KRaft(Kafka Raft)模式下的 Leader 选举是通过 Raft 协议来实现的。Raft 是一种分布式一致性算法,用于管理复制日志,它被设计用来解决分布式系统中的一致性问题,特别是在选举 Leader 方面表现得更加直观和易于理解。
KRaft 中的 Leader 选举过程
- 初始状态:
- Kafka 集群中的每个 Broker 最初都是 Follower 状态。
- 每个 Broker 会定期向当前的 Leader 发送心跳,以确认 Leader 的存在。
- 选举触发:
- 当一个 Broker 没有在超时时间内收到心跳(即选举超时),它会从 Follower 状态转换为 Candidate 状态。
- 转换为 Candidate 后,Broker 的任期编号(Term)会递增,并且它会给自己投一票。
- 请求投票:
- Candidate 会向集群中的其他 Broker 发送投票请求(RequestVote RPC),请求其他 Broker 投票支持自己成为 Leader。
- 在投票请求中,Candidate 会包含自己的任期编号和最后的日志条目信息(日志索引和任期),以便其他 Broker 可以判断是否应该投票给它。
- 投票响应:
- 其他 Broker 收到投票请求后,会检查候选人的日志条目信息:
- 如果候选人的日志至少和自己的日志一样新(即任期编号更大,或者任期编号相同但日志索引更大),那么会投票给该候选人,并回复投票确认(VoteGranted)。
- 如果候选人的日志不够新,那么不会投票,并返回拒绝投票的信息。
- 如果 Broker 已经给另一个候选人投票了,那么不会重复投票。
- 其他 Broker 收到投票请求后,会检查候选人的日志条目信息:
- 选举获胜:
- 如果一个 Candidate 收集到了超过半数的选票(包括自己的一票),它就会成为新的 Leader。
- 新的 Leader 会开始发送心跳给其他 Broker,以维持其领导地位,并处理客户端请求。
- 心跳维持:
- 成为 Leader 后,它会定期向其他 Broker 发送心跳(AppendEntries RPC),以保持领导权。
- 如果 Broker 收到心跳,它会更新其对 Leader 的认知,并且不会发起新的选举。
KRaft 中的特殊配置
在 KRaft 模式下,还需要注意以下配置:
- 选举超时:
- 通过配置
election.timeout.ms来设置选举超时时间。如果 Broker 在这个时间内没有收到心跳,它就会尝试发起选举。
- 通过配置
- Raft 副本数量:
- 通过配置
controller.quorum.voters来指定参与选举的 Broker 列表及其投票权重。通常,这个列表包含了集群中的所有 Broker。
- 通过配置
- 日志保留策略:
- 为了保证 Raft 日志的一致性,需要配置日志的保留策略,确保日志条目的持久性和完整性。