etcd leader选举
etcd 是基于 raft 算法进行选举,而 raft 是一种管理日志一致性的协议,将系统中的角色分为三个
- leader: 接受客户端的请求,并向 follower 发送同步请求日志
- follower: 接收 leader 同步的日志
- candidate: 候选者角色,在选举过程中发挥作用
leader 选举
- raft 是通过心跳机制来触发 leader 的选举,每一个实例(例如 etcd pod)启动后都会初始化为一个 follower,leader 则会周期性的向所有 follower 发送心跳包,在 etcd 的编排中就能看到相关的参数
如果 follower 如果在选举超时时间内没有收到 leader 的心跳包,就会等待一个随机的时间,然后发起 leader 选举。每个 follower 都有一个时钟,这个时钟是一个随机的值,集群中谁的时钟先跑完,那么就由谁来发起 leader 选举
该 follower 会将当前的任期(term) + 1 然后转化为 candidate,先给自己投票然后向集群中的其他 follower 发送 RequestVote RPC
那么最终的结果会有三种:
- 自己赢得了最多的票数,成为 leader
- 收到了 leader 的消息,表示已经有其他服务抢先成为了 leader
- 没有服务获得最高票数,即选举失败,会等待选举时间超时后进行下一次选举
在 raft 协议中,所有的日志条目都只会是 leader 往 follower 写入,且 leader 的日志只增不减,所以能被选举成为 leader 的节点,一定包含了所有已经提交的日志条目
You need to set
install_url
to use ShareThis. Please set it in _config.yml
.