一、分区数设置原则
1. 并发能力基准
分区数决定最大消费者并行度,建议设置为消费者组内消费者数量的整数倍
例如:消费者组有4个实例 → 分区数设为4/8/12等
这里定义的目的是为了让消费者能均匀的分配到分区,避免打破负载均衡,触发rebalance。
2. 吞吐量指标
单个分区写入速度建议不超过10MB/s
消息TPS超过10万时,可按公式计算:
分区数 = 目标吞吐量 / 单个分区吞吐量
这里回答不一定准确,因为一般情况下需要考虑部署kafka机器的性能,需要压测出一个稳定数据,通过稳定数据去计算需要的分区数大小,比如TPS超过1万,每条消息10k,就意味着每秒100万k消息,100万k/单个分区稳定数据(比如10万k),这个时候就需要10个分区,然后搭配消费者负载均衡,设置12个分区。
3. 扩展性预留
建议初始设置时预留20-30%的扩展空间
最大分区数不宜超过200(避免元数据管理开销过大)
二、副本数设置原则
1. 可靠性基线
生产环境必须设置≥3副本(ISR最小副本数建议2)
保证可靠性,部分broker宕机可能导致数据丢失,使用ISR机制有备份情况。
2. 集群规模对应
推荐设置规则:
- 开发环境:1-2副本
- 生产环境:3副本(集群≥5节点时)
- 金融级场景:5副本
3. 写入性能权衡
副本数每增加1,写入吞吐量下降约10%
高吞吐场景建议搭配acks=1
或0
配置使用
这里建议使用acks=1,至少保证一个副本有同步,除非是日志消息之类的,可以考虑ack=0,不然容灾能力会很差。
三、特殊场景优化
properties
# 需要严格顺序的场景
num.partitions=1
- 将主题分区数强制设置为1,所有消息按写入顺序严格排列
- 牺牲横向扩展能力,保证全局消息顺序一致性
- 适用于金融交易、订单状态变更等强顺序需求场景
unclean.leader.election.enable=false
- 禁止非ISR副本(低于高水位线,也就是未完全同步Leader)参与Leader选举(默认值)
- 当所有ISR副本失效时,宁可停止服务也不选举不同步副本
- 避免数据丢失但会降低可用性,需配合 min.insync.replicas 使用
保序
# 高可用要求场景
default.replication.factor=3
- 设置默认副本数为3(需集群至少有3个Broker)
- 每个分区会在不同Broker上保存3个副本
- 最多可容忍2个Broker同时故障而不丢失数据
min.insync.replicas=2
指定对于每个分区,至少有多少个副本需要与领导者副本(Leader Replica)保持同步,才能认为该分区是可用的。
- 定义最小同步副本数要求(需 ≤ replication.factor)
- 生产者设置 acks=all 时,需要至少2个副本确认写入才算成功
- 在数据安全性与写入延迟之间取得平衡(1<min<replication.factor
四、配置验证方法
bash
# 分区性能压测(使用kafka-producer-perf-test)
bin/kafka-producer-perf-test.sh --topic test-topic \
--num-records 1000000 --record-size 1000 \
--throughput -1 --producer-props bootstrap.servers=localhost:9092
- bin/kafka-producer-perf-test.sh Kafka 自带的性能测试工具脚本路径,用于模拟生产者发送消息
- --topic test-topic 指定要测试的 Kafka 主题名称(需要提前创建好)
- --num-records 1000000 设置总共要发送 1,000,000 条测试记录
- --record-size 1000 每条记录的大小设置为 1000 字节(约 1KB)
- --throughput -1 设置吞吐量为无限制(-1 表示以最大速度发送),若设为正数则表示每秒发送的记录数
- --producer-props bootstrap.servers=localhost:9092 指定生产者配置:
- bootstrap.servers :Kafka 集群地址(本地单节点)
- 可追加其他生产者参数如 acks=1 , compression.type=snappy 等
建议通过监控以下指标持续优化:
一、检测分区 Leader 的 ISR 变化频率
bash
# 实时查看 ISR 变化(需开启 JMX 监控)
bin/kafka-run-class.sh kafka.tools.JmxTool --object-name kafka.server:type=ReplicaManager,name=IsrShrinksPerSec
bin/kafka-run-class.sh kafka.tools.JmxTool --object-name kafka.server:type=ReplicaManager,name=IsrExpandsPerSec
# 查看历史 ISR 变更记录
bin/kafka-topics.sh --bootstrap-server localhost:9092 --topic test-topic --describe | grep "Isr"
IsrShrinksPerSec
- 含义:每秒ISR(In-Sync Replicas)集合收缩的次数
- 表示副本从ISR中被移除的速率,可能由以下原因触发:
- 副本同步延迟超过 replica.lag.time.max.ms (默认30秒)
- 磁盘故障或网络问题导致副本离线
IsrExpandsPerSec
- 含义:每秒ISR集合扩展的次数
- 表示副本重新加入ISR的速率,常见恢复场景:
- 副本追赶上Leader的消息进度
- 网络恢复后副本重新上线
安全建议(生产环境必做)
bash:bin/kafka-server-start.sh
# 启用 SSL 和认证的配置示例
export KAFKA_JMX_OPTS="-Dcom.sun.management.jmxremote \
-Dcom.sun.management.jmxremote.port=9999 \
-Dcom.sun.management.jmxremote.ssl=true \
-Dcom.sun.management.jmxremote.registry.ssl=true \
-Dcom.sun.management.jmxremote.authenticate=true \
-Dcom.sun.management.jmxremote.password.file=/etc/kafka/jmx.password"
如何开启关闭JMX
开启JMX监控脚本 (enable_jmx.sh)
bash
#!/bin/bash
# 设置JMX端口和认证参数
export KAFKA_JMX_OPTS="-Dcom.sun.management.jmxremote -Dcom.sun.management.jmxremote.port=9999 -Dcom.sun.management.jmxremote.authenticate=false -Dcom.sun.management.jmxremote.ssl=false"
# 设置JMX远程访问IP限制(默认本地)
export JMX_HOSTNAME="-Djava.rmi.server.hostname=localhost"
# 启动Kafka服务(后台运行)
nohup /path/to/kafka/bin/kafka-server-start.sh /path/to/kafka/config/server.properties > /dev/null 2>&1 &
逐行解释:
#!/bin/bash
:指定使用bash解释器执行脚本export KAFKA_JMX_OPTS...
:设置JMX参数-Dcom.sun.management.jmxremote
:启用JMX远程监控-Dcom.sun.management.jmxremote.port=9999
:指定JMX端口authenticate=false
:禁用认证(生产环境建议开启)ssl=false
:禁用SSL加密(生产环境建议开启)
export JMX_HOSTNAME...
:设置JMX服务绑定IPnohup ... &
:后台运行Kafka服务并忽略挂起信号
关闭JMX监控脚本 (disable_jmx.sh)
bash
#!/bin/bash
# 查找Kafka进程ID
PID=$(jps -l | grep kafka.Kafka | awk '{print $1}')
# 停止Kafka服务
if [ -n "$PID" ]; then
kill -9 $PID
echo "Kafka stopped successfully"
else
echo "Kafka is not running"
fi
# 清除JMX环境变量
unset KAFKA_JMX_OPTS
unset JMX_HOSTNAME
逐行解释:
PID=$(jps -l...)
:通过jps命令查找Kafka进程IDif [ -n "$PID" ]...
:判断进程是否存在kill -9 $PID
:强制终止Kafka进程unset...
:清除JMX相关环境变量
注意事项:
- 端口号9999可根据实际情况修改,需确保防火墙开放
- 生产环境建议启用认证和SSL加密(需配置相关证书)
- 脚本中的kafka路径需替换为实际安装路径
- JMX关闭本质是停止Kafka服务,重启时不带JMX参数即关闭监控
二、检测生产/消费 p99 延迟
bash
# 生产者延迟监控(需 JMX)
bin/kafka-run-class.sh kafka.tools.JmxTool --object-name kafka.producer:type=producer-metrics,client-id=*
# 消费者延迟监控
bin/kafka-consumer-groups.sh --bootstrap-server localhost:9092 --group [消费者组名] --describe | awk '{print $1,$2,$6}'
三、检测分区消息堆积量
bash
# 查看所有消费者组堆积量
bin/kafka-consumer-groups.sh --bootstrap-server localhost:9092 --list | xargs -I {} bin/kafka-consumer-groups.sh --bootstrap-server localhost:9092 --group {} --describe
# 查看指定分区堆积量
bin/kafka-run-class.sh kafka.tools.GetOffsetShell --broker-list localhost:9092 --topic test-topic --time -1
bin/kafka-run-class.sh kafka.tools.GetOffsetShell --broker-list localhost:9092 --topic test-topic --time -2
监控建议:
- 建议将上述命令集成到 Prometheus + Grafana 监控体系
- 关键指标告警阈值设置:
- ISR 变更频率 > 5次/分钟 触发告警
- p99 延迟 > 500ms 触发告警
- 消息堆积量持续增长超过 10万条 触发告警
- 推荐使用 Kafka Eagle 可视化工具进行实时监控