干扰模式 - 主节点和从节点如何保持同步?

时间:2013-07-17 10:41:01

标签: failover disruptor-pattern lmax

LMAX Disruptor模式中,复制器用于将输入事件从主节点复制到从节点。所以设置可能如下所示:

enter image description here

主节点的复制器将事件写入数据库(虽然我们可以想到比写入数据库更好的机制 - 但它对问题语句并不重要)。从节点的接收器从DB读取并将事件放入从节点的环形缓冲区。

忽略从属节点的输出事件。

现在,主节点的业务逻辑处理器可能比从节点的业务逻辑处理器慢。例如,主节点的BL可以在插槽102处,其中从节点可以在106处。(这可能是因为复制器在业务逻辑处理器之前从环形缓冲区读取事件)。

在这种情况下,如果主节点发生故障并且从节点现在成为主节点,则外部系统可能会遗漏一些关键事件。这可能发生,因为节点2在充当从节点时会忽略其输出。

Martin Fowler确实声明复制器的工作是保持节点同步: “之前我提到LMAX在集群中运行其系统的多个副本以支持快速故障转移。复制器使这些节点保持同步”

但我不确定它如何使Business Logic Processor保持同步?有什么想法吗?

2 个答案:

答案 0 :(得分:7)

复制直接从主节点到从节点,而不是通过数据库。复制在来自从站的确认时启动。

http://www.infoq.com/presentations/LMAX

上面的链接更详细,值得阅读有关演示文稿的评论讨论。

答案 1 :(得分:1)

如果成本低,放弃了事件,那么你可以忽略它(?)。

作为一个简单的实现,您可以让主服务器上的输出中断通知从服务器已完成发送数据包。可以将其视为两阶段复制器 - 一个复制事件,另一个复制器确认事件已发送。

在实际实施中,您可能需要在架构中提供额外的下游支持(尤其是重播/重试)。根据您的应用程序要求,您需要能够检测输出事件中是否存在间隙并根据需要获取它们。假设您的事件是幂等的,那么应该没有问题可以追溯并重播事件。

假设您的出站频道丢失了一个数据包,或者您的互联网线路出现问题?即使它成功地从破坏者发出,它仍然可能会丢失。这取决于您的具体应用程序,并且需要更多的思考,以了解您可以容忍的故障情况。