replica運用してるglusterfsボリュームでmount時のフォールバックオプションを付ける

# 序文
例えばserver1とserver2でreplica運用しているglusterfsボリュームがあるとする。

```bash:
# こんな感じに作られたボリュームね
gluster volume create vol1 replica 2 \
  server1:/media/bricks/disk1/vol1 \
  server2:/media/bricks/disk1/vol1
```

fstabには通常、以下のように記述する。

```text:/etc/fstab
server1:/vol1 /media/gluster/vol1 glusterfs defaults,_netdev 0 0
```

しかしこれだと server1 が落ちてた際に mount 失敗して面倒なことになってしまう。
replica運用している場合はserver1に繋がらなかった場合はserver2をmountしてほしい。

# backupvolfile-server オプション
そこでmountオプションに`backupvolfile-server`を追加するとその望みは叶う。
fstabは↓こんな感じになる。

```text:/etc/fstab
server1:/vol1 /media/gluster/vol1 glusterfs defaults,_netdev,backupvolfile-server=server2 0 0
```

こうしておくとまずserver1に接続を試みて数秒待った時点で諦めて、次に`server2:/vol1`のマウントを試みて繋がれば無事mountは成功する。両方繋がらなかった場合はしょうがない、mountは失敗する。

この場合、df を見ると、以下のようになっているはずだ。

```console:
$ df -hHT /media/gluster/vol1
Filesystem    Type           Size  Used Avail Use% Mounted on
server1:/vol1 fuse.glusterfs  60T   35T   26T  58% /media/gluster/vol1
```

実際はserver2を使ってmountしたとしても、あくまでserver1をmountしようとした際のオプションでフォールバックしただけなので、mountしたのは`server:/vol1`として認識されている。

ただしGlusterFSのネイティブクライアントはそもそもreplicaのserver1とserver2のブリックを同格に扱うのでserver1が復帰した際には、分け隔てなくserver1とserver2の両方を読み書きしてくれるのでこれで特に問題はない。

ちなみに ps を見ると、glusterfs のプロセスが以下のように変化しているのが分かる。

```bash:
# backupvolfile-server が無い場合
/usr/sbin/glusterfs --volfile-server=server1 --volfile-id=/vol1 /media/gluster/vol1
# backupvolfile-server がある場合
/usr/sbin/glusterfs --volfile-server=server1 --volfile-server=server2 --volfile-id=/vol1 /media/gluster/vol1
```


# ３つ目のサーバへのフォールバックオプションはマウントオプションにはない？→追記：嘘だった、あった。
`replica 3`で、3サーバ構成のボリュームがあるとする。その場合server1に繋がらなかったらserver2への接続を試みて、server2も繋がらなかったらserver3でmountしたいと思うところだ。だが残念ながらbackupvolfile-serverオプションは追加の1台しかサポートしていない。

まぁ1個だけでもフォールバックしてくれるのは非常に助かるからいいんだけどね。`replica 2`の構成が大半だし。


## glusterfs を直接起動するやりかたなら3つ目のサーバも行けそう？
ただしmountコマンドじゃなく、以下のように glusterfsd を直接起動する場合は3つ目のフォールバックが指定できそうな気がする。後で3つ目のサーバを用意して試してみよう。

```bash:
/usr/sbin/glusterfs \
  --volfile-server=server1 \
  --volfile-server=server2 \
  --volfile-server=server3 \
  --volfile-id=/vol2 /media/gluster/vol2
```

3つ目のバックアップサーバを試す場合実際こうなることが確認出来た。ただし手で実行せずにマウントオプションで書ける事がわかったのでそちらを使うほうが良いと思われる。

## backup-volfile-servers オプションなんてのがあった。
使い方は直感通りで、何台あろうとも以下のように書ける。複数サーバのセパレータはコロンを使うようだ。

```text:/etc/fstab
server1:/vol1 /media/gluster/vol1 glusterfs defaults,_netdev,backup-volfile-servers=server2:server3:server4:server5 0 0
```

ちなみに別にバックアップサーバが1台だけの時でもこの `backup-volfile-servers` オプションを使っても何ら問題はない。そうなると `backupvolfile-server` オプションの存在意義が無くなることになる。恐らくこんな歴史的経緯があったんだろうなぁと想像してる。

- glusterfsはマルチマスタなんだから接続失敗したらフォールバックしたいよね。
- backupvolfile-server 作った。これでSPOF回避だぜ！
- あれ…、3台以上の場合も書きたいのに2つ以上のフォールバック先書けなくね？
- 既に運用してる人もいるし既存の仕様は変えたくないな…オプション名も単数形だし…。
- もういいや、後方互換の為に既存オプションはそっとしておいて、複数指定出来る `backup-volfile-servers` を新設しちゃえ！出来た！
- んー後者がどう考えても上位互換で単数のやつもういらないんだけど互換性維持を考えると面倒だなぁ…もう両方あるまま放置でいいや（いまここ）

みたいな。面倒なので野次馬根性だけでコミットログやIssue追う気にもならんけどどうせ多分こんなとこだろｗ
しかし解せないのは新オプション名は最後に`s`つけるだけで良かった気がするんだが、途中のハイフンも追加してきたのは何でなんだろ？実装した人が違う？それともgrepしたときに紛らわしくないように？謎だ。


# /etc/glusterfs/glusterfs.vol でフォールバック設定をする方法
フォールバック設定とかその他のオプションを `/etc/glusterfs/glusterfs.vol` に書いておくことで、mount時のデフォルト設定としてフォールバック動作を設定できるらしい。

後で調査予定→後に `backup-volfile-servers` オプションを見つけたのでコレを使えばOK。glusterでは基本設定ファイルは手でいじらないのが利口っぽい。