可以使用哪些技术/工具来实现满足这些要求的分布式系统:
在给定时间,系统可以处于 3 种状态之一:同步、计算或空闲。
系统中的每个节点可以接收两个指令:sync()和 计算()。
sync()指令将立即发送到所有节点。收到sync()指令后,如果系统处于IDLE状态,每个节点应将其本地缓存与数据库同步,并且系统状态更改为SYNCING。当所有节点完成同步后,系统状态将更改为 IDLE。如果发生节点故障,一旦所有事件节点完成同步,系统状态仍应更改为 IDLE。
收到compute()指令后,如果系统未同步,节点将运行一些计算,并且系统状态应更改为COMPUTING。当计算完成时,或者在节点发生故障的情况下,如果没有其他计算正在进行,状态应更改为 IDLE。
最佳答案
Zookeeper 将是同步操作的一个不错的选择。假设以下方法。有一个/sync znode,每次需要触发同步时都会使用当前时间戳或一些新数据进行更新。基本上,主节点更新/sync 节点的值以触发工作节点上的操作。
工作节点在/sync znode 上监视数据更改。因此,每次主节点更新/同步时,工作人员都会收到通知并更新其本地缓存。
此外,工作节点在/workers znode 下注册自己(通过在/workers 下创建带有一些 uuid 的临时 znode)。这些节点将是临时的,因此如果工作节点/进程死亡,相应的临时节点就会消失。工作人员在/workers znode 下放置了子进程的监视,因此当新工作人员出现或任何现有工作人员消失时,他们会收到通知。此外,他们还监视/workers 下所有临时节点上的数据更改。
现在一切是如何运作的:
Master 使用当前时间戳更新/sync 以触发工作节点上的同步。 所有工作人员都会收到有关/sync 节点中的数据更改的通知。他们获取/sync 节点的修改数据。 工作人员从数据库同步他们的缓存。 工作人员在/workers 节点下更新其相应的 znode。例如,ID为4dc1efd2-01c8-11e5-bee1-08002791d032的worker更新znode/workers/4dc1efd2-01c8-11e5-bee1-08002791d032。 放置在工作人员特定 znode 上的数据是“synced_at_timestamp”(例如,synced_at_1432451046000) 每当任何工作人员更新其 znode 时,所有其他工作人员都会收到通知。 所有workers都会不断检查/workers下所有znode上的当前数据。 当/workers 下的所有worker znode 具有相同的数据synced_at_timestamp 时,它们会切换到IDLE 状态。
可能还有许多其他可能的方法。如果你熟悉memcache、redis、hazelcast等,你也可以使用它们来实现这样的系统。
关于distributed - 同步分布式系统中的操作,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30407788/