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

And*_*sov 24 cloud algorithm

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

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

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

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

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

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

这是如何选择群集中的新主人的副本这提供了更少的细节,并且在6个月内没有得到回答,所以我觉得开始一个新问题是合适的.

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

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

Mar*_*wis 14

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

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


Spi*_*nim 6

使用Apache ZooKeeper.它解决了这个问题(还有更多).

  • 您的代码不处理并发投票.假设节点1运行协议并选择主节点A.同时,节点2运行协议,节点A从节点2进行netsplit.节点2选择节点B作为主节点.现在你有两个主人.您需要实现http://en.wikipedia.org/wiki/Paxos_algorithm.这比它第一次出现时更难.让ZooKeeper运行(无论语言偏差)比实现Paxos容易得多.一个特别的领导者选举算法将主要起作用,然后突然失败. (3认同)
  • 嘿,谢谢你的回答,但我已经决定我不想把任何怪物带入我的堆栈.并且它是用Java编写的,它永远不是一个好兆头.:)如果你有兴趣,请在GitHub上看到我的impl的第一个版本为[majority.js](https://github.com/andreyvit/majority.js).我们将看到它在实践中的效果如何. (2认同)