使用MongoDB作为变更日志的两个系统之间的同步


11

我们正在开发两个相关的系统。其中一个(A)将安装在我们客户的机器上。其余(B)将由我的组织使用。

每个系统都有其自己的数据库(关系型),并且其架构也不同。但是,两个系统都必须同步。另外,必须将B中的某些更改导出到所有A类系统,而其他仅导出到特定的系统。

有些客户没有Internet连接,因此在某些情况下,必须通过交换文件来完成同步。

因此,我们正计划解决以下问题:

  1. 每个系统都维护其数据库的变更日志。我们计划用MongoDB实施它。
  2. 当系统初始化同步过程时,它将从日志中检索所有进行的更改。如果系统是B,则检索到的更改取决于目标。然后,系统以XML格式对它们进行序列化,最后(通过文件或网络)发送它们。
  3. 当另一端点接收到变更集时,它将对它们进行反序列化。然后,系统对数据进行一些必要的转换,最后记录所做的更改。在这一步中,如果有必要,系统必须解决可能存在的冲突。
  4. 最后,接收器系统发送其更改(以及其他解决冲突的产品)。

这种方法可行,可扩展且优雅吗?您将进行哪些更改或添加?


您是否看过与两个DBMS相关的任何工具来帮助复制数据?涉及哪些DBMS?
亚当·祖克曼

我们正在使用MySQL 5.5.8。我们看过一些工具,但我们认为它们不符合我们的要求。
2014年

一个陷阱是ObjectIds不会单调增加。
CodesInChaos 2015年

Answers:


1

如果您还没有这样做,那么您可能会发现有趣的是,了解事件驱动的系统,事件源和最终的一致性。您所描述的系统与这些模式有很多相似之处,这是一件好事。

您的方法听起来不错,尤其是:

  • 使用有序变更日志意味着同步过程只能检索自上次看到的变更以来所做的变更。这样可以减少处理时间,从而有助于扩展性,并在互联网连接可用的情况下使您可以建立近实时同步。
  • 没有Internet连接的客户会迫使您考虑立即处理延迟和无序的同步,而不是依靠快速同步并无意中导致可伸缩性问题。

在不了解域模型的情况下,我的猜测是解决冲突是导致您最麻烦的部分。我会花一些时间思考如何解决各种冲突。尤其是:

  • 某些冲突是否需要用户解决?
  • 客户系统是否始终是解决冲突的正确场所?
  • 客户系统发送其更改后,步骤4之后的系统B中是否可能存在冲突?

0

每个系统都维护其数据库的变更日志。我们计划用MongoDB实施它。

您可以使用事件存储。数据的任何更新都会在存储中创建一个新事件。

当系统初始化同步过程时,它将从日志中检索所有进行的更改。如果系统是B,则检索到的更改取决于目的地。然后,系统以XML格式对它们进行序列化,最后(通过文件或网络)发送它们。

您可以使用任何机制来发送事件,但是,如果不需要处理文件,则在可能的情况下使用总线会更容易。通常,可以将它们配置为保留消息,直到可以发送连接为止。

当另一端点接收到变更集时,它将对它们进行反序列化。然后,系统对数据进行一些必要的转换,最后记录所做的更改。在这一步中,如果有必要,系统必须解决可能存在的冲突。

只需将事件应用于您的域对象。

最后,接收器系统发送其更改(以及其他解决冲突的产品)。

使用相同的方法。

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.