序文
例えばserver1とserver2でreplica運用しているglusterfsボリュームがあるとする。
# こんな感じに作られたボリュームね
gluster volume create vol1 replica 2 \
server1:/media/bricks/disk1/vol1 \
server2:/media/bricks/disk1/vol1
fstabには通常、以下のように記述する。
server1:/vol1 /media/gluster/vol1 glusterfs defaults,_netdev 0 0
しかしこれだと server1 が落ちてた際に mount 失敗して面倒なことになってしまう。
replica運用している場合はserver1に繋がらなかった場合はserver2をmountしてほしい。
backupvolfile-server オプション
そこでmountオプションにbackupvolfile-server
を追加するとその望みは叶う。
fstabは↓こんな感じになる。
server1:/vol1 /media/gluster/vol1 glusterfs defaults,_netdev,backupvolfile-server=server2 0 0
こうしておくとまずserver1に接続を試みて数秒待った時点で諦めて、次にserver2:/vol1
のマウントを試みて繋がれば無事mountは成功する。両方繋がらなかった場合はしょうがない、mountは失敗する。
この場合、df を見ると、以下のようになっているはずだ。
$ 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 のプロセスが以下のように変化しているのが分かる。
# 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
3つ目のサーバへのフォールバックオプションはマウントオプションにはない?→追記:嘘だった、あった。
replica 3
で、3サーバ構成のボリュームがあるとする。その場合server1に繋がらなかったらserver2への接続を試みて、server2も繋がらなかったらserver3でmountしたいと思うところだ。だが残念ながらbackupvolfile-serverオプションは追加の1台しかサポートしていない。
まぁ1個だけでもフォールバックしてくれるのは非常に助かるからいいんだけどね。replica 2
の構成が大半だし。
glusterfs を直接起動するやりかたなら3つ目のサーバも行けそう?
ただしmountコマンドじゃなく、以下のように glusterfsd を直接起動する場合は3つ目のフォールバックが指定できそうな気がする。後で3つ目のサーバを用意して試してみよう。
/usr/sbin/glusterfs \
--volfile-server=server1 \
--volfile-server=server2 \
--volfile-server=server3 \
--volfile-id=/vol2 /media/gluster/vol2
3つ目のバックアップサーバを試す場合実際こうなることが確認出来た。ただし手で実行せずにマウントオプションで書ける事がわかったのでそちらを使うほうが良いと思われる。
backup-volfile-servers オプションなんてのがあった。
使い方は直感通りで、何台あろうとも以下のように書ける。複数サーバのセパレータはコロンを使うようだ。
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追う気にもならんけどどうせ多分こんなとこだろw
しかし解せないのは新オプション名は最後にs
つけるだけで良かった気がするんだが、途中のハイフンも追加してきたのは何でなんだろ?実装した人が違う?それともgrepしたときに紛らわしくないように?謎だ。
/etc/glusterfs/glusterfs.vol でフォールバック設定をする方法
フォールバック設定とかその他のオプションを /etc/glusterfs/glusterfs.vol
に書いておくことで、mount時のデフォルト設定としてフォールバック動作を設定できるらしい。
後で調査予定→後に backup-volfile-servers
オプションを見つけたのでコレを使えばOK。glusterでは基本設定ファイルは手でいじらないのが利口っぽい。