Kafka出现失效副本
问题发现
执行命令:
sh kafka-topics.sh --describe --zookeeper 10.30.14.15:2181 --under-replicated-partitions |
查询到有失效副本
解决方法
目前未同步副本存在的问题比较复杂,没有最终的解决方案,需要分析broker的日志看为什么副本不同步,正常副本不同步的原因是以下三种情况:
- 副本拉取线程挂掉了。即fllower通过副本线程来拉取数据,此时如果副本线程挂了,就会导致某些分区没有被拉取。此时,可以通过动态调整分区拉取线程数来重启分区线程。
- 副本拉取线程拉取不过来。即数据量太大,副本拉取线程正常工作,但是忙不过来。此时,解决办法是增加副本分区拉取线程数
- Broker 之前出现故障卡顿,比如gc卡顿,磁盘卡顿等,导致Broker缓存的zk信息和实际的zk信息不一致。即Broker认为的分区Leader不是实际的leader,导致数据不能正确同步。此时,会打印如下日志:
此时,解决方案: 重启该台Broker
副本分区拉取线程数操作
操作步骤
查看配置
sh kafka-configs.sh --bootstrap-server 10.0.64.83:9092 --entity-type brokers --entity-default --describe
调整集群维度的副本拉取线程数
sh kafka-configs.sh --bootstrap-server 10.0.64.83:9092 --entity-type brokers --entity-default --alter --add-config num.replica.fetchers=3
验证步骤
可以先登录集群的一台broker,查看当前副本拉取线程数,可以看到如下图中: 该broker有4个往100748 机器的副本拉取线程。
jstack -l <broker进程号>|grep ReplicaFetcherThread |
比如设置了副本拉取线程数为副本线程数为5:则再查看副本拉取线程数如下图