去Webapp群集领袖选举

时间:2016-01-30 23:13:06

标签: web-applications go cluster-computing high-availability distributed-system

我正在编写一个相当复杂的Go webapp,我想让它变得高度可用。我计划让多个虚拟机运行应用程序,负载均衡器可以根据需要在它们之间引导流量。

复杂的地方是webapp有一种运行的数据库簿记例程,我在任何时候都只想要(最多)一个实例。因此,如果我有三个webapp虚拟机,那么其中只有一个应该进行簿记。

(是的,我知道我可以完全将簿记拆分为一个单独的VM实例,但代码已经与Web应用程序的其余部分进行了大量集成。)

我花了好几个小时查看etcdraftbullymemberlistPacemaker等内容,等等向前。这些都似乎吸收了很多信息来完成我之后的事情,或者我看不清楚如何使用它们。

在这个特定用例中,我想要的是一个Go webapp节点自动相互检测并选出一个"领导者的系统。做簿记。理想情况下,这可以扩展到2到10个节点,并且不需要手动将IP地址添加到配置文件中(但如果需要,可以这样做)。

我正在考虑网络分区的情况,其中一个节点看不到其他节点,我不希望它选择自己作为领导者,因为有可能有两个节点试图同时做簿记。这也意味着如果我将群集剥离为仅仅是一个VM,则不会发生任何记账,但在维护期间可以容忍一段时间,或者我可以在某处设置某种标记。

我想知道是否有人能指出我正确的方向,并希望我能以低复杂度完成这项任务,同时尽可能地利用现有的代码库。

1 个答案:

答案 0 :(得分:2)

根据您的容错和一致性要求 - 特别是防止分区中的裂脑 - 像Raft这样的共识算法是您最想要的。但即使Raft是为可理解性而设计的,它仍然需要大量的专业知识才能正确实施。因此,正如其他人所提到的,您应该研究现有的服务或实现。

ZooKeeper(ZAB),etcd(Raft)和Consul(Raft)是用于执行此类操作的最广泛使用的系统。考虑到您希望VM从2个节点扩展到10个节点,这很可能是您想要的方式。 Raft和其他一致性算法具有仲裁要求,如果算法直接嵌入到您的VM中,则可能会以这种方式缩放。通过使用外部服务,您的虚拟机只需成为共识服务的客户,并可以独立扩展。

或者,如果您不希望依赖外部服务进行协调,Raft website会列出各种语言的详尽实施列表,其中一些是共识服务,其中一些可以嵌入。但请注意,其中许多都不完整。至少,任何适合生产的Raft实现必须实现日志压缩。如果没有日志压缩,服务器实际上只能运行一段有限的时间 - 直到磁盘填满日志。