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

mitani mitani @ sraw.co.jp
2013年 1月 17日 (木) 11:44:52 JST


藤井さん、こんにちは。
三谷@広島です。

おっしゃる通り、4の「Aをスタンバイとして起動」の前に
ベースバックアップをとって、転送する必要がありますね。
----------------------
Bにて
$ psql -p 12345 -c "SELECT pg_start_backup(now()::text)" postgres
$ rsync -av --delete --exclude=pg_xlog --exclude=postmaster.pid \
 --exclude=postgresql.conf --exclude=recovery.conf \
 /usr/local/pgsql/data2/* /usr/local/pgsql/data1
$ psql -p 12345 -c "SELECT pg_stop_backup()" postgres

とやってから、
Aの設定:
 <recovery.conf>
・standby_mode = on

$ pg_ctl -D /usr/local/pgsql/data1 start
---------------------
これで、AがWAL転送前に死んだ場合もtimelineの不整合というエラーは出ずに
ベースバックアップ後にかかった更新も、
ちゃんとBのarchiveからリカバリーしてスタンバイになってくれます。
(障害発生のタイミングを作るのが難しいので、AとBを別サーバにしてやってみました。)

Aに更新をかける前にBのネットワークを落とし、
Bのネットワークを復旧する前にAを止めました。
Aサーバのarchiveにログが残っていましたので、
Bを復旧させるとAで更新された値もリカバリーされました。

こんな感じでどうしょうか、藤井さん。

--

On Thu, 17 Jan 2013 00:57:08 +0900
Fujii Masao <masao.fujii @ gmail.com> wrote:

> 藤井と申します。
> 
> > 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


-- 
mitani <mitani @ sraw.co.jp>


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