<div dir="ltr"><div>ご回答ありがとうございます。近藤です。</div><div><br></div><div>1について3.3からの仕様変更ということで理解いたしました。ただ、マニュアルで「SELECT問合わせが明示的なトランザクションブロックの内側にあるかどうかどうかで、 レプリケーションモードの動作が変化します。詳細を表に示します」という記述や、詳細な表の内容もすべて違うとなりますと、なかなか利用が難しいレベルと感じます。</div><div><br></div><div><br></div><div>2についてですが、今まで使用していた過去のpgpoolの仕様と異なるため、プログラムの改修が必要になる というのが一番の理由です。過去のバージョンでは、トランザクション処理の中では、更新作用のあるselect でも安心して使用できる仕組みになっていました。black_listなどの設定で対応は可能と理解していますが、開発側とインフラ側での連携作業が必要になるため、少し手間に感じます。</div><div><br></div><div>また、ロードバランスを可能な限り行う方針というのは、パフォーマンス向上のためと思いますが、もともとがレプリケーションモードですので、</div><div><br></div><div> ・基本は 両方にクエリが送付される。</div><div> ・負荷分散のために、読むだけの select は片方だけに送付される。</div><div><br></div><div>という理解をしていました。レプリケーションモードにもかかわらず、マスターのみにselect が送付される動作がある というのが、腑に落ちないと感じたのも、投稿させて頂いた理由です。</div><div><br></div><div>現在、検証を進めておりますが、SQLエラー発生時に、 idle in transaction 状態で接続が固まってしまう現象も発生しており、先行きは厳しい状況にあります。</div></div><div class="gmail_extra"><br><div class="gmail_quote">2015年3月7日 0:51 近藤 <span dir="ltr"><<a href="mailto:skond66@gmail.com" target="_blank">skond66@gmail.com</a>></span>:<br><blockquote class="gmail_quote" style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex"><div dir="ltr"><div>ご回答ありがとうございます。近藤です。</div><div><br></div><div>1について3.3からの仕様変更ということで理解いたしました。ただ、マニュアルで「SELECT問合わせが明示的なトランザクションブロックの内側にあるかどうかどうかで、 レプリケーションモードの動作が変化します。詳細を表に示します」という記述や、詳細な表の内容もすべて違うとなりますと、なかなか利用が難しいレベルと感じます。</div><div><br></div><div><br></div><div>2についてですが、今まで使用していた過去のpgpoolの仕様と異なるため、プログラムの改修が必要になる というのが一番の理由です。過去のバージョンでは、トランザクション処理の中では、更新作用のあるselect でも安心して使用できる仕組みになっていました。black_listなどの設定で対応は可能と理解していますが、開発側とインフラ側での連携作業が必要になるため、少し手間に感じます。</div><div><br></div><div>また、ロードバランスを可能な限り行う方針というのは、パフォーマンス向上のためと思いますが、もともとがレプリケーションモードですので、</div><div><br></div><div> ・基本は 両方にクエリが送付される。</div><div> ・負荷分散のために、読むだけの select は片方だけに送付される。</div><div><br></div><div>という理解をしていました。レプリケーションモードにもかかわらず、マスターのみにselect が送付される動作がある というのが、腑に落ちないと感じたのも、投稿させて頂いた理由です。</div><div><br></div><div>現在、検証を進めておりますが、SQLエラー発生時に、 idle in transaction 状態で接続が固まってしまう現象も発生しており、先行きは厳しい状況にあります。</div><div><br></div><div><br></div></div><div class="gmail_extra"><br><div class="gmail_quote">2015年3月6日 16:49 Yugo Nagata <span dir="ltr"><<a href="mailto:nagata@sraoss.co.jp" target="_blank">nagata@sraoss.co.jp</a>></span>:<div><div class="h5"><br><blockquote class="gmail_quote" style="margin:0px 0px 0px 0.8ex;padding-left:1ex;border-left-color:rgb(204,204,204);border-left-width:1px;border-left-style:solid">近藤さん<br>
<br>
長田です。<br>
<span><br>
> 1.ロードバランス条件について<br>
><br>
> マニュアルには、以下のように「条件をすべて満たした場合にロードバランス」とあります。<br>
><br>
> >load_balance_mode = true を設定した場合、以下の条件のすべてを満たした>時に<br>
> SELECTなどの問い合わせがロードバランスされます。<br>
> >◾PostgreSQLのバージョンが7.4以降である<br>
> >◾問い合わせが明示的なトランクザションブロックの内側にない(つまり、>BEGINを発行していない)<br>
><br>
> しかし、内部処理を見ますと pool_query_context.c においては以下のようになっています。<br>
><br>
> else if (TSTATE(backend, MASTER_NODE_ID) == 'I' ||<br>
> (!pool_is_writing_transaction() &&<br>
> !pool_is_failed_transaction() &&<br>
> pool_get_transaction_isolation()<br>
> != POOL_SERIALIZABLE))<br>
> {<br>
> /* load balance */<br>
> pool_set_node_to_be_sent(query_context,<br>
</span>(snip)<br>
<span>> つまり、トランザクションの外部 or 他の条件を満たせばロードバランスされておりまして、内部であってもロードバランスされてしまいます。 || でなく<br>
> && であるべきかと思いますが、どうでしょうか?<br>
<br>
</span>すいません。マニュアルの更新漏れがありましたが、こちらは 3.3.0 より<br>
以下の通り仕様が変更がありました。<br>
<br>
- レプリケーションモードで、明示的なトランザクション内のロードバランスができるようになりました。(Tatsuo Ishii)<br>
-- ロードバランスが行われる条件は以下のとおりです。<br>
1. replicate_select が off<br>
2. 書き込みを行う関数が使われていない<br>
3.トランザクション分離モードが SERIALIZABLE ではない<br>
4. DML/DDL がトランザクションの中で実行されていない<br>
<br>
(参照:リリースノート<br>
<a href="http://www.pgpool.net/docs/latest/pgpool-ja.html#release3.3.0" target="_blank">http://www.pgpool.net/docs/latest/pgpool-ja.html#release3.3.0</a>)<br>
<br>
以下のコミットによります。<br>
<a href="http://git.postgresql.org/gitweb/?p=pgpool2.git;a=commitdiff;h=62caae201f683f35f756fedd60c610e343d599c4" target="_blank">http://git.postgresql.org/gitweb/?p=pgpool2.git;a=commitdiff;h=62caae201f683f35f756fedd60c610e343d599c4</a><br>
<span><br>
> 2.レプリケーションモード時の挙動仕様について<br>
><br>
> レプリケーションモードの場合、update や<br>
> deleteは全てのノードに送られます。読むだけのselectは高速化のためにロードバランス可能として頂いていると認識しています。また、トランザクション内部の場合などは、更新副作用のある場合を考慮して、ロードバランスされないと受け止めています。<br>
<br>
</span>上記の通り、3.3.0 からは可能な場合はトランザクションブロック内でも<br>
select がロードバランスされます。<br>
<span><br>
><br>
> そのため、ロードバランスされない場合、レプリケーションモードを利用している場合、update や delete<br>
> と同様に、全てのノードに送られる仕様であると助かります。現在は、マスターノードのみに送られます。<br>
<br>
</span>すみません。これはちょっと分からなかったのですが、<br>
「レプリケーションモードで、トランザクション内の SELECT がロードバランスされない場合は<br>
全てのノードに送るようにしたい。<br>
(ただし、トランザクション外では普通にロードバランスしてOK)」<br>
という理解であっているでしょうか?<br>
<br>
実際には上記の通り可能な場合はロードバランスさせているのですが、<br>
これでは不都合がありますでしょうか。上記の要望の理由やユースケース<br>
など教えていただければ幸いです。<br>
<div><div><br>
><br>
> これは、replicate_select を true にすると、ひとまず両方に送られますが、この対応ではselect<br>
> のロードバランスが全くされないため、パフォーマンスが大きく下がってしまいます。また、更新やinsertが多数ある状態ですと、タイミングによって、ノード間の不一致がごく一時的に発生している状態の単純なselect<br>
> がエラーとなってしまう恐れが高いと思っています。<br>
<br>
<br>
</div></div><span><font color="#888888">--<br>
Yugo Nagata <<a href="mailto:nagata@sraoss.co.jp" target="_blank">nagata@sraoss.co.jp</a>><br>
</font></span></blockquote></div></div></div><br></div>
</blockquote></div><br></div>