一、bucardo介绍¶
Bucardo是一款能在PostgreSQL数据库中实现双向同步的软件,功能如下:
- 可以实现PostgreSQL数据库的双master方案
-
5.0版本之后可以实现多于两个的master同步方案
-
Bucardo的同步是异步的,这与MySQL的binlog同步类似,因此做双master时,只能做到数据的最终一致 性
-
Bucardo使用了触发器,所以同步很灵活,可以只同步主从数据库中指定的几张表,而不必同步整个数据 库集群
-
Bucardo程序是一个单独的程序,可以不与它所复制的数据库运行在同一台机器上。不过,为了减少网络 延迟,通常把Bucardo程序和数据库运行在同一台机器上
-
Bucardo不能复制DDL语句,因为触发器不能记录DDL语句。但可以同步truncate语句
二、应用场景¶
-
两个灾备机房同时都有写入的情况下,针对一些表的同步可以采用次方案
-
多个没有主键冲突的表,需要增量同步到一个表中
三、如何安装¶
(1)安装Test-Simple、ExtUtils-MakeMaker、version-0.91。
(2)安装DBI、DBD::Pg。
(3)安装DBIx-Safe。
(4)安装Bucardo。
四、Bucardo的工作原理¶
-
第1步,bucardo add db:实际是指定如何连接各个数据库实例。
-
第2步,bucardo add -dbgroup:创建一个数据库组,指定哪个数 据库是源数据库,哪个是目标数据库。
-
第3步,bucardo add relgroup:把一些表组合成一个组。
-
第4步,bucardo add sync:创建一个同步,指定“relgroup”和 “dbgroup”。
-
第五步,运行“bucardo_ctl start”启动Bucardo的进程,开始同步数据。
五、案例¶
bucardo add db:
bucardo add db db1 host=10.0.3.101 port=5432 dbname=bctest user=postgres password=postgres
bucardo add db db2 host=10.0.3.102 port=5432 dbname=bctest user=postgres password=postgres
bucardo add -dbgroup
在Bucardo配置中创建一个dbgroup,指定哪个库是复 制的源数据库,哪个库是复制的目标数据库
bucardo add dbgroup dbgrp01 db1:source db2:target
命令中创建了一个名为“dbgrp01”的dbgroup ,db1是源端,db2是目标端
bucardo add relgroup 即要复制的表的集合
bucardo add relgroup relgrp01 synctab01 synctab02 创建了一个名为“relgrp01”的复制集合 吧 synctab01和 synctab02的表同步
指定前面创建的 dbgroup和relgroup,真正创建一个同步任务
需要指定前面创建的dbgroup和relgroup
bucardo add sync sync01 relgroup=relgrp01 dbgroup=dbgrp01 conflict_strategy=bucardo_latest
conflict_strategy 说明
“conflict_strategy”指定了冲突策略,该参数可 以取以下值。也就是在冲突的时候,如何处理
-
bucardo_source:以源数据库为准。
-
bucardo_target:以目标数据库为准。
-
bucardo_skip:跳过冲突。
-
bucardo_random:随机。这是默认值。
-
bucardo_latest:以最新的数据为准。
-
bucardo_abort:停止同步。
最后启动 bucardo start
六、Bucardo 日常维护¶
6.1 Bucardo的触发器日志清理¶
Bucardo使用触发器把变化行的主键记录到一张表中,这张表会变 得越来越大,需要做一个定时任务来清理表内容。通常在crontab中配置该定时任务,比如
0 2 * * * /usr/pgsql-12/bin/psql -X -q -d bctest -U postgres -c "SELECT bucardo.bucardo_purge_delta('10 minutes'::interval)"
主要是防止这张表变得越来越大了
6.2 临时停止和启动同步的方法¶
暂停同步:
bucardo deactivate <syncname>
重新开启同步的
bucardo_ctl activate <syncname>
6.3 新增表到同步的方法¶
首先 在源数据库和目标数据库中创建新表
在部署bucardo机器上执行如下命令
#把synctab03表增加到 db1组 relgrp01的资源组,在sync01同步通道中同步
bucardo add table synctab03 db=db1 relgroup=relgrp01 bucardo validate sync01 bucardo reload sync01
6.4 移除某个表或序列的方法¶
#把synctab03表 从sync01同步中移除
bucardo remove table public.synctab03 bucardo validate sync01 bucardo reload sync01