这里的领导选举是指一组进程组对同一个进程成为领导达成一致的算法。这里要求所有的进程都有平等的机会当选为领导,最终有且只有一个进程被选为领导,并且所有进程都对此达成一致。这里讨论的算法是选择进程ID最大或最小的进程,当然无论使用什么标准,算法应该保证算法能够收敛。
Bully algorithm
Bully 算法选择进程ID最大的进程为领导。当一个进程检测到领导死亡时(响应超时)会启动选举过程,向所有ID比它大的进程发送选举消息并等待响应,如果在超时时间内没有收到响应,则自己当选为领导,并发送新领导声明消息。 当进程收到选举消息会立即响应(发起者不会成为领导),并启动新的选举过程。
Ring algorithm
Ring algorithm算法要求把进程组的进程组成逻辑环状(circular topology),当一个进程检测到领导死亡时,创建选举消息(pi)并发送到其后继进程,如果后继进程死亡,则跳过去直接发送给后继的后继进程。如果进程接收到选举消息,会在选举消息中添加自己进程ID(pi, pj)并向其后继传递选举消息。当进程发现自己的进程ID位于选举消息进程列表的第一个说明消息在逻辑环上传递了一遍,进程在选举消息进程列表中选择进程ID最大的进程作为leader并向其余进程发送新领导声明消息。
Chang and Roberts algorithm
该算法是ring算法的一个改进。 改进点1)在选举信息中不保留整个实时进程的列表,一边进行选举,一边进行投票。某个进程收到了选举消息会做如下处理:(1)如果它的进程ID小于消息中的进程ID,那么会透传该消息到后继进程;(2)如果它的进程ID大于消息中的进程ID,那么它就会用自己的进程ID替换消息中的进程ID。当一个进程收到包含自己进程 ID的消息时,它就会知道消息已经循环完毕,自己当选领导然后它会向其余进程发送新领导声明消息。 改进点2)避免在多个进程同时发起选举时出现多条选举信息的循环。为此,进程会跟踪自己是否参与了选举(即发起或转发了选举信息)。如果某个进程收到的消息的进程ID小于它自己的进程ID,而它又是选举的参与者,那么它就会直接丢弃该消息。另一方面,如果收到的信息中的进程ID大于进程自身的进程ID,那么即使进程是选举参与者,它也会转发该信息,因为该信息中的候选人优先于之前转发的候选人。选举结果公布后,每个进程都会清除其参与选举的状态。