全局一致性
本文檔介紹了全局一致性功能的前提條件、背景信息、技術(shù)方案、開啟方式以及常見問題。
概述
PolarDB PostgreSQL版提供全局一致性功能,在數(shù)據(jù)庫內(nèi)核層面提供全局一致性的能力,保證發(fā)往集群任意節(jié)點的讀請求都可以獲得強一致性的結(jié)果。
前提條件
PolarDB PostgreSQL版14版本,且內(nèi)核小版本需為2.0.14.22.0及以上。
您可通過如下語句查看PolarDB PostgreSQL版的內(nèi)核小版本號:
SHOW polar_version;
polar_version
---------------
2.0.14.22.0
(1 row)
SHOW polar_release_date;
polar_release_date
--------------------
20240630
(1 row)
背景信息
在原有的PolarDB一寫多讀的數(shù)據(jù)庫架構(gòu)中,RO節(jié)點默認(rèn)提供會話一致性讀取功能。物理復(fù)制和共享存儲技術(shù)雖然可以有效降低RO節(jié)點的復(fù)制延遲,但不能保證發(fā)往RO節(jié)點的只讀請求讀取到RW節(jié)點上最新寫入的數(shù)據(jù)。在一些對數(shù)據(jù)延遲比較敏感的金融行業(yè)和游戲行業(yè)中,RO節(jié)點延遲讀取會造成業(yè)務(wù)邏輯的一致性問題。
如上圖所示,業(yè)務(wù)應(yīng)用經(jīng)常通過微服務(wù)框架進(jìn)行解耦,服務(wù)A寫入數(shù)據(jù)后,產(chǎn)生一條寫入成功的消息,通過消息隊列組件通知到服務(wù)B。在會話一致性的場景下,服務(wù)A在col被更新到20后,使用同一個會話立即去讀,,哪怕是請求路由到RO,也能讀到最新的結(jié)果20,但是在服務(wù)A通知服務(wù)B數(shù)據(jù)更新后,服務(wù)B直接讀RO,很可能無法保證得到最新結(jié)果,還是讀到10。此種情況可能給上層業(yè)務(wù)帶來數(shù)據(jù)一致性問題,面對該場景,業(yè)務(wù)側(cè)只能將讀請求轉(zhuǎn)發(fā)到RW節(jié)點上,以保證寫后讀的數(shù)據(jù)一致性,RO節(jié)點資源也因此被閑置。
技術(shù)方案
PolarDB PostgreSQL版在數(shù)據(jù)庫內(nèi)核層面提供了RO節(jié)點的強一致性讀能力,始終保證能看到RW節(jié)點最新寫入的數(shù)據(jù),從而提供了集群維度的強一致性讀能力。在開啟全局一致性功能后,RW節(jié)點上每個讀寫事務(wù)提交時,都會賦予一個CSN(Commit Sequence Number),表示事務(wù)提交序,用來構(gòu)建更高效的事務(wù)快照,以替代原生PostgreSQL的活躍事務(wù)列表。同時,RW節(jié)點會把CSN記錄到WAL中,RO節(jié)點通過回放WAL構(gòu)建出完整的事務(wù)狀態(tài)。
RO節(jié)點強一致性讀能力的SQL執(zhí)行過程如下:
客戶端向RO節(jié)點發(fā)起查詢請求。
RO節(jié)點通過網(wǎng)絡(luò)獲取RW節(jié)點當(dāng)前最大的CSN(Commit Sequence Number)。
RO節(jié)點根據(jù)RW節(jié)點的最大CSN構(gòu)建強一致性只讀視圖,并等到RO節(jié)點事務(wù)狀態(tài)回放到相應(yīng)位點。
RO節(jié)點根據(jù)強一致性讀視圖判斷數(shù)據(jù)可見性,給客戶端返回結(jié)果。
開啟步驟
登錄PolarDB控制臺。
在左側(cè)導(dǎo)航欄單擊集群列表。
在左上角,選擇集群所在地域。
找到目標(biāo)集群,單擊集群ID。
在左側(cè)導(dǎo)航欄中,選擇設(shè)置 。
polar_csn_enable
和polar_global_csn_enable
的值為on
,用于開啟事務(wù)CSN(Commit Sequence Number)的特性。說明需要注意的是,參數(shù)修改需要重啟集群,請在修改參數(shù)前做好業(yè)務(wù)安排,謹(jǐn)慎操作。通過控制臺設(shè)置集群參數(shù)詳細(xì)介紹,請參考設(shè)置集群參數(shù)。
在目標(biāo)集群的基本信息頁面的數(shù)據(jù)庫連接區(qū)域,單擊集群地址右側(cè)的配置或彈窗頁面的點擊設(shè)置。
在編輯地址配置頁面設(shè)置一致性級別為全局一致性(強),同時需要配置另外兩個關(guān)聯(lián)參數(shù):
參數(shù)
描述
全局一致性讀超時時間
為了保證一致性,等待只讀節(jié)點同步到最新數(shù)據(jù)的超時時間。
全局一致性讀超時策略
在只讀節(jié)點等待超時的執(zhí)行策略。取值范圍如下:
0,發(fā)送該請求到主節(jié)點(默認(rèn)值)。
1,超時報錯,客戶端返回錯誤提示信息。
2,超時降級自動降級為非一致性讀取。
常見問題
開啟全局一致性功能后,如果某些查詢不需要使用全局一致性讀,該如何操作?
在RO節(jié)點開啟全局一致性后,默認(rèn)對所有的新建連接生效。如果某些查詢不需要使用該功能,可以通過以下命令來關(guān)閉當(dāng)前連接的全局一致性讀:
SET polar_scc_enable = off;
如何設(shè)置全局一致性讀超時時間
您可以登錄PolarDB控制臺,設(shè)置全局一致性讀超時時間參數(shù)polar_scc_wait_timeout
的值來設(shè)置。如果超時,客戶端會收到以下錯誤信息:
SCC timeout waiting for WAL replay
對于寫入壓力較大,或?qū)懭雺毫Σ环€(wěn)定的集群,您可以將該參數(shù)polar_scc_wait_timeout
的值設(shè)置大一些。
全局一致性讀超時后,如何降級?
您需要登錄PolarDB控制臺,修改參數(shù)polar_scc_timeout_degrade_enable
的值設(shè)置為ON,當(dāng)全局一致性讀超時后,查詢操作會自動降級為非一致性讀取,且客戶端不會收到報錯信息。
如何避免低寫入負(fù)載場景下的讀延遲?
您可以登錄PolarDB控制臺,將高性能參數(shù)synchronous_commit
的值設(shè)置為on,以避免低寫入場景下的讀延遲。