MathJax

MathJax-2

MathJax-3

Google Code Prettify

置頂入手筆記

EnterproseDB Quickstart — 快速入門筆記

由於考慮採用 EnterpriseDB 或是直接用 PostgreSQL 的人,通常需要一些入手的資料。這邊紀錄便提供相關快速上手的簡單筆記 ~ 這篇筆記以 資料庫安裝完畢後的快速使用 為目標,基本紀錄登入使用的範例:

2021年1月30日 星期六

PGSQL 9.x 之後的交易流水帳 WAL 的管理變化—從 v9.4 到 v13

傳統的關聯式資料庫為了的設計上,大多有所謂的 Transaction Log (Tx Log) 的機制設計,將資料庫活動一五一十的記錄下來(優先於表格資料的實際回存到磁碟),以確保資料的高規格保全要求。
Transaction Log 通常稱作交易日誌,不過為了避免跟一般錯誤紀錄 Log 混淆,以下稱作交易紀錄流水帳。
在 PGSQL 與 EDB/PGSQL 企業版中,該機制稱為 Write-Ahead Logging,通常稱作 WAL。

這份筆記簡單紀錄 PGSQL 9.4 ~ PGSQL 13 的重要設定變化。

WAL 檔案:

單一 WAL 檔案預設大小為 16MB (wal_segment_size )。寫滿的 WAL 檔案會回收重利用,或是往他處備份存放(稱作 WAL Archiving),用來搭配資料庫全備份執行 Point-in-Time Recovery ,或是資料庫 Streaming Replication 機制的 Standby DB 同步追溯之用。

一般來說 WAL 檔案大小不是影響 DB 活動效能的首要因素(實際影響的設定在下面~),通常調整 WAL 檔案大小是因為觀察到資料庫活躍導致 WAL Archiving 檔案太多,而透過加大 WAL 大小以減少備份的 WAL 檔案數量。


通常 PGSQL 的 WAL 檔案為 16MB。WAL 檔案大小在 PGSQL 9.x 時僅能在編譯時從 PGSQL 原始碼指定大小。

在 EDB 10 / PGSQL 11 開始,WAL 檔案大小可以在資料庫初始化 initdb 時指定,或透過 pg_resetwal --wal-segsize 指令重新變更 WAL 檔案大小。

不過要注意,變更 WAL 大小,資料庫需要先停止(停機狀態)才能變更,以及大小設定為 2^4 ~ 2^10 這幾個允許值(Note:PGSQL 資料檔都是 1GB 一個,「一格」資料最大也是 1GB:除了 DB Log 之外,其他檔案都在 1GB 以下,連 pg_read_file() 或 pg_read_binary_file() 讀取檔案也都以 1GB 為上限~)。


另外,調整單一 WAL 檔案大小,與 checkpoint_segments, min_wal_size / max_wal_size 的概念不同。加大 WAL 檔案大小是便於備份管理:在作業量比較大的環境,WAL 會很多,這時用比較大的檔案就可以減少備份檔的數量,在進行 Housekeeping 會比較快。

與交易效能調整比較有關的是 WAL 目錄指定大小,也就是 checkpoint_segments, min_wal_size / max_wal_size 的設定。


除了 WAL 檔案大小本身之外,對應的資料庫參數也有一些變動,從指定檔案數量轉變為空間用量的指定:這些參數則延續到 PGSQL 13 才全面替代。



WAL 目錄:

PostgreSQL 的 9.x 版,裡面有一個叫做 pg_xlog/ 的目錄,存放交易紀錄流水帳;原始碼內部也以  xlog 表示,為 Transaction Log 之意。此目錄可類比為一個錄音帶:資料庫的交易流水帳會在異動資料回寫到資料表格檔之前,將 SQL 活動全部都寫到本處,是資料庫作為 Crash Recovery 從異常狀態回復的依據。

由於有些在使用 PostgreSQL 的人,會不小心搞混 pg_log/,pg_clog/ 與 pg_xlog/ 三者,造成誤刪的狀況(原本要刪除 pg_log/ 的紀錄,結果刪了另外兩個)。

因此到 PostgreSQL 10 之後,該目錄調整名稱,改叫做 pg_wal/。

到 PostgreSQL 10,把三者目錄改名字:資料庫的 log/ 會由 current_logfiles 紀錄其位置;pg_clog/ 改成 pg_xact/;pg_xlog/ 則改成 pg_wal/。此外,只要出現 xlog 字樣的系統表或系統函數,都會替代成 wal 字樣。


相關的指令跟函數也有相應的改變

指令 pg_receivexlog 改成 pg_receivewal

函數 pg_switchxlog() 改成 pg_switchwal()

WAL 流水帳位置相關的 location 統一換成 lsn,

例如 pg_current_xlog_location() 改成 pg_current_wal_lsn(),以此類推。



WAL 空間用量控制:

PGSQL 9.4 之前,相關參數叫做 checkpoint_segments,指定 pg_xlog/ 目錄裡面的 WAL Segment file 數量。

到 PGSQL 9.5 之後,被一組參數所替代,min_wal_size / max_wal_size。

其中 checkpoint_segments 直接對應 max_wal_size。pg_wal/ 目錄內容基本上會在這上限值大小左右,若遇到突發的作業,pg_wal/ 佔據大小會變大,等到作業緩和後再慢慢消化到 max_wal_size 設定值。

max_wal_size(或是 checkpoint_segments)指定的大一些的話,在日常作業量就偏大的環境,可以免於 WAL 不斷 rotate 的情況,因此能提昇相當程度的效能,不過這裡保留的比較多,在備份檔還原或是 crash recovery 時會花久一點的時間才會啟動。


min_wal_size 則是另外的設定:pg_wal/ 裡面檔案不多時,完成 checkpoint 之後,過時的 WAL 檔案不要刪掉而是重新回收使用。該設定在指定資料庫太閒的時段,可以保留一點餘裕,應付突發的作業量(因為通常開新檔會有些開銷,沿用既有檔案比較容易)。不過該做的 WAL Archiving 仍然是正常進行(通常 archive_command 填的指令不是 move 而是 copy)



全備份與 WAL:

資料庫全備份指令 pg_basebackup,會將資料庫全部備份起來,資料庫不用停機。但由於資料庫備份期間免不了有資料異動,因此資料庫需要保留備份期間的 WAL 檔案,以便補齊過程中的異動。

但 pg_basebackup 備份有幾種 WAL 備份的模式(--xlog-method / --wal-method)

  • None:直接不備份 WAL,啟動備份檔會必要 restore_command 設定

  • Fetch:在備份完資料檔最後才開始備份 pg_wal/ 目錄

  • Stream:備份開始時,便額外啟動一個 WAL 串流同時備份

在 PGSQL 10 之前,僅能以 Fetch Mode 搭配 Tarball 形式作備份,要在 PGSQL 10 之後才支援 Tarball 形式的備份搭配 Stream Mode。

使用 Fetch Mode 會在備份期間「可能」會發生一個狀況:備份過程 pg_wal/ 裡面的 WAL 可能會被清理掉或備份出去,因此會導致備份最後階段找不到必要 WAL 造成失敗。此時資料庫需要適當的 wal_keep_segments,延緩 WAL 清理/備份的數量,避免這種備份失敗,不過這數量得自己反覆拿捏才行。。

在 PGSQL 13 導入 wal_keep_size 替代 wal_keep_segments ,以符合其他的參數風格,算是最後的補完。



Replication Slot 控制:

最後補充,在近幾個版本陸續引進的幾個使用到 Replication Slot 的功能,使用時可能需要注意 pg_xlog 或 pg_wal 的空間用量,避免佔滿空間。

Replication Slot 是一種鉤子的機制,能夠避免同步 WAL 中斷的狀況:在 Streaming Replication 時中斷的話,就如同錄音帶斷掉一截,中間就會掉音;但在資料庫遇到 WAL 中斷,無法將就著用,就只能重設 Streaming Replication Standby DB。


但是使用 Replication Slot 有時候會有一些風險:若 Slot 的下游(不論是 Streaming Replication/pg_receivewal 備份使用的 Physical Replication Slot 或是 Logical Replication/CDC 使用的 Logical Replication Slot)停止接收 WAL 而且沒有停用 Slot,WAL 就會乖乖的待在 pg_wal/ 目錄裡面,呈現便秘的狀態。。。導致佔據大量空間,佔滿空間就會導致資料庫停下來。

而 PGSQL 13 導入 max_slot_wal_keep_size 避免佔滿空間(延遲超過指定大小的 slot 就會被停用,可以理解作一種熔斷機制)



參考資料

https://www.enterprisedb.com/docs/en/9.5/eeguide/Postgres_Plus_Enterprise_Edition_Guide.1.012.html#pID0E0AKR0HA

WAL segment Management in PostgreSQL 9.5 · Hironobu SUZUKI @ InterDB

http://postgresql.nabble.com/low-perfomances-migrating-from-9-3-to-9-5-td5913537.html

PgSQL · 追根究底 · WAL日志空间的意外增长 - 数据库内核月报 - 2015 / 06

PostgreSQL 中 checkpoint 和 WAL 日誌量的關係以及優化

Re: WAL files not being recycled — Postgresql General Discussion

Inside Postgres Shared Memory with EnterpriseDB

https://demo.pganalyze.com/databases/6/config/wal_buffers

Robert Haas: Tuning shared_buffers and wal_buffers

PgSQL · 特性分析 · 谈谈checkpoint的调度 · 数据库内核月报 · 看云

PostgreSQL: Documentation: 10: 66.1. Database File Layout

pg_wal is too big… what's going on? - Data Egret

postgresql参数 max_wal_size,min_wal_size 的理解_一名数据库爱好者的专栏-CSDN博客

postgresql 13 的wal_keep_segments 已经取消,改用wal_keep_size_一名数据库爱好者的专栏

wal_keep_size - pgPedia - a PostgreSQL Encyclopedia

PostgreSQL 13 and Patroni 2.0 - when parameters change - Blog dbi services

Waiting for PostgreSQL 14 – Rename wal_keep_segments to wal_keep_size. – select * from depesz;

Postgresql 物理流复制 | 学习笔记

Postgresql Checkpoint 原理 | 学习笔记

Postgresql Wal 日志构建原理 | 学习笔记

WAL in PostgreSQL: 1. Buffer Cache / Postgres Professional corporate blog / Habr

WAL in PostgreSQL: 2. Write-Ahead Log / Postgres Professional corporate blog / Habr

WAL in PostgreSQL: 3. Checkpoint / Postgres Professional corporate blog / Habr

WAL in PostgreSQL: 4. Setup and Tuning / Postgres Professional corporate blog / Habr

pg_rewind and checkpoints: caution! - the build


沒有留言:

張貼留言