[pgpool-general-jp: 1212] Re: BEGIN TRANSACTION がすべてのノードに送られない他

Tatsuo Ishii ishii @ sraoss.co.jp
2013年 10月 22日 (火) 18:03:44 JST


石井です。

> みなさまへ
> 
> お世話になっております。CTC 高橋です。
> 表題の件につきまして質問をお送り致します。
> 
> 使用しているバージョンは下記となります。
> 
> ※ ご質問は3点ございます。
> 
> ■ pgpool-II-3.3.1.tar.gz
> 
> ★ 下記についての動作確認となります。
> 
> http://www.pgpool.net/docs/latest/pgpool-ja.html
> -----
> マスタ・スレーブモードでの BEGIN TRANSACTION の扱いを修正しました。(Tatsuo Ishii)
> これは [pgpool-general: 714] で報告されました。
> 
> 3.1 以降、BEGIN TRANSACTION をすべてのノードに送るようにしました。 PostgreSQL の仕様では、スタンバイノードには BEGIN TRANSACTION READ WRITE を送ることはできませんが、 BEGIN WORK ISOLATION LEVEL
> SERIALIZABLE についてチェックしておらず、スタンバイノードに送信していました。 もちろんこれは誤りで、スタンバイノードが SERIALIZABLE モードになることは許されていません。
> 
> そのため、BEGIN WORK ISOLATION LEVEL SERIALIZABLE をチェックするようにしました。
> 
> Subject: [pgpool-general: 714] Load Balancing / Streaming Replication / Isolation Level serializable
> From: Philip Hofstetter
> Date: Wed, 11 Jul 2012 17:04:26 +0200
> -----
> 
> ★ お聞きしたいこと1
>    begin;
>    のみを発行した場合にはBEGIN TRANSACTION がすべてのノードに送信されますが、
>    begin;select 〜;
>    を発行した場合には BEGIN TRANSACTION は Masterノードのみにしか送信されません。
>    ※ 本現象は仕様となりますでしょうか。

はい、そうです。「;」で複数のSQLをつないだ文(マルチステートメント)は、
マニュアルの制限事項にも書いてありますが、pgpool-IIはきちんと扱うことが
できません。今の仕様では、マルチステートメントは無条件にマスタに送るよ
うになっています。

> # MasterDB
> ----
> Oct 22 10:41:39 MasterDB postgres[43156]: [6-1] [43156][192.168.248.71(58193)]LOG:  statement: begin;select 1;
> Oct 22 10:42:01 MasterDB postgres[43156]: [7-1] [43156][192.168.248.71(58193)]LOG:  statement: savepoint _SVP_6789;
> ----
> 
> # Slave
> ----
> Oct 22 10:42:01 SlaveDB postgres[29232]: [2-1] [29232][192.168.248.71(55162)]LOG:  statement: savepoint _SVP_6789;
> Oct 22 10:42:01 SlaveDB postgres[29232]: [3-1] [29232][192.168.248.71(55162)]ERROR:  SAVEPOINT can only be used in transaction blocks
> Oct 22 10:42:01 SlaveDB postgres[29232]: [3-2] [29232][192.168.248.71(55162)]STATEMENT:  savepoint _SVP_6789;
> ----
> 
> 
> ★ お聞きしたいこと2
>    「お聞きしたいこと1」の現象は、unixODBC接続を使用した場合に発生しており、
>    現象を改善する方法としては、下記ソースの改修が必要となってしまします。  
>    psqlodbc-09.02.0100.tar.gz
> 
>    改修方法としては、psqlodbc-09.02.0100/connection.c の CC_send_query_append を実行しないように
>    改修するなどです。
> 
>    ※ 本現象を pgpool-II側で回避する方法がございますでしょうか。

ありません。

>       もし、psqlodbc 側で回避する方法があれば合わせてお教え頂ければと存じます。

psqlodbcのことはちょっと分かりません。

> ★ お聞きしたいこと3
>    ※ load_balance_mode = on の場合のとなります。
>    select version()
>    が発行された場合、select分のLBが実行されませんがLBされるようにする方法はありませんでしょうか。

対応可能です(そのSELECTがマルチステートメントでないとして)。
関数を含むSELECTがロードバランスされるかどうかは、white_function_listと
black_function_listで制御できます。詳細はマニュアルをご覧ください。

>    ※ 本件は下記に設定することで select version() を発行させなくする回避策がございますので、
>       もしございましたらお教え頂ければと思います
>    odbc.ini
>    --- 回避方法抜粋 ---
>    Protocol=7.4
>    -----------------
> 
> 以上、よろしくお願い申し上げます。
> 
> _______________________________________________
> pgpool-general-jp mailing list
> pgpool-general-jp @ sraoss.jp
> http://www.sraoss.jp/mailman/listinfo/pgpool-general-jp


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