本文由簡體中文內容自動轉碼而成。阿里雲不保證此自動轉碼的準確性、完整性及時效性。本文内容請以簡體中文版本為準。

全域一致性

更新時間:2025-02-17 02:01

本文檔介紹了全域一致性功能的前提條件、背景資訊、技術方案、開啟方式以及常見問題。

概述

PolarDB PostgreSQL版(相容Oracle)提供全域一致性功能,在資料庫核心層面提供全域一致性的能力,保證發往叢集任意節點的讀請求都可以獲得強一致性的結果。

前提條件

支援的PolarDB PostgreSQL版(相容Oracle)版本如下:

Oracle文法相容 2.0(核心小版本2.0.14.22.0及以上)。

說明

您可通過如下語句查看PolarDB PostgreSQL版(相容Oracle)的核心小版本號碼:

SHOW polar_version;

如需升級核心小版本,請參考升級版本

背景資訊

在原有的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執行過程如下:

  1. 用戶端向RO節點發起查詢請求。

  2. RO節點通過網路擷取RW節點當前最大的CSN(Commit Sequence Number)。

  3. RO節點根據RW節點的最大CSN構建強一致性唯讀視圖,並等到RO節點事務狀態回放到相應位點。

  4. RO節點根據強一致性讀視圖判斷資料可見度,給用戶端返回結果。

開啟步驟

  1. 登入PolarDB控制台

  2. 在左側導覽列單擊叢集列表

  3. 在左上方,選擇叢集所在地區。

  4. 找到目的地組群,單擊叢集ID。

  5. 在左側導覽列中,選擇配置與管理 > 參數配置設定polar_csn_enablepolar_global_csn_enable的值為on,用於開啟事務CSN(Commit Sequence Number)的特性。

    說明

    需要注意的是,參數修改需要重啟叢集,請在修改參數前做好業務安排,謹慎操作。通過控制台設定叢集參數詳細介紹,請參考設定叢集參數

  6. 在目的地組群的基本資料頁面的資料庫連接地區,單擊叢集地址右側的配置或彈窗頁面的點擊設定

    image

  7. 在編輯地址配置版面設定一致性層級為全域一致性(強),同時需要配置另外兩個關聯參數:

    參數

    描述

    參數

    描述

    全域一致性讀逾時時間

    為了保證一致性,等待唯讀節點同步到最新資料的逾時時間。取值範圍:1~1000000。單位:ms。預設值為100。

    全域一致性讀逾時策略

    在唯讀節點等待逾時的執行策略。取值範圍如下:

    • 0,發送該請求到主節點(預設值)

    • 1,逾時報錯,用戶端返回錯誤提示資訊。

    • 2,逾時降級自動降級為非一致性讀取。

常見問題

開啟全域一致性功能後,如果某些查詢不需要使用全域一致性讀,該如何操作?

在RO節點開啟全域一致性後,預設對所有的建立串連生效。如果某些查詢不需要使用該功能,可以通過以下命令關閉當前會話的全域一致性讀:

SET polar_scc_enable = off;

如何設定全域一致性讀逾時時間

登入PolarDB控制台,單擊目的地組群地址右側的配置或彈窗頁面的點擊設定,修改全域一致性讀逾時時間。如果逾時,用戶端會收到以下錯誤資訊:

SCC timeout waiting for WAL replay
說明

對於寫入壓力較大,或寫入壓力不穩定的叢集,您可以將全域一致性讀逾時時間的值設定大一些。

全域一致性讀逾時後,如何降級?

登入PolarDB控制台,單擊目的地組群地址右側的配置或彈窗頁面的點擊設定,設定全域一致性讀逾時策略2,逾時降級自動降級為非一致性讀取。當全域一致性讀逾時後,查詢操作會自動降級為非一致性讀取,且用戶端不會收到報錯資訊。全域一致性讀逾時策略的取值範圍及詳細介紹請參考全域一致性讀逾時策略參數描述

如何避免低寫入負載情境下的讀延遲?

登入PolarDB控制台,設定高績效參數synchronous_commit值為on,以避免低寫入情境下的讀延遲。通過控制台修改參數詳細操作請參考設定叢集參數

  • 本頁導讀 (1, M)
  • 概述
  • 前提條件
  • 背景資訊
  • 技術方案
  • 開啟步驟
  • 常見問題
  • 開啟全域一致性功能後,如果某些查詢不需要使用全域一致性讀,該如何操作?
  • 如何設定全域一致性讀逾時時間
  • 全域一致性讀逾時後,如何降級?
  • 如何避免低寫入負載情境下的讀延遲?
文檔反饋