Leader选举机制
Leader选举机制⌗
简介⌗
Leader选举机制是为了解决分布式系统中一致性问题常见的一种机制,目前多数开源组件的选举算法都来自Paxos
或者其简化版本Raft
。
算法简介⌗
- Paxos
- Raft: 是对
Mul-ti Paxos
的一个改造,论文将算法分为三个部分:Leader election
,Log replication
, Safety.选举只是其中一部分,在选举中,节点分为三个状态:follower
,leader
,candidate
,开始所有节点均为follower
状态,在指定的election timeout(通常 150~300ms)
到期后,为自己投票(VoteCount+1),同时向其他节点发送RequestVote
消息,其中包含当前的任期编号(Term)和自己的标识,为了避免节点同时发起 Vote 所以 election timeout 都是在允许范围内随机化
,当节点获得多数的票数,则立即变为 Leader,同时开始定期(heartbeat timeout)发送 Append Entries 消息,其他节点受到则会刷新 election timeout,同时回复消息。其他节点在接受到 RequestVote 会判断当前任期是否已经处理,如果已经处理则不会回复任何消息(此时依旧会触发 election timeout) - Bully: 使用一个ID来竞选 Leader,最大者胜出。 除了这些算法外,如果你有用到额外存储,其实可以利用存储来实现选主,原理和分布式锁类似,多个实例争抢一个 key,谁抢到谁是leader,同时约定好ttl,定期继任和竞争。
k8s 中的实现⌗
了解k8s的读者应该知道,k8s早期的master
是没有实现高可用的,所以早期社区出现各种不同的考可用方案,直到v1.13后官方才原生支持高可用。
它的实现方案就是使用了 Leader选举
,并且利用了k8s
中endpoint
来优雅地完成云原生的选举机制。
参考client-go leader-election
另外还有一个SideCar使用这个库来完成 contrib/election.
查看其他