合 使用Bucardo搭建PG的双主
简介
OGG方式实现双主可以参考:
https://www.dbaup.com/shiyongogg-for-pgweifuwukuaisushuangxiangtongburdsshujukushuangzhu.html
Bucardo开源工具是一个perl语言编写的程序,其依赖PG数据库的plperl语言组件,进而严格依赖perl的版本(数据库服务器安装的perl大版本号必须和官方说明的perl版本严格一致,小版本号不限制)。
Bucardo是PostgreSQL数据库中实现双向同步的软件,可以实现PostgreSQL数据库的双master的方案,不过bucardo中的同步都是异步的,它是通过触发器记录变化,程序是perl写的。Bucardo可以实现postgresql的多主复制、主从同步,甚至可以以postgresql为源库,可以和oracle、mysql、mongodb等很多数据库进行数据异步同步。
而pg原生的流复制(stream replication)虽可以同步,但只能单向同步,而且备库只能是只读操作,而bucardo不支持DDL的同步。
Bucardo 是基于表复制的系统,通过触发器记录变化,同步的表必须有主键,不能同步DDL语句(truncate可以同步)。Bucardo 可以实现PostgreSQL数据库的双master/多master的方案。Bucardo的核心是一个Perl守护进程,它侦听通知请求并对其进行操作,方法是连接到远程数据库并来回复制数据。
守护进程需要的所有特定信息都存储在主bucardo数据库中,包括复制所涉及的所有数据库的列表以及如何到达这些数据库、要复制的所有表以及如何复制每个表。
运行Bucardo的第一步是向主Bucardo数据库添加两个或更多数据库。
完成此操作后,将添加关于要复制哪些表的信息以及表的任何分组。然后添加同步。
同步被称为复制操作,将一组特定的表从一台服务器复制到另一台服务器或一组服务器。
一旦设置好Bucardo,触发器就开始存储有关所有相关的表中哪些行被更改的信息。
对于多主机,过程是这样的:
1、对表进行更改并记录在bucardo_delta表中。
2、向主Bucardo守护进程发送通知,让它知道表已经更改。
3、守护进程通知控制器进行同步,然后返回侦听。
4、控制器创建一个“kid”来处理复制,或者通知已经存在的复制。
5、孩子开始一个新的事务,禁用相关表上的触发器和规则。
6、然后,它收集自上次复制以来哪些行发生了更改的列表,然后比较这两个行以确定应该做什么。
7、如果存在冲突,则会运行标准冲突处理程序,或者为每个表设置的自定义处理程序来对内容进行排序。
8、触发器和规则被重新启用,事务被提交。
9、如果事务失败,则运行任何自定义异常处理程序。
10、子程序向控制器发出它已经完成的信号。
环境架构
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 | -- 创建专用网络 docker network create --subnet=172.72.6.0/24 pg-network -- PG 1 docker rm -f lhrpg1 docker run -d --name lhrpg1 -h lhrpg1 \ -p 64326:5432 --net=pg-network --ip 172.72.6.26 \ -v /sys/fs/cgroup:/sys/fs/cgroup \ --privileged=true lhrbest/lhrpgall:2.0 \ /usr/sbin/init -- PG 2 docker rm -f lhrpg2 docker run -d --name lhrpg2 -h lhrpg2 \ -p 64327:5432 --net=pg-network --ip 172.72.6.27 \ -v /sys/fs/cgroup:/sys/fs/cgroup \ --privileged=true lhrbest/lhrpgall:2.0 \ /usr/sbin/init |
安装bucardo
https://github.com/bucardo/bucardo
Bucardo版本5.6.0需要如下组件:
1 2 3 4 5 | build, test, and install Perl 5 (at least 5.8.3) build, test, and install PostgreSQL (at least 8.2) build, test, and install the DBI module (at least 1.51) build, test, and install the DBD::Pg module (at least 2.0.0) build, test, and install the DBIx::Safe module (at least 1.2.4) |
在2个节点都需要安装:
1 2 3 4 5 6 | yum install -y perl-5* perl-DBI perl-DBIx-Safe perl-DBD-Pg postgresql13-plperl wget https://bucardo.org/downloads/Bucardo-5.6.0.tar.gz tar -xzvf Bucardo-5.6.0.tar.gz cd Bucardo-5.6.0/ perl Makefile.PL make && make install |
安装plperl语言组件
1 2 3 4 5 6 7 8 9 10 11 12 13 14 | create language plperlu; create language plperl; postgres=# \dx List of installed extensions Name | Version | Schema | Description --------------------+---------+------------+------------------------------------------------------------------------ pageinspect | 1.8 | public | inspect the contents of database pages at a low level pg_stat_statements | 1.8 | public | track planning and execution statistics of all SQL statements executed plperl | 1.0 | pg_catalog | PL/Perl procedural language plperlu | 1.0 | pg_catalog | PL/PerlU untrusted procedural language plpgsql | 1.0 | pg_catalog | PL/pgSQL procedural language (5 rows) |