サイオステクノロジーの橋本です。
個人的に max_wal_size と wal_keep_size の役割を忘れたり、混同しがちなので、
備忘のためブログを書きます。
パラメータの説明
max_wal_size
PostgreSQL 9.5 から追加されているパラメータです。
役割は 2 つあります。
・保存される WAL ファイルサイズの上限値設定 (ソフトリミット)
・CHECKPOINT の実行条件の制御
wal_keep_size
PostgreSQL 13から登場したレプリケーション用のパラメータです。
以前は wal_keep_segments という名前でした。
削除も再利用もされることがなく保存が保証される WAL ファイルサイズを定義します。
チューニング時の指針について
max_wal_size
max_wal_size の重要な役割として CHECKPOINT の実行条件の制御があります。
※CHECKPOINT の仕組みは複雑で説明すると脱線するので触れません
CHECKPOINT が発生すると大きな DISK I/O が発生します。
CHECKPOINT が発生する条件は以下の 2 つです (or 条件)
・checkpoint_timeout 秒が経過する
・max_wal_size に達する
CHECKPOINT の実行は大きな DISK I/O が伴うため可能な限り発生を抑止したいです。
例えば checkpoint_timeout = 60min と設定すれば CHECKPOINT は一時間に一回の実行に抑えることが可能です。
※CHECKPOINT の発生間隔が長くなるとクラッシュリカバリに要する時間が長くなるデメリットがあります。
この場合、CHECKPOINT は一時間に一回の実行としたいという思惑があるわけです。
次にようやく max_wal_size のチューニング観点です。
CHECKPOINT は max_wal_size で指定したサイズ分だけ WAL ファイルが生成されても実行されます。
一時間に 10 GB の更新 (WAL ファイルの生成) がされるシステムは
最低限 max_wal_size の値も 10 GB と設定する必要があります。
ただし、厳密に max_wal_size で指定したサイズ分の更新があった場合に CHECKPOINT 発生するわけではなく
多少の誤差が生じます。
この点は運用していく中でチューニングが必要です。
wal_keep_size
このパラメータは最低限の保存する WAL ファイルサイズを指定します。
主にストリーミングレプリケーションの時に必要となるパラメータです。
例えばネットワークメンテナンスやパッチ適用などでレプリケーションが最長 3 時間途絶える可能性がある環境があるとします。
3 時間で生成される WAL ファイルサイズを wal_keep_size を指定する必要があります。
つまり一時間に 10 GB の更新 (WAL ファイルの生成) がされるシステムは 30 GB を wal_keep_size に指定する必要があります。
wal_keep_size の値は max_wal_size の値より大きく手も小さくても問題ありません。
以下の場合は WAL ファイルは最低 30 GB を保持してくれます。
max_wal_size = 10GB
wal_keep_size = 30GB
この例からもわかるように max_wal_size はあくまでソフトリミットとなります。
max_wal_size を超えて WAL ファイルを保持する例として他には以下があります。
archive_command の失敗
レプリケーションスロットに基づく保存
ただし、レプリケーションスロットを利用している場合は wal_keep_size を設定する必要は薄くなります。
本記事がチューニングを検討しているかたの助けになれば幸いです。