GlusterFS 3.(2|3).x で transport-type を rdma から tcp に変更する方法

GlusterFS 3.2.x で "transport-type rdma" の設定をすると動作がおかしくなることが偶にあるようである。本家のフォーラムで、3.2.x あたりから rdma の設定はちゃんとテストされていないから動いていないかも、将来的には直すよ的な発言が出ていたので rdma から tcp に transport-type を変更することにした。

rdma から tcp に transport-type を変更するといっても Infiniband を使わない設定にするわけではなくて、IPoIB に切り替えることにした。ちなみに筆者が適当に行った(ddででっかいシーケンシャルファイルを読み書きするだけの)ベンチマークによれば、QDR Infiniband での rdma/tcp 間のスピード差は計測誤差範囲内であったので、これからもずっと tcp でいいや、と思ったということも移行の理由だ。

筆者の管理しているクラスターはホスト名が abc001, abc002 のように連番で振られていて、IPoIB の IP は abc001-ib, abc002-ib, ... のように -ib というサフィックスを付けたホストネームに割り当てられている。だから、rdma/tcp の切り替えを行うには peer の名前変更、brick の名前変更、volume の transport-type 変更など、変更箇所は多岐に渡る。

変更を行う前に全ての GlusterFS 領域を合うマウントし、glusterd, glusterfsd を全部落とした。オンラインでできるかもしれないけど、ダウンタイムがあっても良かったので安全策を取った。以下、設定ファイルの変更点を羅列する。

まず最初にホスト名の変更を行った。/etc/glusterd 以下にあるファイルを一つ一つ確認してホスト名らしき文字列があればそれに全て -ib というサフィックスを付けていった。数は覚えていないけど数重ファイルぐらい弄った気がする。

次に transport-type の変更を行った。grep -r で rdma という文字列を探し、問題ない場所は片っ端から tcp に変更した。これも結構なファイル数変更をしたと思う。

更に、/etc/glusterd/vols/ボリューム名/info に transport-type=1 と書かれた行があるが、これが rdma に対応しているので transport-type=0 に変更して tcp を用いる設定に変更する。

あと、/etc/glusterd/vols/ボリューム名/ボリューム名.マシン名.export-* というファイルのマシン名のところに -ib を付けるのを忘れずに。

ここまで変更を行った後に glusterd, glusterfsd を全て立ち上げ、GlusterFS 領域をマウントしなおしたらちゃんと動いた。