系統版本:Ubuntu12.04
數據庫版本:postgresql-9.1.3
java
下載地址:http://ftp.postgresql.org/pub/source/v9.1.3/postgresql-9.1.3.tar.gzsql
Master :192.168.1.10數據庫
Slave : 192.168.1.108vim
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 和用來複制的用戶名密碼ide
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_senders是Slave庫的節點數,有多少個slave庫就設多少,post
wal_level是write ahead log參數值,設置流複製務必將此值更新成hot_standby測試
wal_keep_segments默認值是16,是PG_XLOG下的日誌文件大小archive也能夠選擇關閉,歸檔是定時恢復用的,流複製不是必須的spa
建立用來複制的用戶:rest
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 james@192.168.1.108:/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
測試是否正常:
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=#
數據庫能夠看到已經同步過來。
主備服務器的判斷:
看到此信息的確定是master服務器
看到此信息的確定是slave服務器
模擬master down 機,slave切換爲master
主機中止前的備機進程:
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$
查看備機狀態
備機切換成主機
以前備機上的recovery.conf中配置了 trigger_file = '/database/pgdata/trigger.kenyon' 要切換備機成主機,只要建立一個觸發文件trigger.kenyon便可,這個名字能夠隨便寫
touch /data/pgsql/data0/postgresql.trigger.1949
已經變成production了,對,備機切主機就這麼簡單。
還有一處明顯的變化是如今的主機上的recovery.conf文件名字變成了recovery.done。
備機切換爲主機後,就能夠正常鏈接使用了。此時就有時間去處理原master端問題了。
如今備機能夠正常提供服務了,下來要把原有的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服務器
若是遇到這種時間線不一致的問題:
在現有的master上執行以下操做:
scp 00000002.history postgres@192.168.1.10:/data/pqsql/data0/pg_xlog
而後啓動現有的slave主機:
postgres@Jmaes:/data/pqsql/bin$./pg_ctl -D ../data0 start
成功切換
INSERT INTO slave values ('now slave is ok');
現有的slave上執行插入動做: