破坏者模式 - 主节点和从节点如何保持同步?

Posted

技术标签:

【中文标题】破坏者模式 - 主节点和从节点如何保持同步?【英文标题】:Disruptor pattern - how are master and slave nodes kept in sync? 【发布时间】:2013-07-15 21:03:29 【问题描述】:

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

主节点的复制器将事件写入数据库(尽管我们可以认为比写入数据库更好的机制——这对问题陈述不是很重要)。从节点的Receiver从DB中读取,并将事件放到从节点的环形缓冲区中。

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

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

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

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

但我不确定它如何保持业务逻辑处理器同步?有什么想法吗?

【问题讨论】:

【参考方案1】:

复制是直接从主节点到从节点,而不是通过数据库。复制门从从站确认。

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

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

【讨论】:

感谢马丁的回复。如果 master 的复制器从 slave 的 ACK 上“门”,那么在 slave 关闭的情况下,master 的业务逻辑处理器无法继续?这种情况如何处理? Disruptor 是一种用于线程间消息传递的模式。您的问题是关于如何在事件源系统中实现高可用性,因此超出了 Disruptor 的范围。 Martin Folwer 的文章只是说明如何使用 Disruptor 的一个例子。 复制共识算法的一个例子可以在这里找到ramcloud.stanford.edu/wiki/download/attachments/11370504/…【参考方案2】:

如果丢弃事件的成本很低,那么您可以忽略它 (?)。

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

在现实世界的实现中,您的架构可能需要额外的下游支持(尤其是重放/重试)。根据您的应用程序要求,您需要能够检测输出事件中是否存在间隙并在必要时获取它们。假设您的事件是幂等的,那么及时返回并重播事件应该没有问题。

假设您的出站频道丢失了一个数据包,或者您的互联网线路出现故障?即使它成功地从干扰器中发出,它仍然可能丢失。这取决于您的特定应用程序,并且需要比这里更多地考虑您可以容忍哪些故障情况。

【讨论】:

我认为如果我们确实认识到差距,回放事件的想法很重要。谢谢

以上是关于破坏者模式 - 主节点和从节点如何保持同步?的主要内容,如果未能解决你的问题,请参考以下文章

redis的主从分片和集群简述

简述MySQL主从复制的原理面试必看

我如何在视图中保持下降的精灵节点?

创建一个在 MPI 进程之间保持同步的计数器

主从分布式怎么写

Mysql-高可用集群[主从单一模式-binlog]