3、Kafka安装与配置:单机模式安装、集群模式安装、关键配置参数详解、JMX监控配置
好,咱们进入实操环节。说实话,Kafka 的安装本身并不复杂,但很多人栽在配置细节上。我见过不少团队,集群搭起来了,跑了两天就崩,一查全是配置没调对。这一章,我会把单机、集群、核心参数和 JMX 监控一次性讲透。
3.1 单机模式安装
单机模式主要用于开发测试。我个人习惯在 Linux 上搞,Windows 也能跑,但生产环境没人用 Windows 跑 Kafka,对吧?
前置条件
- JDK 8+(推荐 JDK 11,我踩过 JDK 8 的 GC 坑)
- ZooKeeper(Kafka 2.8+ 可选,但 3.x 之前还是强依赖)
- 下载 Kafka 二进制包(
kafka_2.13-3.2.0.tgz这种)
安装步骤
- 解压:
tar -xzf kafka_2.13-3.2.0.tgz - 启动 ZooKeeper:
bin/zookeeper-server-start.sh config/zookeeper.properties - 启动 Kafka:
bin/kafka-server-start.sh config/server.properties
dataDir 和 log.dirs 单独挂载到 SSD 上。默认路径在 /tmp 下,重启就没了,你想想看,这多坑。
验证安装
# 创建主题
bin/kafka-topics.sh --create --topic test-topic --bootstrap-server localhost:9092 --partitions 1 --replication-factor 1
# 查看主题列表
bin/kafka-topics.sh --list --bootstrap-server localhost:9092
# 启动生产者
bin/kafka-console-producer.sh --topic test-topic --bootstrap-server localhost:9092
# 启动消费者(另开终端)
bin/kafka-console-consumer.sh --topic test-topic --from-beginning --bootstrap-server localhost:9092
能收发消息,单机就搞定了。嗯,这里要注意,--bootstrap-server 是 2.x 以后的新参数,老教程还在用 --zookeeper,别搞混了。
3.2 集群模式安装
单机只是热身。生产环境至少 3 台 Broker,这是底线。我曾经见过一个团队只搭了 2 台,结果一台宕机,ISR 缩到 1,写入直接 hang 住……
集群规划
| 节点 | IP | Broker ID | 角色 |
|---|---|---|---|
| node1 | 192.168.1.10 | 0 | Broker + Controller |
| node2 | 192.168.1.11 | 1 | Broker + Controller |
| node3 | 192.168.1.12 | 2 | Broker + Controller |
关键配置差异
每台 Broker 的 server.properties 只有三个地方不同:
broker.id:全局唯一,0/1/2listeners:绑定本机 IP,比如PLAINTEXT://192.168.1.10:9092log.dirs:数据目录,建议每台机器一致
broker.id 配重复了,结果集群启动后,两个 Broker 互相踢来踢去,日志里全是 LeaderElection 错误。查了半天才发现是 ID 冲突。
启动集群
# 每台机器依次启动 ZooKeeper(或使用独立 ZK 集群)
# 然后依次启动 Kafka
bin/kafka-server-start.sh -daemon config/server.properties
# 验证集群状态
bin/kafka-topics.sh --describe --bootstrap-server 192.168.1.10:9092,192.168.1.11:9092,192.168.1.12:9092
集群启动后,建议创建一个带副本的主题测试:
bin/kafka-topics.sh --create --topic cluster-test \
--bootstrap-server 192.168.1.10:9092 \
--partitions 3 --replication-factor 3
用 --describe 查看分区分布,如果每个分区的 Leader 和 Replicas 分布在不同的 Broker 上,说明集群正常。
3.3 关键配置参数详解
这部分是重点。很多 Kafka 故障,说白了就是参数没调对。我按类别来讲。
3.3.1 基础参数
| 参数名 | 默认值 | 说明 |
|---|---|---|
broker.id |
0 | 集群内唯一标识,不能重复 |
listeners |
PLAINTEXT://:9092 | 监听地址,生产环境建议绑定内网 IP |
log.dirs |
/tmp/kafka-logs | 数据存储目录,建议用多块磁盘,逗号分隔 |
zookeeper.connect |
localhost:2181 | ZK 地址,集群用逗号分隔多个 ZK 节点 |
3.3.2 性能与可靠性参数
| 参数名 | 默认值 | 我的建议 |
|---|---|---|
num.partitions |
1 | 根据吞吐量预估,建议 3-6 起步 |
default.replication.factor |
1 | 生产环境至少 2,推荐 3 |
min.insync.replicas |
1 | 配合 acks=all 使用,建议设为 2 |
log.retention.hours |
168 | 7 天,根据数据量调整 |
log.segment.bytes |
1073741824 | 1GB,太小会导致频繁刷盘 |
min.insync.replicas 如果设得比 replication.factor 大,生产者写入时会直接报 NotEnoughReplicasException。我曾经在 3 副本集群里把 min.insync.replicas 设成 3,结果一台 Broker 宕机,整个集群写入就停了……太死板了。
3.3.3 网络与线程参数
num.network.threads:默认 3,处理网络请求的线程数。机器核多可以调大。num.io.threads:默认 8,处理磁盘 I/O 的线程数。建议设为 CPU 核数的 2 倍。socket.send.buffer.bytes:默认 102400(100KB),网络好的话可以调大。
3.4 JMX 监控配置
Kafka 跑起来只是第一步,你得知道它健不健康。JMX(Java Management Extensions)是官方推荐的监控方式。我习惯用 Prometheus + JMX Exporter 来采集指标。
开启 JMX
在启动 Kafka 前,设置环境变量:
export JMX_PORT=9999
export KAFKA_JMX_OPTS="-Dcom.sun.management.jmxremote \
-Dcom.sun.management.jmxremote.authenticate=false \
-Dcom.sun.management.jmxremote.ssl=false \
-Dcom.sun.management.jmxremote.port=9999 \
-Dcom.sun.management.jmxremote.rmi.port=9999 \
-Djava.rmi.server.hostname=192.168.1.10"
bin/kafka-server-start.sh -daemon config/server.properties
java.rmi.server.hostname,结果 JMX 客户端连不上,因为 RMI 返回的是内网 hostname,解析不了。你想想看,监控面板一片灰,多吓人。
关键 JMX 指标
| 指标 MBean | 含义 | 告警阈值 |
|---|---|---|
kafka.server:type=BrokerTopicMetrics,name=MessagesInPerSec |
每秒消息入量 | 根据业务基线 |
kafka.server:type=ReplicaManager,name=UnderReplicatedPartitions |
未同步分区数 | > 0 立即告警 |
kafka.controller:type=KafkaController,name=ActiveControllerCount |
活跃 Controller 数 | 必须为 1 |
kafka.log:type=LogFlushStats,name=FlushMs |
刷盘耗时 | > 1000ms 告警 |
java.lang:type=OperatingSystem |
系统 CPU/内存 | CPU > 80% 关注 |
使用 JMX Exporter 集成 Prometheus
# 下载 jmx_prometheus_javaagent
wget https://repo1.maven.org/maven2/io/prometheus/jmx/jmx_prometheus_javaagent/0.18.0/jmx_prometheus_javaagent-0.18.0.jar
# 创建配置文件 kafka_broker.yml(定义要暴露的指标)
# 启动时添加 javaagent
export KAFKA_OPTS="-javaagent:/path/to/jmx_prometheus_javaagent-0.18.0.jar=7071:/path/to/kafka_broker.yml"
bin/kafka-server-start.sh -daemon config/server.properties
这样 Prometheus 就能从 http://192.168.1.10:7071/metrics 拉取指标了。配合 Grafana 面板,集群状态一目了然。
3.5 本章知识体系
下面这张图总结了 Kafka 安装与配置的核心脉络,从单机到集群,再到参数和监控,你一看就明白。
这张图把本章的四个核心模块串起来了。你从单机入手,熟悉基本操作;然后扩展到集群,理解分布式协作;接着深入参数调优,这是性能的关键;最后用 JMX 监控兜底,确保集群健康。每一步都有坑,但按这个路径走,基本不会出大问题。