实现主从

时间:2012-09-22 15:39:47

标签: c++ linux master-slave stability

在Ubuntu上运行。程序是用C ++编写的。 我有2个进程在不同的主机上运行,​​当一个是master而一个是slave(它们之间没有任何优先级,只有一个句柄请求。)。 只有一个进程可以是主进程和处理请求。 两个进程总是向上,如果它们崩溃,有一只看门狗重启它们。

主机通过网线连接。

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

我很乐意得到您的意见:

如何防止两者同时掌握?这是我的主要关注点。启动和连接失败时,如何同时防止2个主站?

你认为查询保持活着还是保持活着会更好吗? (对于我来说,要求保持活力比推动更好)

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

1 个答案:

答案 0 :(得分:4)

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

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

还有另一个需要考虑的问题......如果网络问题暂时切断两台主机之间的通信会怎样? (例如,一些小丑或QA测试人员将以太网电缆拔出1分钟,然后重新插入)在这种情况下,两个进程都将停止从其他进程接收UDP数据包,因此两个进程都会认为其他进程已经消失,并且两者都将成为主流程。然后,当重新连接网络电缆时,您有两个主进程同时运行,这不是您想要的。因此,您需要某种方法让两个主进程决定将两者中的哪一个降级为自身状态,以满足汉兰达原则(“只能有一个!”)。这可能很简单,“具有最小IP地址的主机应保持为主”,或者您可以让每个心跳包包含发送进程的正常运行时间,并且具有较长正常运行时间的主机应保持为主,或等等。