双Broker KRaft集群移除节点后部分主题无法消费问题咨询
Kafka KRaft双Broker集群副本未复制问题排查与解决
问题结论
是的,你的主题未跨Broker创建副本,这直接导致了Broker停机后无法消费的问题。从现象来看,主题仅在单个节点存在数据目录,说明该主题的副本因子实际为1,而非你预期的2。
原因分析
- 全局副本因子未配置:你的集群配置中仅设置了
offsets.topic.replication.factor=2(仅针对offsets系统主题),但未设置default.replication.factor=2。这意味着创建自定义主题时,若未显式指定副本因子,Kafka会使用默认值1创建单副本主题。 - 单副本的可用性缺陷:当主题仅存在单副本时,若该副本所在Broker停机,对应分区将没有可用的Leader节点,消费者无法连接到Leader获取数据,从而出现无法消费的情况。
验证步骤
执行以下命令确认主题的副本配置:
kafka-topics.sh --describe --topic my-topic --bootstrap-server 192.168.56.1:9092
输出中会看到ReplicationFactor: 1,且Replicas和Isr列表仅包含单个节点ID(1或2),可直接验证单副本问题。
解决方法
1. 配置全局默认副本因子
在两个节点的server.properties文件中添加以下配置,确保后续创建的主题默认使用2副本:
default.replication.factor=2
修改后重启两个Broker节点。
2. 为已存在的主题添加副本
步骤1:生成副本分配方案
创建一个JSON文件(例如reassignment.json),内容如下:
{ "version": 1, "partitions": [ { "topic": "my-topic", "partition": 0, "replicas": [1, 2] } ] }
步骤2:执行副本重分配
运行以下命令触发副本同步:
kafka-reassign-partitions.sh --bootstrap-server 192.168.56.1:9092 --reassignment-json-file reassignment.json --execute
步骤3:验证重分配结果
执行命令确认副本同步完成:
kafka-reassign-partitions.sh --bootstrap-server 192.168.56.1:9092 --reassignment-json-file reassignment.json --verify
当输出显示Status: Completed时,说明副本已成功同步到两个Broker。
3. 后续主题创建规范
创建新主题时,显式指定副本因子确保符合预期:
kafka-topics.sh --create --topic new-topic --bootstrap-server 192.168.56.1:9092 --partitions 1 --replication-factor 2
效果验证
完成上述操作后,停止节点2的Broker:
- 若主题副本已同步到两个节点,Controller会将分区Leader切换到节点1,消费者连接节点1可正常消费消息;
- 重启节点2后,副本会自动同步节点1的新数据,恢复完整的副本集群。
内容的提问来源于stack exchange,提问作者user2233706
相关产品推荐
相关产品推荐

