ITエンジニアのYukiです。
PostgreSQL資格のOSS-DB Gold取得目指して、今日もがんばります。
今回は、WAL関係で更新のあった機能を勉強しました。
前回書きましたが、古いバージョンのOSS-DB Gold 1.0対応のテキスト(「LPI-Japan OSS-DB Gold 認定教材 PostgreSQL 高度技術者育成テキスト」)で勉強しているため、読んでいておやっとなるところが出てきます。PostgreSQL 9.3の時代に書かれた本なので、試験対象のバージョンである10はかなり変更が入っているんですよね。
WALに関する解説が古くなっていたので調べてみました。
checkpoint_segmentsパラメータの廃止
checkpoint_segmentsパラメータは、9.5で廃止されました。代わりに、新しいパラメータのmax_wal_sizeとmin_wal_sizeで制御するようになりました。2つのパラメータに分かれることで、更新量が少ないときに、あまりWAL領域を使わずに済むようになっています。
PostgreSQL 高度技術者育成テキストの記載
PostgreSQL 高度技術者育成テキストでは、WAL領域の見積式として、以下の式が紹介されています。廃止されたcheckpoint_segmentsパラメータを使っています。
16MB × (checkpoint_segments × 3 + 1)
「LPI-Japan OSS-DB Gold 認定教材 PostgreSQL 高度技術者育成テキスト」NTTソフトウェア株式会社著, 3章 運用監視>容量監視, p44)
さて、これはどう変わるのでしょうか?
checkpoint_segmentsとは
そもそものcheckpoint_segmentsパラメータについて説明します。
checkpoint_segmentsは、自動チェックポイントの契機を設定するパラメータの1つです。チェックポイントが走るまでの最大ログファイル数を設定します。以下のようなトレードオフがあります。
checkpoint_segmentsが低すぎる場合
- チェックポイント多発により性能が低下する
checkpoint_segmentsが高すぎる場合
- WAL領域が大きくなる
- クラッシュリカバリにかかる時間が増える
ちなみに、チェックポイントの契機としては、ほかに時間(秒)で指定するcheckpoint_timeoutパラメータがあります。デフォルトは5分です。自動チェックポイントは、checkpoint_segmentsで設定したログファイル数を超えるまで発生しないというのではなく、サイズか時間のどちらかの条件を満たすと発生します。
見積式の意味
もう一度、PostgreSQL 高度技術者育成テキストの見積式です。
16MB × (checkpoint_segments × 3 + 1)
「LPI-Japan OSS-DB Gold 認定教材 PostgreSQL 高度技術者育成テキスト」3章 運用監視>容量監視, p44
マジックナンバーの「3」や「1」について、このテキストには一切解説がありません。『「× 3 + 1」の部分は定数であり、パラメータで変更はできません』(p44)とだけ書かれています。せめて意味くらいは説明してほしいものです。
意味も分からず覚えるのは難しいですからね。
マニュアル(PostgreSQL文書)を調べると以下のような説明がありました。
WALセグメントファイルは常に少なくとも1つあり、また、通常は(2 + checkpoint_completion_target) * checkpoint_segments + 1、もしくはcheckpoint_segments + wal_keep_segments + 1より多くはありません。
「PostgreSQL 9.4.5文書」第 29章信頼性とログ先行書き込み>29.4. WALの設定
なるほど、「(2 + checkpoint_completion_target) * checkpoint_segments + 1」の部分ですね。
checkpoint_completion_target
式で出てくるcheckpoint_completion_targetパラメータは、その名の通り、チェックポイントが完了するまでの目標です。チェックポイント間の時間の割合として0~1で設定できます。デフォルトは0.5です。
チェックポイント処理には時間がかかります。すべてのダーティバッファをディスクに書き出すので、IO負荷も上がります。完了するまでほかの処理を待たせるわけにはいかないので、バックグラウンドライタプロセスは、裏でチェックポイント処理を進めます。その完了時間がチェックポイント間隔のどれくらいの割合で終わるようにするかという目標です。たとえば、デフォルトの0.5だとチェックポイント間隔の半分の時間で終わるのが目標という具合です。
次のようなトレードオフがあります。
checkpoint_completion_targetが小さすぎる場合
- IO負荷が高くなる
checkpoint_completion_targetが大きすぎる場合
- クラッシュリカバリにかかる時間が増える
- 次のチェックポイント間隔までにチェックポイント処理が終わらない(⇒最大でも0.9までにする)
再び見積式
マニュアルの見積式に戻ります。
(2 + checkpoint_completion_target) * checkpoint_segments + 1
「PostgreSQL 9.4.5文書」第 29章信頼性とログ先行書き込み>29.4. WALの設定
checkpoint_completion_targetは、0~1の範囲で設定できるのでしたね。最大である1を設定したときに、高度情報技術者育成テキストの式になります。
16MB × (checkpoint_segments × 3 + 1)
「LPI-Japan OSS-DB Gold 認定教材 PostgreSQL 高度技術者育成テキスト」NTTソフトウェア株式会社著, 3章 運用監視>容量監視, p44)
16MBは、1つのWALログファイルの固定サイズです。
これで見積式の意味が分かりました。最大のケース、つまりチェックポイント間隔の時間でチェックポイント処理が完了したときのサイズということになります。
9.5以降のWAL領域の見積
では、9.5以降は、新たなパラメータを使って、どのように見積もればよいのでしょうか?
新たなパラメータは、max_wal_sizeとmin_wal_sizeでした。
そうです。max_wal_sizeがそのまま見積もりになります。余裕率をかけて確保しましょう。
簡単ですね。
max_wal_sizeとmin_wal_sizeの理解
見積もりは簡単になりましたが、これらのパラメータが意味するところは、何でしょうか?
max_wal_size
max_wal_sizeの方は、checkpoint_segmentsが置き換わったイメージです。このサイズを超えると自動チェックポイントが走ります。checkpoint_segmentsのときは、ファイル数でしたが、max_wal_sizeはサイズで指定します。デフォルトは、checkpoint_segmentsの時より大きくなって、1GBです。ただし、ソフトリミットになります。高負荷な場合などに超えることがあるため、見積も余裕を持たせる必要があります。
min_wal_size
では新たに追加されたmin_wal_sizeは、なんでしょうか? 最大値以外に何が必要なのでしょう?
こちらは、最低限確保するWAL領域の設定です。要らなくなったWALファイルを削除するときに消しすぎないようにします。削除するとディスクに空き領域ができますが、次回、重いバッチ処理で負荷がかかった時などに再確保のコストがかかってしまいます。そのため、領域を解放しすぎないように、最低保証を設定するわけです。
ただ、このラインまでは解放することができるわけで、9.4以前と比較すると、通常時の空き領域を増やすことができます。
基本的には、要らなくなったWALファイルは、ファイル名を変更するだけで再利用されます。
参考情報
max_wal_sizeとmin_wal_sizeについては、アシスト社の技術ブログを参考にさせてもらいました。
「【PostgreSQL 9.5】max_wal_sizeとmin_wal_sizeの概要」アシスト現場ブログ ~ Database & Cloud ~
また、結構マニュアルを読みました。
これはこれで勉強になりますね。
まとめ
以上、9.4以前のcheckpoint_segmentsと、9.5で代わりに導入されたmax_wal_sizeとmin_wal_sizeの説明でした。また、見積式の変更についても触れました。
このようにOSS-DB Goldの1.0から2.0の間に更新された機能について、まとめていこうと思っています。ほかの機能更新についても、記事を書いていく予定です。
同じテキストで勉強される人や、昔のPostgreSQLは知っているという人の参考になればと思います。
コメント