PostgreSQLには、アーキテクチャーの制限として、システム停止を伴うトランザクションの周回問題があり、それを避けるためにタプル凍結によるトランザクションIDの回収を必要とします。
タプル凍結は、自動バキュームや積極的なタプル凍結(VACUUM FREEZE)によって動作します。しかし、トランザクションを消費するスピードが速いシステムでは、自動バキュームだけではトランザクションIDの周回問題に遭遇する可能性があります。なぜなら、自動バキュームは、アプリケーションとの衝突頻度やシステム負荷の上昇を抑えるために低速だからです。このようなシステムでは、適切なタイミングで積極的なタプル凍結を実行する必要があります。
このような問題を回避するために、トランザクションIDの使用量のモニタリング機能と積極的なタプル凍結の定期実行機能を提供します。モニタリング機能を有効化してFEPClusterを構築すると、デフォルトでトランザクションIDの使用量の監視が有効になります。
AlertManagerでWarning“PostgresqlTooManyTxidUsage”が通知された場合は、自動バキュームだけではトランザクションIDの凍結処理が間に合っていない可能性があります。このような場合は、積極的なタプル凍結の定期実行機能の有効化を検討してください。
積極的なタプル凍結の定期実行機能を有効化する場合は、FEPClsuterカスタムリソースのspec.fep.freezingTuples.enableをtrueに設定してください。spec.fep.freezingTuples.enableのデフォルトはfalseです。
以下は設定可能な項目です。
スケジュール
実行期間
以下の例は、日曜日の午前1時から3時間と水曜日の午前2時から1時間の2つのスケジュールで積極的なタプル凍結を実行する場合の定義例です。
spec: fep: freezingTuples: enable: true schedule1: start: 0 1 * * 0 executionTime: 10800 schedule2: start: 0 2 * * 3 executionTime: 3600
積極的なタプル凍結のスケジュールは、タプル凍結を実行しても影響の少ない業務負荷の低い時間帯を指定してください。
積極的なタプル凍結のスケジュール後も、引き続きトランザクションIDの使用量の推移を監視します。凍結処理が間に合っていないと判断した場合は、スケジュールの見直しが必要です。見直しに必要な統計情報を収集するため、以下の手順で積極的なタプル凍結のための拡張機能を有効化します。
postgresql.confのshared_preload_librariesパラメータを修正
shared_preload_libraries = 'pgx_stat_vacuum_freeze'
以下のSQLを実行
SELECT datname FROM pg_database WHERE datallowconn = true;
出力されるデータベースすべてに対して以下のCREATE EXTENSIONを実行し、拡張を定義
CREATE EXTENSION pgx_stat_vacuum_freeze;
積極的なタプル凍結の割当て時間のチューニングについては、“Fujitsu Enterprise Postgres 運用ガイド”を参照してください。