聊聊Election Algorithms
序
本文主要研究一下Election Algorithms
Election Algorithms
Election Algorithms大致有兩類,一類是Garcia-Molina提出的Bully Election,一類是Chang & Roberts's Token Ring Election algorithm;對於大多數的election algorithms通常有如下幾個假定:
- 完整的topology,資訊可以在topology的nodes之間傳遞
- 每個node有唯一的id,而且對整個topology其他node可見
- 所有的通訊網路是可靠的,只允許node fail,要求訊息不丟失,不重複,不損壞
- 要求已經有fail detector機制來處理node fail的情況
Bully Election
- 當有node檢測到leader fail之後,就傳送election request給其他node,election request中帶上自己的id
- 當node接收到election request時判斷如果自己的id大於request中的id,則可以"bully"覆蓋request中的id,如果小於則不改動,然後傳送election request給其他node;當有node接收到election request的id是自己的node id時,則表明自己是leader,於是給其他node傳送leader request
- 當node接收到leader request時設定本地leader id,同時判斷如果leader id不是自己的node id時則轉發該leader request給其他node
Token Ring Election
- 當有node檢測到leader fail之後,就傳送election request給其他node,election request中帶上自己的id
- 當node接收到election request時,則判斷自己的node id是否在裡面,不在的話則追加自己的node id到election request中;如果自己的node id已經在該election request中時則提取這些node id,取出id最大的作為leader,然後給其他node傳送leader request
- 當node接收到leader request時設定本地leader id,同時判斷如果leader id不是自己的node id時則轉發該leader request給其他node
例項
這裡採用distributedLeaderElection 的實現
Bully Election
public void onMessage(String message) { String messageHeader = message.split(":")[0]; String messageBody = message.split(":")[1]; if (messageHeader.equals("Election")){ if (Integer.parseInt(messageBody.trim()) < Node.getMyID() // If we are a better candidate && !participant){ System.out.println("I " + Node.getMyID() + " am a better candidate than "+messageBody); Node.sendMsgToNextNode("Election" + ":" + Node.getMyID()); // Suggest us for election } else if (Integer.parseInt(messageBody.trim()) == Node.getMyID()){ // If this is our ID System.out.println("I " + Node.getMyID() + " received my own pebble, so I am the new leader"); Node.sendMsgToNextNode("Leader" + ":" + Node.getMyID()); // Announce us as the new leader } else { // The current candidate is better System.out.println("I " + Node.getMyID() + " am a worse candidate than "+messageBody); Node.sendMsgToNextNode(message); // Forward his candidancy } participant = true; } else if (messageHeader.equals("Leader")){ System.out.println(messageBody + " is the new leader"); leaderID = messageBody; if (Integer.parseInt(messageBody.trim()) != Node.getMyID()) Node.sendMsgToNextNode(message); } }
- 可以看到bully演算法在看到election request中node id小於自己node id時,直接bully覆蓋該node id;當走了一圈發現請求中node id是自己的node id時,則選舉自己為leader
Token Ring Election
public void onMessage(String message) { String messageHeader = message.split(":")[0]; List<String> messageBody = Arrays.asList(message.replace(messageHeader+":", "").split(":")); if (messageHeader.equals("Election")){ if (!messageBody.contains(Node.getMyID()+"")){ // If we are not contained in the list System.out.println("I " + Node.getMyID() + " am not contained in this message "+message); Node.sendMsgToNextNode(message + ":" + Node.getMyID()); // Suggest us for election } else { // If we are in the list System.out.println("I " + Node.getMyID() + " am contained in this message"); String newLeader = findLeaderInBody(messageBody); Node.sendMsgToNextNode("Leader" + ":" + newLeader); // Announce the new leader } } else if (messageHeader.equals("Leader")){ String leaderBody = message.split(":")[1]; System.out.println(leaderBody + " is the new leader"); leaderID = leaderBody; if (Integer.parseInt(leaderBody.trim()) != Node.getMyID()) Node.sendMsgToNextNode(message); } } private String findLeaderInBody(List<String> messageBody) { int maxID = 0; if (messageBody.size() > 0){ for (String leaderCandidate : messageBody){ if (Integer.parseInt(leaderCandidate.trim()) > maxID) { maxID = Integer.parseInt(leaderCandidate.trim()); } } } return maxID+""; }
- 可以看到ring演算法是在請求中追加自己的node id;當走了一圈發現自己的node id已經在其中時,通過findLeaderInBody從這些node id中取出最大的那個,選舉該node為leader
小結
- Election Algorithms大致有兩類,一類是Garcia-Molina提出的Bully Election,一類是Chang & Roberts's Token Ring Election algorithm
-
對於大多數的election algorithms通常有如下幾個假定:
- 完整的topology,資訊可以在topology的nodes之間傳遞
- 每個node有唯一的id,而且對整個topology其他node可見
- 所有的通訊網路是可靠的,只允許node fail,要求訊息不丟失,不重複,不損壞
- 要求已經有fail detector機制來處理node fail的情況
- bully演算法與ring演算法的共同點是對比node id,在具體的例項中我們可以看到,bully演算法顧名思義就是如果自己的node id比較大,則可以覆蓋request中的node,最後node id最大的為leader;而ring演算法則是採取追加node id方式,最後在從中選取node id最大的為leader