2

据我所知,celery beat 是一个被认为是 SPOF 的调度程序。这意味着服务崩溃,没有任何东西会被安排和运行。

我的情况是,我需要一个带有两个调度程序的 HA 设置:主/从,主周期性地进行一些调用(比如说每 30 分钟),而从可以空闲。

当 master 崩溃时,slave 需要成为 master 并从死去的 master 身上捡起剩下的东西,并执行周期性任务。(领导人选举)

这里的要求是:

  1. 任务每 30 分钟安排一次(这可以通过 celery beat 来实现)
  2. 该任务不是原子的,它不仅仅是每 30 分钟一次失败或成功的调用。假设每 30 分钟,该任务会发出 50 个不同的调用。如果 master 完成 25 次并崩溃,slave 预计会出现并完成剩余的 25 次,而不是再次完成所有 50 次调用。
  3. 当死掉的master从故障中重新启动时,它需要意识到已经有一个master在运行。无论如何,它不需要作为主人出现,只需要保持空闲直到正在运行的主人再次崩溃。

起搏器与芹菜相结合是实现这一目标的正确工具吗?

4

1 回答 1

1

简短的回答是“是的”。Pacemaker 会在这里做你想做的事。

更长的答案是,由于需要在序列中间重新启动,您的架构很棘手。

您有两种可用的解决方案。第一种是使用某种数据库(或 DRBD 文件系统)来记录 50 次调用中有 25 次已完成的事实。问题不在于已完成的 24 个调用,也不是 25 个尚未完成的调用,而是系统崩溃时正在执行的调用。打电话给#25,说。如果 C25 还没有开始,那么你就可以了。从站将在 Pacemaker 控制下启动,DRBD 文件系统将故障转移,新的主站将执行 #25 到 #50。如果#25 被调用但老主人还没有这样标记它会发生什么?

您可以对其进行架构设计,使其在实际执行之前将调用标记为完成,在这种情况下,C25 在此特定情况下不会被调用,或者您可以在调用之后将其标记为完成,在这种情况下,C25 将被调用两次.

理想情况下,您将使调用具有幂等性。这是您的第二个选择。在这种情况下,是否再次调用 C1 -> C25 并不重要,因为没有重复影响。C26 -> C50 只被调用一次。我对您的架构知之甚少,无法说出哪个可行,但希望这会有所帮助。

Pacemaker 肯定会处理故障转移。添加 DRBD,您可以保存两个系统之间的状态。但是,您需要自己解决部分调用问题。

于 2013-09-11T09:24:39.903 回答