[pgpool-general-jp: 1382] Re: ドキュメントバグ? Streaming Replicationでのクエリ振り分けについて

Kazuki Uehara uehara.kazuki @ lab.ntt.co.jp
2015年 8月 5日 (水) 11:30:54 JST


SRA OSS石井様

上原です。
お世話になっております。


誤解させてしまい申し訳ありません。

>> 試しにDECLAREをロードバランシングさせてみたのですが、以下のようなエラー
>> が出力されました。

こちらは、「試しにソースをいじって」DECLAREをロードバランシングの対象にして
みましたときの話ですので、pgpool-II 3.4.2の仕様ではDECLAREはノード1
(スタンバイ)に行くことはありません。

誤解を招くような書き方になってしまい、失礼しました。


■本題
[pgpool-general-jp: 1380] で追加で確認させていただきたい内容は
・SHOW
がロードバランシング対象か否かについてです。

マニュアルではロードバランシングの対象となっていますが、こちらで
確認した限りではロードバランシングの対象外という認識です。
ご確認いただけないでしょうか。


以上です。
よろしくお願いします。


(2015/08/05 10:17), Tatsuo Ishii wrote:
> 上原様
> 
> お世話になっています。SRA OSS石井です。
> 
> ノード0がプライマリだと仮定して、そもそもDECLAREがノード1に負荷分散され
> ているのがおかしいですね。まずはここから調べてみます。
> --
> Tatsuo Ishii
> SRA OSS, Inc. Japan
> English: http://www.sraoss.co.jp/index_en.php
> Japanese:http://www.sraoss.co.jp
> 
>> SRA OSS石井様
>>
>> 上原です。
>> お世話になっております。
>>
>>
>> ご確認いただきありがとうございます。
>> マニュアルの修正、よろしくお願いします。
>>
>> 五月雨になってしまい申し訳ないのですが、「SHOW」もDECLAREと同様で
>> PRIMARYに振られているようです。(pgpool-II 3.4.2)
>> マニュアルではロードバランシングの対象と記載されているので、DECLARE
>> と合わせて修正いただけると幸いです。
>>
>>
>> 以下、確認ログです。
>>
>> 念のため、src/context/pool_query_context.cに以下のデバッグログを入れて
>> 確認しております。
>>
>> ----------------
>>          /*
>>           * Other statements are sent to primary
>>           */
>>          ereport(LOG,(errmsg("[debug_k] Other statements")));←★追加
>>          return POOL_PRIMARY;
>>      }
>> --------------
>>
>>
>> $ psql -h 192.168.1.3 -p 9999 -U user1 testdb -c "show SERVER_VERSION"
>>
>> pgpool.log
>> ---------
>> 2015-08-04 19:30:29: pid 15678: LOG:  [debug_k] Other statements
>> 2015-08-04 19:30:29: pid 15678: LOG:  DB node id: 0 backend pid: 13625 statement: show SERVER_VERSION
>> ---------
>>
>>
>>
>>> ところで2.2.6のコミットログ(ed5a6338cc83fc00ffdac89025eb7a59d6024d4b)を
>>> 見直してみると、"Fix is_select_query() not to allow cursor statements.
>>> Close() should not allowed since hold cursor + update may cause data
>>> inconsistency." とあるのですが、正直自分がコミットしたにも関わらず自分
>>> でもなぜこのように考えたのか覚えていません:-)
>>>
>>> うーん、思い出せるかどうか頑張ってみます。
>>
>>
>> <以下、余談です。>
>>
>> 試しにDECLAREをロードバランシングさせてみたのですが、以下のようなエラー
>> が出力されました。
>>
>> 実施概要:JDBC使用(AutoCommit OFF)
>>      DECLARE後にFETCHを何回か実行する
>>
>> pgpool.log
>> ---------------
>> 2015-08-04 19:55:53: pid 16692: LOG:  DB node id: 0 backend pid: 13731 statement: Execute: BEGIN
>> 2015-08-04 19:55:53: pid 16692: LOG:  DB node id: 1 backend pid: 24379 statement: Execute: BEGIN
>> 2015-08-04 19:55:53: pid 16692: LOG:  DB node id: 1 backend pid: 24379 statement: Parse: DECLARE cur2 CURSOR WITH HOLD FOR SELECT * FROM bar2
>> 2015-08-04 19:55:53: pid 16692: LOG:  DB node id: 1 backend pid: 24379 statement: B message
>> 2015-08-04 19:55:53: pid 16692: LOG:  DB node id: 1 backend pid: 24379 statement: D message
>> 2015-08-04 19:55:53: pid 16692: LOG:  DB node id: 1 backend pid: 24379 statement: Execute: DECLARE cur2 CURSOR WITH HOLD FOR SELECT * FROM bar2
>> 2015-08-04 19:55:53: pid 16692: LOG:  [debug_k] Other statements
>> 2015-08-04 19:55:53: pid 16692: LOG:  DB node id: 0 backend pid: 13731 statement: Parse: FETCH FIRST FROM cur2
>> 2015-08-04 19:55:53: pid 16692: LOG:  DB node id: 0 backend pid: 13731 statement: B message
>> 2015-08-04 19:55:53: pid 16692: LOG:  DB node id: 0 backend pid: 13731 statement: D message
>> 2015-08-04 19:55:53: pid 16692: LOG:  DB node id: 0 backend pid: 13731 statement: Execute: FETCH FIRST FROM cur2
>> 2015-08-04 19:55:53: pid 16692: LOG:  pool_send_and_wait: Error or notice message from backend: : DB node id: 0 backend pid: 13731 statement: "FETCH FIRST FROM cur2" message: "cursor "cur2" does not exist"
>> 2015-08-04 19:55:53: pid 16692: LOG:  DB node id: 1 backend pid: 24379 statement: ABORT
>> 2015-08-04 19:55:53: pid 16692: LOG:  DB node id: 0 backend pid: 13731 statement: ABORT
>> ----------------
>>
>> DECLAREをnode:1で実行したあとにFETCHがnode:0に向いていたのでエラーに
>> なっていました。ですので、もしカーソル系を分散させたいなら全nodeに
>> DECLAREをしたりするのでしょうか?
>> # もともと外された理由を理解できていないので、トンチンカンなことを
>>  言っていたらすみません。
>>
>>
>> 以上です。
>> よろしくお願いします。
>>
>>
>> (2015/08/04 17:48), Tatsuo Ishii wrote:
>>> 上原様
>>>
>>> お世話になっています。SRA OSS石井です。
>>>
>>>> 上原と申します。
>>>> お世話になっております。
>>>>
>>>> pgpool-II 3.4.2 でロードバランシングの対象となるSQLについて確認して
>>>> いたところ、マニュアルの記述に誤りと思われる箇所がありました。
>>>> ご確認いただけないでしょうか。
>>>>
>>>> ---------
>>>> ○Streaming Replicationでのクエリ振り分け
>>>> ・Primary/Standbyどちらにも送ることのできる問い合わせ。
>>>>  - DECLARE, FETCH, CLOSE
>>>> ---------
>>>> (pgpool-II マニュアルから一部抜粋)
>>>>
>>>> 上記のように記載されているのですが、確認したところカーソル系のSQLは
>>>> ロードバランシングの対象とはなっておらず、全てPrimaryに向けられて
>>>> いるようです。
>>>>
>>>> src/context/pool_query_context.c
>>>> send_to_where()
>>>> -------
>>>> 1213                 /*
>>>> 1214                  * Other statements are sent to primary
>>>> 1215                  */
>>>> 1216                 return POOL_PRIMARY;
>>>> -------
>>>> ここで、DeclareCursorStmtはPOOL_PRIMARYに落ちているかと思います。
>>>>
>>>>
>>>> # 調べた後で気づきましたが、
>>>>     2.2.6 のリリースノートにDECLAREをロードバランシングの対象から外した
>>>>     という記述がありましたので、おそらくその時期から残っていたのかと思います。
>>>
>>> 仰るとおりで、マニュアルの記述が更新されていないようです。修正いたします。
>>> ご指摘ありがとうございました。
>>>
>>> ところで2.2.6のコミットログ(ed5a6338cc83fc00ffdac89025eb7a59d6024d4b)を
>>> 見直してみると、"Fix is_select_query() not to allow cursor statements.
>>> Close() should not allowed since hold cursor + update may cause data
>>> inconsistency." とあるのですが、正直自分がコミットしたにも関わらず自分
>>> でもなぜこのように考えたのか覚えていません:-)
>>>
>>> うーん、思い出せるかどうか頑張ってみます。
>>> --
>>> Tatsuo Ishii
>>> SRA OSS, Inc. Japan
>>> English: http://www.sraoss.co.jp/index_en.php
>>> Japanese:http://www.sraoss.co.jp
>>
>>
>> -- 
>> 上原 一樹 (Kazuki Uehara)
>> Mail : uehara.kazuki @ lab.ntt.co.jp
>> Phone: 03-5860-5115
>>
>> _______________________________________________
>> pgpool-general-jp mailing list
>> pgpool-general-jp @ sraoss.jp
>> http://www.sraoss.jp/mailman/listinfo/pgpool-general-jp


-- 
上原 一樹 (Kazuki Uehara)
Mail : uehara.kazuki @ lab.ntt.co.jp
Phone: 03-5860-5115



pgpool-general-jp メーリングリストの案内