实现主从式

Implement master-slave

本文关键字:实现      更新时间:2023-10-16

在Ubuntu上运行。程序是用C++编写的。我有两个进程在不同的主机上运行,其中一个是主进程,另一个是从进程(它们之间没有任何优先级,只有一个句柄请求)。只有一个进程可以是master和handle请求。两个进程总是启动,如果它们崩溃,有一个看门狗会重新启动它们。

主机通过网络电缆连接。

我的计划是要求从一个到另一个保持生命,以防奴隶停止从主人那里获得生命,它需要将状态更改为主人。当主机再次启动时,它首先等待保持活动状态,以防无法将其设置为主机。如果获取它,则将角色设置为从属角色。

我很乐意得到你对的意见

如何防止两者同时成为高手这是我主要关心的问题。当启动和连接失败时,如何同时阻止两个主机?

你认为查询保活还是发送保活会更好?(在我看来,要求保持活力比推动更好)

任何其他好的建议和陷阱都是非常受欢迎的。

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

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

这里还有另一个问题需要思考。。。如果网络问题暂时中断了两台主机之间的通信,会发生什么?(例如,一些小丑或QA测试人员将以太网电缆拔出1分钟,然后将其插回)在这种情况下,两个进程都将停止接收来自另一个进程的UDP数据包,因此两个进程会认为另一个过程已经离开,并且两个进程将成为主进程。然后,当重新连接网络电缆时,您会同时运行两个主进程,这不是您想要的。因此,为了满足Highlander原则("只能有一个!"),两个主进程需要某种方式来决定哪一个应该将自己降级回从属状态。这可以很简单,比如"具有最小IP地址的主机应该保持为主",或者你可以让每个心跳数据包都包含发送过程的正常运行时间,而具有较大正常运行时间的主机应该保留为主,等等。

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

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

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

另请参阅:

  • 如何在集群中运行的节点中选择主节点
  • 如何在集群中选择新的Master
  • https://en.wikipedia.org/wiki/Leader_election