Chinaunix

标题: Postgresql分布式方案 [打印本页]

作者: jessechencn    时间: 2009-05-03 00:34
标题: Postgresql分布式方案
求Postgresql分布式方案,我们的模式是这样的,我们的服务器群放在两个地方,一个香港(主业务),一个美国(网站),各跑一套APP与Postgresql,然后由代码控制将数据从美国同步回到香港,同时香港的数据变动也被同步到美国的服务器中。
现在我们使用程序来控制数据在各个服务器间的同步,我总觉得不踏实,所以想咨询一下大家有没有更好的方式,将我两地的数据实时保持同步,且各地服务器都保持运行。
多谢。

[ 本帖最后由 jessechencn 于 2009-5-3 12:10 编辑 ]
作者: scottsiu    时间: 2009-05-03 09:22
可以通过Slony-I来做,数据传输时是有事务保障的。
使用Slony-I有一点是要注意的,如果有一张表被设成了用于接受远端数据,为保证其数据完整性,在运行时将不能由Slony-I以外写入。
这一点在设置好Slony-I后,会自动被锁定。

另外不知您现在所讲的通过“代码控制”来做是什么意思。
作者: jessechencn    时间: 2009-05-03 12:07
标题: 回复 #2 scottsiu 的帖子
感谢scottsiu回复的这么迅速,其实现有的同步方案是这样的,我们把数据由中央机分发到终端机叫做Pull,终端机汇总到中央机叫Push,我们每隔N小时就执行一次Pull,Push,不管是Pull or Push, 原理都是根据每条数据发生的时间作为处理依据,因为我们给每条数据都加上了特别字段, created_stamp,update_stamp,等作为时间戳,这样当系统调用同步方法时就先判断当前系统中有多少数据是在上次“成功同步”后产生的,以此对变动过的数据做同步,数据通过Java的RMI传输到各个APP服务器,各APP服务器再保存到数据库。
所以说现有的方法是通过程序来实现对数据的同步,而不是数据库级的同步。

由于我们的不同地域的服务器或数据库都独立运行,所以不可能设为只读模式,因此,我觉得Slony-I是否真的适合我们?按我的理解Slony-I只是个主从备的应用,我们香港的主服务器,不可能停止运行或只读状态下运行,美国的网站服务器也不能在这种状态下运行,或是我的理解不对?请专家给合理的解决建议。
非常感谢。
作者: zmh5211314    时间: 2009-05-04 08:56
标题: 回复 #3 jessechencn 的帖子
你的要求就是写入的同步。Slony-I 或者pgpool这些中间件的实现可能会影响性能,
我认为你应该考虑一些底层的同步解决方案,
例如,drbd,或者采取一些硬件的解决方案。
作者: freebarque    时间: 2009-05-04 09:05
个人感觉, 你们现在靠程序来控制, 已经是最好的选择了, 当然这个缺乏事务级控制
极端情况失败时会出现数据不一致.

数据库级互为同步不可能做到的吧,  比如一条记录A改, B也改, 最后结果以谁为准呢?
除非就是一端写, 一端只读, 或者2端写的数据库不冲突.

靠程序来控制的好处,就是上面(A/B)的情况, 你们也可以条件选择以哪个为准.
作者: tochu    时间: 2009-05-04 16:04
根据楼主提供的信息,建议楼主在应用软件的层面来完成这些事情,比如业务系统插入一条数据的时候,将一条数据放入香港的库中,同时再放一条到美国的库中;

如果你自己知道如何写代码,可以用Postgre-R来完成,Postgre-R目前进展很慢;只支持8.4

其它更好的方法我没有想到,或者你可以用trigger 家db_link在数据库之间来做
作者: scottsiu    时间: 2009-05-05 19:35
标题: 回复 #3 jessechencn 的帖子
Slony-I只会使得处于“订阅”状态的表变成只读。因此如果pull及push双方的数据可以分开而不在同一张表中,这样做还是比较方便的。另外如果你已经通过程序处理此问题,比较好的方法还是通过db_link。
作者: vyouzhi    时间: 2009-05-06 10:51
我的理解是,楼主是想双向的读与写吧? 既然这样,在postgresql上面有另一个可能合你的 http://pgpool.projects.postgresql.org/
就是这个pgpool来实现

如果你是想直接在程序上面做的呢,可以试试我的办法
一。在A处写入的数据,让它写在另一个A表里
二。在B处写入的数据,让它写在另一个B表里
三。在同步上,select * into anytable from A,B  where A.update_time = B.update_time  类似这样
作者: jessechencn    时间: 2009-07-15 23:42
多谢各位回复,该问题还在研究中。
作者: galylee    时间: 2009-07-21 14:41
标题: 回复 #9 jessechencn 的帖子
你的系统需要multi-master的异步复制方案。

bucardo应该可以满足你的要求
http://bucardo.org/overview.html
作者: shory152    时间: 2011-09-05 17:39
DBMaker内置了分布式数据库管理功能,可以实现同步表复制和异步表复制。同步表复制可以确保global transaction的ACID属性。




欢迎光临 Chinaunix (http://bbs.chinaunix.net/) Powered by Discuz! X3.2