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