我正在编写一个相当复杂的 Go webapp,我想让它高度可用。我计划让多个 VM 运行该应用程序,并使用负载平衡器根据我的需要在它们之间引导流量。
它变得复杂的地方在于 webapp 有一种数据库簿记例程在运行,我只想要(最多)任何时候的一个实例。因此,如果我有三个 webapp 虚拟机,那么只有其中一个应该进行簿记。
(是的,我知道我可以将簿记完全拆分为一个单独的 VM 实例,但代码已与 web 应用程序的其余部分高度集成。)
我花了几个小时研究etcd、raft、bully、memberlist、Pacemaker等等。这些似乎都需要吸收很多信息来完成我所追求的目标,或者我看不到使用它们的明确方法。
在这个特定用例中,我想要的是一个系统,让 Go webapp 节点自动检测彼此并选举一个“领导者”来进行簿记。理想情况下,这可以扩展到 2 到 10 个节点,并且不需要手动将 IP 地址添加到配置文件(但可能,如有必要)。
我在想在网络分区或其他节点无法看到其他节点的情况下,我不希望它选举自己作为领导者,因为有可能有两个节点试图在同时。这也意味着,如果我将集群精简为单个 VM,则不会发生簿记,但在维护期间可以容忍一小段时间,或者我可以在某处设置某种标志。
我想知道是否有人可以为我指出正确的方向,希望我如何能够以低复杂度实现这一目标,同时尽可能地利用现有的代码库。
凤凰求蛊
相关分类