我正在开发由主服务器和工作服务器组成的分布式系统。应该有两种消息:
心跳
Master获取工作状态并立即使用适当的命令进行响应。例如:
参与者用间隔T交换此消息。
直接掌握命令
让我们说客户要求主人杀掉#123的职位。这是对话:
很明显,我们无法预测此消息何时出现。
最简单的解决方案是 master 是两个消息的所有通信的发起者(在心跳的情况下,我们将包括来自 master 的另一个以开始交换)。但我们假设在主方为N 工作人员进行所有心跳管理是很昂贵的。我们不想浪费我们的资源来保持与工作服务器的几个tcp连接,所以我们只有一个。
这种限制是否有任何解决方案?
答案 0 :(得分:0)
首先,您必须在某处某些簿记 。否则,谁会意识到一个工人已经死了?如果您正在构建主/工作系统,那么将数据放在主数据上的自然位置。否则,可以要求工人在长圆圈或随机图表中跟踪彼此。如果工作人员注意到他们的帐户不再响应,则可以提醒主人。
同样的事情适用于当前正在运行的作业列表;谁跟踪那个?它也可以扩展O(n),因此大师可能也没有空间。在工人之间对数据进行分析(例如,通过跟踪他们的账户可能做的事情)到目前为止只能起作用;如果a
和b
崩溃,而a
是唯一照顾b
的人,则您刚刚丢失了b
上运行的作业列表(可能还有本应通知您b
崩溃的警报。
我建议针对此类任务使用分布式一致性算法。对于生产,使用其他人已经写过的东西;他们可能知道他们在做什么。如果它是出于学习目的,我认为,请查看raft consensus algorithm。它不是很难理解,但仍然突出了分布式系统中的许多复杂性。模拟器是正确理解的黄金。
面对崩溃的工作人员,主人/工人系统永远不会为O(n)
工作人员提供少于n
个资源。根据定义,即使一些工人管理其他工人,主人也需要控制工人,即O(n)
工作。另外,如果主机崩溃会发生什么?
答案 1 :(得分:0)
就像Filip Haglund所说,读筏纸你也应该自己实施。但简而言之,你需要从中提取出来的是这个。在成为会员管理的成员。
您需要在所有节点上保留成员资格列表和主人身份。
筏子在主人的心跳上发送它不是非常昂贵的网络,你不需要让它们保持开放状态。如果他们没有回复主人,则每隔200毫秒到秒,您需要发送心跳信息告诉奴隶从列表中删除成员x。
然而,如果主人死得很好怎么办,基本上你需要预设候选节点。如果您在超时时间内没有收到心跳,则候选人会请求来自群集其余部分的投票。如果你获得最轻微的多数,你就会成为新的领导者。
如果您想加入与上述基本相同的现有群集,如果不是领导者回复不是领导者地址的领导者。