2025年9月25日: PostgreSQL 18 釋出!
支援的版本: 當前 (18) / 17 / 16 / 15 / 14 / 13
開發版本: devel
不支援的版本: 12 / 11 / 10 / 9.6 / 9.5 / 9.4 / 9.3 / 9.2 / 9.1 / 9.0

26.1. 不同解決方案的比較 #

共享磁碟故障轉移

共享磁碟故障轉移避免了同步開銷,因為只有一個數據庫副本。它使用一個由多個伺服器共享的單一磁碟陣列。如果主資料庫伺服器發生故障,備用伺服器能夠像從資料庫崩潰中恢復一樣掛載並啟動資料庫。這允許快速故障轉移而不會丟失資料。

共享硬體功能在網路儲存裝置中很常見。使用網路檔案系統也是可能的,儘管必須注意檔案系統具有完整的POSIX行為(參見第 18.2.2.1 節)。此方法的一個主要限制是,如果共享磁碟陣列發生故障或損壞,主伺服器和備用伺服器都將無法執行。另一個問題是,在主伺服器執行時,備用伺服器永遠不應訪問共享儲存。

檔案系統(塊裝置)複製

共享硬體功能的一個修改版本是檔案系統複製,其中檔案系統的所有更改都會映象到另一臺計算機上的檔案系統中。唯一的限制是,映象必須以確保備用伺服器擁有檔案系統的Consistent副本的方式完成——特別是,必須按照與主伺服器相同的順序在備用伺服器上執行寫操作。DRBD是Linux上流行的檔案系統複製解決方案。

預寫日誌傳輸

可以透過讀取預寫日誌(WAL)記錄流來使溫備和熱備伺服器保持最新。如果主伺服器發生故障,備用伺服器將包含主伺服器的幾乎所有資料,並可以快速成為新的主資料庫伺服器。這可以是同步的或非同步的,並且只能用於整個資料庫伺服器。

可以使用基於檔案的日誌傳輸(第 26.2 節)或流複製(參見第 26.2.5 節),或兩者的組合來實現備用伺服器。有關熱備的資訊,請參見第 26.4 節

邏輯複製

邏輯複製允許資料庫伺服器將資料修改流傳送到另一臺伺服器。PostgreSQL邏輯複製從WAL構建邏輯資料修改流。邏輯複製允許按表複製資料更改。此外,釋出自身更改的伺服器也可以訂閱另一臺伺服器的更改,從而允許資料雙向流動。有關邏輯複製的更多資訊,請參見第 29 章。透過邏輯解碼介面(第 47 章),第三方擴充套件也可以提供類似功能。

基於觸發器的主備複製

基於觸發器的複製設定通常將資料修改查詢定向到指定的伺服器。基於表進行操作,主伺服器(通常)非同步地將資料更改傳送到備用伺服器。在主伺服器執行時,備用伺服器可以響應查詢,並且可能允許一些本地資料更改或寫入活動。這種複製形式通常用於分載大型分析或資料倉庫查詢。

Slony-I是此類複製的一個示例,具有按表粒度和多備用伺服器支援。因為它非同步地(分批)更新備用伺服器,所以在故障轉移期間可能丟失資料。

基於SQL的複製中介軟體

使用基於SQL的複製中介軟體,程式會攔截每個SQL查詢並將其傳送到一個或所有伺服器。每個伺服器獨立執行。讀寫查詢必須傳送到所有伺服器,以便每個伺服器接收任何更改。但只讀查詢可以僅傳送到一個伺服器,從而允許在它們之間分配讀取工作負載。

如果查詢只是未經修改地廣播,則random()CURRENT_TIMESTAMP和序列等函式在不同伺服器上可能會有不同的值。這是因為每個伺服器獨立執行,並且因為SQL查詢是廣播的而不是實際的資料更改。如果這是不可接受的,則中介軟體或應用程式必須從單個源確定這些值,然後將這些值用於寫入查詢。還必須注意,所有事務要麼在所有伺服器上提交,要麼中止,可能使用兩階段提交(PREPARE TRANSACTIONCOMMIT PREPARED)。Pgpool-IIContinuent Tungsten是此類複製的示例。

非同步多主複製

對於不經常連線或通訊連結緩慢的伺服器,如筆記型電腦或遠端伺服器,保持伺服器之間的資料一致性是一項挑戰。使用非同步多主複製,每個伺服器獨立工作,並定期與其他伺服器通訊以識別衝突事務。衝突可以透過使用者或衝突解決規則來解決。Bucardo是此類複製的一個示例。

同步多主複製

在同步多主複製中,每個伺服器都可以接受寫請求,並在每次事務提交之前,將修改後的資料從原始伺服器傳輸到每個其他伺服器。繁重的寫操作可能導致過多的鎖定和提交延遲,從而導致效能下降。讀取請求可以傳送到任何伺服器。一些實現使用共享磁碟來減少通訊開銷。同步多主複製最適合以讀取為主的工作負載,儘管它最大的優點是任何伺服器都可以接受寫請求——無需在主伺服器和備用伺服器之間劃分工作負載,並且由於資料更改是從一個伺服器傳送到另一個伺服器,因此不會出現random()等非確定性函式的問題。

PostgreSQL不提供此類複製,儘管PostgreSQL兩階段提交(PREPARE TRANSACTIONCOMMIT PREPARED)可以在應用程式程式碼或中介軟體中實現此功能。

表 26.1總結了上述各種解決方案的功能。

表 26.1. 高可用性、負載均衡和複製功能矩陣

功能 共享磁碟 檔案系統複製 預寫日誌傳輸 邏輯複製 基於觸發器的複製 SQL複製中介軟體 非同步MM複製 同步MM複製
流行示例 NAS DRBD 內建流複製 內建邏輯複製,pglogical Londiste,Slony pgpool-II Bucardo  
通訊方法 共享磁碟 磁碟塊 WAL 邏輯解碼 錶行 SQL 錶行 錶行和行鎖
無需特殊硬體  
允許多個主伺服器        
對主伺服器無開銷        
無需等待多個伺服器   (非同步時) (非同步時)    
主伺服器故障永不丟失資料 (同步時) (同步時)    
副本接受只讀查詢     (熱備時)
按表粒度        
無需衝突解決    

有幾種解決方案不符合上述類別

資料分割槽

資料分割槽將表分成資料集。每個資料集只能由一個伺服器修改。例如,資料可以按辦公室分割槽,例如倫敦和巴黎,每個辦公室都有一個伺服器。如果需要組合倫敦和巴黎資料的查詢,應用程式可以查詢兩個伺服器,或者可以使用主/備複製來在每個伺服器上保留其他辦公室資料的只讀副本。

多伺服器並行查詢執行

上述許多解決方案允許多個伺服器處理多個查詢,但沒有一個允許單個查詢使用多個伺服器來更快地完成。此解決方案允許多個伺服器同時處理單個查詢。它通常透過將資料分佈在伺服器之間,並讓每個伺服器執行其查詢部分,然後將結果返回到一箇中央伺服器,然後將它們合併並返回給使用者來實現。可以使用PL/Proxy工具集實現這一點。

還應注意,由於PostgreSQL是開源的並且易於擴充套件,因此許多公司採用了PostgreSQL並建立了具有獨特故障轉移、複製和負載均衡功能的商業閉源解決方案。此處不討論這些。

提交更正

如果您在文件中看到任何不正確、與您對特定功能的體驗不符或需要進一步解釋的內容,請使用此表單報告文件問題。