1. 控制器 Broker 的选举过程
控制器的选举过程涉及到所有 Broker 和 ZooKeeper,主要分为以下几个步骤:
1.1 Broker 启动
- 当一个 Broker 启动时,它会向 ZooKeeper 注册自己。每个 Broker 会在 ZooKeeper 的
/brokers/ids
路径下创建一个临时节点,表示它的存在。
1.2 创建控制器节点
- 启动的 Broker 会尝试创建一个控制器节点,通常在 ZooKeeper 的
/controller
路径下创建一个临时节点。 - 这个节点的创建是具有原子性的,即 ZooKeeper 会确保同一时刻只有一个 Broker 能够成功创建该节点。
1.3 竞争控制器
- 所有启动的 Broker 会尝试创建
/controller
的临时节点。第一个成功创建该节点的 Broker 将被选为控制器。 - 这个过程确保在集群中只有一个控制器存在,因为 ZooKeeper 会自动删除临时节点,当控制器 Broker 失去连接或崩溃时,其他 Broker 可以重新进行控制器选举。
1.4 控制器的初始化
- 成功创建
/controller
节点的 Broker 会读取和初始化控制器的状态,并开始负责管理集群元数据和 Broker 状态。
2. Leader 的选举过程
Leader 的选举过程则更为复杂,通常在主题分区创建后进行,以下是具体的步骤:
2.1 分区创建
- 当创建主题时,可以指定分区的数量。每个分区会有一组副本(包括 Leader 和 Follower)。
2.2 控制器进行 Leader 选举
- 控制器会为每个分区选择 Leader。选择的过程通常基于当前 Broker 的状态和负载。
- 控制器会从 ZooKeeper 中获取所有 Broker 的信息,判断哪些 Broker 可用。
2.3 选举机制
- 控制器会按照以下步骤进行 Leader 选举:
- 获取可用 Broker 列表:控制器从 ZooKeeper 中获取当前活跃的 Broker 列表。
- 选择候选者:从可用的 Broker 中选择一个作为 Leader,通常选择负载较轻、状态正常的 Broker。
- 更新 ZooKeeper:控制器在 ZooKeeper 中更新该分区的元数据,设置 Leader 信息,例如
/brokers/topics/{topic_name}/{partition_id}/leader
路径下存储 Leader 的 Broker ID。 - 通知 Follower:控制器会通知相应的 Follower 开始从 Leader 同步数据。
2.4 Leader 变更
- 如果当前的 Leader Broker 因故障下线,控制器会在 ZooKeeper 中检测到 Leader 的缺失。
- 控制器会重新进行 Leader 选举,重复以上选举步骤,选择新的 Broker 作为 Leader。
3. 选举的关键特性
- 原子性:ZooKeeper 的节点创建操作是原子的,这保证了控制器选举的唯一性。
- 临时节点:控制器和 Leader 都使用临时节点,确保在 Broker 失去连接后,节点会被删除,从而触发新的选举。
- 一致性:通过 ZooKeeper,所有 Broker 都可以一致地获取当前的控制器和 Leader 状态。
定义 | 集群中负责管理状态的特殊 Broker | 每个主题分区的主节点,处理读写请求 |
选举机制 | 由 ZooKeeper 选举生成,确保只有一个控制器 | 由控制器管理,针对每个分区选举 |
职责 | 管理 Broker 的状态,处理元数据和分区 | 处理对应分区的所有读写请求 |
数量 | 只有一个控制器 Broker | 每个分区有一个 Leader,可以有多个 |
总结