用于故障转移的分布式单例服务

Distributed singleton service for failover

我有一个抽象的问题。

我需要一个具有容错功能的服务。该服务一次只能 运行ning 在一个节点上。这是关键。

有两个连接节点:A 和 B。

我考虑过用于同步节点状态和检测超时的心跳协议,但是存在很多竞争条件。

我可以添加带有全局锁的第三个节点,但我不确定该怎么做。

有人知道执行此操作的任何知名算法吗?或者更好 是否有任何开源软件可以让我控制这类事情?

谢谢

如果您可以在节点之间提供某种共享内存,那么就有解决此问题的经典算法,称为 Peterson's algorithm

它基于两个额外的变量,称为 flagturnTurn是一个整型变量,其值表示当前允许激活的节点索引。换句话说,turn=1表示1号节点有权激活,其他节点应该等待。换句话说,轮到他主动了——这就是名字的由来。

Flag 是一个布尔数组,其中 flag[i] 表示第 i 个节点声明自己已准备好服务。在您的设置中,flag[i]=false 表示第 i 个节点已关闭。该算法的关键部分是准备好服务的节点(即flag[i] = true)必须等到他获得turn.

算法最初是为了解决critical section无冲突的执行问题而开发的。但是,在您的情况下,关键部分只是 运行 服务。您只需确保在第 i 个节点关闭之前,它将 flag[i] 设置为 false。这绝对是一个棘手的部分,因为如果一个节点崩溃了,它显然不能设置任何值。我会带着某种心跳去这里。

关于解决类似问题的开源软件,尝试搜索"cluster failover"。阅读 Google's Paxos and Google FileSystem。有很多解决方案,但如果您想自己实现一些东西,我会尝试 Peterson 的算法。