Pgpool-II 4.1の紹介【第1回】

2019 年 10 月 31 日、Pgpool-II の新しいメジャーバージョン 4.1 がリリースされました。Pgpool-II 4.1 では多数のパフォーマンス改善、機能追加が行われており、本ブログにて、今後数回に渡って新機能を紹介していきます。

Pgpool-II 4.1 の新機能及び変更点は以下のページに記載されています。

Pgpool-II 4.1 リリースノート

Pgpool-II 4.1 新機能の概要

Pgpool-II 4.1 では、待望のステートメントレベルの負荷分散、自動フェイルバック機能が実装されました。また、パフォーマンス向上、PostgreSQL 12 への対応、Pgpool-II 内部クエリの改善及び Watchdog の機能強化行われました。

ステートメントレベルの負荷分散

ステートメントレベルの負荷分散とは、クエリごとに負荷分散先を決定し、クエリの振り分けを行う機能のことです。
Pgpool-II 4.0 以前では、セッションレベルの負荷分散のみ可能でしたが、Pgpool-II 4.1 では、クエリごとに負荷分散先を決定できるようになりました。バックエンドサーバに接続したままのようなアプリケーションの場合、セッションが終了するまで負荷分散先のノードが変わらないので、この機能を有効にすると、クエリごとに負荷分散先を決めることが可能になり、負荷分散性能の向上が期待できます。

自動フェイルバック

Pgpool-II 4.0 以前では、スタンバイサーバとプライマリサーバとの接続性を判断できる安全な方法がなかったため、一度切り離されたスタンバイサーバは自動的に Pgpool-II 管理下のクラスタに復帰することはできませんでした。PostgreSQL 10 から pg_stat_replication ビューによりスタンバイサーバがプライマリサーバから WAL を受け取っているかを確認できるようになったので、この情報をもとに自動フェイルバック機能が実装されました。
この機能は、特に一時的なネットワーク障害が原因でスタンバイサーバが切り離された場合に役立ちます。

シェアードリレーションキャッシュ

Pgpool-II 4.1 ではシェアードリレーションキャッシュ機能により、パフォーマンスが向上しました。
Pgpool-II では、一時テーブル、unlogged テーブルが常にプライマリに送信されるようになっています。テーブルへの初回アクセス時に、PostgreSQL のシステムカタログからテーブル情報を取得し、ローカルキャッシュに保存します。子プロセスのローカルキャッシュに蓄積されるリレーションキャッシュが全ての子プロセスで共有できるようにシェアードレーションキャッシュ機能が追加されました。この機能によりバックエンドサーバへの負荷の軽減が期待できます。

Pgpool-II によって発行される内部クエリの改善

テーブルへの初回アクセス時に、Pgpool-II は PostgreSQL のシステムカタログからテーブル情報を取得するため、内部クエリを発行しています。
Pgpool-II 4.1 では、Pgpool-II によって発行される内部クエリによる負荷を軽減するために、PostgreSQL のバージョン番号に応じて不要な内部クエリを省くようになりました。
また、内部クエリの送信先及び一時テーブルの追跡方式が柔軟に設定できるように改善されました。

Watchdog の機能強化

ネットワークパーティション状態でプライマリ PostgreSQL サーバが存在しない状況を回避するためにWatchdog の挙動が改善されました。
また、クォーラムとフェイルオーバにおける合意を解決する際に、どのように多数決ルールにおける計算を行うかを設定するパラメータ enable_consensus_with_half_votes が追加されました。

PostgreSQL 12 パーサ移植

Pgpool-II ではメジャーリリースするたびに、PostgreSQL の最新パーサを移植しています。今回のリリースでは PostgreSQL 12 の新しいパーサを取り込みました。

リザーブドコネクションズ

フロントエンドからの新しい接続を許可しないための新しいパラメータ reserved_connections が実装されました。reserved_connections を 1 以上に設定すると、クライアントからの現在の接続数が (num_init_children – reserved_connections) 以上になった場合、ブロックするのではなくクライアントからの後続の接続は受け付けずエラーメッセージを返すようになりました。
PostgreSQL の負荷が高い場合や、コネクションを長時間専有するアプリケーションが存在するときに、Pgpool-II への接続待ち行列があふれることがあります。リザーブドコネクションを適切に設定することにより、クライアントからの接続要求を拒否することによって待ち行列溢れを防ぐことができます。

おわりに

今回は、Pgpol-II 4.1 の新機能の概要について紹介しました。
こられの機能の詳細については今後の Pgpool-II 4.1 新機能に関するブログ記事をご覧ください。