部分双向数据库同步框架

Framework for partial bidirectional database synchronization

我正在尝试优化信息系统的后端以实现高可用性,这涉及将时间关键型客户请求(前台)所需的部分与其余部分(后台)分开。

前台将配备具有负载平衡功能的冗余应用服务器以实现最佳性能,并将使用包含预先计算数据的数据库。后台会根据客户统计和一些外部数据,定期为前台准备数据。

后台和前台将共享部分数据模式,但不是整个数据库,只是部分表。数据不需要一直对应,会周期性的在两个数据库之间同步。连续同步也是可行的,但没有实时一致性要求,而且似乎批式同步在控制、调试和备份可能性方面会更好。我希望不需要解决冲突,因为数据只会在一侧增长和变化。

该解决方案应该允许定义相应的表和列,然后它将 insert/update new/changed 行。理想情况下,该解决方案应该使用 Groovy 类 中定义的数据模型(可能通过注释?),因为这两个应用程序都在 Grails 上 运行。同步可以使用现有的 Grails Web 应用程序或 运行 外部,甚至可能单独在数据库服务器 (Postgresql) 上。

有复制整个镜像数据库的系统,但我找不到适合我需要的解决方案。您是否知道有任何现有框架可以对此提供帮助,或者我自己制作是唯一的可能性?

我最终使用了 SkyTools 的 Londiste。 pgFoundry 站点上的项目页面列出了相当旧的二进制文件(目前已关闭),因此您最好从 source.

构建它

只是单向(master-slave),双向同步需要设置两个同步实例。请注意,每个实例都包含两个 Londiste 二进制文件(master 和 slave worker)和一个推送更改的代码守护进程。

为了减少同步流量,您可以在配置文件中延长轮询周期(默认为 1 秒),甚至可以通过停止 ticker 将其完全关闭,然后通过 运行 [=] 手动触发同步21=] 函数 pgq.ticker 在主机上。

我通过编写一个简单的自定义处理程序(londiste.handler.TableHandler 子类)解决了部分列复制的问题,并在数据库中配置了列映射。映射配置(还)不是我最初计划的模型驱动,但我只需要复制公共列,所以这个解决方案现在就足够了。