设为首页收藏本站

LUPA开源社区

 找回密码
 注册
文章 帖子 博客
LUPA开源社区 首页 业界资讯 技术文摘 查看内容

Bucardo 5实现PostgreSQL多master的异步复制

2014-6-25 11:57| 发布者: joejoe0332| 查看: 4016| 评论: 0|原作者: 几点人|来自: 开源中国社区

摘要: 下一代异步多个主数据库复制系统Bucardo 5发布了。这个版本删除了老版本中两个数据库源的限制,允许有更多的源数据库(即主数据库)以及更多的目标数据库(即备份数据库)。Bucardo还可以 复制到其他类型的目标数据 ...


第二条命令创建了一个已命名的复制系统,其sync名称为bard。Bucardo需要知道复制到哪儿和如何复制,因此我们告诉它使用三个数据库s1,s2和s3。每一个数据库都可以作为源数据库,因此我们给它们添加了这样的信息。最后我们需要知道要复制什么。在这个例子里,我们需要复制的是所有表(或者更精确点,复制具有主键或者唯一索引的所有数据库)。注意: Bucardo总是把数据库和表放在命名组里-在这个例子里我们只是硬编码其为10,然而通常这个值是表格视图控制器数组的长度。现在例子里,这一切都是自动进行的,dbgroup和relgroup都是以sync的名字命名的。

我们验证一下复制是否运行,即检查一下更新行是否复制到sync里包含的所有数据库了:

01$ bucardo start
02$ psql shake1 -c \
03"update character set speechcount=123 where charname='Hamlet'"
04UPDATE 1
05for in {1,2,3}; do psql shake$i -tc "select \
06> current_database(), speechcount from character \
07> where charname='Hamlet'"; done grep s
08 shake1       |     123
09 shake2       |     123
10 shake3       |     123

我们还可以查看Bucardo的日志文件"log.bucardo",看看是否有复制操作:

1tail -2 log.bucardo
2(25181) KID (bard) Delta count for s1.public."character": 1
3(25181) KID (bard) Totals: deletes=2 inserts=2 conflicts=0

上面出现了两条delete和两条insert命令,这是因为更新一行意味着在其他两个数据库上首先运行的是delete,然后才运行insert(技术上采用的COPY)。接下来我们看看Bucardo是怎么处理冲突的。我们将对所有服务器上的同一行进行更新,这样就会产生冲突:

1for in {1,2,3}; do psql shake$i -tc \
2> "update character set speechcount=$i$i$i \
3> where charname='Hamlet'"; done
4UPDATE 1
5UPDATE 1
6UPDATE 1

查看日志表明确实存在冲突,而且也很好的解决了冲突。默认的冲突解决方案表明:最后一个更新的数据库是获胜者,现在所有三个数据库具有与最后一个更新数据库相同的行。

01tail log.bucardo
02(25181) KID (bard) Delta count for s1.public."character": 1
03(25181) KID (bard) Delta count for s2.public."character": 1
04(25181) KID (bard) Delta count for s3.public."character": 1
05(25181) KID (bard) Conflicts for public."character": 1
06(25181) KID (bard) Conflicts have been resolved
07(25181) KID (bard) Totals: deletes=2 inserts=2 conflicts=1
08 
09for in {1,2,3}; do psql shake$i -tc \
10> "select current_database(), speechcount \
11> from character where charname='Hamlet'"; done grep s
12 shake1       |     333
13 shake2       |     333
14 shake3       |     333

上面出现了两条delete和两条insert命令,这是因为更新一行意味着在其他两个数据库上首先运行的是delete,然后才运行insert(技术上采用的COPY)。接下来我们看看Bucardo是怎么处理冲突的。我们将对所有服务器上的同一行进行更新,这样就会产生冲突:

1for in {1,2,3}; do psql shake$i -tc \
2> "update character set speechcount=$i$i$i \
3> where charname='Hamlet'"; done
4UPDATE 1
5UPDATE 1
6UPDATE 1

查看日志表明确实存在冲突,而且也很好的解决了冲突。默认的冲突解决方案表明:最后一个更新的数据库是获胜者,现在所有三个数据库具有与最后一个更新数据库相同的行。

01tail log.bucardo
02(25181) KID (bard) Delta count for s1.public."character": 1
03(25181) KID (bard) Delta count for s2.public."character": 1
04(25181) KID (bard) Delta count for s3.public."character": 1
05(25181) KID (bard) Conflicts for public."character": 1
06(25181) KID (bard) Conflicts have been resolved
07(25181) KID (bard) Totals: deletes=2 inserts=2 conflicts=1
08 
09for in {1,2,3}; do psql shake$i -tc \
10> "select current_database(), speechcount \
11> from character where charname='Hamlet'"; done grep s
12 shake1       |     333
13 shake2       |     333
14 shake3       |     333

我们开发这个示例的时候,Bucardo有时运行的非常快,所以没有发生冲突。也就是说,因为更新时顺序执行的。所以在下一个更新之前,存在一个时间窗口可以让Bucardo完成更新的复制。另外,“暂停sync"功能也非常方便,只要在你需要暂时停止运行sync的情况下,运行下面命令即可:

01$ bucardo pause bard
02Syncs paused: bard
03$ psql shake1 -c "update character set speechcount=1234 where charname='Hamlet'"
04UPDATE 1
05$ psql shake2 -c "update character set speechcount=4321 where charname='Hamlet'"
06UPDATE 1
07$ bucardo resume bard
08Syncs resumed: bard
09 
10tail log.bucardo
11(27344) KID (bard) Delta count for s1.public."character": 1
12(27344) KID (bard) Delta count for s2.public."character": 1
13(27344) KID (bard) Conflicts for public."character": 1
14(27344) KID (bard) Conflicts have been resolved
15(27344) KID (bard) Totals: deletes=2 inserts=2 conflicts=1

  Bucardo 5比我们在这儿演示的功能多很多。以后的博客文章里我们将包含它可以完成的其他功能,从复制到比如Oracle、Mysql或者MongoDB等非PostgreSQL系统到使用自定义的冲突解决方案。以及复制时对正在运行的数据实行转换。如果你有任何问题,请在下面的评论里说明,或者写一封短信给Bucardo邮件列表bucardo-general@bucardo.org。


  这么多年,如果没有许多人贡献代码、提出漏洞、测试Bucardo以及询问(或者回答!)重大问题,就不可能有这个重大版本的发布。查看 Changes文件,你就可以看到部分贡献者的列表。谢谢你们所有人,特别感谢Jon Jensen,是他在很久之前就开启了这个项目。




酷毙

雷人

鲜花

鸡蛋

漂亮
  • 快毕业了,没工作经验,
    找份工作好难啊?
    赶紧去人才芯片公司磨练吧!!

最新评论

关于LUPA|人才芯片工程|人才招聘|LUPA认证|LUPA教育|LUPA开源社区 ( 浙B2-20090187 浙公网安备 33010602006705号   

返回顶部