[pgsql-jp: 41661] Re: pgpoolの縮退運転について

Tatsuo Ishii ishii @ sraoss.co.jp
2014年 5月 25日 (日) 17:36:10 JST


> "以前実行されたINSERT"というご指摘でピンときました。
> 
> # マスタ
> 
> 2014-05-20 23:16:02 JST [58222]: [61036-1] LOG: statement: BEGIN
> 2014-05-20 23:16:02 JST [58222]: [61044-1] LOG: statement: INSERT
> 2014-05-20 23:16:06 JST [56956]: [60827-1] LOG: statement: BEGIN
> 2014-05-20 23:16:06 JST [56956]: [60831-1] LOG: statement: UPDATE
> 2014-05-20 23:16:06 JST [56956]: [60835-1] LOG: statement: ABORT
> 2014-05-20 23:16:07 JST [58222]: [61046-1] LOG: statement: COMMIT
> 
> # セカンダリ一台目
> 
> 2014-05-20 23:16:02 JST [52719]: [73712-1] LOG: statement: BEGIN
> 2014-05-20 23:16:02 JST [52719]: [73716-1] LOG: statement: INSERT
> 2014-05-20 23:16:03 JST [52719]: [73718-1] LOG: statement: COMMIT
> 2014-05-20 23:16:06 JST [51974]: [75261-1] LOG: statement: BEGIN
> 2014-05-20 23:16:06 JST [51974]: [75265-1] LOG: statement: UPDATE
> 2014-05-20 23:16:06 JST [51974]: [75269-1] LOG: statement: ABORT
> 
> # セカンダリ二台目
> 
> 2014-05-20 23:16:02 JST [14558]: [71786-1] LOG: statement: BEGIN
> 2014-05-20 23:16:02 JST [14558]: [71790-1] LOG: statement: INSERT
> 2014-05-20 23:16:06 JST [14558]: [71792-1] LOG: statement: COMMIT
> 2014-05-20 23:16:06 JST [13813]: [73769-1] LOG: statement: BEGIN
> 2014-05-20 23:16:06 JST [13813]: [73773-1] LOG: statement: UPDATE
> 2014-05-20 23:16:06 JST [13813]: [73777-1] LOG: statement: ABORT
> 
> 上記は同じテーブルに対するINSERTとUPDATEのみを抽出したものですが。見事に
> マスタのINSERTがCOMMITするまでに UPDATEが実行されており、セカンダリ×2と
> はタイミングがずれているため、UPDATEで不一致が起きています。これがABORT
> の原因な 気がします。そもそも、INSERTとUPDATEを同一トランザクションで処
> 理していないことが問題でした。
> 
> しかし、ここで疑問が浮かびます。
> 
> ■ INSERTの実行開始時間が3台とも同じであること

PostgreSQLのログのタイムスタンプが秒単位ですから、1秒以内実行順序はわか
らないですよね。このログをもって、「INSERTの実行開始時間が3台とも同じ」
ということは言えないのでは?

> "replication_mode = true"の場合、2.0以降、内部的に
> は"replicate_strict=true"の挙動ですので、INSERTはマスタから実行され、完
> 了次 第、セカンダリ2台に並列に処理されると思っていました(昔作成された
> SRAさんの2.0向けのプレゼン資料にはそう記載があったはずです)。実 は、同時
> に並列にINSERTされる動きが正しくて、デットロックを防ぐ何かの仕組みがある
> のでしょうか?
> 
> ■ マスタだけINSERTのCOMMITまでに時間がかかること
> 
> INSERTによってインデックスが更新されるのでこれに時間がかかっているのか?
> と思いますが、もちろんサーバーの状態によっては何とも言えま せんが、時間
> がかかる原因はどのようなものが考えられるのでしょうか?

pgpool-IIでは、COMMITはマスタ最後に実行されるようにしています。そのせい
でしょう。

> よろしくお願いいたします。
> 


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