Persisted Buffer Pool(PBP)特效能夠協助您在叢集異常退出或者重新啟動時,仍然可以使用叢集退出前的Shared Buffer Pool。
前提條件
支援的PolarDB PostgreSQL版的版本如下:
PostgreSQL 14(核心小版本14.5.2.0及以上)
PostgreSQL 11(核心小版本1.1.1及以上)
您可通過如下語句查看PolarDB PostgreSQL版的核心小版本的版本號碼:
PostgreSQL 14
select version();
PostgreSQL 11
show polar_version;
背景資訊
PolarDB PostgreSQL版的記憶體可以分為Shared Buffer Pool、Dynamic Shared Memory Areas以及進程私人記憶體三部分:
Shared Buffer Pool:叢集啟動時採用預分配的方式建立的一大段共用記憶體,通過確定offset來對各個功能模組劃分使用區間。
Dynamic Shared Memory Areas:進程間動態共用記憶體區。PostgreSQL為實現進程間並行計算設計的共用記憶體區,可以動態擴充。
Process Global Area:進程工作使用的記憶體區。包含以下兩部分。
Memory Context。
邏輯直接控制的記憶體。
記憶體劃分如圖所示:
其中,Shared Buffer Pools在PolarDB PostgreSQL版中使用的記憶體最多,且對效能有直接影響。原PostgreSQL在叢集重啟或者意外退出時,都會對Shared Buffer Pools進行清理和重新初始化。在叢集重啟進入到故障恢複狀態時,會根據WAL日誌進行資料頁面的修改,需要重新載入資料甚至修改資料,影響叢集可用時間。其次,Shared Buffer Pools的重新初始化將會導致重新載入資料業務需要的資料,會帶來嚴重的效能抖動。
為瞭解決以上問題,PolarDB PostgreSQL版增加了Persisted Buffer Pool(PBP)的特性,能夠在叢集異常退出或者重新啟動時,仍然可以使用叢集退出前的Shared Buffer Pool。優勢如下:
減少故障恢復,提升系統可用性。
叢集退出前後,效能沒有明顯抖動。
原理介紹
PolarDB PostgreSQL版將Shared Buffer Pool的部分記憶體變為Pod級生命週期的Persisted Buffer Pool。根據對效能的影響性,PolarDB PostgreSQL版主要將Buffer Pool和Buffer Descriptor兩部分放入了PBP中,其他依舊是Instance級生命週期的記憶體。
Pod級生命週期:PolarDB PostgreSQL版是部署在K8s上的,Pod級生命週期的共用記憶體不會隨著叢集的退出而銷毀。
Instance級生命週期:在叢集退出或者異常退出重啟後進行清理的叢集級共用記憶體。
記憶體劃分如圖所示:
影響PBP可用性的指標
叢集退出前的PBP不是所有情境都適用。在叢集啟動時,如果出現以下情況,則無法使用PBP。
叢集的規格改變,需要使用不同大小的Buffer Pool。
當前PBP並非此叢集所建立。
當前PBP中的控制資訊失效。
除了PBP的整體可用性需要檢查外,每個PBP的頁都需要做可用性檢測。如果出現以下情況,則無法使用當前頁。
當前頁存在未提交的事務。
當前頁的Descriptor資訊無效。
當前頁存在無效的LSN。
當前頁的屬性為錯誤或者無效。
影響PBP可用性的指標如圖所示:
PBP的效果
Persisted Buffer Pool在資料庫重啟後,依然能夠使用叢集退出前的Buffer Pool。因此,無論在恢複情境還是業務情境,都能夠快速使用快取資料,提升效能。如圖所示:
恢複效能對比。
類比異常退出時的情境,回放日誌總大小為2093 MB情況如下:
參數
日誌回放耗時
故障恢複耗時
未使用PBP
598s
746s
使用PBP
68s
294s
耗時對比如圖所示:
效能前後對比。
並不是Buffer Pool中所有的頁都是可以複用的。例如:在重啟前,某進程對頁上X鎖,隨後系統宕機了,該X鎖就沒有進程來釋放了。因此,在宕機和重啟之後需要把Buffer Pool的所有頁遍曆一遍,剔除掉不能被複用的頁。另外,Buffer Pool的回收依賴於K8s。使用該最佳化之後,可以使重啟前後的效能更加平穩。重啟前後效能對比如圖所示:
使用指南
開啟如下參數即可使用。
polar_enable_persisted_buffer_pool = ON
參數的啟用或者關閉需要重啟叢集。