BLOGサブスレッドの日常

2022.01.27

RDSをPostgreSQL11.x にアップデートするとトランザクションログが増加した

yoshida

はじめに

AWSからAWS RDS for PostgreSQL 9.6のサポート終了のアナウンスがされ、PostgreSQLのバージョンアップを実施することになりました。
https://aws.amazon.com/jp/blogs/news/amazon-rds-for-postgresql-9-6-retirement/

2022年1月18日以降になるとメンテナンスウインドで強制的にバージョンアップがされるので、今回は手動でPostgreSQLを11.x系にバージョンアップしました。

その中で発生した問題について解決することができましたので、書き残します。

トランザクションログが増加した

PostgreSQL9.6からPostgreSQL11.x系にアップデートをした際、空きディスク容量が減少してしまいました。CloudWatchメトリクスをみてみるとアップデート後からトランザクションログが増加していることに気が付きました。

試したこと

トランザクションログを減らすため以下のパラメータを変更し削除を試みました。

  • checkpoint_timeoutの値を5分から1分に変更
    • トランザクションログの書き込み頻度を増やして削減できないかと仮定しました
  • max_wal_size トランザクションログの最大値を2048から512へ変更
    • 設定変更後にRDSの再起動も実施しました。
  • min_wal_size トランザクションログの最小値を192から128に変更

結果

  • 上記のパラメータ変更ではトランザクションログは削減できませんでした

トランザクションログが増加した原因

Amazon RDSのトランザクションログとは、テーブルに書き込む前に先行ログ書き込み(WAL)を一時的に溜めておくファイルです。
デフォルト設定ではWALを32セグメントで設定されています。

Amazon RDS PostgreSQL9.6 では1セグメントサイズは16MBとなり、トランザクションログの使用量は32セグメント×16MB なので 512MBの大きさになります

1セグメントに対しての大きさの変更はドキュメントに記載されています。

Amazon RDS での PostgreSQL バージョン 11.1 * セグメントサイズ – 先書きログ (WAL) セグメントサイズが 16 MB から 64 MB に変更されました。

https://docs.aws.amazon.com/ja_jp/AmazonRDS/latest/UserGuide/CHAP_PostgreSQL.htm l

Amazon RDS PostgreSQL11.x では1つのセグメントサイズは64MBとなり、トランザクションログの使用量は32セグメント×64MB なので 2048MBの大きさになります。

セグメントサイズが64MBになったことでトランザクションログ(WAL)の使用が512MBから2048MBへ増加しました。

やったこと

セグメントサイズの変更はできないためセグメント数を変更しトランザクションログの容量をアップデート前と同じ大きさになるように変更しました。

AWS RDSのパラメータグループ管理画面から`wal_keep_segments`の値を32から8へ変更
することでトランザクションログで保持をするセグメントの数を32個から8個に減らします。減らしたことでトランザクションログの使用量は8セグメント×64MBで512MBに削減できるのではと推測をしました。

結果

wal_keep_segmentsを値を変更しRDSへ反映後、トランザクションログが削減されたことを確認できました。

トランザクションログが削減されたことで空きディスク容量が増加したことを確認できました。


トランザクションログが削減したCloudWatchのグラフ


ディスク容量が増加したCloudWatchのグラフ

この記事を書いた人

yoshida