一、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