1. 程式人生 > >配置PostgreSQL資料庫流複製(replication stream)環境

配置PostgreSQL資料庫流複製(replication stream)環境

原文地址 http://www.sijitao.net/1764.html

在配置之前準備兩臺伺服器環境。

第一步:在兩個環境中分別安裝postgresql資料庫

推薦使用原始碼編譯安裝,安裝步驟可以參考之前寫的文章“通過原始碼編譯安裝PostgreSQL步驟及問題總結”,網址:http://www.sijitao.net/1535.html 。備庫可以不做初始化資料的操作。

在主庫中修改postgresql.conf,把listen_addresses改成"*",預設只有localhost能登陸資料庫。

第二步:在主庫中建立流複製使用者

CREATE USER repuser replication LOGIN CONNECTION LIMIT 
5 ENCRYPTED PASSWORD '123456';

第三步:修改主庫pg_hba.conf檔案

在最後新增如下行。

hostreplicationrepuser0.0.0.0/0md5

第四步:修改主庫postgresql.conf檔案

修改如下幾個引數

wal_level = hot_standby
max_wal_senders =1
hot_standby = on

max_wal_senders是Slave庫的節點數,有多少個slave庫就設多少。

wal_level是write ahead log引數值,設定流複製務必將此值更新成hot_standby。

修改後記得重啟資料庫。

第五步:基礎備份複製到備庫伺服器

登陸備庫伺服器,執行如下命令從主庫複製檔案。如果備庫PGDATA目錄有檔案先需要刪除。

pg_basebackup -D $PGDATA -F p -h masterdb -p masterdb_port -U repuser -W

第六步:修改備庫配置資訊

新增recovery.conf檔案。

$ cp $PGHOME/share/postgresql/recovery.conf.sample $PGDATA/recovery.conf
 $ vi recovery.conf  --新增以下三行
 standby_mode ='on'
 trigger_file 
='/data/pgsql/pg.trigger' primary_conninfo ='host=192.168.2.101 port=5432 user=repuser password=123456 keepalives_idle=60'

配置.pgpass檔案。

192.168.2.101:5432:postgres:repuser:123456

第七步:啟動備資料庫,檢查是否啟動成功。

檢視主庫是否有類似這個程序:

postgres: wal sender process repuser 192.168.2.102(45446) streaming 0/C01EDB8

檢視備庫是否有類似這個程序:

postgres: wal receiver process   streaming 0/C01ED28

如果都有就可以在主庫新建一個數據庫測試下,一切沒問題後流複製環境就算搭建好了。

第八步:指令碼定時備份

指令碼是開啟archive_mode的例子。

#!/bin/bash

bkpath=/home/postgres/dbbk/pgsql/dump
log_path=/home/postgres/dbbk/pgsql/logarch

find $log_path -mtime +15-name "*.gz"-exec rm -f {} \;

export PATH=/opt/PostgreSQL/93/bin:$PATH
export PGDATA=/data/pgsql
export PGHOME=/opt/PostgreSQL/93export PGPORT=5432

echo ""
echo "PostgreSQL_backup"
echo "----------------------"
echo "* Rotating backups..."
rm -rf $bkpath/base/02
mv $bkpath/base/01 $bkpath/base/02
mkdir $bkpath/base/01
chmod 750 $bkpath/base/01

label=`date "+%Y%m%d"`

echo `date`"backup started."
pg_basebackup -D $bkpath/base/01-l $label -F t -z
rc=$?
mv $bkpath/base/01/base.tar.gz $bkpath/base/01/base_$label.tar.gz
cp -p $log_path/*.backup.gz $bkpath/base/01
chmod 640 $bkpath/base/01/*.backup.gz
echo `date` "backup completed with rc $rc"
exit $rc