聊聊Election Algorithms

本文主要研究一下Election Algorithmshtml

Election Algorithms

Election Algorithms大體有兩類,一類是Garcia-Molina提出的Bully Election,一類是Chang & Roberts's Token Ring Election algorithm;對於大多數的election algorithms一般有以下幾個假定:node

  • 完整的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的實現git

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

doc

相關文章
相關標籤/搜索