Avi*_*ano 6 c++ linux stability master-slave
在Ubuntu上运行.程序是用C++编写的.我有2个进程在不同的主机上运行,当一个是master而一个是slave(它们之间没有任何优先级,只有一个句柄请求.).只有一个进程可以是主进程和处理请求.两个进程总是向上,如果它们崩溃,有一个看门狗重新启动它们.
主机通过网线连接.
我的计划是要求从一个到另一个保持活着,并且如果奴隶停止从主人那里保持活着,则需要将其状态改为主人.当master再次启动时,它首先等待保持活动状态,以防万一将其设置为master.如果让它设置为奴隶角色.
我很乐意得到您的意见:
如何防止两者同时掌握?这是我的主要关注点.启动和连接失败时,如何同时防止2个主站?
你认为查询保持活着还是保持活着会更好吗?(对于我来说,要求保持活力比推动更好)
任何其他好的建议和陷阱都将受到欢迎.
我这样做的方法是让每个进程生成一个心跳线程,该线程每秒发送一次 UDP 数据包,并侦听来自其他进程的传入 UDP 数据包。如果心跳线程在指定的时间内(例如 5 秒)没有收到来自其他进程的任何 UDP 数据包,则它假定其他进程已关闭并通知父线程它现在应该成为主线程。
之所以心跳发送/监听是在专门的线程中完成的,是因为这样如果主线程忙于进行冗长的计算,也不会导致心跳UDP包暂时无法发送。这样,主线程中的算法不需要是实时的,以避免触发虚假故障转移。
这里还有另一个问题需要考虑......如果网络问题暂时切断了两台主机之间的通信,会发生什么?(例如,一些小丑或 QA 测试人员拔掉以太网电缆 1 分钟,然后将其重新插入)在这种情况下,两个进程都将停止接收来自另一个进程的 UDP 数据包,因此两个进程都会认为另一个进程已经消失,并且两者都将成为主进程。然后当重新连接网线时,您会同时运行两个主进程,这不是您想要的。因此,您需要某种方法让两个主进程决定两个进程中的哪一个应该将自己降级回从属状态,以满足高地原则(“只能有一个!”)。这可以像“具有最小 IP 地址的主机应保持主机”一样简单,或者您可以让每个心跳数据包包含发送进程的正常运行时间,而具有较长正常运行时间的主机应保持主机状态,等等。
| 归档时间: |
|
| 查看次数: |
2150 次 |
| 最近记录: |