自宅の超重要データはdropboxに同期したので一安心。しかし、それ以外にも5TB超の有象無象のデータがある。中身は過去のメールのバックアップやPCのディスクイメージ、CDやらDVDのiso、果てはPSPやらPS2のisoまで。もはや必要かどうかすら怪しいが、消すのも面倒なので貯まっているようなものたち。3TBx4本のraid5を2つ作って運用してきたんだけど、有効容量が8分の3という非効率さ。加えて、同期用のcronがしばらく消えていた。cronの仕込みをchefで管理していたんだけど、recipeの修正ミスでした。
こういうことがあり、改めて自宅のファイルサーバの冗長環境を見直す。できれば手動rsyncなどを使わずに仕組みの中で同期して欲しい。ついでに何とかしたいのは、サーバ間のファイル共有と共有スペースの冗長化。ヤフオクのお陰でノード数が増えて、現在サーバ用途は4台。4台とも同じデータを見たいが、そういうスペースが作れていない。raid5のディスクをnfsで共有してもいいんだけど、nfsは割りとセンシティブなのでダウンしたときのインパクトが怖い。という訳で、いまどきの分散ファイルシステムを検証してみる事にした。
選択肢になりえそうなのはcephとglusterfs、どちらもredhatがサポートしてるし。hdfsも考えてみたかったけど、今回の用途には合わないのでまた別の機会。cephはopenstackのstorageとして採用されているので、まずはこちらから評価してみた。ceph-deployというツールが優秀で、これを使えば構築は想像以上に簡単だった。簡単過ぎて、裏で何が行われいるのか見る気をなくすほどw
ceph1/2/3というcentos7サーバを用意。firewalldを適切に設定、面倒なら停止。rootユーザーを公開鍵認証パスなしでsshできるようにしておく。ceph1/2/3の3台全てにmon/mds/osdを作成する。monはクラスターマップを持っており、最も重要。こいつが消滅するとデータは全滅する。複数、奇数台が望ましい。mdsはcephfsを使う際にメタデータを管理する。openstackのようにブロックデバイスとして使うなら不要。後述するが曲者。osdはデバイスそのものを管理する。
ssh root@ceph1
yum install -y http://download.ceph.com/rpm-firefly/el7/noarch/ceph-release-1-0.el7.noarch.rpm
yum install -y ceph-deploy
ceph-deploy new ceph1 ceph2 ceph3
ceph-deploy install ceph1 ceph2 ceph3
ceph-deploy mon create ceph1 ceph2 ceph3
ceph-deploy gatherkeys ceph1 ceph2 ceph3
ceph-deploy osd create ceph1:/dev/sdb ceph2:/dev/sdb ceph2:/dev/sdc ceph3:/dev/sdb
ceph-deploy mds create ceph1 ceph2 ceph3
これで必要なコンポーネントは準備される。osdにデバイス名を指定すると、フォーマット済みでもxfsで再フォーマットされる。ブロックデバイスを利用する場合は、rbdコマンドを使ってデバイスを作成する。今回はcephコマンドを使って、cephfsファイルシステムを作成する。ちなみにcephfsは年内の安定板リリースを目指している段階なので、品質は推して知るべし。尚、レプリ数はデフォルトで3だが、そこまで冗長でなくてよいので2に変更する。
ceph status
ceph osd pool create cephfs_data 64
ceph osd pool set cephfs_data size 2
ceph osd pool create cephfs_meta 64
ceph osd pool set cephfs_meta size 2
ceph fs new cephfs cephfs_meta cephfs_data
ceph fs ls
これでファイルシステムは作れたのでマウントしてみる。monが動いているサーバならどこでも対象サーバとして指定できる。自分の考えとしてはローカルのmonに繋げることで、cephサーバの冗長性を担保する。いずれかのノードが落ちても他のノードは自前のmonを見ているので、cephfsへのアクセスが維持されるからだ。落ちたノード数がレプリ数未満であれば、実データにもアクセス可能なはず。
mkdir /ceph
mount -t ceph ceph1:6789:/ /ceph -o name=admin,secret=`ceph-authtool -p /etc/ceph/ceph.client.admin.keyring`
素晴らしい。ちなみにceph-fuseを使えばlxcコンテナでもマウントできた。/dev/fuseを手動で作ってあげる必要あり。早速、raid5上の過去データをrsyncしてみたが、数GBをコピーしたところで停止してしまう。rsyncを止めてもう一度再開しても停止。今度はマウントしている/cephまでアクセス不能に。何回か繰り返したが、問題は再現してしまうので軽くぐぐる。どうやらmulti-mdsというのが、まだ不安定らしい。ささっとsingle-mds構成で再構築して、再度rsyncを試してみる。今度は数GBを越えても処理は続いたので、ちょっと安心。
しかし、数10GBくらいいったところで、またもrsyncが停止。やっぱり不安定だねえ。まあ、作ってる人たちが不安定って言ってるんだから当たり前なんだけど。この品質でcephfsを使い続ける気にはなれなかったので、性能云々以前にcephfsの利用は見合わせる事に。ブロックデバイスでの利用も考えなくはなかったんだけど、共有方法がnfsになってしまうのがイマイチ。ブロックデバイスを複数ノードにマップしたりもしてみたんだけど、データはマップ時点の状態が維持されて当然同期されず。年内予定の安定板が出たら、また評価してみます。