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

Kazuki Uehara uehara.kazuki @ lab.ntt.co.jp
2015年 8月 4日 (火) 20:47:06 JST


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 メーリングリストの案内