在 Ubuntu 上运行。程序是在 C++ 中。 我有 2 个进程在不同的主机上运行,一个是主进程,一个是从进程(它们之间没有任何优先级,只有一个处理请求。)。 只有一个进程可以是master 和handle 请求。 两个进程始终处于运行状态,如果它们崩溃,则有一个看门狗会重新启动它们。
主机通过网线连接。
我的计划是要求从一个到另一个保持活力,如果奴隶停止从主人那里保持活力,它需要将其状态更改为主人。 当 master 再次启动时,它首先等待 keep alive,以防万一它无法将角色设置为 master。如果得到它设置角色为奴隶。
我很乐意听取您的意见:
如何防止两者同时成为主人?这是我主要关心的问题。启动时连接失败,如何防止同时有2个master?
你觉得查询keepalive好还是发送keepalive好? (在我看来,请求 keep alive 比 push 更好)
我们非常欢迎任何其他好的建议和陷阱。
最佳答案
我这样做的方法是让每个进程产生一个心跳线程,每秒发送一次 UDP 数据包,并监听来自其他进程的传入 UDP 数据包。如果心跳线程在指定的时间(例如 5 秒)内没有收到来自其他进程的任何 UDP 数据包,它会假定其他进程已关闭并通知父线程它现在应该成为主线程。
心跳发送/监听之所以在专用线程中完成,是因为这样如果主线程忙于进行冗长的计算,也不会导致心跳UDP包暂时不发送。这样,主线程中的算法就不需要是实时的,以避免触发虚假的故障转移。
这里还有一个问题需要考虑……如果网络问题暂时切断了两台主机之间的通信会怎样? (例如,一些 joker 或 QA 测试人员拔下以太网电缆 1 分钟,然后将其重新插入)在这种情况下,两个进程将停止从另一个进程接收 UDP 数据包,因此两个进程都会认为另一个进程已经消失,并且两者都将成为主进程。然后当网线重新连接时,你有两个主进程同时运行,这不是你想要的。所以你需要一些方法让两个主进程决定两个主进程中的哪一个应该将自己降级回从属状态,以满足高地原则(“只能有一个!”)。这可以像“具有最小 IP 地址的主机应该保持为主”一样简单,或者您可以让每个心跳包包含发送进程的正常运行时间,而具有较大正常运行时间的主机应该保持为主,等等。
关于c++ - 实现主从,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12545189/