Pgsql 主從複製


系統版本:Ubuntu12.04
數據庫版本:postgresql-9.1.3

下載地址:http://ftp.postgresql.org/pub/source/v9.1.3/postgresql-9.1.3.tar.gz

Master 192.168.1.10

Slave 192.168.1.108

Master PostgreSQL安裝:

sudo apt-get  install lib64readline-gplv2-devlib64readline6-dev libreadline-dev readline-common libghc-readline-dev
sudo apt-get install zlib1g-dev
sudo mkdir -p /data
tar zxvf postgresql-9.1.3.tar.gz
cd postgresql-9.1.3/
sudo ./configure --prefix=/data/pqsql
sudo make
sudo make install
sudo mkdir -p /data/pqsql/data0
sudo chown -R postgres:postgres /data/pqsql/data0/
sudo su – postgres
/data/pqsql/bin/initdb  -D /data/pqsql/data0/
/data/pqsql/bin/pg_ctl   -D /data/pqsql/data0/ start
cd /data/pqsql/data0/
vim pg_hba.conf
host   replication     repuser192.168.1.108/32        md5

#最後一行添加從機的ip 和用來複制的用戶名密碼

vim postgresql.conf
listen_addresses = '*'
max_wal_senders = 1
wal_level = hot_standby
archive_mode = on
archive_command = 'cd ./'
wal_keep_segments = 64

注:max_wal_sendersSlave庫的節點數,有多少個slave庫就設多少,

wal_levelwrite ahead log參數值,設置流複製務必將此值更新成hot_standby

wal_keep_segments默認值是16,PG_XLOG下的日誌文件大小archive也可以選擇關閉,歸檔是定時恢復用的,流複製不是必須的

創建用來複制的用戶:

cd /data/pqsql/bin/
postgres@Jmaes:/data/pqsql/bin$ ./psql
psql (9.1.3)
Type "help" for help.
 
postgres=# CREATE USER repuser replicationLOGIN CONNECTION LIMIT 2 ENCRYPTED PASSWORD 'repuser';
postgres=#\q

重啓master數據庫

./pg_ctl -D ../data0/ restart
Slave安裝
sudo apt-get  install lib64readline-gplv2-devlib64readline6-dev libreadline-dev readline-common libghc-readline-dev
sudo apt-get install zlib1g-dev
sudo mkdir -p /data
tar zxvf postgresql-9.1.3.tar.gz
cd postgresql-9.1.3/
sudo ./configure --prefix=/data/pqsql
sudo make
sudo make install
sudo mkdir -p /data/pqsql/data0
sudo chown -R postgres:postgres /data/pqsql/data0/
sudo su – postgres
/data/pqsql/bin/initdb  -D /data/pqsql/data0/
/data/pqsql/bin/pg_ctl   -D /data/pqsql/data0/ start

確保可以正常啓動就OK

開始同步操作:

備份主庫(master

登陸master主庫執行:

postgres=# selectpg_start_backup('replication work');

打開另外一個終端,切換到root進行打包備份:

cd /data/pqsql/
tar zcvf data0.tar.gz  --exclude=data0/pg_xlog   data0/
scpdata0.tar.gz  [email protected]:/tmp

返回master庫上執行,停止備份操作:

postgres=# selectpg_stop_backup(),current_timestamp;

從庫上操作:

使用具有sudo權限的用戶:

Sudp cp /tmp/data0.tar.gz  /data/pqsql/

然後使用postgres用戶停止數據庫服務

/data/pqsql/bin/pg_ctl   -D /data/pqsql/data0/ stop
mv data0 data0.old

使用sudo的用戶進行解壓:

tar zxvf data0.tar.gz

使用postgres用戶進行修改

cd /data/pgsql/data0
vim pg_hba.conf
host   replication     repuser192.168.1.10/32        md5
vim postgresql.conf
hot_standby = on
cp/data/pgsql/share/recovery.conf.sample /data/pgsql/data0/recovery.conf
standby_mode = 'on'
primary_conninfo = 'host=192.168.1.10port=5432 user=repuser password=repuser keepalives_idle=60'
trigger_file ='/data/pgsql/data0/postgresql.trigger.1949'

配置.pgpass文件

192.168.1.10:5432:postgres:repuser:repuser
rm –rf pg_xlog
rm –rf postmaster.pid
mkdir pg_xlog

啓動slave數據庫

postgres@PostGres:/data/pgsql/bin$./pg_ctl  -D ../data0    start
server starting
postgres@PostGres:/data/pgsql/bin$LOG:  database system was interrupted;last known up at 2014-05-21 11:40:05 CST
LOG: creating missing WAL directory "pg_xlog/archive_status"
LOG: entering standby mode
LOG: streaming replication successfully connected to primary
LOG: redo starts at 0/3000020
LOG: consistent recovery state reached at 0/4000000
LOG: database system is ready to accept read onlyconnections

wKiom1RkfjHhWASkAANceSJS-Fg110.jpg

測試是否正常:

Master上:

CREATE TABLE rep_test (test varchar(40));
INSERT INTO rep_test VALUES ('data one');
INSERT INTO rep_test VALUES ('some morewords');
INSERT INTO rep_test VALUES ('lalala');
INSERT INTO rep_test VALUES ('hellothere');
INSERT INTO rep_test VALUES ('blahblah');

slave上查詢:

postgres=# select * from rep_test;
     test      
-----------------
 dataone
 somemore words
 lalala
 hello there
 blahblah
(5 rows)
 
postgres=#

數據庫可以看到已經同步過來。

 

主備服務器的判斷:

wKioL1RkfvSDdrHnAANfdpeyb2k860.jpg

看到此信息的肯定是master服務器

wKiom1RkftbS75xpAALlJA_WsBA785.jpg

看到此信息的肯定是slave服務器

 

模擬master down 機,slave切換爲master

主機停止前的備機進程:

wKiom1Rkfv-DQQH-AARFCFGi8hk055.jpg

Master停機

postgres@PostGres:/data/pgsql/bin$./pg_ctl  -D ../data0 stop
waiting for server to shut down.... done
server stopped
postgres@PostGres:/data/pgsql/bin$

wKioL1Rkf67DAzD1AAPA2kBWjbI140.jpg

查看備機狀態

wKiom1Rkf2Th4QDoAAIZGLfCrq8552.jpg

備機切換成主機

之前備機上的recovery.conf中配置了 trigger_file = '/database/pgdata/trigger.kenyon' 要切換備機成主機,只要創建一個觸發文件trigger.kenyon即可,這個名字可以隨便寫

touch /data/pgsql/data0/postgresql.trigger.1949

wKioL1RkgBjDm_2GAAE9gLPq6AI500.jpg

已經變成production了,對,備機切主機就這麼簡單。

還有一處明顯的變化是現在的主機上的recovery.conf文件名字變成了recovery.done

備機切換爲主機後,就可以正常連接使用了。此時就有時間去處理原master端問題了。

wKioL1RkgEDAw2RTAAVhDSj5eDU669.jpgwKiom1Rkf_eiXgELAALxY_7ABXA416.jpg

現在備機可以正常提供服務了,下來要把原有的master切換爲slave

在現在的master上做一些操作:

REATE TABLE slave (test varchar(40));
INSERT INTO slave  VALUES  ('welcome to beijing');

在現在的備機上準備恢復文件:

cp/data/pqsql/share/postgresql/recovery.conf.sample  /data/pqsql/data0/recovery.conf
recovery_target_timeline = 'latest'
primary_conninfo = 'host=192.168.1.108port=5432 user=repuser password=repuser'
trigger_file = '/data/pgsql/data0/postgresql.trigger.1949'
standby_mode = on
vim ../data0/postgresql.conf
hot_standby = on
vim ../data0/pg_hba.conf
host   replication     repuser192.168.1.10/32 md5

在現在的slave上創建:

vim .pgpass
192.168.1.11:5432:postgres:repuser:repuser

然後重啓先有的slave服務器

如果遇到這種時間線不一致的問題:

wKiom1RkgHeD_mgrAAHDrTHnmu0075.jpg

在現有的master上執行如下操作:

scp 00000002.history [email protected]:/data/pqsql/data0/pg_xlog

然後啓動現有的slave主機:

postgres@Jmaes:/data/pqsql/bin$./pg_ctl  -D ../data0 start

wKioL1RkgUTwdqGZAAQiBy7vV5Q980.jpg

成功切換

wKiom1RkgRaAaiqwAADlNkTOHPY785.jpg

INSERT INTO  slave   values ('now slave is ok');

wKioL1RkgbfRRjfnAAFIsju2JPo778.jpg

現有的slave上執行插入動作:

wKiom1RkgWegK7vBAAEEQpOhhQw880.jpg

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章