利用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上
利用bucardo搭建PostgreSQL數據庫雙活