在分布式系统中同步动作
Synchronize actions in a distributed system
什么techniques/tools可以用来实现具有这些需求的分布式系统:
在给定的时间,系统可以处于 3 种状态之一:SYNCING、COMPUTING 或 IDLE。
系统中每个节点可以接收两条指令:sync()和
计算()。
一条sync()指令会一次性发送到所有节点。在收到 sync() 指令后,如果系统处于 IDLE 状态,则每个节点都应将其本地缓存与数据库同步,系统状态将更改为 SYNCING。当所有节点完成同步后,系统状态变为 IDLE。在节点故障的情况下,一旦所有活动节点完成同步,系统状态仍应更改为 IDLE。
收到 compute() 指令后,如果系统未同步,节点将 运行 进行一些计算,系统状态应更改为 COMPUTING。当计算完成时,或者在节点故障的情况下,如果没有其他计算在进行中,状态应该变为 IDLE。
这可以通过 RabbitMQ 并为不同的消息指定送达回执选项来完成。 sync
条消息应传送到所有节点,而 compute
条消息应由第一个看到它的节点确认。
Zookeeper 将是同步操作的好选择。假设以下方法。有一个 /sync znode,每次需要触发同步时,它都会使用当前时间戳或一些新数据进行更新。基本上,主节点更新 /sync 节点的值以触发工作节点上的操作。
工作节点监视 /sync znode 以获取数据更改。因此,每次主节点更新/同步时,工作节点都会收到通知并更新其本地缓存。
此外,工作节点在 /workers znode 下注册自己(通过在 /workers 下使用一些 uuid 创建临时 znode)。这些节点将是临时的,因此如果一个工作人员 node/process 死亡,相应的临时节点就会消失。 workers 在 /workers znode 下监视 childern,因此当新 worker 出现或任何现有 worker 消失时,他们会收到通知。此外,他们还监视 /workers 下所有临时节点的数据变化。
现在一切如何运作:
Master 使用当前时间戳更新 /sync 以触发工作节点上的同步。
所有工作人员都会收到有关 /sync 节点中数据更改的通知。他们获取 /sync 节点的修改数据。
工作人员从数据库同步他们的缓存。
工作人员在 /workers 节点下更新其相应的 znode。例如,id 为 4dc1efd2-01c8-11e5-bee1-08002791d032 的 worker 更新了 znode /workers/4dc1efd2-01c8-11e5-bee1-08002791d032。
放置在 worker 特定 znode 上的数据是 "synced_at_timestamp"(例如 synced_at_1432451046000)
每当任何工作人员更新其 znode 时,所有其他工作人员都会收到通知。
所有 worker 不断检查 /workers 下所有 znode 的当前数据。
当 /workers 下的所有 worker znode 都具有相同的数据synced_at_timestamp,它们切换到 IDLE 状态。
可能还有许多其他可能的方法。如果你熟悉memcache、redis、hazelcast等,你也可以用它们来实现这样的系统。
什么techniques/tools可以用来实现具有这些需求的分布式系统:
在给定的时间,系统可以处于 3 种状态之一:SYNCING、COMPUTING 或 IDLE。
系统中每个节点可以接收两条指令:sync()和 计算()。
一条sync()指令会一次性发送到所有节点。在收到 sync() 指令后,如果系统处于 IDLE 状态,则每个节点都应将其本地缓存与数据库同步,系统状态将更改为 SYNCING。当所有节点完成同步后,系统状态变为 IDLE。在节点故障的情况下,一旦所有活动节点完成同步,系统状态仍应更改为 IDLE。
收到 compute() 指令后,如果系统未同步,节点将 运行 进行一些计算,系统状态应更改为 COMPUTING。当计算完成时,或者在节点故障的情况下,如果没有其他计算在进行中,状态应该变为 IDLE。
这可以通过 RabbitMQ 并为不同的消息指定送达回执选项来完成。 sync
条消息应传送到所有节点,而 compute
条消息应由第一个看到它的节点确认。
Zookeeper 将是同步操作的好选择。假设以下方法。有一个 /sync znode,每次需要触发同步时,它都会使用当前时间戳或一些新数据进行更新。基本上,主节点更新 /sync 节点的值以触发工作节点上的操作。
工作节点监视 /sync znode 以获取数据更改。因此,每次主节点更新/同步时,工作节点都会收到通知并更新其本地缓存。
此外,工作节点在 /workers znode 下注册自己(通过在 /workers 下使用一些 uuid 创建临时 znode)。这些节点将是临时的,因此如果一个工作人员 node/process 死亡,相应的临时节点就会消失。 workers 在 /workers znode 下监视 childern,因此当新 worker 出现或任何现有 worker 消失时,他们会收到通知。此外,他们还监视 /workers 下所有临时节点的数据变化。
现在一切如何运作:
Master 使用当前时间戳更新 /sync 以触发工作节点上的同步。 所有工作人员都会收到有关 /sync 节点中数据更改的通知。他们获取 /sync 节点的修改数据。 工作人员从数据库同步他们的缓存。 工作人员在 /workers 节点下更新其相应的 znode。例如,id 为 4dc1efd2-01c8-11e5-bee1-08002791d032 的 worker 更新了 znode /workers/4dc1efd2-01c8-11e5-bee1-08002791d032。 放置在 worker 特定 znode 上的数据是 "synced_at_timestamp"(例如 synced_at_1432451046000) 每当任何工作人员更新其 znode 时,所有其他工作人员都会收到通知。 所有 worker 不断检查 /workers 下所有 znode 的当前数据。 当 /workers 下的所有 worker znode 都具有相同的数据synced_at_timestamp,它们切换到 IDLE 状态。
可能还有许多其他可能的方法。如果你熟悉memcache、redis、hazelcast等,你也可以用它们来实现这样的系统。