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 就會被停用,可以理解作一種熔斷機制)
參考資料
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 Checkpoint 原理 | 学习笔记
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
沒有留言:
張貼留言