选举(election) 是分布式系统实践中常见的问题,通过打破节点间的对等关系,选得的 leader(或叫master、coordinator) 有助于实现事务原子性、提升决议效率。
多数派(quorum) 的思路帮助我们在网络分化的情况下达成决议一致性,在leader选举的场景下帮助我们选出唯一leader。
租约(lease) 在一定期限内给予节点特定权利,也可以用于实现 leader 选举。
一致性问题(consistency) 是独立的节点间如何达成决议的问题,选出大家都认可的 leader 本质上也是一致性问题,因而如何应对宕机恢复、网络分化等在leader选举中也需要考量。
Bully 算法[1]是最常见的选举算法,其要求每个节点对应一个序号,序号最高的节点为 leader。leader 宕机后次高序号的节点被重选为 leader,过程如下:

(a). 节点4发现leader不可达,向序号比自己高的节点发起重新选举,重新选举消息中带上自己的序号。
(b)(c). 节点5、6接收到重选信息后进行序号比较,发现自身的序号更大,向节点4返回OK消息并各自向更高序号节点发起重新选举。
(d). 节点5收到节点6的OK消息,而节点6经过超时时间后收不到更高序号节点的OK消息,则认为自己是leader。
(e). 节点6把自己成为leader的信息广播到所有节点。
Bully算法中有2PC的身影,都具有提议(propose)和收集反馈(vote)的过程。
在一致性算法 Paxos、ZAB[2]、Raft[3]中,为提升决议效率均有节点充当 leader 的角色。ZAB、Raft中描述了具体的 leader 选举实现,与 Bully 算法类似 ZAB 中使用 zxid 标识节点,具有最大 zxid 的节点表示其所具备的事务(transaction)最新、被选为leader。