		  メタデータサーバフェイルオーバ手順

● 本ドキュメントについて
==========================
本文書はメタデータサーバのフェイルオーバの手順について説明します。

● フェイルオーバを行うために
=============================
メタデータサーバをフェイルオーバさせるためには、スレーブメタデータサー
バが必要になります。スレーブメタデータサーバの設定は、メタデータ冗長化
- チュートリアル文書を参照してください。

● 同期スレーブサーバへのフェイルオーバ
=======================================
マスタースレーブサーバが停止した時、同期スレーブサーバへのフェイルオー
バは gfarm-zabbix を設定することにより自動的に行われます。詳細は、
gfarm-zabbix のインストールマニュアルを参照してください。

手動でフェイルオーバを行う場合は、マスターメタデータサーバを停止後、
gfarm-zabbix に付属の gfarm_gfmd_failover.pl を用いるか、以下のように昇
格させたいスレーブサーバに USR1シグナルを送ります。

1. マスターメタデータサーバ（以後、マスター）を停止します。
(マスター)
# systemctl stop gfmd

2. スレーブをマスターに昇格します。
(スレーブ)
# pkill -USR1 gfmd

なお、停止していた旧マスターメタデータサーバを復旧させるためには、明示
的にスレーブサーバとして起動する必要があります。そのためには、起動スク
リプトの OPTIONS に -S を追加するか、gfmd.conf に以下を加えて起動します。
metadb_server_force_slave enable

systemd形式ではなく rcスクリプト形式の起動ファイルを利用しているプラッ
トフォームでは gfmd の rcスクリプトに「slavestart」を指定することにより、
スレーブサーバとして起動することができます。

● 非同期スレーブサーバへのフェイルオーバ
=========================================
非同期スレーブサーバではメタデータは非同期に更新されるため、自動的には
フェイルオーバの対象とはなりません。フェイルオーバを行うためには、フェ
イルオーバの前に一時的に同期スレーブサーバに変更します。

例として以下のように osaka, tokyo でメタデータサーバが動作し、tokyo か
ら osaka へのフェイルオーバを考えます。tokyo の gfm1.tokyo.jp がマスター
メタデータサーバで、osaka のメタデータサーバは非同期スレーブサーバです。

$ gfmdhost -l
+ slave  async c osaka      gfm1.osaka.jp 601
+ slave  async c osaka      gfm2.osaka.jp 601
+ master -     m tokyo      gfm1.tokyo.jp 601
+ slave  sync  c tokyo      gfm2.tokyo.jp 601

1. 非同期スレーブを同期スレーブに変更します。
$ gfmdhost -m -C tokyo gfm1.osaka.jp
同期スレーブに変更するためには、クラスタ名をマスターメタデータサーバが
動作しているクラスタ名（tokyo）に変更します。
＃gfm1.osaka.jp の gfmd の再起動は必要ありません。

2. 更新が同期するまで待ちます。
$ gfmdhost -l
+ slave  sync  c tokyo      gfm1.osaka.jp 601
+ slave  async c osaka      gfm2.osaka.jp 601
+ master -     m tokyo      gfm1.tokyo.jp 601
+ slave  sync  c tokyo      gfm2.tokyo.jp 601
gfm1.osaka.jp の 1コラム目が「+」となるまで待ちます。

なお、複数の非同期スレーブを同期スレーブに変更する時は、上記を1台ずつ繰
り返します。

この状態で、gfm1.osaka.jp は同期スレーブサーバとなり、フェイルオーバの
対象となります。確実にこのサーバにフェイルオーバさせるためには、マスター
メタデータサーバを停止させ、gfm1.osaka.jp の gfmd に USR1シグナルを送信
してフェイルオーバさせます。

停止していた旧メタデータサーバを復旧させるためには、前節と同様にスレー
ブサーバとして起動します。

また、もとの非同期スレーブサーバへ戻すためには、クラスタ名をもとのクラ
スタ名に変更します。

● 非同期スレーブサーバへの手動フェイルオーバ手順 (参考)
=================================================
この手順は、内部的な動作の説明のために残してあります。実務での利用には
前節に従って下さい。

非同期スレーブサーバ（以後、スレーブサーバ）への手動フェイルオーバは以
下のように行います。なお、ジャーナルファイルはデフォルトでは
/var/gfarm-metadata/journal/0000000000.gmj にあります。

0. gfarm-zabbix の自動フェイルオーバ機能を利用している場合は停止します。

1. マスターメタデータサーバ（以後、マスター）を停止します。
(マスター)
# systemctl stop gfmd

2. マスターのジャーナルファイルのシーケンス番号を確認します。
(マスター)
# gfjournal -m 0000000000.gmj
1234567890

3. スレーブのシーケンス番号を確認します。
(スレーブ)
# gfjournal -m 0000000000.gmj
1234567890

4. シーケンス番号が等しい場合は、既に全ての更新がスレーブに送信されてい
ます。そのままスレーブをマスターに昇格できます。
(スレーブ)
# pkill -USR1 gfmd

5. シーケンス番号が異なる場合は、マスターでジャーナルファイルのシーケン
ス番号の最小値を調べます。
(マスター)
# gfjournal 0000000000.gmj
records  seqnum(min/max) ...
1000001    1233567890/  1234567890 ...

6. スレーブでバックエンドDBに反映されているシーケンス番号を調べます。
(スレーブ)
# config-gfarm-update
gfarm=# select * from seqnum;
 name |    value
------+-------------
      | 1234567880

7. このシーケンス番号がマスターのジャーナルファイルのシーケンス番号の最
小値-1以上の場合は、スレーブを停止させ、ジャーナルファイルをマスターか
ら転送し、スレーブを起動し、USR1シグナルを送ってマスターに昇格させます。
(スレーブ)
# systemctl stop gfmd
ジャーナルファイルをマスターからコピー
# systemctl start gfmd
# pkill -USR1 gfmd

8. シーケンス番号がマスターのジャーナルファイルのシーケンス番号の最小
値-1より小さい場合は、マスターのバックエンドDBをダンプし、スレーブでリ
ストアし、USR1シグナルを送ってマスターに昇格させます。
(マスター)
# gfdump.postgresql -d -f - | gzip > dump.gz

(スレーブ)
ダンプファイルをマスターからコピー
# gunzip -c dump.gz | gfdump.postgresql -r -f -
# pkill -USR1 gfmd

9. 手順1.で停止した元マスターを前節と同様にスレーブとして起動します。

10. gfarm-zabbix の自動フェイルオーバ機能を利用していた場合は利用を再開
する設定を行います。
