Zookeeper是否适合此场景?

3
这是我的需求。
我有一群机器组成的集群(比如4台,A、B、C、D)。A的任务是轮询数据库以获取更新(例如,在订单表中查找新订单)。一旦A收到更新,它会验证B、C、D哪个相对空闲(负载平衡是正确的词语),然后命令其中一个(B、C或者D)开始处理该订单。A跟踪B/C/D正在处理哪个订单。
B、C和D就像从属于A的节点 - 它们只接收来自A的更新,并在完成订单处理时通知A。如果A出现故障(由于网络问题或其他原因),那么B、C或D中的一个将成为主节点并执行A的职责。A关于正在运行的作业的元数据也定期备份到备份节点E。因此,当B/C/D成为新的主节点时,它会从E中读取元数据。
我知道这听起来有点像Hadoop,但是订单处理无法适应MapReduce模型,因此我正在寻找利用其他框架(如ZooKeeper)来协调A、B、C和D之间的协调的方法。
ZooKeeper在这里合适吗?
2个回答

11

Zookeeper是解决协调问题的自然选择。

以下配方可用于您的用例。

A的工作是轮询数据库以获取更新(因此,A可以在订单表中寻找新订单)。一旦收到更新,A会验证B、C、D中哪一个相对空闲(负载均衡是我猜测的正确术语)。它然后命令B、C、D中的一个开始处理订单。A跟踪正在B/C/D上处理哪个订单。

分布式队列可用于任务调度。

B、C、D就像从属者-他们只从A那里接收更新并在完成订单处理时通知A。如果A崩溃(由于网络问题或其他原因),B、C、D中的一个将成为主节点,并执行A的职责。

看起来像是领导者选举问题。

A关于正在运行的工作的元数据也定期备份到备用节点E。

您可以使用Zookeeper存储元数据。


这些示例/教程的问题在于,其中大部分内容都与我无关。例如,有一个示例讲解如何在zookeeper中设置观察者等,但几乎没有实际对所有这些节点执行任何操作的内容(比如简单的计算或数据库访问等)。 - Jay
Jay,我有一个类似于你的应用程序(需要知道哪些机器B、C或D接受了任务)。所以我们最终做的是:将具有唯一ID的作业写入队列并在其上设置监视器。 B、C或D抓取作业,然后创建一个名为/jobs/uniqueID的新节点(如果可能的话是原子性的),并附带一些数据说明哪台机器拥有它。通过监视器提醒A作业已从队列中移除,然后可以直接访问/jobs/uniqueID来查看谁正在处理它(如果这确实对您很重要)。 - Mike

3

Zookeeper非常适合用于集群同步(例如主节点的选举)。另一个相关的子项目是bookkeeper,它也可以帮助你。

需要注意的是,hadoop并没有使用zookeeper(版本0.23会使用,但尚未发布)- HBase在当前和以前的版本中都使用了它。


版本0.23已经在一个月前发布了,但仍处于alpha测试阶段。 - Praveen Sripati
1
alpha = 还未发布 :) - Arnon Rotem-Gal-Oz
1
alpha = alpha "release" - 技术上来说,是一个发布;-) - Jay
1
@Jay,无论如何:)如果你想使用zookeeper,你可能想看看Netflix的curator库,它使使用更加容易。http://techblog.netflix.com/2011/11/introducing-curator-netflix-zookeeper.html - Arnon Rotem-Gal-Oz

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接