2天时间,聊今年最热的 Agent、上下文工程、AI 产品创新等话题。2025 年最后一场~ 了解详情
写点什么

Kafka 无法消费,究竟是 bug 的错还是配置的问题?

  • 2019-10-21
  • 本文字数:1459 字

    阅读完需:约 5 分钟

Kafka无法消费,究竟是bug的错还是配置的问题?

在一个月黑风高的夜晚,突然收到现网生产环境 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 是否有问题:



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


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


1.6 月 10 日 15:48:30,006 秒 Broker 1 成为 controller



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



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



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



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



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



注意这个时间点,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 网络中断,并处理节点失败事件:



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


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


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



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

根因总结

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

问题总结

这是一个典型的由于网络异常导致脑裂,进而出现了多个 Controller,华为云分布式消息服务(DMS)Kafka 经过电信级的可靠性验证,已经完美解决了这些问题,快点击“阅读原文”了解更多吧!


本文转载自公众号中间件小哥(ID:huawei_kevin)。


原文链接:


https://mp.weixin.qq.com/s/baxyONDEHTlPrSwszjo3Jw


2019-10-21 14:175038

评论

发布
暂无评论
发现更多内容

美团面试题:String s = new String("111") 会创建几个对象?

Java小咖秀

Java 面试 string java对象

js数组和函数

赫鲁小夫

4月日更

面试官常考的 21 条 Linux 命令

xcbeyond

Linux 面试 4月日更

微服务中台技术解析之网关(dubbo-rest)实践

小江

dubbo 架构设计 api 网关

年轻人不要老熬夜

小天同学

健康 个人感悟 4月日更 熬夜

ElasticSearch 如何使用 ik 进行中文分词?

程序员历小冰

中文分词 elasticsearch ik 全文搜索

2021 年带你漫游语音识别技术

清秋

人工智能 语音识别 智能音箱 签约计划 4月日更

想要做网页游戏怎么办 ?PixiJs篇(一)

空城机

大前端 游戏开发 4月日更 pixi HTML5游戏

树莓派4B+OpenVINO快速实现人脸识别

IT蜗壳-Tango

音视频 IT蜗壳教学 4月日更

Java运算符

ベ布小禅

4月日更

翻译:《实用的Python编程》08_02_Logging

codists

Python

Let's Go 100

escray

学习 Go 语言 4月日更 Go100

【IDEA】配置MySQL环境并创建MySQL数据库

咿呀呀

Java MySQL 数据库 IDEA

Jenkins教程:使用Jenkins进行持续集成

码界行者

DevOps jenkins

浅论变量的作用域与变量的生存周期

Integer

c

如何设计一款用户想要的产品——“Design Thinking”培训笔记

gavin

产品设计 design thinking

「免费开源」基于Vue和Quasar的前端SPA项目crudapi后台管理系统实战之动态表关系管理(六)

crudapi

Vue crud crudapi quasar 表关系

React 学习总结

pydata

Vue 大前端 低代码 React

自定义 Grafana Home 页面

耳东@Erdong

Grafana 4月日更

从一个创业者的角度看国外爆火音频实时聊天APP-ClubHouse,真香

Langer

产品推荐 产品策略 语音社交

数据中台前世今生

李孟聊AI

大数据 数据中台 签约计划

华仔架构训练营作业(模块一)

不听不听王八念晶

手把手教你基于Prometheus搭建监控告警系统

Java全栈封神

云原生 Prometheus 监控告警

带你厘清事务一致性(中篇)

小舰

4月日更

企业签频繁掉签,何处是出路?

风翱

ios 4月日更 企业签 超级签

全网首发:Android Camera2 集成人脸识别算法

小驰笔记

android 音视频 人脸识别 引航计划

【LeetCode】丑数 IIJava题解

Albert

算法 LeetCode 4月日更

微服务网关:Spring Cloud Config-配置中心

程序员架构进阶

Spring Cloud 源码解析 配置中心 28天写作 4月日更

推荐一本新书《Software Design for Flexibility: How to Avoid Programming Yourself Into a Corner》

顿晓

推荐书籍 4月日更 SICP flexibility

重装变态的微信

箭上有毒

生活 4月日更

数据结构和算法难?盘他!-快速入门

Aldeo

数据结构 算法 时间复杂度 复杂度 算法和数据结构

Kafka无法消费,究竟是bug的错还是配置的问题?_文化 & 方法_余洲_InfoQ精选文章