"Rebalancing" 在 Apache Kafka 上下文中意味着什么?
What does "Rebalancing" mean in Apache Kafka context?
我是 Kafka 的新用户,现在已经试用了大约 2-3 周。我相信目前我对 Kafka 的大部分工作方式有很好的理解,但是在尝试为我自己的 Kafka 消费者安装 API 之后(这很模糊,但我正在遵循新 KafkaConsumer 的指南这应该可用于 v 0.9,它在 'trunk' repo atm 上)如果我有多个具有相同 groupID 的消费者,我会遇到从主题消耗的延迟问题。
在此设置中,我的控制台始终记录有关 'rebalance triggering' 的问题。当我将新消费者添加到消费者组时是否会发生重新平衡,是否会触发重新平衡以确定同一组 ID 中的哪个消费者实例将获得哪些分区,或者重新平衡是否完全用于其他用途?
我也从 https://cwiki.apache.org/confluence/display/KAFKA/Kafka+0.9+Consumer+Rewrite+Design 看到了这段话,但我似乎无法理解它,所以如果有人能帮助我理解它,我将不胜感激:
Rebalancing is the process where a group of consumer instances
(belonging to the same group) co-ordinate to own a mutually exclusive
set of partitions of topics that the group is subscribed to. At the
end of a successful rebalance operation for a consumer group, every
partition for all subscribed topics will be owned by a single consumer
instance within the group. The way rebalancing works is as follows.
Every broker is elected as the coordinator for a subset of the
consumer groups. The co-ordinator broker for a group is responsible
for orchestrating a rebalance operation on consumer group membership
changes or partition changes for the subscribed topics. It is also
responsible for communicating the resulting partition ownership
configuration to all consumers of the group undergoing a rebalance
operation.
当新消费者加入消费者组时,消费者组会尝试“重新平衡”负载以将分区分配给每个消费者。如果在进行此分配时消费者组发生变化,则重新平衡将失败并重试。此设置控制放弃前的最大尝试次数。
此命令是:rebalance.max.retries,默认设置为 4。
此外,如果满足以下条件,则可能会发生这种情况:
ZooKeeper 会话超时。如果消费者在这段时间内未能向 ZooKeeper 发送心跳,则认为它已死,将发生重新平衡。
希望对您有所帮助!
Rebalance是给定消费者组内消费者之间分区所有权的重新分配。请记住,消费者组中的每个消费者都被分配了一个或多个主题分区独占。
A 再平衡 发生在:
- 一个消费者加入了群组
- 一个消费者完全关闭
- 组协调器认为消费者已死亡。这可能发生在崩溃之后或者当消费者忙于一个长运行处理时,这意味着在配置的会话间隔内消费者没有同时向组协调器发送心跳
- 添加了新分区
作为组协调员(集群中的代理之一)和组长(第一个加入组的消费者) 指定给一个消费者组,Rebalance 或多或少可以描述如下:
- leader 从
组协调员(这将包括所有发送
最近心跳,因此被认为是活着的)并且是
负责为每个消费者分配一个分区子集。
- 决定分区分配后(Kafka 有几个内置的分区分配策略),组长发送
组协调员的分配列表,它发送这个
给所有消费者的信息。
这适用于 Kafka 0.9,但我很确定对于较新的版本仍然有效。
消费者重新平衡决定哪个消费者负责某些主题的所有可用分区的哪个子集。
例如,您可能有一个包含 20 个分区和 10 个消费者的主题;在重新平衡结束时,您可能希望每个消费者都从 2 个分区读取数据。如果您关闭其中的 10 个消费者,您可能希望每个消费者在重新平衡完成后拥有 1 个分区。 Consumer rebalance 是一种动态分区分配,可以由 Kafka 自动处理。
Group Coordinator 是负责与消费者沟通以实现 consumers.In 早期版本 Zookeeper 存储元数据详细信息但最新版本之间的再平衡的经纪人之一,它存储在经纪人上。消费者协调器接收来自消费者组的所有消费者的心跳和轮询,因此请注意每个消费者的心跳并管理他们在分区上的偏移量。
组长:
一个consumer Group作为group leader,由Group coordinator选出,负责代表group中的所有consumer做出分区分配决策。
再平衡场景:
消费者组订阅任意主题
消费者实例无法以 session.heart.beat 时间间隔发送心跳。
消费者长进程超过轮询超时
消费者组的消费者通过异常
添加了新分区。
扩大和缩小消费者。为
添加新消费者或手动删除现有消费者
消费者再平衡
消费者请求加入群组或离开群组时发起消费者再平衡。 Group Leader 从 Group Coordinator 那里收到所有活跃消费者的列表。 Group Leader 使用 PartitionAssigner 决定分配给每个消费者的分区。
一旦 Group Leader 完成分区分配,它将分配列表发送给 Group Coordinator,后者将此信息发回给所有消费者。 Group 只将适用的分区发送给他们的消费者,而不是其他消费者分配的分区。只有 Group Leader 知道所有消费者及其分配的分区。
重新平衡完成后,消费者开始向 Group Coordinator 发送 Heartbeat,表明它处于活动状态。
消费者向组协调器发送 OffsetFetch 请求,以获取为其分配的分区的最后提交的偏移量。
消费者开始为新分配的分区消费消息。
状态管理
在重新平衡时,Group coordinator 将其状态设置为 Rebalance 并等待所有消费者重新加入该组。
当Group开始重新平衡时,Group协调器首先将其状态切换为重新平衡,以便通知所有交互的消费者重新加入该组。
一旦重新平衡完成,组协调器创建新的生成 ID 并通知所有消费者和组继续同步阶段,消费者发送同步请求并等待组长完成生成新的分配分区。一旦消费者收到新分配的分区,他们就会进入稳定阶段。
静态成员资格
这种重新平衡是一项相当繁重的操作,因为它需要停止所有消费者并等待获得新分配的分区。在每次重新平衡时,始终创建新一代 id 意味着刷新所有内容。为了解决这个开销,Kafka 2.3+ 引入了静态成员资格以减少不必要的重新平衡。 KIP-345
在静态成员身份中,消费者状态将持续存在,并且在重新平衡时将应用相同的分配。它使用新的 group.instance.id 来保持成员身份。因此,即使在最坏的情况下,成员 ID 也会重新洗牌以分配一个新分区,但相同的消费者实例 ID 仍将获得相同的分区分配
instanceId: A, memberId: 1, assignment: {0, 1, 2}
instanceId: B, memberId: 2, assignment: {3, 4, 5}
instanceId: C, memberId: 3, assignment: {6, 7, 8}
重启后:
instanceId: A, memberId: 4, assignment: {0, 1, 2}
instanceId: B, memberId: 2, assignment: {3, 4, 5}
instanceId: C, memberId: 3, assignment: {6, 7, 8}
参考:
消费者组、消费者和分区再平衡
Kafka Consumer 可以 consume/Subscribe 到多个主题并开始接收消息。 Kafka 消费者通常是消费者群体的一部分。当多个消费者订阅一个主题并属于同一个消费者组时,该组中的每个消费者都会收到来自该主题中不同分区子集的消息。
因此,消费者组中的消费者共享他们订阅的主题中分区的所有权。当我们向组中添加一个新的消费者时,它会开始消费来自另一个消费者之前消费过的分区的消息。当消费者关闭或崩溃时,也会发生同样的事情;它离开了这个组,它用来消费的分区将被剩下的一个消费者消费。当正在消费的消费者组被修改时,如添加新分区,也会将分区重新分配给消费者。
"将分区所有权从一个消费者转移到另一个消费者称为重新平衡" 在重新平衡期间,消费者无法消费消息,因此我们可以假设重新平衡对整个消费者群体来说是短暂的 window 不可用。它还会导致消费者方面的一些其他 activity ,例如当分区从一个消费者移动到另一个消费者时,cosnumer 会失去其当前状态,就像如果有任何数据是缓存,则它需要刷新其缓存,从而减慢整个应用程序直到消费者再次设置其状态。
heartbeat.interval.ms
消费者通过向指定为组协调器的 Kafka 代理发送心跳来维护消费者组中的成员资格以及分配给他们的分区的所有权,并且对于不同的消费者组来说会有所不同。只要消费者定期发送心跳,那么它就被认为是活着的,并继续处理来自指定分配分区的消息当消费者调用 poll 方法(从分区检索记录)以及提交记录时发送心跳已消耗。
如果一个消费者长时间停止发送心跳并且它的会话将超时(由session.timeout.ms控制)那么组协调器将认为它已经死亡并且因此触发重新平衡。如果一个消费者崩溃了并且没有处理消息,它会在没有心跳的情况下花费几秒钟的时间来确定它已经死了并触发重新平衡。当一个consumer干净的关闭时,consumer会通知group coordinator它要离开group,coordinator会立即触发rebalance,减少消息不可用的时间。
我是 Kafka 的新用户,现在已经试用了大约 2-3 周。我相信目前我对 Kafka 的大部分工作方式有很好的理解,但是在尝试为我自己的 Kafka 消费者安装 API 之后(这很模糊,但我正在遵循新 KafkaConsumer 的指南这应该可用于 v 0.9,它在 'trunk' repo atm 上)如果我有多个具有相同 groupID 的消费者,我会遇到从主题消耗的延迟问题。
在此设置中,我的控制台始终记录有关 'rebalance triggering' 的问题。当我将新消费者添加到消费者组时是否会发生重新平衡,是否会触发重新平衡以确定同一组 ID 中的哪个消费者实例将获得哪些分区,或者重新平衡是否完全用于其他用途?
我也从 https://cwiki.apache.org/confluence/display/KAFKA/Kafka+0.9+Consumer+Rewrite+Design 看到了这段话,但我似乎无法理解它,所以如果有人能帮助我理解它,我将不胜感激:
Rebalancing is the process where a group of consumer instances (belonging to the same group) co-ordinate to own a mutually exclusive set of partitions of topics that the group is subscribed to. At the end of a successful rebalance operation for a consumer group, every partition for all subscribed topics will be owned by a single consumer instance within the group. The way rebalancing works is as follows. Every broker is elected as the coordinator for a subset of the consumer groups. The co-ordinator broker for a group is responsible for orchestrating a rebalance operation on consumer group membership changes or partition changes for the subscribed topics. It is also responsible for communicating the resulting partition ownership configuration to all consumers of the group undergoing a rebalance operation.
当新消费者加入消费者组时,消费者组会尝试“重新平衡”负载以将分区分配给每个消费者。如果在进行此分配时消费者组发生变化,则重新平衡将失败并重试。此设置控制放弃前的最大尝试次数。
此命令是:rebalance.max.retries,默认设置为 4。
此外,如果满足以下条件,则可能会发生这种情况:
ZooKeeper 会话超时。如果消费者在这段时间内未能向 ZooKeeper 发送心跳,则认为它已死,将发生重新平衡。
希望对您有所帮助!
Rebalance是给定消费者组内消费者之间分区所有权的重新分配。请记住,消费者组中的每个消费者都被分配了一个或多个主题分区独占。
A 再平衡 发生在:
- 一个消费者加入了群组
- 一个消费者完全关闭
- 组协调器认为消费者已死亡。这可能发生在崩溃之后或者当消费者忙于一个长运行处理时,这意味着在配置的会话间隔内消费者没有同时向组协调器发送心跳
- 添加了新分区
作为组协调员(集群中的代理之一)和组长(第一个加入组的消费者) 指定给一个消费者组,Rebalance 或多或少可以描述如下:
- leader 从 组协调员(这将包括所有发送 最近心跳,因此被认为是活着的)并且是 负责为每个消费者分配一个分区子集。
- 决定分区分配后(Kafka 有几个内置的分区分配策略),组长发送 组协调员的分配列表,它发送这个 给所有消费者的信息。
这适用于 Kafka 0.9,但我很确定对于较新的版本仍然有效。
消费者重新平衡决定哪个消费者负责某些主题的所有可用分区的哪个子集。 例如,您可能有一个包含 20 个分区和 10 个消费者的主题;在重新平衡结束时,您可能希望每个消费者都从 2 个分区读取数据。如果您关闭其中的 10 个消费者,您可能希望每个消费者在重新平衡完成后拥有 1 个分区。 Consumer rebalance 是一种动态分区分配,可以由 Kafka 自动处理。
Group Coordinator 是负责与消费者沟通以实现 consumers.In 早期版本 Zookeeper 存储元数据详细信息但最新版本之间的再平衡的经纪人之一,它存储在经纪人上。消费者协调器接收来自消费者组的所有消费者的心跳和轮询,因此请注意每个消费者的心跳并管理他们在分区上的偏移量。
组长: 一个consumer Group作为group leader,由Group coordinator选出,负责代表group中的所有consumer做出分区分配决策。
再平衡场景:
消费者组订阅任意主题
消费者实例无法以 session.heart.beat 时间间隔发送心跳。
消费者长进程超过轮询超时
消费者组的消费者通过异常
添加了新分区。
扩大和缩小消费者。为
添加新消费者或手动删除现有消费者
消费者再平衡
消费者请求加入群组或离开群组时发起消费者再平衡。 Group Leader 从 Group Coordinator 那里收到所有活跃消费者的列表。 Group Leader 使用 PartitionAssigner 决定分配给每个消费者的分区。 一旦 Group Leader 完成分区分配,它将分配列表发送给 Group Coordinator,后者将此信息发回给所有消费者。 Group 只将适用的分区发送给他们的消费者,而不是其他消费者分配的分区。只有 Group Leader 知道所有消费者及其分配的分区。 重新平衡完成后,消费者开始向 Group Coordinator 发送 Heartbeat,表明它处于活动状态。 消费者向组协调器发送 OffsetFetch 请求,以获取为其分配的分区的最后提交的偏移量。 消费者开始为新分配的分区消费消息。
状态管理
在重新平衡时,Group coordinator 将其状态设置为 Rebalance 并等待所有消费者重新加入该组。
当Group开始重新平衡时,Group协调器首先将其状态切换为重新平衡,以便通知所有交互的消费者重新加入该组。 一旦重新平衡完成,组协调器创建新的生成 ID 并通知所有消费者和组继续同步阶段,消费者发送同步请求并等待组长完成生成新的分配分区。一旦消费者收到新分配的分区,他们就会进入稳定阶段。
静态成员资格
这种重新平衡是一项相当繁重的操作,因为它需要停止所有消费者并等待获得新分配的分区。在每次重新平衡时,始终创建新一代 id 意味着刷新所有内容。为了解决这个开销,Kafka 2.3+ 引入了静态成员资格以减少不必要的重新平衡。 KIP-345
在静态成员身份中,消费者状态将持续存在,并且在重新平衡时将应用相同的分配。它使用新的 group.instance.id 来保持成员身份。因此,即使在最坏的情况下,成员 ID 也会重新洗牌以分配一个新分区,但相同的消费者实例 ID 仍将获得相同的分区分配
instanceId: A, memberId: 1, assignment: {0, 1, 2}
instanceId: B, memberId: 2, assignment: {3, 4, 5}
instanceId: C, memberId: 3, assignment: {6, 7, 8}
重启后:
instanceId: A, memberId: 4, assignment: {0, 1, 2}
instanceId: B, memberId: 2, assignment: {3, 4, 5}
instanceId: C, memberId: 3, assignment: {6, 7, 8}
参考:
消费者组、消费者和分区再平衡 Kafka Consumer 可以 consume/Subscribe 到多个主题并开始接收消息。 Kafka 消费者通常是消费者群体的一部分。当多个消费者订阅一个主题并属于同一个消费者组时,该组中的每个消费者都会收到来自该主题中不同分区子集的消息。
因此,消费者组中的消费者共享他们订阅的主题中分区的所有权。当我们向组中添加一个新的消费者时,它会开始消费来自另一个消费者之前消费过的分区的消息。当消费者关闭或崩溃时,也会发生同样的事情;它离开了这个组,它用来消费的分区将被剩下的一个消费者消费。当正在消费的消费者组被修改时,如添加新分区,也会将分区重新分配给消费者。
"将分区所有权从一个消费者转移到另一个消费者称为重新平衡" 在重新平衡期间,消费者无法消费消息,因此我们可以假设重新平衡对整个消费者群体来说是短暂的 window 不可用。它还会导致消费者方面的一些其他 activity ,例如当分区从一个消费者移动到另一个消费者时,cosnumer 会失去其当前状态,就像如果有任何数据是缓存,则它需要刷新其缓存,从而减慢整个应用程序直到消费者再次设置其状态。
heartbeat.interval.ms
消费者通过向指定为组协调器的 Kafka 代理发送心跳来维护消费者组中的成员资格以及分配给他们的分区的所有权,并且对于不同的消费者组来说会有所不同。只要消费者定期发送心跳,那么它就被认为是活着的,并继续处理来自指定分配分区的消息当消费者调用 poll 方法(从分区检索记录)以及提交记录时发送心跳已消耗。
如果一个消费者长时间停止发送心跳并且它的会话将超时(由session.timeout.ms控制)那么组协调器将认为它已经死亡并且因此触发重新平衡。如果一个消费者崩溃了并且没有处理消息,它会在没有心跳的情况下花费几秒钟的时间来确定它已经死了并触发重新平衡。当一个consumer干净的关闭时,consumer会通知group coordinator它要离开group,coordinator会立即触发rebalance,减少消息不可用的时间。