[pgpool-general-jp: 1357] pgpool3.3.5 ロードバランスについて
近藤
skond66 @ gmail.com
2015年 3月 5日 (木) 19:49:12 JST
近藤と申します。pgpoolを利用させて頂いております。
ずっと、postgresql 8系 と pgpool 2.2.6 を使用しておりましたが、postgreSQL を
9.3系へ更新に合わせて、pgpool 3.3.5 の動作テストを行っております。その中で、疑問点が2点ありまして、確認をお願いしたく思います。
動作条件
レプリケーションモード
pgpool サーバ centos 5.11
postgreSQLサーバ centos 6.6 postgreSQL 9.3.6
1.ロードバランス条件について
マニュアルには、以下のように「条件をすべて満たした場合にロードバランス」とあります。
>load_balance_mode = true を設定した場合、以下の条件のすべてを満たした>時に
SELECTなどの問い合わせがロードバランスされます。
>◾PostgreSQLのバージョンが7.4以降である
>◾問い合わせが明示的なトランクザションブロックの内側にない(つまり、>BEGINを発行していない)
しかし、内部処理を見ますと pool_query_context.c においては以下のようになっています。
else if (TSTATE(backend, MASTER_NODE_ID) == 'I' ||
(!pool_is_writing_transaction() &&
!pool_is_failed_transaction() &&
pool_get_transaction_isolation()
!= POOL_SERIALIZABLE))
{
/* load balance */
pool_set_node_to_be_sent(query_context,
session_context->load_balance_node_id);
}
動作チェックを行うと、psqlで通常時は TSTATE(backend, MASTER_NODE_ID) == 'I' となっており、beginを
発行した直後のselect では、 'I' 以外となっています。定義上も、下記のようになっています。
char tstate; /* Transaction state (V3 only) 'I' if idle
* (not in a transaction
block); 'T' if in a
* transaction block; or
'E' if in a failed
* tra
つまり、トランザクションの外部 or 他の条件を満たせばロードバランスされておりまして、内部であってもロードバランスされてしまいます。 || でなく
&& であるべきかと思いますが、どうでしょうか?
2.レプリケーションモード時の挙動仕様について
レプリケーションモードの場合、update や
deleteは全てのノードに送られます。読むだけのselectは高速化のためにロードバランス可能として頂いていると認識しています。また、トランザクション内部の場合などは、更新副作用のある場合を考慮して、ロードバランスされないと受け止めています。
そのため、ロードバランスされない場合、レプリケーションモードを利用している場合、update や delete
と同様に、全てのノードに送られる仕様であると助かります。現在は、マスターノードのみに送られます。
これは、replicate_select を true にすると、ひとまず両方に送られますが、この対応ではselect
のロードバランスが全くされないため、パフォーマンスが大きく下がってしまいます。また、更新やinsertが多数ある状態ですと、タイミングによって、ノード間の不一致がごく一時的に発生している状態の単純なselect
がエラーとなってしまう恐れが高いと思っています。
以上2点、よろしくお願いいたします。
-------------- next part --------------
HTML$B$NE:IU%U%!%$%k$rJ]4I$7$^$7$?(B...
URL: <http://www.sraoss.jp/pipermail/pgpool-general-jp/attachments/20150305/a5c1aa52/attachment-0001.html>
pgpool-general-jp メーリングリストの案内