前幾天講過zfs的snapshot用作postgresql pitr, 使用接近還原點的snapshot可以減少xlog的apply, 縮短資料庫的恢複時間.
其實snapshot還有一個作用, 用作流複制ha的主備角色切換後避免因為xlog的差異導緻old primary無法切換成standby角色.
例如 :
一個pg 流複制的ha場景如下 :
在發生failover後, standby節點切換成主節點, 老的主節點切換成standby節點.
但是由于standby節點和老的主節點存在差異, (即隻接收了部分xlog), 那麼standby激活後實際上是從primary節點的過去狀态開始了新的讀寫, 是以primary節點不能直接切換成standby節點.
如果primary節點有snapshot的話, 可以回到以往的snapshot, 使用rollback或者使用clone都沒有問題. 隻是clone更保險一點, 因為還能回來, 完全ok後可以删掉其他的dataset.
注意必須回到一個節點并且所有的xlog都在新的primary可以找到.
這種問題的另外一種解決辦法是使用rsync , 這也是pgpool-ii中的用法, 但是rsync對于比較大的資料庫, 開銷一是很大的, 因為所有的檔案都要讀一遍, 技術checksum, 然後與本地檔案的checksum進行比對. 是以不推薦使用rsync.
[參考]1. http://blog.163.com/digoal@126/blog/static/163877040201441723450443/