本文檔介紹了全域一致性功能的前提條件、背景資訊、技術方案、開啟方式以及常見問題。
概述
PolarDB PostgreSQL版(相容Oracle)提供全域一致性功能,在資料庫核心層面提供全域一致性的能力,保證發往叢集任意節點的讀請求都可以獲得強一致性的結果。
前提條件
支援的PolarDB PostgreSQL版(相容Oracle)版本如下:
Oracle文法相容 2.0(核心小版本2.0.14.22.0及以上)。
背景資訊
在原有的PolarDB一寫多讀的資料庫結構描述中,RO節點預設提供會話一致性讀取功能。物理複製和共用儲存技術雖然可以有效降低RO節點的複寫延遲,但不能保證發往RO節點的唯讀請求讀取到RW節點上最新寫入的資料。在一些對資料延遲比較敏感的金融行業和遊戲行業中,RO節點延遲讀取會造成商務邏輯的一致性問題。
如上圖所示,業務應用經常通過微服務架構進行解耦,服務A寫入資料後,產生一條寫入成功的訊息,通過訊息佇列組件通知到服務B。在會話一致性的情境下,服務A在col被更新到20後,使用同一個會話立即去讀,哪怕是請求路由到RO,也能讀到最新的結果20,但是在服務A通知服務B資料更新後,服務B直接讀RO,很可能無法保證得到最新結果,還是讀到10。此種情況可能給上層業務帶來資料一致性問題,面對該情境,業務側只能將讀請求轉寄到RW節點上,以保證寫後讀的資料一致性,RO節點資源也因此被閑置。
技術方案
PolarDB PostgreSQL版(相容Oracle)在資料庫核心層面提供了RO節點的強一致性讀能力,始終保證能看到RW節點最新寫入的資料,從而提供了叢集維度強一致性讀能力。在開啟全域一致性功能後,RW節點上每個讀寫事務提交時,都會賦予一個CSN(Commit Sequence Number),表示事務提交序,用來構建更高效的事務快照,以替代原生PostgreSQL的活躍事務列表。同時,RW節點會把CSN記錄到WAL中,RO節點通過回放WAL構建出完整的事務狀態。
RO節點強一致性讀能力的SQL執行過程如下:
用戶端向RO節點發起查詢請求。
RO節點通過網路擷取RW節點當前最大的CSN(Commit Sequence Number)。
RO節點根據RW節點的最大CSN構建強一致性唯讀視圖,並等到RO節點事務狀態回放到相應位點。
RO節點根據強一致性讀視圖判斷資料可見度,給用戶端返回結果。
開啟步驟
登入PolarDB控制台。
在左側導覽列單擊叢集列表。
在左上方,選擇叢集所在地區。
找到目的地組群,單擊叢集ID。
在左側導覽列中,選擇設定 。
polar_csn_enable
和polar_global_csn_enable
的值為on
,用於開啟事務CSN(Commit Sequence Number)的特性。需要注意的是,參數修改需要重啟叢集,請在修改參數前做好業務安排,謹慎操作。通過控制台設定叢集參數詳細介紹,請參考設定叢集參數。
在目的地組群的基本資料頁面的資料庫連接地區,單擊叢集地址右側的配置或彈窗頁面的點擊設定。
在編輯地址配置版面設定一致性層級為全域一致性(強),同時需要配置另外兩個關聯參數:
參數
描述
參數
描述
全域一致性讀逾時時間
為了保證一致性,等待唯讀節點同步到最新資料的逾時時間。取值範圍:1~1000000。單位:ms。預設值為100。
全域一致性讀逾時策略
在唯讀節點等待逾時的執行策略。取值範圍如下:
0,發送該請求到主節點(預設值)。
1,逾時報錯,用戶端返回錯誤提示資訊。
2,逾時降級自動降級為非一致性讀取。