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

Fujii Masao masao.fujii @ gmail.com
2013年 1月 17日 (木) 00:57:08 JST


藤井と申します。

> 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 メーリングリストの案内