Kafka rebalance 重平衡深度解析


consumer group 是用于实现高伸缩性、高容错性的 consumer 机制。组内多个 consumer 实例可以同时读取 Kafka 消息,而且一旦有某个 consumer “挂”了,consumer group 会立即将己崩溃 consumer 负责的分区转交给其他 consumer 来负责,从而保证整个 group 可以继续工作,不会丢失数据。
consumer group 的 rebalance 本质上是一组协议,它规定了一个 consumer group 是如何达成一致来分配订阅 topic 的所有分区的 。 假设某个组下有 20 个 consumer 实例,该组订阅了一个有着 100 个分区的 topic 。 正常情况下, Kafka 会为每个 consumer 平均分配 5 个分区。这个分
配过程就被称为 rebalance 。 当 consumer 成功地执行 rebalance 后,组订阅 topic 的每个分区只会分配给组内的一个 consumer 实例。
Kafka 内置的一个全新的组协调协议(group coordination protocol) 。对于每个组而言, Kafka 的某个 broker 会被选举为组协调者(group coordinator)。coordinator 负责对组的状态进行管理,它的主要职责就是当新成员到达时促成组内所有成员达成新的分区分配方案,即 coordinator 负责对组执行 rebalance 操作。

rebalance 触发条件

组 rebalance 触发的条件有以下 3 个:

  1. 组成员发生变更,比如新 consumer 加入组,或己有 consumer 主动离开组,再或是己有 consumer 崩溃时则触发 rebalance 。
  2. 组订阅 topic 数发生变更,比如使用基于正则表达式的订阅,当匹配正则表达式的新 topic 被创建时则会触发 rebalance。
  3. 组订阅 topic 的分区数发生变更,比如使用命令行脚本增加了订阅 topic 的分区数。

真实应用场景中引发 rebalance 最常见的原因就是违背了第一个条件,特别是 consumer 崩溃的情况。这里的崩横不一定就是指 consumer 进程“挂掉”或 consumer 进程所在的机器岩机 。
当 consumer 无法在指定的时间内完成消息的处理,那么 coordinator 就认为该 consumer 己经崩溃,从而引发新一轮 rebalance。可以通过 [[消费者参数#max poll interval ms|max.poll.interval.ms]] 参数配置 consumer 处理逻辑最大时间。

分区分配策略

Kafka consumer 默认提供了 3 种分配策略,分别是 range 策略、round-robin 策略和 sticky 策略。通过 consumer 参数 partition.assignment. strategy 来进行配置。
所谓的分配策略决定了订阅 topic 的每个分区会被分配给哪个 consumer 。 range 策略主要是基于范围的思想。它将单个 topic 的所有分区按照顺序排列,然后把这些分区划分成固定大小的分区段井依次分配给每个 consumer。假设有 1 个消费者线程订阅了 2 个 topic; round-robin 策略则会把所有 topic 的所有分区顺序摆开,然后轮询式地分配给各个

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值