如何在群集中运行的节点中选择主节点?

时间:2010-12-23 23:22:18

标签: algorithm cloud

我正在编写托管云堆栈(在EC2等硬件级云提供商之上),我将很快面临的一个问题是:

几个相同的节点如何决定哪一个成为主节点? (即,想到在EC2上运行的5台服务器。其中一台服务器必须成为主服务器,其他服务器必须成为服务器。)

我阅读the algorithm used by MongoDB的描述,看起来相当复杂,并且还取决于投票的概念 - 即单独留下两个节点将无法做出任何决定。他们的方法在产生结果之前也有很长的延迟。

  1. 我想知道是否有任何不那么复杂的,KISS-embrasing方法?它们被广泛使用,还是有风险采用?

  2. 假设我们已经有了服务器列表。然后我们可以选择一个正在运行且具有数字最小的IP地址的那个。这种方法的缺点是什么?

  3. 为什么MongoDB的算法如此复杂?

  4. 这是How to elect new Master in Cluster?的副本,它提供了较少的细节,并且在6个月内没有得到答复,所以我觉得开始一个新问题是合适的。

    (我正在研究的堆栈是开源的,但是它处于开发的早期阶段,所以不在这里提供链接。)

    更新:根据答案,我设计了一个简单的一致性算法,你可以在GitHub上找到一个JavaScript(CoffeeScript)实现:majority.js

4 个答案:

答案 0 :(得分:14)

领导者选举算法通常将split brain视为要支持的故障案例。如果您认为不是节点失败而是网络,则可能会遇到所有节点都已启动但无法相互通信的情况。然后,你最终可能会有两个主人。

如果您可以从故障模型中排除“裂脑”(即如果您只考虑节点故障),那么您的算法(领导者是地址最小的算法)就可以了。

答案 1 :(得分:6)

使用Apache ZooKeeper。它完全解决this problem(以及更多)。

答案 2 :(得分:3)

如果您的节点还需要就事物及其总订单达成一致,您可能需要考虑Paxos。这很复杂,但是没有人能为分布式共识提出更简单的解决方案。

答案 3 :(得分:2)

我喜欢这个算法:

  • 每个节点计算最低的已知节点ID,并向该节点发送领导投票
  • 如果一个节点收到足够多的投票并且该节点也投票给自己,那么它将担任领导角色并开始发布群集状态。

在下面的链接中有一些选择主节点的算法: https://www.elastic.co/blog/found-leader-election-in-general#the-zen-way

还可以看到Raft算法:https://raft.github.io

相关问题