PostgreSQL 金融行業高可用和容災解決方案
金融行業高度依賴共享存儲來解決高可用,數據0丟失以及異地容災的問題。
開源數據庫PostgreSQL基於複製的解決方案能不能解決0丟失,高可用以及容災的問題?
完全可以,而且更靈活,更可靠。
PostgreSQL 金融場景實現
如圖1

主備同步通過流複製實現,可靠性指標包含反饋維度的指標和一致性維度的指標。
1. L1,備庫接收到REDO並寫入XLOG BUFFER。
2. L2,備庫接收到REDO並落盤。
3. L3,備庫接收到REDO落盤後並恢複。
以上三個指標,對事務的時延逐級提升。(根據可靠性強度要求設置)
1. 滿足兩個條件後,通知應用程序事務提交成功或失敗
1.1 強製要求強同步的指定備庫組反饋,處於該組的所有備庫,至少有一個反饋。(用於異地強同步容災,不配置則表示沒有指定的強同步備庫,隻要滿足下麵一條即可。)
1.2 大於等於n個備庫反饋,(用於任意副本數強同步,0表示異步,1表示1個備庫強同步,2表示2個備庫強同步,以此類推)
2. 異步庫延遲多少秒,主庫切換為隻讀(不配置,表示主庫不管異步庫延遲多少)
3. 異步庫延遲多少字節,主庫切換為隻讀(不配置,表示主庫不管異步庫延遲多少)
(如果異地容災庫也需要0丟失,把上圖的異地2個異步庫級聯掛接改為直接掛接主庫即可。並且將它們配置為一組,則這組庫必須要有1個反饋。)
架構簡化
數據0丟失的實際上是靠REDO日誌來保障的,隻要REDO不丟失,就可以恢複到最終一致性狀態。
前麵的圖,可以簡化為XLOG多分組同步如下圖,每個分組代表一個機房(含本地機房)。
XLOG副本:
本地強同步模式
XLOG數據在本地機房同步至少1份。
異地容災強同步模式
XLOG在異地機房同步至少1份。

數據副本:
本地機房建議2個副本。
異地機房建議1個副本,可靠性要求高的場景,可以再增加副本。

配置示範:
針對金融行業,或者可靠性要求非常高的用戶。
本地機房
1主3備,萬兆網連接。
反饋指標配置為2個L1,1個L2。一致性要求配置為超過1個主機反饋。
本地機房和異地機房通過物理分離的雙光纖直連。
異地機房
2備, 都直連主庫,並配置為強同步組,至少要有1個反饋,同時反饋指標都配置為L1。
1. 數據的強同步副本達到了2個,其中一個副本在異地。
2. 本地機房,備庫掛2台沒關係,不影響主庫運作。
3. 異地機房,備庫掛1台沒關係,不影響主庫運作。
1. 對讀完全沒有影響。
2. 對寫事務的性能影響,完全取決於網絡,實測萬兆網的環境中寫事務請求延遲會增加不到1毫秒,影響非常小。
3. 備庫和主庫的延遲,因為PostgreSQL是基於物理變更的數據流同步,所以不存在邏輯複製的延遲問題,物理流複製的延遲可以控製在毫秒級。
4. 發生故障時 HA 切換時延如何?
考慮到網絡抖動,負載等不安因素,整個切換過程一般控製在25到45秒之間。
5. 發生故障切換時,應用要不要重新和數據庫建立會話?
有proxy解決方案,可以做到 HA 切換時不斷開用戶連接,對用戶無感知(但是使用綁定變量的話,需要重新綁定,將來會解決會話信息的同步)。
1. 從已達到同步模式的庫中根據配置的優先級順序選擇
2. 如果用戶配置的是全異步模式,則從延遲最低的庫選擇
3. 同樣的延遲,則根據配置的優先級順序選擇
圖2

選舉出新的主庫後,連接關係重新建立。
1. 備庫可以提供給隻讀查詢,做讀寫分離負載均衡。
2. 時間線切換很方便,主備角色切換非常靈活。
3. 備庫還可以用於升級大版本的演練,測試環境快速搭建,樣本庫快速建立等。
以上這些,使用共享存儲的解決方案都是做不到的。
性能和一致性的博弈
如果異地機房不設置強同步,那麼當主庫所在機房都掛掉時,切換到異地機房有丟數據的風險。但是為了可用性,用戶可能會決定切換到異地機房,那麼問題來了,當主庫所在的機房活了,
1. 怎麼把未完全同步到異地機房的數據補回去?
2. 怎麼快速的把原來的主庫變成備庫,需不需要重新同步數據,搭建主備?
1. PostgreSQL 的logical decode幫你解決第1個問題。
使用logical decode,可以幫助用戶從異地機房激活的時間點開始,將主庫執行過多的SQL取出來,同時將SQL影響的行,老的記錄,新的記錄都取出來。
有了這些數據,就可以在業務層麵解決補數據差異的問題。
2. PostgreSQL 的pg_rewind可以幫你解決第2個問題
速度有多快?假設切換時,異地備庫與主庫的延遲在分鍾級別,那麼:
不管數據庫有多大,都可以分鍾級完成回退,變成備庫。
原理是從異地機房激活的時間點到主庫crash時,主庫產生的XLOG,將這些變更使用新的主庫的數據塊替換。
這一點Oracle都做不到。
成本
使用PostgreSQL的解決方案,本地高可用,加一個容災機房。
(假設用戶單庫的數據 10TB,REDO 保留100GB。)
成本如下:
1. 本地機房數據 2份(包括主庫在內2台主機)
2. 本地機房XLOG 3份(複用以上主機,再增加一台)
3. 異地機房數據 1份(1台主機)
4. 異地機房XLOG 2份(複用以上主機,再增加一台)
一共5台主機。
磁盤容量需求,3份數據容量(30TB),5份REDO容量(500 GB)。
效果:
1. 本地2個XLOG接收服務,掛掉1個不影響主庫的寫操作。
2. 異地機房2個XLOG接收服務,掛掉1個不影響主庫的寫操作。
3. 主庫掛掉時,自動切換到本地的備庫。
4. 機房掛掉時,可以切換到異地的備庫。
最後更新:2017-04-01 13:44:32
上一篇:
公有雲視頻服務功能簡介
下一篇:
PostgreSQL 行列轉換的用法
Java 商戶管理係統 銷售報表 SSM項目源碼 客戶管理 庫存管理
劍指Offer之包含min函數的棧
筆記:The Seven Steps to Building a Successful Software Development Company
無微不至:調整_lm_cache_res_cleanup解決Shared Pool 的4031問題
機房收費係統之結賬與報表
把IList和泛型數組轉換為DataTable
用數據科學搭建一個實時推薦引擎
es6(2)——let和const
阿裏雲RDS PostgreSQL OSS 外部表 - 並行寫提速案例
【OpenHW參賽手記】AXI-Stream接口介紹