一 Bully算法
Bully算法是一种相对简单的选举算法,他的核心思想就是选举一个ID最大的进程作为Master。
它在选举的过程中,主要包括以下三种消息类型:
# Election: 表示发起一次选举消息
# Answer: 如果该进程处于存活状态,则对选举消息进行响应的消息
# Coordinate: 选举胜利者向其他进程发送的选举成功的消息
二 选举流程
2.1 发生选举的时机
# 进程收到Master节点失效的消息(没有Master了需要重新选举Master)
# 进程从失败中恢复(比如Master节点失效了,最后恢复了,因为他的ID是最大的,所以他又会重新选举)
2.2 进程P选举的流程
2.2.1 进程P的ID最大,他会向其他节点发送Coordinator消息,宣布自己是Master,常见场景比如之前的Master恢复或者Master失败后,当前进程的ID最大
2.2.2 如果P进程的ID不是最大的,则向比它大的进程发送Election消息,即选举消息
情况一: 收到比它ID大的进程的应答
假设Node A挂掉了,然后当前进程是Node B, 然后Node B向比自己大的进程发送Election消息。
如果它向Node C发送消息,则收到Node C返回的Answer消息,则Node B选举失败,等待接收其他节点的Coordinator消息;
情况二: 没有收到比它ID大的进程的应答
Node D向比自己ID大的Node A发送Election消息,但是Node A没有回复,则没有向Node D返回Answer消息,因为Node D没有收到Answer消息,则Node D就会向其他节点广播Coordinator消息,宣布自己是Master
2.2.3 如果进程P收到ID比自己小的进程的Election消息,它会返回每一个Answer消息;并且他自己也启动选举流程,向比它更高ID的进程发送Election消息
假设Node B向比它ID大的Node C发送Election消息,Node C返回Answer消息,Node B等待被其他其他发送Coordinator消息;然后Node C也启选举进程,向比自己大的Node D发送Election消息,然后返回Answer消息,则Node C等待被其他其他发送Coordinator消息。
2.2.4 如果进程P收到其他进广播的Coordinator消息,那么他就会把发送这条Coordinator消息的进程看作为Master进程