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