閱讀366 返回首頁    go 阿裏雲 go 技術社區[雲棲]


PostgreSQL 金融行業高可用和容災解決方案

金融行業高度依賴共享存儲來解決高可用,數據0丟失以及異地容災的問題。

開源數據庫PostgreSQL基於複製的解決方案能不能解決0丟失,高可用以及容災的問題?
完全可以,而且更靈活,更可靠。

PostgreSQL 金融場景實現

如圖1
0fc4318705cff149ded79ab3fc718132098d2cbd
主備同步通過流複製實現,可靠性指標包含反饋維度的指標和一致性維度的指標。

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份。

d0bf7f30cfb1eebe0725412afbece699fccccd09

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

配置示範:
針對金融行業,或者可靠性要求非常高的用戶。
本地機房
    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

3919cc0c4c4d7d5e0b74bf672a45f75ca68f2133

選舉出新的主庫後,連接關係重新建立。

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

  上一篇:go 公有雲視頻服務功能簡介
  下一篇:go PostgreSQL 行列轉換的用法