我正在尝试为高可用性优化信息系统的后端,这涉及将时间关键客户端请求(前台)所需的部分从其他部分(后台办公室)拆分掉。
前台办公室将拥有冗余应用程序服务器,其负载平衡可实现最高性能,并将使用具有预先计算数据的数据库。后台将根据客户统计数据和一些外部数据定期为前台准备数据。
数据模式的一部分将在后台和前台之间共享,但不是整个数据库,只是部分表的一部分。数据不需要一直对应,它将定期在两个数据库之间同步。连续同步也是可行的,但是没有实时一致性要求,并且似乎批处理式同步在控制,调试和备份可能性方面会更好。我希望不需要解决冲突,因为数据只会在一方面增长和变化。
解决方案应该允许定义相应的表和列,然后它将插入/更新新的/更改的行。理想情况下,解决方案应该使用Groovy类中定义的数据模型(可能通过注释?),因为两个应用程序都在Grails上运行。同步可以使用现有的Grails Web应用程序或在外部运行,甚至可以单独在数据库服务器上运行(Postgresql)。
有复制整个镜像数据库的系统,但我无法找到适合我需求的任何解决方案。你知道任何现有的框架可以帮助解决这个问题,还是让自己的框架成为唯一的可能性?
答案 0 :(得分:0)
我最终使用了SkyTools的Londiste。 pgFoundry网站上的项目页面列出了相当旧的二进制文件(目前已经关闭),因此您最好从source构建它。
它只是一个方向(主从),因此必须为双向同步设置两个同步实例。请注意,每个实例都包含两个Londiste二进制文件(主工作者和从属工作者)以及一个推动更改的ticker守护程序。
要减少同步流量,您可以在配置文件中延长轮询周期(默认为1秒),甚至可以通过停止自动收报机将其完全关闭,然后通过运行SQL函数pgq.ticker
手动触发同步主
我通过在数据库中配置了列映射的简单自定义处理程序(londiste.handler.TableHandler
子类)来解决部分列复制的问题。映射配置不是我最初计划的模型驱动(但是),但我只需要复制常用列,因此这个解决方案现在已经足够了。