上周参加了 Kafka Meetup 北京站的技术分享,本文简单介绍下 Kafka Consumer 的 Rebalance 机制以及其新版本中的优化策略~
如上图所示,Consumer
使用 Consumer Group
名称标记自己,并且发布到主题的每条记录都会传递到每个订阅消费者组中的一个 Consumer
实例。 Consumer
实例可以在单独的进程中或在单独的机器上。
如果所有 Consumer
实例都属于同一个 Consumer Group
,那么这些 Consumer
实例将平衡再负载的方式来消费 Kafka
。
如果所有 Consumer
实例具有不同的 Consumer Group
,则每条记录将广播到所有 Consumer
进程。
Group Coordinator
是一个服务,每个 Broker
在启动的时候都会启动一个该服务。Group Coordinator
的作用是用来存储 Group
的相关 Meta
信息,并将对应 Partition
的 Offset
信息记录到 Kafka
内置Topic(__consumer_offsets)
中。Kafka
在 0.9 之前是基于 Zookeeper
来存储 Partition
的 Offset
信息 (consumers/{group}/offsets/{topic}/{partition})
,因为 Zookeeper
并不适用于频繁的写操作,所以在 0.9 之后通过内置 Topic
的方式来记录对应 Partition
的 Offset
。如下图所示:
在 Kafka 0.8.2
之前是这样的
之后是这样的:
每个 Group
都会选择一个 Coordinator
来完成自己组内各 Partition
的 Offset
信息,选择的规则如下:
Group
对应在 __consumer_offsets
上的 Partition
Partition 计算规则:
partition-Id(__consumer_offsets) = Math.abs(groupId.hashCode() % groupMetadataTopicPartitionCount)
其中 groupMetadataTopicPartitionCount
对应 offsets.topic.num.partitions
参数值,默认值是 50 个分区
consumer
实例加入该消费组或者离开组。Topic
个数发生变化。Topic
的分区数发生变化。session
过期heartbeat
过期Rebalance
发生时,Group
下所有 Consumer
实例都会协调在一起共同参与,Kafka
能够保证尽量达到最公平的分配。但是 Rebalance
过程对 Consumer Group
会造成比较严重的影响。在 Rebalance
的过程中 Consumer Group
下的所有消费者实例都会停止工作,等待 Rebalance
过程完成。
1,有新的 Consumer
加入 Consumer Group
2,从 Consumer Group
选出 leader
3,leader
进行分区的分配
Known Issue #1: Stop-the-world Rebalance
Kafka
在发生 Rebalance
时候会释放 Consumer Group
的所有资源,造成比较长的 Stop-the-world
Known Issue #2: Back-and-forth Rebalance
Rebalance
的时候发生的不必要的资源释放与重新分配。
本篇文章由一文多发平台ArtiPub自动发布
这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。
V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。
V2EX is a community of developers, designers and creative people.