etcd leader选举

etcd 是基于 raft 算法进行选举,而 raft 是一种管理日志一致性的协议,将系统中的角色分为三个

  1. leader: 接受客户端的请求,并向 follower 发送同步请求日志
  2. follower: 接收 leader 同步的日志
  3. candidate: 候选者角色,在选举过程中发挥作用

leader 选举

  1. raft 是通过心跳机制来触发 leader 的选举,每一个实例(例如 etcd pod)启动后都会初始化为一个 follower,leader 则会周期性的向所有 follower 发送心跳包,在 etcd 的编排中就能看到相关的参数

etcd编排

  1. 如果 follower 如果在选举超时时间内没有收到 leader 的心跳包,就会等待一个随机的时间,然后发起 leader 选举。每个 follower 都有一个时钟,这个时钟是一个随机的值,集群中谁的时钟先跑完,那么就由谁来发起 leader 选举

  2. 该 follower 会将当前的任期(term) + 1 然后转化为 candidate,先给自己投票然后向集群中的其他 follower 发送 RequestVote RPC

那么最终的结果会有三种:

  1. 自己赢得了最多的票数,成为 leader
  2. 收到了 leader 的消息,表示已经有其他服务抢先成为了 leader
  3. 没有服务获得最高票数,即选举失败,会等待选举时间超时后进行下一次选举

在 raft 协议中,所有的日志条目都只会是 leader 往 follower 写入,且 leader 的日志只增不减,所以能被选举成为 leader 的节点,一定包含了所有已经提交的日志条目

Author

Warner Chen

Posted on

2024-03-19

Updated on

2024-03-19

Licensed under

You need to set install_url to use ShareThis. Please set it in _config.yml.
You forgot to set the business or currency_code for Paypal. Please set it in _config.yml.

Comments

You forgot to set the shortname for Disqus. Please set it in _config.yml.