内容简介:本文主要研究一下Election AlgorithmsElection Algorithms大致有两类,一类是Garcia-Molina提出的Bully Election,一类是Chang & Roberts's Token Ring Election algorithm;对于大多数的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
doc
以上所述就是小编给大家介绍的《聊聊Election Algorithms》,希望对大家有所帮助,如果大家有任何疑问请给我留言,小编会及时回复大家的。在此也非常感谢大家对 码农网 的支持!
猜你喜欢:本站部分资源来源于网络,本站转载出于传递更多信息之目的,版权归原作者或者来源机构所有,如转载稿涉及版权问题,请联系我们。
区块链核心算法解析
【瑞士】Roger Wattenhofer(罗格.瓦唐霍费尔) / 陈晋川、薛云志、林强、祝庆 / 电子工业出版社 / 2017-8 / 59.00
《区块链核心算法解析》介绍了构建容错的分布式系统所需的基础技术,以及一系列允许容错的协议和算法,并且讨论一些实现了这些技术的实际系统。 《区块链核心算法解析》中的主要概念将独立成章。每一章都以一个小故事开始,从而引出该章节的内容。算法、协议和定义都将以形式化的方式描述,以便于读者理解如何实现。部分结论会在定理中予以证明,这样读者就可以明白为什么这些概念或算法是正确的,并且理解它们可以确保实现......一起来看看 《区块链核心算法解析》 这本书的介绍吧!
CSS 压缩/解压工具
在线压缩/解压 CSS 代码
Markdown 在线编辑器
Markdown 在线编辑器