[pgsql-jp: 35211] Re: pgpoolとLargeObject

Tatsuo Ishii t-ishii @ sra.co.jp
2005年 4月 8日 (金) 13:00:26 JST


石井です.

> こんばんは。加澤と申します。
> 
> レプリケーション設定の pgpool 2.5.2 を経由して LargeObject を扱うような
> プログラムはそもそも作成出来ないのでしょうか。
> 
> というのも、こちらでそのような環境のテストしてみたところ、特に平行して
> LargeObject を作成しているような時に、
> 
> ・pgpool のログ
> 2005-04-07 19:59:10 ERROR: pid 26599: pool_process_query: kind does not
> match between backends master(V) secondary(E)
> 2005-04-07 19:59:10 LOG:   pid 26599: notice_backend_error: master: 1
> fail over request from pid 26599
> 2005-04-07 19:59:10 LOG:   pid 26576: starting degeneration. shutdown
> master host master_db_host(5432)
> 2005-04-07 19:59:10 LOG:   pid 26576: degeneration done. shutdown master
> host master_db_host(5432)
> 
> ・PostgreSQL のログ
> Apr  7 19:59:10 master_db_host postgres[7764]: [1-1] ERROR:  large
> object 1338930 does not exist
> 
> というようなエラーが起きて縮退してしまうのです (上記エラー発生時の
> pgpool の設定については末尾に)。

これは,マスタとセカンダリで違うoidがアサインされてしまっているからな
んですね.

> pgpool のページにある、
> 
> 「7.レプリケーションについて
> 
> 同じ問い合わせを送っても異なる結果を返すようなデータ,たとえば乱数やトラ
> ンザクションID,OID,SERIAL,シーケンス,CURRENT_TIMETSTAMPのようなもの
> に関する問い合わせをレプリケーションすることはできません(正確には,同じ
> 値でレプリケーションされる保証がありません). SERIALやシーケンスに関して
> は,関連テーブルをロックすることによって回避することもできます.」
> 
> ということは、LargeObject を扱う際に必須な oid がレプリケーション出来な
> いからそもそも LargeObject は扱えない、という結論となるのでしょうか。
> 
> 何とかレプリケーション環境で LargeObject を利用することは出来ないので
> しょうか?
> 
> // 上記エラーもそれほどの頻度で発生するわけではなくて、特に平行して処理
> // しない限りにおいてはかなり安定して動作しているようにも見えます。なの
> // で儚い希望を抱いてしまいます…。

おっしゃる通りで,同時セッションが1ならば問題なく動作しますが,複数セッ
ションを動かすときはシーケンスと同様,何らかの方法でマスタとセカンダリ
でoidの生成タイミングの同期を取らないと上のようなエラーになります.

回避策としては,ラージオブジェクトの生成を行う前に,pg_databaseのよう
なshared catalogにテーブルロックをかけて同期を保障する方法があります.
詳細はインプレスさんの「丸ごとPostgreSQL」に書いたので,そちらをご覧下
さい.
--
Tatsuo Ishii



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