全部產品
Search
文件中心

PolarDB:物理/邏輯複製支援從WAL Buffer中讀取WAL日誌

更新時間:Jan 27, 2026

PolarDB PostgreSQL版的物理/邏輯複製支援從WAL Buffer中讀取WAL日誌,從而將複製進程的WAL日誌讀I/O最佳化為記憶體拷貝。這將顯著減少因多個複製進程引發的WAL日誌讀I/O放大,節省讀取WAL日誌所消耗的頻寬,並降低WAL日誌的讀取時延,從而有效減少複製時延。

背景

原生PostgreSQL中,複製可以被分為物理複製邏輯複製

  • 物理複製:通過傳遞WAL日誌的內容實現Primary和Standby節點之間的同步。

  • 邏輯複製:通過傳遞WAL日誌中解碼出的邏輯變更,實現發布端和訂閱端節點之間的資料同步。

一個運行中的PostgreSQL允許同時存在多個物理複製和邏輯複製鏈路,每一個鏈路由一個對應的WAL sender進程負責讀取已經持久化到儲存上的WAL日誌,完成必要的解析後通過網路發送到下遊。每條複製鏈路之間互相獨立,複製進度不受彼此影響。

由於複製進度互相獨立,因此每個複製進程都需要各自讀取全量的WAL日誌並做處理和發送。當複製鏈路數量較多時,WAL日誌的讀頻寬會呈倍數高於WAL日誌的寫頻寬,消耗大量IOPS。當執行個體I/O壓力較大時,大量的WAL日誌讀I/O和日常業務的讀寫I/O會互相影響I/O時延,日常業務的運行速度會變慢,複製延時也會變大。

原生PostgreSQL中,WAL日誌產生時,會先被寫入到WAL Buffer中,然後再被後台進程或普通進程寫入儲存。WAL Buffer中的空間會被迴圈複用,因此WAL Buffer中留存了所有最近產生的WAL日誌,也是最大機率會被複製進程使用到的部分。

PolarDB PostgreSQL版支援直接從WAL Buffer中消費已經落盤但依舊留存的WAL日誌,從而將複製進程的WAL日誌讀 I/O最佳化為記憶體拷貝。該最佳化不僅能夠極大減少因多個複製進程引發的WAL日誌讀I/O放大,節省讀取WAL日誌所消耗的頻寬,還可以降低WAL日誌的讀取時延,從而降低複製時延。

適用範圍

支援的PolarDB PostgreSQL版的版本如下:

  • PostgreSQL 18(核心小版本2.0.18.0.1.0及以上)

  • PostgreSQL 17(核心小版本2.0.17.2.1.0及以上)

  • PostgreSQL 16(核心小版本2.0.16.6.2.0及以上)

  • PostgreSQL 15(核心小版本2.0.15.12.4.0及以上)

  • PostgreSQL 14(核心小版本2.0.14.13.27.0及以上)

說明

您可在控制台查看核心小版本號碼,也可以通過SHOW polardb_version;語句查看。如未滿足核心小版本要求,請升級核心小版本

使用方法

設定polar_enable_read_from_wal_buffers參數為on使其對複製進程生效。預設值為on。通過控制台設定叢集參數詳細操作,請參考設定叢集參數

通過polar_monitor外掛程式可查看從WAL Buffer中讀取WAL日誌的命中情況。

  1. 建立polar_monitor外掛程式。

    CREATE EXTENSION IF NOT EXISTS polar_monitor;
  2. 查看從WAL Buffer中讀取WAL日誌的命中情況。

    SELECT * FROM polar_stat_walsnd_xlog_read();

    返回結果如下:

       pid   | hit  | hit_bytes | prefetched | prefetched_bytes | read | read_bytes
    ---------+------+-----------+------------+------------------+------+------------
     3865685 | 2175 | 251583064 |          0 |                0 |   82 |   10628128
     3865751 | 2173 | 251582792 |          0 |                0 |   82 |   10628400
    (2 rows)

返回欄位描述如下:

列名

資料類型

描述

pid

INTEGER

複製進程PID。

hit

BIGINT

直接命中WAL Buffer的讀I/O次數。

hit_bytes

BIGINT

直接命中WAL Buffer的讀I/O位元組數。

prefetched

BIGINT

從儲存上批量預讀取WAL日誌並在記憶體中緩衝後,命中記憶體緩衝的讀I/O次數。

prefetched_bytes

BIGINT

從儲存上批量預讀取WAL日誌並在記憶體中緩衝後,命中記憶體緩衝的讀I/O位元組數。

read

BIGINT

從儲存上讀取WAL日誌的讀I/O次數。

read_bytes

BIGINT

從儲存上讀取WAL日誌的讀I/O位元組數。