KRaft(Kafka Raft)模式下的 Leader 选举是通过 Raft 协议来实现的。Raft 是一种分布式一致性算法,用于管理复制日志,它被设计用来解决分布式系统中的一致性问题,特别是在选举 Leader 方面表现得更加直观和易于理解。

KRaft 中的 Leader 选举过程

  1. 初始状态
    • Kafka 集群中的每个 Broker 最初都是 Follower 状态。
    • 每个 Broker 会定期向当前的 Leader 发送心跳,以确认 Leader 的存在。
  2. 选举触发
    • 当一个 Broker 没有在超时时间内收到心跳(即选举超时),它会从 Follower 状态转换为 Candidate 状态。
    • 转换为 Candidate 后,Broker 的任期编号(Term)会递增,并且它会给自己投一票。
  3. 请求投票
    • Candidate 会向集群中的其他 Broker 发送投票请求(RequestVote RPC),请求其他 Broker 投票支持自己成为 Leader。
    • 在投票请求中,Candidate 会包含自己的任期编号和最后的日志条目信息(日志索引和任期),以便其他 Broker 可以判断是否应该投票给它。
  4. 投票响应
    • 其他 Broker 收到投票请求后,会检查候选人的日志条目信息:
      • 如果候选人的日志至少和自己的日志一样新(即任期编号更大,或者任期编号相同但日志索引更大),那么会投票给该候选人,并回复投票确认(VoteGranted)。
      • 如果候选人的日志不够新,那么不会投票,并返回拒绝投票的信息。
    • 如果 Broker 已经给另一个候选人投票了,那么不会重复投票。
  5. 选举获胜
    • 如果一个 Candidate 收集到了超过半数的选票(包括自己的一票),它就会成为新的 Leader。
    • 新的 Leader 会开始发送心跳给其他 Broker,以维持其领导地位,并处理客户端请求。
  6. 心跳维持
    • 成为 Leader 后,它会定期向其他 Broker 发送心跳(AppendEntries RPC),以保持领导权。
    • 如果 Broker 收到心跳,它会更新其对 Leader 的认知,并且不会发起新的选举。

KRaft 中的特殊配置

在 KRaft 模式下,还需要注意以下配置:

  1. 选举超时
    • 通过配置  election.timeout.ms  来设置选举超时时间。如果 Broker 在这个时间内没有收到心跳,它就会尝试发起选举。
  2. Raft 副本数量
    • 通过配置  controller.quorum.voters  来指定参与选举的 Broker 列表及其投票权重。通常,这个列表包含了集群中的所有 Broker。
  3. 日志保留策略
    • 为了保证 Raft 日志的一致性,需要配置日志的保留策略,确保日志条目的持久性和完整性。