6

在 Ubuntu 上运行。程序是用 C++ 编写的。我有 2 个进程在不同的主机上运行,​​一个是主进程,一个是从属进程(它们之间没有任何优先级,只有一个处理请求。)。只有一个进程可以成为主进程并处理请求。两个进程始终启动,如果它们崩溃,则会有一个看门狗重新启动它们。

主机通过网线连接。

我的计划是要求从一个到另一个保持活动状态,以防奴隶停止从主人那里保持活动状态,它需要将其状态更改为主人。当 master 再次启动时,它首先等待保持活动状态,以防不将其设置为 master。如果将其设置为奴隶。

我很乐意听取您的意见:

如何防止两者同时成为大师?这是我最关心的问题。当启动和连接失败时,你如何防止2个master同时出现?

你认为查询keep alive还是发送keep alive更好?(在我看来,最好是要求保持活力而不是推动)

任何其他好的建议和陷阱都将受到欢迎。

4

2 回答 2

4

我这样做的方法是让每个进程产生一个心跳线程,该线程每秒发送一次 UDP 数据包,并侦听来自其他进程的传入 UDP 数据包。如果心跳线程在指定的时间内(例如 5 秒)没有收到来自其他进程的任何 UDP 数据包,则假定其他进程已关闭并通知父线程它现在应该成为主线程。

心跳发送/侦听在专用线程中完成的原因是,如果主线程忙于进行冗长的计算,不会导致心跳UDP数据包暂时不发送。这样,主线程中的算法不需要是实时的,以避免触发虚假的故障转移。

这里还有一个问题要考虑……如果网络问题暂时中断了两台主机之间的通信会发生什么?(例如,一些小丑或 QA 测试人员拔下以太网电缆 1 分钟,然后将其重新插入)在这种情况下,两个进程将停止接收来自另一个进程的 UDP 数据包,因此两个进程都会认为另一个进程已经消失,并且两者都将成为主进程。然后当重新连接网线时,你有两个主进程同时运行,这不是你想要的。因此,您需要一些方法让两个主进程来决定两个主进程中的哪一个应该将自己降级为从属状态,以满足汉兰达原则(“只能有一个!”)。这可以像“IP 地址最小的主机应该保持主控”一样简单,

于 2012-09-22T16:12:08.087 回答
1

解决这个问题的典型方法是举行选举。系统中的每个人都共享他们将用作算法输入的数据,以便每个人都能得出相同的结论。

例如:对等点都(都)相互发送一些唯一标识符(MAC 地址,或 pid,或高精度进程开始时间,例如)。然后每个对等方使用相同的比较来确定获胜者(例如,最大值)。然后他们互相通知结果。

有关瞬时连接故障的问题,请参阅拜占庭将军

也可以看看:

于 2012-09-23T05:21:05.123 回答