共享磁碟容錯移轉透過僅擁有資料庫的一個副本來避免同步負擔。 它使用由多個伺服器共享的單一磁碟陣列。 如果主資料庫伺服器發生故障,備用伺服器能夠掛載並啟動資料庫,就像從資料庫崩潰中恢復一樣。 這允許快速容錯移轉,而不會丟失資料。
共享硬體功能在網路儲存裝置中很常見。 使用網路檔案系統也是可能的,但必須注意檔案系統是否具有完整的POSIX行為(請參閱第 18.2.2.1 節)。 這種方法的一個顯著限制是,如果共享磁碟陣列發生故障或損壞,主伺服器和備用伺服器都將無法運作。 另一個問題是,在主伺服器執行時,備用伺服器絕不應存取共享儲存。
共享硬體功能的一個修改版本是檔案系統複寫,其中對檔案系統的所有變更都會鏡像到位於另一台電腦上的檔案系統。 唯一的限制是鏡像必須以確保備用伺服器具有檔案系統一致副本的方式進行 — 具體來說,寫入備用伺服器必須以與主伺服器上相同的順序進行。DRBD 是 Linux 的熱門檔案系統複寫解決方案。
可以透過讀取預寫式日誌 (WAL) 記錄串流來保持暖備用伺服器和熱備用伺服器處於最新狀態。 如果主伺服器發生故障,備用伺服器幾乎包含主伺服器的所有資料,並且可以快速成為新的主資料庫伺服器。 這可以是同步或非同步的,並且只能對整個資料庫伺服器執行。
可以使用基於檔案的日誌傳輸(第 26.2 節)或串流複寫(請參閱第 26.2.5 節)或兩者的組合來實現備用伺服器。 有關熱備用的資訊,請參閱第 26.4 節。
邏輯複寫允許資料庫伺服器將資料修改串流傳送到另一個伺服器。PostgreSQL 邏輯複寫從 WAL 構造邏輯資料修改串流。 邏輯複寫允許以每個表格為基礎複寫資料變更。 此外,發布自身變更的伺服器也可以訂閱來自另一個伺服器的變更,從而允許資料在多個方向上流動。 有關邏輯複寫的更多資訊,請參閱第 29 章。 透過邏輯解碼介面(第 47 章),第三方擴充功能也可以提供類似的功能。
基於觸發器的複寫設定通常將資料修改查詢傳輸到指定的主伺服器。 在每個表格的基礎上運作,主伺服器(通常)以非同步方式將資料變更傳送到備用伺服器。 在主伺服器執行時,備用伺服器可以回答查詢,並且可能允許一些本地資料變更或寫入活動。 這種形式的複寫通常用於卸載大型分析或資料倉儲查詢。
Slony-I 是此類複寫的一個範例,具有每個表格的粒度,並支援多個備用伺服器。 因為它以非同步方式(以批次形式)更新備用伺服器,所以在容錯移轉期間可能會遺失資料。
透過基於 SQL 的複寫中介軟體,程式會攔截每個 SQL 查詢,並將其傳送到一個或所有伺服器。 每個伺服器獨立運作。 讀寫查詢必須傳送到所有伺服器,以便每個伺服器都收到任何變更。 但是唯讀查詢可以僅傳送到一個伺服器,從而允許將讀取工作負載分散在它們之間。
如果查詢只是未經修改地廣播,則 random()
、CURRENT_TIMESTAMP
和序列等函數在不同的伺服器上可能具有不同的值。 這是因為每個伺服器獨立運作,並且因為廣播的是 SQL 查詢而不是實際的資料變更。 如果這是不可接受的,則中介軟體或應用程式必須從單一來源確定這些值,然後在寫入查詢中使用這些值。 還必須注意,所有交易要么在所有伺服器上提交,要么中止,也許可以使用兩階段提交(PREPARE TRANSACTION 和 COMMIT PREPARED)。 Pgpool-II 和 Continuent Tungsten 是此類複寫的範例。
對於那些不常連線或擁有慢速通訊連結的伺服器,像是筆記型電腦或遠端伺服器,保持伺服器間資料的一致性是一項挑戰。 使用非同步多主複製,每台伺服器獨立運作,並定期與其他伺服器通訊以識別衝突的交易。 這些衝突可以由使用者或衝突解決規則來解決。 Bucardo 是這種類型複製的一個範例。
在同步多主複製中,每台伺服器都可以接受寫入請求,並且修改過的資料會從原始伺服器傳輸到所有其他伺服器,然後每個交易才會提交。 繁重的寫入活動可能會導致過度的鎖定和提交延遲,進而導致效能不佳。 讀取請求可以傳送到任何伺服器。 有些實作使用共享磁碟來減少通訊開銷。 同步多主複製最適合主要為讀取的工作負載,儘管它的最大優點是任何伺服器都可以接受寫入請求 — 不需要將工作負載分割到主要和備用伺服器之間,而且由於資料變更會從一台伺服器傳送到另一台伺服器,因此非確定性函數(如 random()
)不會有問題。
PostgreSQL 不提供這種類型的複製,但 PostgreSQL 的兩階段提交(PREPARE TRANSACTION 和 COMMIT PREPARED)可以用於在應用程式碼或中介軟體中實現這一點。
表 26.1 總結了上面列出的各種解決方案的功能。
表 26.1. 高可用性、負載平衡和複製功能矩陣
功能 | 共享磁碟 | 檔案系統複製 | 預寫式日誌傳輸 | 邏輯複製 | 基於觸發器的複製 | SQL 複製中介軟體 | 非同步多主複製 | 同步多主複製 |
---|---|---|---|---|---|---|---|---|
常見範例 | NAS | DRBD | 內建串流複製 | 內建邏輯複製,pglogical | Londiste, Slony | pgpool-II | Bucardo | |
通訊方法 | 共享磁碟 | 磁碟區塊 | WAL | 邏輯解碼 | 資料表列 | SQL | 資料表列 | 資料表列和列鎖定 |
無需特殊硬體 | • | • | • | • | • | • | • | |
允許使用多個主伺服器 | • | • | • | • | ||||
主伺服器上沒有額外開銷 | • | • | • | • | ||||
無需等待多個伺服器 | • | 關閉同步時 | 關閉同步時 | • | • | |||
主伺服器故障永遠不會遺失資料 | • | • | 開啟同步時 | 開啟同步時 | • | • | ||
副本接受唯讀查詢 | 使用熱備援 | • | • | • | • | • | ||
可以指定到資料表層級 | • | • | • | • | ||||
無需解決衝突 | • | • | • | • | • | • |
有些解決方案不屬於上述任何類別
資料分割將資料表分割成資料集。 每個集合只能由一台伺服器修改。 例如,可以按辦公室(例如倫敦和巴黎)分割資料,每個辦公室都有一台伺服器。 如果需要結合倫敦和巴黎資料的查詢,應用程式可以查詢兩台伺服器,或者可以使用主/備複製在每台伺服器上保留另一辦公室資料的唯讀副本。
上述許多解決方案允許使用多個伺服器來處理多個查詢,但沒有一個允許單個查詢使用多個伺服器來更快地完成。 此解決方案允許多個伺服器同時處理單個查詢。 通常的做法是在伺服器之間分割資料,並讓每台伺服器執行其查詢部分並將結果傳回中央伺服器,在中央伺服器中將結果組合並傳回給使用者。 可以使用 PL/Proxy 工具集來實作此功能。
還應該注意的是,由於 PostgreSQL 是開源且易於擴展的,因此許多公司都採用了 PostgreSQL 並創建了具有獨特故障轉移、複製和負載平衡功能的商業閉源解決方案。 這裡不討論這些。
如果您在文件中發現任何不正確、與您特定功能的使用經驗不符或需要進一步澄清的內容,請使用此表格回報文件問題。