记录kafka上线N天后自动崩溃的bug分析和优化策略

原文链接:https://zhuanlan.zhihu.com/p/459766419?utm_id=0

最近偶遇一个逆天大bug。kafka运行一段时间(第一次7天,第二次5天),三个kafka进程自动全部挂掉。翻看日志,只有state-change.log有报错信息,其他日志均为INFO信息。报错内容如下:

ERROR [Controller id=3 epoch=3] Controller 3 epoch 3 failed to change state for partition GL_t_com_standard_band9-0 from OfflinePartition to OnlinePartition (state.change.logger)

kafka.common.StateChangeFailedException: Failed to elect leader for partition GL_t_com_standard_band9-0 under strategy OfflinePartitionLeaderElectionStrategy(false)

kafka版本为2.8,每个topic(除了__consumer_offsets是默认的50partition,其余topic全部是1partition 和 1replication)的partition全部报错一次,然后三个进程一起down。看报错,很明显,OfflinePartition转化为OnlinePartition状态时,需要找到最新的leader,但是找不到(leader和follower都是自己),导致状态转换失败。

一、分析报错:

OfflinePartition状态产生的原因有两个:

1.当有 Broker 掉线时,将 leader 在这个机器上的 Partition 设置为 OfflinePartition

2.Topic 删除成功后,中间会将该 Partition 的状态先转变为 OfflinePartition

这里显然没有删除操作,而broker掉线的原因有:

1.真的挂了

2.ZK延迟接收心跳认为broker挂了

3.Follower节点没有及时响应Leader节点,Leader认为Follower挂了。

显然,原因只能是2和3。而topic只有1个replication。此时,leader和follower,ISR都在同一个节点。那么

(1)zk延迟接收心跳

(2)kafka内部通信(akka线程)延迟

(3)ISR=1,挂掉后不能重新选举

(4)写入速度太快,leader不堪重负

这些是broker宕机直接原因。而根本原因,包括不限于:1.内存满 2.磁盘读写瓶颈 3.CPU满 4.GC 5.网络丢包 6.flink写数据太快 7.同步写的方式造成磁盘内存压力等等。

通过grafana观测,排除cpu,内存和磁盘,这三项负载都没有问题,峰值网络2M/s的IO,排除flink写过快问题(这点吞吐量还是没问题的),所以无需优化 异步写,增大写缓存 和 增大溢写磁盘频率 这些写优化。剩下的GC,网络,副本数,一个一个来。

二、解决调优

(1)查看gc频率:

不算高,上线1天gc 3000次,平均30秒 gc 1次。不过还是果断修改kafka-server-start.sh : export KAFKA_HEAP_OPTS="-Xmx2G -Xms2G (默认堆内存1G)

(2)网络和丢包:

丢包是服务器网卡和数据量的问题,没办法解决,但是可以解决kafka内部消息传输的问题。修改:num.network.threads=4 --网路线程数

replica.lag.time.max.ms=10000 --follower响应leader的延迟时间,默认500秒

zookeeper.session.timeout.ms=36000 --增大与zk交互的延迟默认18000秒

broker.heartbeat.interval.ms=4 --增大broker之间心跳发送频率默认2秒

提高节点之间交互线程数,提高节点间交互延迟时间,降低心跳频率和延迟时间。以上操作均为提高容错:降低网络波动带来的误认为broker挂掉的问题。

(3)ISR为1,选举新leader直接失败:

default.replication.factor=3

offsets.topic.replication.factor=3

transaction.state.log.replication.factor=3

transaction.state.log.min.isr=3

修改副本数,这样即使出现问题,leader可以重新选举,提高的容错。

最后重新上线,这次观察一下日志,看看kafka能坚持几天。如果后续依旧报错,再回来总结这篇文章。

附上kafka分区状态转换详情:https://www.cnblogs.com/zhy-heaven/p/10994193.html

附上kafka 2.8版本配置大全:https://kafka.apache.org/28/documentation.html

你可能感兴趣的:(kafka,bug,分布式)