ストリーミングレプリケーションモードを前提とする。
負荷分散 †
- マスタースレーブモードとレプリケーションモードで動作
- 有効な場合、参照クエリの負荷分散を行なう。
ただし、更新クエリはプライマリノードに送信される。
負荷分散先の決定 †
Pgpoolは、クライアントからの接続があると、すべてのバックエンドに対してまずコネクション接続を行なう。続いて、負荷分散設定(load_balance_mode
)が有効な場合、セッション初期化プロセスの中で負荷分散先を決定する。負荷分散先はセッション単位でありセッション中は変更されない。
redirect_app_names
やredirect_dbnames
パラメータでキーワードstandbyが使われた場合は、スタンバイノードの中で重みを考慮した選択が行われる。
参考
- child.c#select_load_balancing_node() - on https://git.postgresql.org/gitweb/?p=pgpool2.git
- pool_session_context.c#pool_init_session_context() - on https://git.postgresql.org/gitweb/?p=pgpool2.git
セッション中の負荷分散先の確認 †
showコマンドで確認できる。下の例では、node_idが0のstandbyが選択されている。
postgres=# show pool_nodes ; node_id | hostname | port | status | lb_weight | role | select_cnt | load_balance_node | replication_delay ---------+----------+-------+--------+-----------+---------+------------+-------------------+------------------- 0 | /tmp | 11002 | up | 0.500000 | primary | 0 | false | 0 1 | /tmp | 11003 | up | 0.500000 | standby | 0 | true | 0 (2 rows)
負荷分散のプロセス詳細 †
セッション初期化でロードバランスノードが決定されるが、実際には送られてきたクエリの内容によって、選択されるノードが異なることがある。ざっくりと図示すると以下のようになっている。
- セッションの初期化でロードバランスノードは決定されるものの、クエリの内容によってはプライマリノードに送られたり、プライマリとスタンバイの両方に送られることもある。参考 pool_where_to_send()
- クエリ実行過程で、いつくかのチェッククエリが投げられる。結果は、relcacheに入るので毎回クエリごとに投げられるわけではない。ただし、ローカルセッション中でのみキャッシュが有効なものもある(一時テーブルとか)。
- 現在のトランザクション分離レベル(トランザクションごと)
- その他、システムカタログチェック、一時テーブルチェック、unloggedテーブルチェックなど
参考 http://www.pgpool.net/docs/latest/ja/html/runtime-misc.html