主備流複製環境搭建請參考http://blog.csdn.net/baiyinqiqi/article/details/47833811,參考文章介紹的是異步流複製環境的搭建,實際上同步模式只需要修改主庫的幾個參數即可實現。
主:192.168.3.201
從:192.168.3.202
postgresql 的幾種流複製:
1+n異步流複製:1是指master,n是指slave。一個master可以有多個slave。
1+1+n同步加異步流複製:也就是說1個master與n個slave的流複製環境,在n個slave中有一個slave是同步模式,其它是異步模式。如果同步的slave掛掉,其它異步的slave會選舉出一個slave切換到同步模式,整個流複製環境仍能夠保證1+1+n的結構。
級聯流複製:1個master A,一個slave B直連A,其它slave連B,從B獲取數據。這種方式要9.2或更高版本支持。
這裏流複製環境的搭建不再重複,僅介紹下如何將異步模式修改爲同步模式:
修改master的postgresql.conf
synchronous_standby_names = '*' # *=all,意思是所有slave都被允許以同步方式連接到master,但同一時間只能有一臺slave是同步模式。另外可以指定slave,將值設置爲slave的application_name即可。
synchronous_commit = on #這個參數控制是否等待wal日誌buffer寫入磁盤再返回用戶事物狀態信息。這個對性能影響還是比較大的,看業務實際情況可考慮關閉,在關鍵數據更新時在事物中將其暫時性打開,保證關鍵數據不會因意外停機而丟失。默認情況下是打開狀態。同步流複製模式需要打開這個參數。
測試:
若使用同步流複製模式,那麼master會等待同步slave返回事物狀態後,纔會完成當前事物。所以如果slave停掉,那麼master的事物會一直等待下去。下面將slave 202數據庫關掉,然後在master 201進行事物操作。
slave 202數據庫停掉:
在master 201中進行數據更新,因爲同步slave庫已經停掉了,所以該事物一直等待:
如果將synchronous_commit = off 關掉,即使slave庫關掉了,master的事物也不會出現等待的現象。
主備切換及IP漂移:
模擬環境:192.168.3.201 master 、192.168.3.202 slave 兩臺服務器設置對外ip 192.168.3.100。模擬201宕機,202從slave切換到master,同時100ip從201漂移到202。
設置漂移ip:一塊網卡綁定多個ip網上有很多資料,可以去搜下。注意,master與slave的網卡都要綁定192.168.3.100。master是啓用狀態,slave是停用狀態。
切換前IP配置情況:
切換前數據庫狀態:
在搭建流複製環境的時候,一般在master、與slave服務器上都要配置密碼文件,以便將來master宕機後進行主備切換,這裏就不贅述了。
開始模擬:
停掉master數據庫:
[postgres@CentOS_201 ~]$ pg_ctl stop -m fast
停用master 的192.168.3.100 ip :
啓用slave的192.168.3.100 ip,完成ip漂移:
slave庫進行切換:
查看slave狀態,已經切換到production狀態:
配置原master庫recovery:
recovery_target_timeline = 'latest'
standby_mode = on
primary_conninfo = 'host=192.168.3.202 port=5432 user=rep'
啓動原master,自動切換到standby模式:
ok!
主備切換完成,至於ip漂移,可以用其他服務器的客戶端測試,比如,漂移前,master停用後,slave啓用前,漂移完成後。
另外,postgresql在9.3增加了流複製協議自動拷貝時間線timeline的功能,本過程使用的是9.4。如果您在測試的時候,使用的是9.3以前的版本,可能需要手工拷貝時間線文件。
ip漂移可以使用第三方工具來做,比如keepalived等。