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

Kensuke Takahashi kensuke.takahashi @ ctc-g.co.jp
2013年 10月 22日 (火) 10:55:22 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ノードのみにしか送信されません。
   ※ 本現象は仕様となりますでしょうか。

# 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 側で回避する方法があれば合わせてお教え頂ければと存じます。

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

   ※ 本件は下記に設定することで select version() を発行させなくする回避策がございますので、
      もしございましたらお教え頂ければと思います
   odbc.ini
   --- 回避方法抜粋 ---
   Protocol=7.4
   -----------------

以上、よろしくお願い申し上げます。



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