本文檔介紹了全域一致性功能的前提條件、背景資訊、技術方案、開啟方式以及常見問題。
概述
PolarDB PostgreSQL版提供全域一致性功能,在資料庫核心層面提供全域一致性的能力,保證發往叢集任意節點的讀請求都可以獲得強一致性的結果。
適用範圍
支援的PolarDB PostgreSQL版的版本如下:
PostgreSQL 14(核心小版本2.0.14.11.22.0及以上)。
背景資訊
在原有的PolarDB一寫多讀的資料庫結構描述中,RO節點預設提供會話一致性讀取功能。物理複製和共用儲存技術雖然可以有效降低RO節點的複寫延遲,但不能保證發往RO節點的唯讀請求讀取到RW節點上最新寫入的資料。在一些對資料延遲比較敏感的金融行業和遊戲行業中,RO節點延遲讀取會造成商務邏輯的一致性問題。
如上圖所示,業務應用經常通過微服務架構進行解耦,服務A寫入資料後,產生一條寫入成功的訊息,通過訊息佇列組件通知到服務B。在會話一致性的情境下,服務A在col被更新到20後,使用同一個會話立即去讀,哪怕是請求路由到RO,也能讀到最新的結果20,但是在服務A通知服務B資料更新後,服務B直接讀RO,很可能無法保證得到最新結果,還是讀到10。此種情況可能給上層業務帶來資料一致性問題,面對該情境,業務側只能將讀請求轉寄到RW節點上,以保證寫後讀的資料一致性,RO節點資源也因此被閑置。
技術方案
PolarDB PostgreSQL版在資料庫核心層面提供了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,超时降级自动降级为非一致性读取