学习资源:
CMU 15440 Lecture note: http://www.andrew.cmu.edu/course/15-440-f14/applications/ln/lecture7.html
分布式系统原理与范型, chap5
5.4 选举算法
许多分布式算法需要有一个进程充当协调者,发起者或者其他特殊角色。这里讨论选举出一个协调者(用于协调的进程)的算法。
假定每个进程有一个唯一的编号(例如它的网络地址)。通常,选举算法会试着找出进程号最大的进程,将它指定为协调者。
另外,假定每个进程都知道其他进程的进程号,但不知道当前有哪些进程正在运行,而哪些进程已经崩溃。选举算法的目的是确保发起选举以后,所有的进程都同意选举出的新协调者,则选举结束。
5.4.1 Bully算法
当任何一个线程P发现当前的协调者已经不再响应请求的时候,它就发起一次选举(P主持选举):
1)P向所有编号比它大的进程发送一个election消息
2)如果无人响应,则P自己获胜,成为协调者
3)如果有编号比P大的进程响应,则那个响应的线程接管了P的选举工作,P的选举工作到此完成
由上面的步骤可以看出,任何时刻,一个进程只能从编号比它小的进程处得到election消息。这个进程(election的接受者)发回一个OK消息给发送者(响应election),表面它仍然在运行,并接管选举工作。以此步骤进行下去,最终只有一个编号最大的线程在举行选举,而其他线程都已经放弃选举或者无法响应,这个最大的线程就是新的协调者。它赢得了选举并把获胜的消息(coordinator消息)发送给所有线程,通知它们自己是新的协调者。因此可见,最大的线程总是获胜,因此称为bully。
需要注意的是,可以有多个进程同时举行选举工作。4发起选举后,同时向5和6都发送了election消息,当然5和6也都回响应。此时4得到响应后,停止了自己的选举工作。但是5和6都在同时举行选举工作。这并不是问题。因为5会向6发送election消息并得到6的响应,从而放弃主持选举。