实现主从式
Implement master-slave
在Ubuntu上运行。程序是用C++编写的。我有两个进程在不同的主机上运行,其中一个是主进程,另一个是从进程(它们之间没有任何优先级,只有一个句柄请求)。只有一个进程可以是master和handle请求。两个进程总是启动,如果它们崩溃,有一个看门狗会重新启动它们。
主机通过网络电缆连接。
我的计划是要求从一个到另一个保持生命,以防奴隶停止从主人那里获得生命,它需要将状态更改为主人。当主机再次启动时,它首先等待保持活动状态,以防无法将其设置为主机。如果获取它,则将角色设置为从属角色。
我很乐意得到你对的意见
如何防止两者同时成为高手这是我主要关心的问题。当启动和连接失败时,如何同时阻止两个主机?
你认为查询保活还是发送保活会更好?(在我看来,要求保持活力比推动更好)
任何其他好的建议和陷阱都是非常受欢迎的。
我这样做的方法是让每个进程生成一个心跳线程,该线程每秒发送一次UDP数据包,并侦听来自另一个进程的传入UDP数据包。如果心跳线程在指定的时间(例如5秒)内没有从另一个进程接收到任何UDP数据包,它会假设另一个过程已关闭,并通知父线程它现在应该成为主线程。
心跳发送/侦听是在专用线程中完成的,因为这样,如果主线程忙于进行长时间的计算,就不会导致心跳UDP数据包暂时无法发送。这样,主线程中的算法就不需要是实时的,以避免触发虚假的故障切换。
这里还有另一个问题需要思考。。。如果网络问题暂时中断了两台主机之间的通信,会发生什么?(例如,一些小丑或QA测试人员将以太网电缆拔出1分钟,然后将其插回)在这种情况下,两个进程都将停止接收来自另一个进程的UDP数据包,因此两个进程会认为另一个过程已经离开,并且两个进程将成为主进程。然后,当重新连接网络电缆时,您会同时运行两个主进程,这不是您想要的。因此,为了满足Highlander原则("只能有一个!"),两个主进程需要某种方式来决定哪一个应该将自己降级回从属状态。这可以很简单,比如"具有最小IP地址的主机应该保持为主",或者你可以让每个心跳数据包都包含发送过程的正常运行时间,而具有较大正常运行时间的主机应该保留为主,等等。
解决这个问题的典型方法是举行选举。系统中的每个人都共享他们将用作算法输入的数据,这样每个人都可以得出相同的结论。
例如:对等方都(两者)向对方发送一些唯一的标识符(MAC地址、pid或高精度进程开始时间,例如)。然后每个对等方使用相同的比较来确定获胜者(最大值,例如),然后将结果通知对方。
有关瞬态连接故障的问题,请参阅拜占庭将军。
另请参阅:
- 如何在集群中运行的节点中选择主节点
- 如何在集群中选择新的Master
- https://en.wikipedia.org/wiki/Leader_election
- 如果没有malloc,链表实现将失败
- 如何在c++中实现处理器调度模拟器
- 如何在c++中使用引用实现类似python的行为
- 实现无开销push_back的最佳方法是什么
- 使用简单类型列表实现的指数编译时间.为什么
- 如何在BST的这个简单递归实现中消除警告
- 实现一个在集合上迭代的模板函数
- 我应该实现右值推送功能吗?我应该使用std::move吗
- 如何正确实现和访问运算符的各种自定义枚举器
- C++Union/Struct位域的实现和可移植性
- 这个极客对极客的trie实现是否存在内存泄漏问题
- 在c++中实现LinkedList时,应出现未处理的错误
- 为左值和右值的包装器实现C++范围
- 使用模板进行堆栈实现; "name followed by :: must be a class or namespace"
- 使用GSoap实现ONVIF
- 在用于格式4的arm模拟器中实现功能时的一个问题
- 用于AVX的ln(x)的实现,m256
- 用常见虚拟函数实现的任意组合来实现派生类的正确方法是什么
- 在C++中,如何在类和函数(可能是模板化的)的头中编写完整的实现
- std::random_device是如何实现的