Bucardo 是一个PostgreSQL的异步同步工具,它支持任意方式的主从同步,multi-master或者multi-slave等。新版Bucardo可将数据同步到其他存储系统,如MongoDB。
bucardo是PostgreSQL数据库中实现双向同步的软件,可以实现PostgreSQL数据库的双master的方案,不过bucardo中的同步都是异步的,它是通过触发器记录变化,程序是perl写的。
===============安装bucardo===========================
bucardo是一个perl脚本,需要一些perl的包,先安装这些包:
Test-Simple-0.98.tar.gz
ExtUtils-MakeMaker-6.56.tar.gz
DBI-1.616.tar.gz
version-0.91.tar.gz
DBD-Pg-2.18.1.tar.gz
DBIx-Safe-1.2.5.tar.gz
perl包的安装方法都是到http://search.cpan.org找到这个包,下载下来,一般习惯解压到/usr/src目录:
然后:
perl Makefile.PL
make
make install
安装perl的包
先安装DBI-1.616
http://search.cpan.org/CPAN/authors/id/T/TI/TIMB/DBI-1.616.tar.gz
安装DBI前需要安装:
http://search.cpan.org/CPAN/authors/id/M/MS/MSCHWERN/Test-Simple-0.98.tar.gz
http://search.cpan.org/CPAN/authors/id/M/MS/MSCHWERN/ExtUtils-MakeMaker-6.56.tar.gz
否则会报:
Warning: prerequisite ExtUtils::MakeMaker 6.48 not found. We have 6.30.
Warning: prerequisite Test::Simple 0.90 not found. We have 0.62.
安装DBD-pg前需要先安装version-0.91
http://search.cpan.org/CPAN/authors/id/J/JP/JPEACOCK/version-0.91.tar.gz
再安装DBD-pg:
http://search.cpan.org/CPAN/authors/id/T/TU/TURNSTEP/DBD-Pg-2.18.1.tar.gz
安装
http://bucardo.org/downloads/DBIx-Safe-1.2.5.tar.gz
安装Bucardo4.4.4
http://blog.endpoint.com/2011/06/bucardo-multi-master-for-postgresql.html
===================bucardo4.4.4的配置====================================
在用户的HOME目录下建立一个.bucardorc文件,在这个文件中设定一些参数:
default_email_from = [email protected]
default_email_host = mailhost.myinc.com
default_email_to = [email protected]
log_conflict_file = /home/postgres/log/bucardo_conflict.log
piddir = /home/postgres/run
reason_file = /home/postgres/log/bucardo.restart.reason.log
warning_file = /home/postgres/log/bucardo.warning.log
syslog_facility = LOG_LOCAL1
bucardo会在所需要同步的数据库中建一个名叫bucardo的数据库,在其中存一些配置信息,这个过
程是由bucardo_ctl install命令完成的:
bucardo_ctl install
完成后,我们把bucardo数据库的搜索路径上加上bucardo这个schema名,以便连接到这个数据库
后就可以使用\d看到这些配置表:
alter database bucardo set search_path="$user",public,bucardo;
下面的配置的环境:
主机1: 192.168.195.35
主机2: 192.168.195.36
我们在这两台机器上的postgresql做双向同步:
这两台机器上的postgresql数据库已经装好。
操作步骤:
1. 在两台机器上:
bucardo_ctl install
2. 在两台机器上,先建我们要同步的数据库:
createdb aligputf8
createlang plpgsql
注意需要plpgsql装到数据库中。
使用pgbench 建一些测试表。
pgbench -i aligputf8 -s 300
我们同步就在pgbench_accounts pgbench_branches pgbench_tellers上进行:
3. bucardo中增加要同步的数据库,主要是配置bucardo如何连接这些数据库:
在第一台机器上:
bucardo_ctl add db db1 dbname=aligputf8 sourcelimit=100 targetlimit=100
bucardo_ctl add db db2 dbname=aligputf8 host=192.168.195.36 sourcelimit=100 targetlimit=100
这个命令中可以带的参数,基本上都是数据库连接参数:
name: the internal name used by Bucardo to refer to this database
port: the port this database runs on. Defaults to 5432.
host: the host this database is on. Defaults to no host (Unix socket)
user: the user to connect as. Defaults to 'bucardo'
pass: the password to connect with. Don't use this, use a .pgpass file instead!
conn: Any additional information add to the connection string, e.g. sslmode=require
sourcelimit: The maximum number of replication events that can run at one time using this database as a source. Defaults to 0 (no limit)
targetlimit: The maximum number of replication events that can run at one time using this database as a target. Defaults to 0 (no limit)
pgpass: Full path and filename of a Bucardo/pgpass file to use for this connection
由于我们是双向同步,需要指定同步的默认的冲突处理方法:
alter table bucardo.goat alter standard_conflict set default 'latest';
冲突解决方法可为:
source
target
skip
random
latest
abort
4. 增加哪些表要同步:
在第一台机器上:
bucardo_ctl add table pgbench_accounts pgbench_branches pgbench_tellers db=db1 --herd=herd1 --verbose
这个步骤其实是在表上建触发器,做完这个步骤后所产生的变化都会被同步
5. 增加群,群是为了便于管理同步中表的一个集合。
在第一台机器上:
bucardo_ctl add herd herd1 pgbench_accounts pgbench_branches pgbench_tellers
6. 增加同步
在第一台机器上:
bucardo_ctl add sync sync1 source=herd1 targetdb=db2 type=swap ping=yes
加同步的时候,实际上是把源数据库上的群(群中包含了一些表)同步到目标数据库中。
type为swap,就是两个数据库做双向同步。
type 还可以有的值为:
pushdelta: master/slave模式,只有主库把数据同步到备库
fullcopy: master/slave模式,全量同步
7. 如果初始时,源数据库上有数据,而目标数据库上没有数据,需要开始时做一次全量同步,这种
方式在bucardo中叫onetimecopy,要执行ontimecopy,需要源数据中的表至少有一条数据,而
目标数据库中的表不能有数据:
bucardo_ctl update sync sync onetimecopy=2
这可我们把同步的onetimecopy属性设置为2,这样当同步启动后,会自动做一次全量同步,然后再
慢慢增量同步。
全量同步完后,会自动把状态改为0。
8. 启动同步:
bucardo_ctl start
9. 查看同步状态:
bucardo_ctl status
bucardo_ctl status sync1
============================= 日常维护操作 ===============================
1. bucardo使用触发器把变化行的主键记到一张表中,所以这张表会变得越来越大,我们需要做一
个定时任务来清理这个表的内容:
0 2 * * * /usr/local/bin/psql -X -q -d aligputf8 -U postgres -c "SELECT bucardo.bucardo_purge_delta('10 minutes'::interval)"
2. 临时停止和启动同步的方法:
bucardo_ctl activate <syncname>
bucardo_ctl deactivate <syncname>
bucardo.sync中有:track_rates
设置为true。
3. onetimecopy:
bucardo_ctl update sync <syncname> onetimecopy=2
重启bucardo_ctl可以让其开始复制
bucardo_ctl reload sync1好象也可以
4. 新增表的步骤:
bucardo_ctl add all tables
bucardo_ctl update sync <syncname> add table <tab1> <tab2> ...
bucardo_ctl validate <syncname>
bucardo_ctl update sync onetimecopy=2
bucardo_ctl update sync onetimecopy=2 rebuild_index=1
bucardo_ctl reload <syncname>
5. 移除表:
bucardo_ctl update sync <syncname> remove table foobar
bucardo_ctl update sync <syncname> remove sequence foobar_seq
bucardo_ctl reload <syncname>