[pgsql-jp: 41327] Re: ストリーミングレプリケーションのフェイルバック方法

Ooura, Nobuhito ooura.nobuhito @ jp.fujitsu.com
2013年 1月 17日 (木) 09:28:23 JST


初めまして。
大浦と申します。

三谷さんの例では synchronous_commit = local なので、
藤井さんご説明の(2)の時点でクライアントはコミット完了(成功)を
認識すると思います。(非同期になっている)

その場合、B をベースに 新しいA をセットアップする前に、
元の A から何らかの方法で WAL を吸出し、B へリカバリしておく
必要がありませんでしょうか。
A のディスクはRAIDとしても、遠隔地等の場合、迅速かつ確実に
元Aにアクセスできる手段がいつも悩ましいのですが。。。

以上

> -----Original Message-----
> From: pgsql-jp-bounces @ ml.postgresql.jp
> [mailto:pgsql-jp-bounces @ ml.postgresql.jp] On Behalf Of Fujii Masao
> Sent: Thursday, January 17, 2013 12:57 AM
> To: PostgreSQL Japanese Mailing List
> Subject: [pgsql-jp: 41324] Re: ストリーミングレプリケーションのフェイル
> バック方法
> 
> 藤井と申します。
> 
> > 4.Aの設定を書き換え、スタンバイとして起動
> > Aの設定:
> > $ cd /usr/local/pgsql/data1
> > $ mv recovery.done  recovery.conf
> >
> > <recovery.conf>
> > ・standby_mode = on
> >
> > $ pg_ctl -D /usr/local/pgsql/data1 start
> 
> この4.の操作の前に、本来は、新しいマスタであるBから
> バックアップを取得しなければならないことに注意してください。
> そして、そのバックアップをベースに新しいスタンバイAを
> セットアップする必要があります。運がよいと、バックアップ
> なしでも旧マスタAをスタンバイとして起動して、レプリケーション
> を再開できますが、基本的にはNGです。
> 
> NGな理由は、旧マスタAが新マスタBより進んだ状態にある
> かもしれないことです。例えば、以下のようなケースを考えて
> ください。
> 
> (1) Aがマスタ、Bがスタンバイとしてレプリケーション中
> (2) AでトランザクションがCOMMITされ、そのWALがAの
>      ディスクに書き込まれた
> (3) そのトランザクションが変更したDBデータがディスクに
>       書き込まれた
> (4) WALがスタンバイBに転送される前に、Aが停止した
> (5) Aが停止したため、スタンバイBをマスタに昇格した
> 
> このとき、停止している旧マスタAは上記WALを持っています。
> 一方、新マスタBはそのWALを持っていません。つまり、Aの
> 方がBより進んだ状態にあります。この状態でAをスタンバイとして
> 起動したとしても、現在のPostgreSQLでは、進んだものを
> 遅れたものに合わせる(REDOではなくUNDO)することはできない
> ため、結果として、正しくレプリケーションできません。
> このため、新マスタから取得したバックアップをベースに
> スタンバイをセットアップし、確実に新マスタBを「進んだ状態」
> にした上で、レプリケーションを再開する必要があります。
> 
> また、運よく、上記ケースのようなAがBより進んだという
> 状態にならなければ、バックアップなしでAをスタンバイ
> として起動できるということになります。
> 
> 以上、よろしくお願いいたします。
> 
> --
> Fujii Masao


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