繁体   English   中英

如何进行跨库信息同步?

[英]How to do cross-database information syncing?

我正在设计一个目录,其中多个源中的数据在更改或更新时必须覆盖其他源中的数据。 一些数据库是 MySQL、SQL 服务器和一些信息将是 AD/LDAP。

我的问题是:这种类型的数据库传播是否有设计模式,以减少流量并防止错误? 这个项目也将在 PHP 中,所以如果有人知道我可以适应的类似开源项目,那也很好。 一些数据库之间可能必须有一些逻辑。

您需要一些方法来标记要同步的记录。 我们使用这样的系统,其中每个要同步的表都有一个保持同步状态的列。 修改记录时,它也会修改其 state(在触发器中),并且同步工具每隔几分钟查询一次修改的记录。

缺点是您需要大量代码才能正确处理此问题,尤其是因为您无法直接删除记录。 同步工具首先需要知道并且需要执行实际的删除。 除此之外,这种方式很难建立一个好的队列,所以如果记录在他们的父母之前同步,你会得到一个错误。 每个必须同步的表都需要一个额外的列。

所以现在有一个新的解决方案即将实施。 此解决方案为队列使用单独的表。 队列包含指向其他表中记录的指针(主键值和对表名/字段名的引用)。 该队列现在是唯一监控更改的表,因此表需要做的就是实现一个触发器,将修改的记录标记为队列中的已修改。 因为它是单独表中的单个队列,这增加了我前面提到的问题的解决方案:

  • 记录可以立即删除。 同步工具在队列中找到一个 id,验证它不再存在,因此它也将它从另一个数据库中删除
  • 自动解决子父依赖关系。 新的父级将在其子级之前在队列中,而已删除的父级将在其子级之后。 您可能会在交叉链接记录中发现唯一的问题,尽管延迟提交可能是解决此问题的方法。
  • 所有表中都不需要额外的列。 只有一个队列、一些辅助表和一个触发器,其中包含对要同步的每个表的单个 function 调用。

不幸的是,我们还没有完全实现这个解决方案,所以我不能告诉你它是否会更好地工作,尽管测试肯定会这样。

请注意,该系统会进行一对一的记录副本。 我认为这也是最好的方法。 复制数据,然后(之后)在目标服务器上处理它。 我认为在复制数据时处理数据不是一个好主意。 如果出现任何问题,您将不得不进行调试和恢复/重新计算数据的工作。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM