温馨提示×

温馨提示×

您好,登录后才能下订单哦!

密码登录×
登录注册×
其他方式登录
点击 登录注册 即表示同意《亿速云用户服务条款》

Kafka无法消费?!我的分布式消息服务Kafka却稳如泰山!

发布时间:2020-08-11 17:44:20 来源:ITPUB博客 阅读:159 作者:PaaS小魔仙 栏目:云计算

  在一个月黑风高的夜晚,突然收到现网生产环境 Kafka 消息积压的告警,梦中惊醒啊,马上起来排查日志。

问题现象:消费请求卡死在查找 Coordinator

Coordinator 为何物? Coordinator 用于管理 Consumer Group 中各个成员,负责消费 offset 位移管理和 Consumer Rebalance Consumer 在消费时必须先确认 Consumer Group 对应的 Coordinator ,随后才能 join Group ,获取对应的 topic partition 进行消费。

那如何确定 Consumer Group Coordinator 呢?分两步走:

1 、一个 Consumer Group 对应一个 __consumers_offsets 的分区,首先先计算 Consumer Group 对应的 __consumers_offsets 的分区,计算公式如下:

__consumers_offsets partition# = Math.abs(groupId.hashCode() % groupMetadataTopicPartitionCount ,其中 groupMetadataTopicPartitionCount offsets.topic.num.partitions 指定。

2 1 中计算的该 partition leader 所在的 broker 就是被选定的 Coordinator

定位过程

Coordinator 节点找到了,现在看看 Coordinator 是否有问题:

Kafka无法消费?!我的分布式消息服务Kafka却稳如泰山!

不出所料, Coordinator 对应分区 Leader -1 ,消费端程序会一直等待,直到 Leader 选出来为止,这就直接导致了消费卡死。

为啥 Leader 无法选举? Leader 选举是由 Controller 负责的。 Controller 节点负责管理整个集群中分区和副本的状态,比如 partition Leader 选举, topic 创建,副本分配, partition replica 扩容等。现在我们看看 Controller 的日志:

1.          6 10 15:48:30,006 Broker 1 成为 controller

Kafka无法消费?!我的分布式消息服务Kafka却稳如泰山!

此时感知的节点为 1 2 ,节点 3 zk 读不出来:

Kafka无法消费?!我的分布式消息服务Kafka却稳如泰山!

31 847 的时候把 __consumer_offsets 的分区 3 Leader 选为 1 ISR [1,2] leader_epoch 14

Kafka无法消费?!我的分布式消息服务Kafka却稳如泰山!

再过 1 秒后才感知到 Controller 发生变化,自身清退

Kafka无法消费?!我的分布式消息服务Kafka却稳如泰山!

2.          Broker 2 在其后几百毫秒后 (15:48:30,936) 也成为 Controller

Kafka无法消费?!我的分布式消息服务Kafka却稳如泰山!

但是 Broker2  是感知到 Broker 3 节点是活的,日志如下 :

Kafka无法消费?!我的分布式消息服务Kafka却稳如泰山!


注意这个时间点, Broker1 还没在 zk __consumer_offsets 的分区 3 Leader 从节点 3 改为 1 ,这样 Broker 2 还认为 Broker 3 Leader ,并且 Broker 3 在它认为是活的,所以不需要重新选举 Leader 。这样一直保持了相当长的时间,即使 Broker 1 已经把这个分区的 Leader 切换了,它也不感知。

3.          Broker 2 12 号的 21:43:19 又感知 Broker 1 网络中断,并处理节点失败事件:

Kafka无法消费?!我的分布式消息服务Kafka却稳如泰山!

因为 Broker 2 内存中认为 __consumer_offsets 分区 3 Leader broker 3 ,所以不会触发分区 3 Leader 切换。

Broker 2 但是在处理失败的节点 Broker 1 时,会把副本从 ISR 列表中去掉,去掉前会读一次 zk ,代码如下:

Kafka无法消费?!我的分布式消息服务Kafka却稳如泰山!

但是发现 zk 中分区 3 Leader 已经变为 1 ISR 列表为 [1,2] ,当要去掉的节点 1 就是 Leader 的时候, Leader 就会变为 -1  ISR 只有 [2] ,从日志也可以看到:

Kafka无法消费?!我的分布式消息服务Kafka却稳如泰山!

这样分区 Leader 一直为 -1 ,直到有新的事件触发节点 2 重新选举才能恢复(例如重启某个节点)。

根因总结

出现网络异常后,由于新老 controller 之间感知的可用节点不同,导致新 controller 对某个分区的 Leader 在内存中的信息与 zk 记录元数据的信息不一致,导致 controller 选举流程出现错误,选不出 Leader   需要有新的选举事件才能触发 Leader 选出来,例如重启。

问题总结

这是一个典型的由于网络异常导致脑裂,进而出现了多个 Controller ,菊厂分布式消息服务 Kafka( https://www.huaweicloud.com/product/dmskafka.html 经过电信级的可靠性验证,已经完美解决了这些问题

 



向AI问一下细节

免责声明:本站发布的内容(图片、视频和文字)以原创、转载和分享为主,文章观点不代表本网站立场,如果涉及侵权请联系站长邮箱:is@yisu.com进行举报,并提供相关证据,一经查实,将立刻删除涉嫌侵权内容。

AI