使用Bucardo5实现PostgreSQL的主数据库复制
下一代异步多个主数据库复制系统Bucardo 5发布了。这个版本删除了老版本中两个数据库源的限制,允许有更多的源数据库(即主数据库)以及更多的目标数据库(即备份数据库)。Bucardo还可以复制到其他类型的目标数据库,其中包括MySQL、MariaDB、Oracle、SQLite、MongoDB和Redis。Bucardo已经被完全重写了,这个版本比前一版本Bucardo 4功能更强大,效率更高。你可以访问Bucardo wiki查找最新版本的Bucardo。 这篇文章快速的介绍了一下Bucardo。以后的博客文章将会介绍Bucardo的强大功能,现在我们将介绍如何简单地实现多主数据库复制。
# Always a good idea: $ sudo yum update # This also installs other postgresql packages: $ sudo yum install postgresql-plperl # Create a new Postgres cluster: $ initdb btest 此时,我们仍然不能期待哦你个PostgreSQL,因为这个发布版的socket通信目录使用的是/var/run/postgresql和/tmp。我们调整了第一个目录的权限后就可以启动PostgreSQL了,然后创建第一个测试数据库: $ sudo chmod 777 /var/run/postgresql $ pg_ctl -D btest -l logfile start $ createdb shake1
$ sudo yum install git $ git clone -q https://github.com/catherinedevlin/opensourceshakespeare.git $ psql shake1 -q -f opensourceshakespeare/shakespeare.sql # You can safely ignore the 'role does not exist' errors 我们打算创建这个数据库的副本,这些副本可被当作其他数据源。换个说法,这些服务器拥有相同的数据而且可以写入。实现这些非常简单: $ createdb shake2 -T shake1 $ createdb shake3 -T shake1 Bucardo需要安装一些依赖包。如果你安装的操作系统发布不同,那么你可能要安装的依赖包就不同:下面是我写这篇文章的时候Amazon Linux需要安装的依赖包。(如果幸运的话,你的发布包可能已经包含了Bucardo,在这种情况下,下面的执行步骤就不需要执行了,你只要运行"yum install bucard"就可以了-不过要确定一下你使用的是版本5或者更好的版本!(通过yum info bucardo查看)) $ sudo yum install perl-ExtUtils-MakeMaker perl-DBD-Pg > perl-Encode-Locale perl-Sys-Syslog perl-boolean > perl-Time-HiRes perl-Test-Simple perl-Pod-Parser $ sudo yum install cpan $ echo y | cpan DBIx::Safe
$ wget -nv http://bucardo.org/Bucardo.tar.gz $ wget -nv http://bucardo.org/Bucardo.tar.gz.asc $ gpg -q --keyserver pgp.mit.edu --recv-key 14964AC8 $ gpg --verify Bucardo.tar.gz.asc $ tar xfz Bucardo.tar.gz $ ln -s Bucardo-5.0.0 bucardo $ cd bucardo $ perl Makefile.PL $ make $ sudo make install 我们对bucardorc文件(设置某些全局信息的文件)进行某些小的调整。然后运行"bucardo install",这条命令将创建bucardo的主数据库,其中包含Bucardo服务进程所需的信息: $ mkdir pid $ echo -e "piddir=pidnlogdest=." > .bucardorc $ bucardo install --batch --quiet Creating superuser 'bucardo'
bucardo add dbs s1,s2,s3 dbname=shake1,shake2,shake3 Added databases "s1","s2","s3" $ bucardo add sync bard dbs=s1:source,s2:source,s3:source tables=all Added sync "bard" Created a new relgroup named "bard" Created a new dbgroup named "bard" Added table "public.chapter" Added table "public.character" Added table "public.character_work" Added table "public.paragraph" Added table "public.wordform" Added table "public.work" 第一条命令,我们告诉Bucardo如何连接到三个数据库,我们告诉Bucardo数据库的名字,然后Bucardo把这三个数据库看作(s1,s3)。你还可以指定端口和主机,不过在这个例子里,默认的端口为5432,而且不需要主机(采用的是Unix Socket通信机制)。
我们验证一下复制是否运行,即检查一下更新行是否复制到sync里包含的所有数据库了: $ bucardo start $ psql shake1 -c > "update character set speechcount=123 where charname='Hamlet'" UPDATE 1 $ for i in {1,2,3}; do psql shake$i -tc "select > current_database(),speechcount from character > where charname='Hamlet'"; done | grep s shake1 | 123 shake2 | 123 shake3 | 123 我们还可以查看Bucardo的日志文件"log.bucardo",看看是否有复制操作: $ tail -2 log.bucardo (25181) KID (bard) Delta count for s1.public."character": 1 (25181) KID (bard) Totals: deletes=2 inserts=2 conflicts=0
$ for i in {1,3}; do psql shake$i -tc > "update character set speechcount=$i$i$i > where charname='Hamlet'"; done UPDATE 1 UPDATE 1 UPDATE 1 查看日志表明确实存在冲突,而且也很好的解决了冲突。默认的冲突解决方案表明:最后一个更新的数据库是获胜者,现在所有三个数据库具有与最后一个更新数据库相同的行。 $ tail log.bucardo (25181) KID (bard) Delta count for s1.public."character": 1 (25181) KID (bard) Delta count for s2.public."character": 1 (25181) KID (bard) Delta count for s3.public."character": 1 (25181) KID (bard) Conflicts for public."character": 1 (25181) KID (bard) Conflicts have been resolved (25181) KID (bard) Totals: deletes=2 inserts=2 conflicts=1 $ for i in {1,3}; do psql shake$i -tc > "select current_database(),speechcount > from character where charname='Hamlet'"; done | grep s shake1 | 333 shake2 | 333 shake3 | 333 我们开发这个示例的时候,Bucardo有时运行的非常快,所以没有发生冲突。也就是说,因为更新时顺序执行的。所以在下一个更新之前,存在一个时间窗口可以让Bucardo完成更新的复制。另外,“暂停sync"功能也非常方便,只要在你需要暂时停止运行sync的情况下,运行下面命令即可: $ bucardo pause bard Syncs paused: bard $ psql shake1 -c "update character set speechcount=1234 where charname='Hamlet'" UPDATE 1 $ psql shake2 -c "update character set speechcount=4321 where charname='Hamlet'" UPDATE 1 $ bucardo resume bard Syncs resumed: bard $ tail log.bucardo (27344) KID (bard) Delta count for s1.public."character": 1 (27344) KID (bard) Delta count for s2.public."character": 1 (27344) KID (bard) Conflicts for public."character": 1 (27344) KID (bard) Conflicts have been resolved (27344) KID (bard) Totals: deletes=2 inserts=2 conflicts=1
这么多年,如果没有许多人贡献代码、提出漏洞、测试Bucardo以及询问(或者回答!)重大问题,就不可能有这个重大版本的发布。查看 Changes文件,你就可以看到部分贡献者的列表。谢谢你们所有人,特别感谢Jon Jensen,是他在很久之前就开启了这个项目。 (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |