3.3. Pgpool-IIの設定

3.3.1. pgpool.confの設定

pgpool.confPgpool-IIのメインの設定ファイルです。 Pgpool-IIの起動時には-fオプションでこのファイルのパスを指定する必要があります。 ソースコードからインストールした場合、デフォルトではpgpool.conf$prefix/etc/pgpool.confに配置されます。

Pgpool-IIのクラスタリングモードについて設定のサンプルがあります。

表 3-1. pgpool.conf中のbackend_clustering_modeの値

クラスタリングモード
ストリーミングレプリケーションモードstreaming_replication
ネイティブレプリケーションモードnative_replication
ロジカルレプリケーションモードlogical_replication
slonyモードslony
スナップショットアイソレーションモードsnapshot_isolation
Rawモードraw

これらの設定ファイルはデフォルトのソースコードからのインストールでは/usr/local/etcに配置されています。 これらをpgpool.confとしてコピーして使うことが可能です。 (もしかするとそのためにはroot権限が必要かもしれません。)

# cd /usr/local/etc
# cp pgpool.conf.sample pgpool.conf
    

3.3.2. Pgpool-IIのクラスタリングモード

Pgpool-IIにはストリーミングレプリケーションモード、ロジカルレプリケーションモード、メインレプリカモード(Slonyモード)、ネイティブレプリケーションモード、スナップショットアイソレーションモード、rawモードの6つのクラスタリングモードがあります。 いずれのモードにおいても、Pgpool-IIはコネクションプーリング、自動フェイルオーバの機能を提供します。 ストリーミングレプリケーションモード、ネイティブレプリケーションモード、スナップショットアイソレーションモードでは、更新処理を受け付けながらデータベースノードの同期を取り直すオンラインリカバリが利用可能です。 オンラインリカバリの詳細については項5.11を参照してください。

これらのモードは互いに排他的であり、サーバ起動後は変更することができません。 システム設計の初期の段階でどのモードを使うか決めなければなりません。 どれを使えば良いかわからない場合は、ストリーミングレプリケーションモードかスナップショットアイソレーションモードを使うことを推奨します。

ストリーミングレプリケーションモードはストリーミングレプリケーションを使用するPostgreSQLサーバ(AWSのAuroa、RDSを含みます)と一緒に使うことができます。 このモードでは、PostgreSQLがデータベースを同期する責任を持ちます。 このモードは広く使われており、最も推奨されるPgpool-IIの使用法です。 このモードでは負荷分散が可能です。 ノードをまたがる可視性の一貫性は保証されません。

スナップショットアイソレーションモードでは、Pgpool-IIがデータベースを同期する責任を持ちます。 このモードの利点はデータベース同期が同期的に行われることです。 すなわち、データベースへの書き込みは全てのPostgreSQLサーバが書き込み操作を完了するまで返ってきません。 また、スナップショットアイソレーションモードは、ノードをまたがる可視性の一貫性を保証します。 これは簡単に言うと、単一サーバ上のトランザクション可視性ルールがそのまま複数サーバからなるクラスタでも適用されるということで、Pgpool-IIのスナップショットアイソレーションモードが持つ著しい特徴です。 実際、PostgreSQLに改造を加えずにノードをまたがる可視性の一貫性を保証するシステムは、現時点ではPgpool-IIのスナップショットアイソレーションモードだけです。 これにより、アプリケーションは単一のPostgreSQLではなく複数PostgreSQLからなるクラスタを使っていることを意識しないで済むメリットがあります。 ただし、このモードではトランザクション分離レベルをREPEATABLE READにする必要があります。 具体的には、postgresql.confに以下のように記述します。

default_transaction_isolation = 'repeatable read'
      

また、トランザクションの一貫性を保つ仕組みのオーバヘッドにより、ストリーミングレプリケーションモードやネイティブレプリケーションモードに比べると性能が低下します。

ネイティブレプリケーションモードでは、Pgpool-IIがデータベースを同期する責任を持ちます。 このモードの利点は同期が同期的に行われることです。 すなわち、データベースへの書き込みは全てのPostgreSQLサーバが書き込み操作を完了するまで返ってきません。 このモードではノードをまたがる可視性の一貫性は保証されないので、トランザクション分離レベルをREPEATABLE READに限定したくない場合を除き、スナップショットアイソレーションモードを使うことをお勧めします。 このモードでは負荷分散が可能です。

ロジカルレプリケーションモードはロジカルレプリケーションを使用するPostgreSQLサーバと一緒に使うことができます。 このモードでは、PostgreSQLがテーブルを同期する責任を持ちます。 このモードでは負荷分散が可能です。 ロジカルレプリケーションは必ずしもすべてのテーブルをレプリケーションしないので、負荷分散させるテーブルがレプリケーションされるようにするのはユーザの責任です。 Pgpool-IIはすべてのテーブルをロードバランスします。 このことは、テーブルがレプリケーションされていない場合には、Pgpool-IIがサブスクライバー側の更新されていない古いテーブルを見てしまうかもしれないことを意味します。

メインレプリカモード(slonyモード)はSlony-Iを使用するPostgreSQLサーバと一緒に使うことができます。 このモードでは、Slony/PostgreSQLがデータベースを同期する責任を持ちます。 Slonyはストリーミングレプリケーションの登場により廃れつつあるため、Slonyを使う特別な理由が無い限りこのモードの使用を推奨しません。 このモードでは負荷分散が可能です。

rawモードでは、Pgpool-IIはデータベースの同期に関しては関与しません。 システム全体に意味の有る動作をさせるのはユーザの責任となります。 このモードでは負荷分散はできません

3.3.3. プロセス管理モード

Pgpool-IIは、各子プロセスが常に1つのクライアント接続を処理できるマルチプロセスアーキテクチャを実装しています。 Pgpool-IIが処理できるクライアントの最大同時接続数は、num_init_children設定パラメーターによって設定されます。 Pgpool-IIは、2つの子プロセス管理モードdynamicおよびstaticをサポートしています。 静的(static)プロセス管理モードでは、Pgpool-IIは起動時にnum_init_childrenの設定値の数の子プロセスを事前にフォークし、各子プロセスは、クライアント接続をリッスンし続けます。 動的(dynamic)プロセス管理モードでは、Pgpool-IIはアイドル状態のプロセスを追跡し、プロセスの数を指定された範囲内に維持するために、プロセスをforkまたはkillします。

process_management_modeは、Pgpool-II V4.4より以前のバージョンでは使用できません。