分区数决定最大消费者并行度,建议设置为消费者组内消费者数量的整数倍
例如:消费者组有4个实例 → 分区数设为4/8/12等
这里定义的目的是为了让消费者能均匀的分配到分区,避免打破负载均衡,触发rebalance。
单个分区写入速度建议不超过10MB/s
消息TPS超过10万时,可按公式计算:
分区数 = 目标吞吐量 / 单个分区吞吐量
这里回答不一定准确,因为一般情况下需要考虑部署kafka机器的性能,需要压测出一个稳定数据,通过稳定数据去计算需要的分区数大小,比如TPS超过1万,每条消息10k,就意味着每秒100万k消息,100万k/单个分区稳定数据(比如10万k),这个时候就需要10个分区,然后搭配消费者负载均衡,设置12个分区。
建议初始设置时预留20-30%的扩展空间
最大分区数不宜超过200(避免元数据管理开销过大)
生产环境必须设置≥3副本(ISR最小副本数建议2)
保证可靠性,部分broker宕机可能导致数据丢失,使用ISR机制有备份情况。
推荐设置规则:
副本数每增加1,写入吞吐量下降约10%
高吞吐场景建议搭配acks=1
或0
配置使用
这里建议使用acks=1,至少保证一个副本有同步,除非是日志消息之类的,可以考虑ack=0,不然容灾能力会很差。
# 需要严格顺序的场景
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
# 分区性能压测(使用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
建议通过监控以下指标持续优化:
# 实时查看 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"
# 启用 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"
#!/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服务并忽略挂起信号#!/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相关环境变量# 生产者延迟监控(需 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}'
# 查看所有消费者组堆积量
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
监控建议: