利用bucardo搭建PostgreSQL数据库双活
前言:
本PostgreSQL数据库双活部署实例使用Bucardo开源工具实现,Bucardo开源工具是一个perl语言编写的程序,其依赖PG数据库的plperl语言组件,进而严格依赖perl的版本(数据库服务器安装的perl大版本号必须和官方说明的perl版本严格一致,小版本号不限制),数据库的perl环境记录于$PG_HOME/etc/sysconfig/plLanguages.config。
环境说明:
数据库服务器一:
操作系统版本 |
RHEL6.5 |
IP地址 |
10.19.100.50 |
数据库版本 |
PostgreSQL-10.1 |
数据库端口 |
5432 |
数据库服务器二:
操作系统版本 |
RHEL6.5 |
IP地址 |
10.19.100.51 |
数据库版本 |
PostgreSQL-10.1 |
数据库端口 |
5432 |
一. 安装前准备
该步骤在服务器一和服务器二上均需要执行
1.确定数据库依赖的Perl版本
$ more /PostgreSQL/10/etc/sysconfig/plLanguages.config PG_PERL_VERSION=5.24 PG_PYTHON_VERSION=3.4 PG_TCL_VERSION=8.6 PG_PERL_PATH=PERL_INSTALL_PATH PG_PYTHON_PATH=PYTHON_INSTALL_PATH PG_TCL_PATH=TCL_INSTALL_PATH
2. 检查服务器上已安装的perl版本
$ perl -v This is perl, v5.10.1 (*) built for x86_64-linux-thread-multi
如果显示的perl版本不为第一步显示的版本(这里是5.24),则需要重新安装perl(任意小版本均可),我这里使用perl5-5.24.4
$ tar zxvf perl-5.24.4.tar.gz $ cd perl-5.24.4 ./Configure
进行Configure时务必不要指定-d参数,其中有2个重要选项不能采用默认配置:
- Build a shared libperl.so (y/n) [n] 这里要选Y
- Build a threading Perl? [n] 这里要选Y
make
make test
sudo make install
3. 检查plperl.so引用
数据库在创建plperl语言支持时使用的库文件位于$PG_HOME/lib/postgresql/plperl.so(不同版本的数据库可能有所不同),需要检查该库文件的依赖包是否正确。
$ ldd $PG_HOME/lib/postgresql/plperl.so linux-vdso.so.1 => (0x00007fff561fa000) libperl.so => /usr/lib64/perl5/CORE/libperl.so libpthread.so.0 => /lib64/libpthread.so.0 (0x00007fc7c2d97000) libc.so.6 => /lib64/libc.so.6 (0x00007fc7c2a05000) libnsl.so.1 => /lib64/libnsl.so.1 (0x00007fc7c27ec000) libdl.so.2 => /lib64/libdl.so.2 (0x00007fc7c25e7000) libm.so.6 => /lib64/libm.so.6 (0x00007fc7c2363000) libcrypt.so.1 => /lib64/libcrypt.so.1 (0x00007fc7c212c000) libutil.so.1 => /lib64/libutil.so.1 (0x00007fc7c1f28000) /lib64/ld-linux-x86-64.so.2 (0x0000003555000000) libfreebl3.so => /lib64/libfreebl3.so (0x00007fc7c1cc6000)
或者
$ ldd $PG_HOME/lib/postgresql/plperl.so linux-vdso.so.1 => (0x00007fff561fa000) libperl.so => not found libpthread.so.0 => /lib64/libpthread.so.0 (0x00007fc7c2d97000) libc.so.6 => /lib64/libc.so.6 (0x00007fc7c2a05000) libnsl.so.1 => /lib64/libnsl.so.1 (0x00007fc7c27ec000) libdl.so.2 => /lib64/libdl.so.2 (0x00007fc7c25e7000) libm.so.6 => /lib64/libm.so.6 (0x00007fc7c2363000) libcrypt.so.1 => /lib64/libcrypt.so.1 (0x00007fc7c212c000) libutil.so.1 => /lib64/libutil.so.1 (0x00007fc7c1f28000) /lib64/ld-linux-x86-64.so.2 (0x0000003555000000) libfreebl3.so => /lib64/libfreebl3.so (0x00007fc7c1cc6000)
若如上所示,libperl.so引用的是系统自带的非5.24版本的libperl.so或没有引用任何libperl.so,则需要修改ldconfig配置,使perl5-5.24的库文件被包含在ldconfig的搜索路径中:
$ vi /etc/ld.so.conf.d/perl5-5.24.conf /usr/local/lib/perl5/5.24.4/x86_64-linux-thread-multi/CORE
正确的引用应如下所示
$ ldd /PostgreSQL/10/lib/postgresql/plperl.so linux-vdso.so.1 => (0x00007fff1dbff000) libperl.so => /usr/local/lib/perl5/5.24.4/x86_64-linux-thread-multi/CORE/libperl.so (0x00007fa26ea0b000) libpthread.so.0 => /lib64/libpthread.so.0 (0x00007fa26e7ed000) libc.so.6 => /lib64/libc.so.6 (0x00007fa26e45b000) libnsl.so.1 => /lib64/libnsl.so.1 (0x00007fa26e242000) libdl.so.2 => /lib64/libdl.so.2 (0x00007fa26e03d000) libm.so.6 => /lib64/libm.so.6 (0x00007fa26ddb9000) libcrypt.so.1 => /lib64/libcrypt.so.1 (0x00007fa26db82000) libutil.so.1 => /lib64/libutil.so.1 (0x00007fa26d97e000) /lib64/ld-linux-x86-64.so.2 (0x0000003834e00000) libfreebl3.so => /lib64/libfreebl3.so (0x00007fa26d71c000)
4. 测试数据库plperl语言组件是否能正确运行
确保库文件正确以后需要检查一下数据库是否能正确使用该语言组件包,这里创建一个简单的plperl程序检查一下:
create language plperlu; create language plperl; CREATE FUNCTION perl_max (integer, integer) RETURNS integer AS $$ if ($_[0] > $_[1]) { return $_[0]; } return $_[1]; $$ LANGUAGE plperl; select perl_max(1,3); perl_max ---------- 3 (1 row)
二. 安装Bucardo及其依赖包
该步骤在服务器一和服务器二上均需要执行
1. 安装Bucardo依赖的perl模块
安装perl模块最方便的方式是使用spam命令从官方服务器上获取模块包及其依赖包,在无法连接官方服务器的内网可以采用下载相应压缩包,编译安装的方式,perl模块下载地址为:http://search.cpan.org/
- 安装DBI
$ tar zxvf DBI-1.634.tar.gz $ cd DBI-1.634 $ perl Makefile.PL $ make $ make test $ sudo make install
- 安装DBD:pg
$ tar zxvf DBD-Pg-3.5.3.tar.gz $ cd DBD-Pg-3.5.3 $ perl Makefile.PL $ make $ make test $ sudo make install
- 安装DBIx-Safe
$ tar zxvf DBIx-Safe-1.2.5.tar.gz $ cd DBIx-Safe-1.2.5 $ perl Makefile.PL $ make $ make test $ sudo make install
- 安装boolean
$ tar zxvf boolean-0.45.tar.gz $ cd boolean-0.45 $ perl Makefile.PL $ make $ make test $ sudo make install
- 安装Test::Simple
$ tar zxvf Test-Simple-1.001014.tar.gz $ cd Test-Simple-1.001014 $ perl Makefile.PL $ make $ make test $ sudo make install
- 安装Encode::Locale
$ tar zxvf Encode-Locale-1.05.tar.gz $ cd Encode-Locale-1.05 $ Perl Makefile.PL $ make $ make test $ sudo make install
2. 安装Bucardo
完成上述perl模块以后,Bucardo本身安装非常简单。
$ export INSTALL_BUCARDODIR=/PostgreSQL/Bucardo $ tar zxvf bucardo-5.4.1.tar.gz $ cd bucardo-5.4.1 $ perl MakeFile.pl $ make $ make test $ make install
同时,需要把INSTALL_BUCARDODIR=/PostgreSQL/Bucardo 设置为.bash_profile中的环境变量
3. 部署Bucardo辅助对象
这里需要注意,PG-10.1以后的版本 select version()函数的输出字符串格式有变化,而Bucardo-5.4.1(已经是我写这篇文章时的最新版本)还是采用PG-9.*版本的select version()输出字符串格式做检测,因此需要修改bucardo脚本,否则无法通过版本检测。
最简单的就是把所有检查脚本的地方全注释掉。找到所有如下语句,全部用##注释。
##if ($maj < 8 or (8 == $maj and $min < 1)) { ## die "Sorry, Bucardo requires Postgres version 8.1 or higher. This is only $maj.$min\n"; ##}
Bucardo以侵入式的方式在数据库上创建必要的辅助对象,并需要在被同步表上创建触发器。辅助对象通过下面的命令安装:
$ ./bucardo install Current connection settings: 1. Host: <none> 2. Port: 5432 3. User: postgres 4. Database: bucardo 5. PID directory: /var/run/bucardo Enter a number to change it, P to proceed, or Q to quit: P
因为Bucardo默认是为PostgreSQL开发的,所以连接的数据库、端口和用户都需要按命令行提示进行修改。如果没有任何报错,那么Bucardo的辅助对象就创建完了。
三. 利用Bucardo配置数据库双向同步
服务器一和服务器二上需要预先创建好要同步的对象,这里以下面的建表语句创建的数据库对象为例说明如何配置双向同步
CREATE TABLE t1
(
col1 numeric NOT NULL,
col2 numeric,
CONSTRAINT pk_1 PRIMARY KEY (col1)
)
这里需要注意一点,被同步的对象一定要有主键,如果没有主键在创建同步队列时会失败。虽然可以通过一些办法强行对无主键表进行同步,但会在同步发生数据冲突时产生不可预料的错误。
1. 首先配置服务器一向服务器二的同步
该步骤在仅在服务器一配置
- 添加源数据库
$ ./bucardo add database pg50 dbname=postgres port=5432 host=10.19.100.50 user=postgres pass=123456 Added database "pg50"
- 添加目标数据库
$ ./bucardo add database pg51 dbname=postgres port=5432 host=10.19.100.51 user=postgres pass=123456 Added database "pg51"
- 添加数据库组
$ ./bucardo add dbgroup grp1 pg50:source pg51:target Created dbgroup "grp1" Added database "pg50" to dbgroup "grp1" as source Added database "pg51" to dbgroup "grp1" as target
- 添加表集群(Bucardo是一种已经灭绝的西班牙山羊,所以这里集群是用 herd:羊群)
$ ./bucardo add table public.t1 herd=herd_test Added the following tables or sequences: public.t1 Created the relgroup named "herd_test" The following tables or sequences are now part of the relgroup "herd_test": public.t1
注意:要同步的表必须有主键
- 添加同步信息
$ ./bucardo add sync sync50to51 herd=herd_test dbs=grp1 conflict_strategy=latest
注意:sync名称需要以字母开头
conflict_strategy表示解决数据冲突的方式,可为:
source ,target ,skip, random ,latest ,abort
- 运行软件并开始同步
$ sudo mkdir -p /var/log/bucardo $ sudo mkdir /bucardo $ sudo chown -R postgres:postgres /var/log/bucardo/ $ sudo chown -R postgres:postgres /bucardo $ ./bucardo start
下面是其他管理用命令
停止同步:bucardo stop 暂停/恢复某一组同步:bucardo pause/resume sync50to51 查看同步状态:bucardo status
完成以上操作后,所有对服务器一上postgres用户的public.t1表的操作会被同步到服务器二的postgres用户public.t1表上。接下来进行服务器二到服务器一的同步配置以完成双向同步。
2. 配置服务器二向服务器一的同步(其实就是上一步反过来做)
该步骤在仅在服务器二配置
- 添加源数据库
$ ./bucardo add database pg51 dbname=postgres port=5432 host=10.19.100.51 user=postgres pass=123456
- 添加目标数据库
$ ./bucardo add database pg50 dbname=postgres port=5432 host=10.19.100.50 user=postgres pass=123456
- 添加数据库组
$ ./bucardo add dbgroup grp1 pg51:source pg50:target
- 添加表集群
$ ./bucardo add table t1 herd=herd_test
- 添加同步信息
$ ./bucardo add sync sync51to50 herd=herd_test dbs=grp1 conflict_strategy=latest
- 运行软件并开始同步
$ sudo mkdir -p /var/log/bucardo $ sudo mkdir /bucardo $ sudo chown -R postgres:postgres /var/log/bucardo/ $ sudo chown -R postgres:postgres /bucardo $ ./bucardo start
这样双向同步就配置完成了,所有在服务器二上对postgres数据库下public.t1表的修改也会被同步到服务器一的postgres数据库的public.t1上