今回は、RHCS 3 で CephFS を使う方法を紹介しようと思います。公式ドキュメントはこちらです。ドキュメントには、ansile-playbookを利用する方法や、(tech previewですが) 複数ファイルシステムを利用する方法がなかったので、紹介しようと思います。
- ansible-playbookを利用して、CephFSを構築
- 2つ目のFilesystemのデプロイとクライアントからの利用方法
みたいな流れで書いています。なお、環境は、こちらの記事で利用した環境と全く同じで、odsやmonはすでにデプロイされていることを前提にしています。ホスト名がknakayam-ceph-c1
からknakayam-ceph-c2
に変更されていますが、関係はありません。knakayam-ceph-c1
に読み替えて使ってください。
1. ansible-playbookを利用して、CephFSを構築
まずは、ansible playbookを使って CephFS を構築していこいうと思います。
playbookの編集
いつも通り /usr/share/ceph-ansible
配下のplaybookを利用します。mdss.yml.sample
の編集は必要なく、そのまま利用可能です。
cd /usr/share/ceph-ansible
cp group_vars/mdss.yml.sample group_vars/mdss.yml
inventory ファイルの編集
# vim /etc/ansible/hosts
以下の[mdss]
を追加します。
[mdss]
knakayam-ceph-c2.example.com
playbookの実行
ansible-playbook -vvv site.yml --limit=mdss
無事にplaybookが完走したら、デプロイを確認してみます。
cephfs のデプロイ確認
まずは、ceph fs status <FS>
を叩いてみます。
ceph fs status cephfs
filesystemが一つ出来上がっていることがわかります。ansibleで[mdss]
を追記しただけで、filesystemまで作ってくれるのは、あるべき実装なのでしょうか・・metadata serverをインストールしたら、filesystem使うのは当然だから、勝手にインストールしてくれてるのだと思いますが・・
[root@knakayam-ceph-c2 ceph-ansible]# ceph fs status cephfs
cephfs - 0 clients
======
+------+--------+------------------+---------------+-------+-------+
| Rank | State | MDS | Activity | dns | inos |
+------+--------+------------------+---------------+-------+-------+
| 0 | active | knakayam-ceph-c2 | Reqs: 0 /s | 11 | 13 |
+------+--------+------------------+---------------+-------+-------+
+-----------------+----------+-------+-------+
| Pool | type | used | avail |
+-----------------+----------+-------+-------+
| cephfs_metadata | metadata | 9728 | 12.3G |
| cephfs_data | data | 0 | 12.3G |
+-----------------+----------+-------+-------+
+-------------+
| Standby MDS |
+-------------+
+-------------+
クライントからのマウント (kernel client)
まず、keyringの準備をしておきます。
注意: 今回は簡易テストのため、client.admin
のkeyを利用していますが、adminとは別のクライアントを利用すべきです。
Cephホスト上でsecretを取り出します。
# ceph auth get-key client.admin
AQADvUlblC/RGxAALnjhQPNBuR0+HXxGpsb+aw==
クライント側に移動して、keyを記載したファイルを作っておきます。
# echo "AQADvUlblC/RGxAALnjhQPNBuR0+HXxGpsb+aw==" > /root/asecret
あとは、secretfileとusernameを指定して、mountするだけです。
# mount -t ceph knakayam-ceph-c2.example.com:/ /mnt/cephfs/ -o name=admin,secretfile=/root/asecret
knakayam-ceph-c2.example.com
は、monの名前です。knakayam-ceph-c2.example.com:6789
としても良いですが、デフォルトで6789ポートを利用します。
getfattrコマンドで属性も確認してみます。期待通りのcephfsがマウントされていることがわかります。
# getfattr -n ceph.dir.layout /mnt/cephfs/
getfattr: Removing leading '/' from absolute path names
# file: mnt/cephfs/
ceph.dir.layout="stripe_unit=4194304 stripe_count=1 object_size=4194304 pool=cephfs_data"
確認が終わったらumountしておきます。
# umount /mnt/cephfs/
以上が、cephfsを利用する手順でした。次からは、複数の CephFS をデプロイして利用してみます。現時点(2018年7月)では、複数 CephFS には、既知の問題があるようですので、ご注意ください。
2. 複数の CephFS を利用する
2つ目のCephFSの作成
まずは、2つ目のCephFSを作っていきます。
# ceph osd pool cephfs_metadata_ssd 64
# ceph osd pool create cephfs_metadata_ssd 64
# ceph fs new cephfs2 cephfs_metadata_ssd cephfs_data_ssd
最後のコマンドで、以下のエラーが発生すると思います。
[root@knakayam-ceph-c2 ceph-ansible]# ceph fs new cephfs2 cephfs_metadata_ssd cephfs_data_ssd
Error EINVAL: Creation of multiple filesystems is disabled. To enable this experimental feature, use 'ceph fs flag set enable_multiple true'
これは、先に述べた通り、複数のFilesystemには既知の問題があるため、以下のコマンドが必要になります。
ceph fs flag set enable_multiple true --yes-i-really-mean-it
ceph fs new cephfs2 cephfs_metadata_ssd cephfs_data_ssd
作成が終わったら、ceph fs status <FS>
でcephfs2のステータスを確認してみます。
[root@knakayam-ceph-c2 ceph-ansible]# ceph fs status cephfs2
cephfs2 - 0 clients
=======
+------+-------+-----+----------+-----+------+
| Rank | State | MDS | Activity | dns | inos |
+------+-------+-----+----------+-----+------+
+------+-------+-----+----------+-----+------+
+---------------------+----------+-------+-------+
| Pool | type | used | avail |
+---------------------+----------+-------+-------+
| cephfs_metadata_ssd | metadata | 0 | 12.3G |
| cephfs_data_ssd | data | 0 | 12.3G |
+---------------------+----------+-------+-------+
+-------------+
| Standby MDS |
+-------------+
+-------------+
+---------+---------+
| version | daemons |
+---------+---------+
+---------+---------+
Poolは作られているのですが、以下の項目が空です。2つ目に作ったCephFSに利用するMDSが不足しているようです。
+------+-------+-----+----------+-----+------+
| Rank | State | MDS | Activity | dns | inos |
+------+-------+-----+----------+-----+------+
+------+-------+-----+----------+-----+------+
2つ目のMDSのデプロイ
1つ目のMDSをデプロイしたホストに、2つ目のMDSをデプロイしていきます。しかし今回は、ansible playbookでなく、手作業でデプロイしていきます。cephのドキュメント(Adding MDS)を参考にしています。
mdsのデプロイ
export cluster_name=ceph
export id=a
export mon=knakayam-ceph-c2.example.com:6789
echo "[mds.${id}]" >> /etc/ceph/ceph.conf
echo "host = ${}" >> /etc/ceph/ceph.conf
mkdir -p /var/lib/ceph/mds/${cluster_name}-${id}
ceph-authtool --create-keyring /var/lib/ceph/mds/${cluster_name}-${id}/keyring --gen-key -n mds.${id}
ceph auth add mds.${id} osd "allow rwx" mds "allow" mon "allow profile mds" -i /var/lib/ceph/mds/${cluster_name}-${id}/keyring
ceph-mds --cluster ${cluster_name} -i ${id} -m ${mon}
サービスの再起動
systemctl restart ceph-mds@*
cephfs2にmax_mdsを設定しておきます。
ceph fs set cephfs2 max_mds 1
無事に2つ目のMDSがデプロイできれば、cephfs2のMDSステータスもactiveになっているはずです。
[root@knakayam-ceph-c2 ~]# ceph fs status cephfs2
cephfs2 - 0 clients
=======
+------+--------+------------------+---------------+-------+-------+
| Rank | State | MDS | Activity | dns | inos |
+------+--------+------------------+---------------+-------+-------+
| 0 | active | knakayam-ceph-c2 | Reqs: 0 /s | 10 | 12 |
+------+--------+------------------+---------------+-------+-------+
+---------------------+----------+-------+-------+
| Pool | type | used | avail |
+---------------------+----------+-------+-------+
| cephfs_metadata_ssd | metadata | 3615 | 12.3G |
| cephfs_data_ssd | data | 0 | 12.3G |
+---------------------+----------+-------+-------+
+-------------+
| Standby MDS |
+-------------+
+-------------+
ceph fs ls
も確認しておきましょう。cephfsとcephfs2が見えていることがわかります。
[root@knakayam-ceph-c2 ceph-ansible]# ceph fs ls
name: cephfs, metadata pool: cephfs_metadata, data pools: [cephfs_data ]
name: cephfs2, metadata pool: cephfs_metadata_ssd, data pools: [cephfs_data_ssd ]
2つ目のcephfsをマウントする
クライアントから使ってみるのですが、RHEL7の kernel client(mount -t ceph
)では、cephfsの指定が未だできないようでした。ceph-fuseを利用します。
admin の keyring /etc/ceph/ceph.client.admin.keyring
をscpしておきます。ここでもadminのkeyringは使うべきではないですが、簡単のため利用します。
# scp root@knakayam-ceph-c2.example.com:/etc/ceph/ceph.client.admin.keyring ceph.client.admin.keyring
いよいよマウントです。cephfsは、client_mds_namespace
で指定します。
ceph-fuse /mnt/cephfs -m knakayam-ceph-c2.example.com --client_mds_namespace=cephfs2 -c ceph.client.admin.keyring
マウントができれば、以下のような出力が得られます。
[root@knakayam-rhel7-work ~]# ceph-fuse /mnt/cephfs -m knakayam-ceph-c2.example.com --client_mds_namespace=cephfs2 -c ceph.client.admin.keyring
2018-07-23 09:37:43.861054 7f09482c70c0 -1 init, newargv = 0x55f0e75a0ea0 newargc=9ceph-fuse[
2983]: starting ceph client
ceph-fuse[2983]: starting fuse
属性を確認してみると、pool名がpool=cephfs_data_ssd
となっているので、cephfs2が利用されているようです。
[root@knakayam-rhel7-work ~]# getfattr -n ceph.dir.layout /mnt/cephfs/
getfattr: Removing leading '/' from absolute path names
# file: mnt/cephfs/
ceph.dir.layout="stripe_unit=4194304 stripe_count=1 object_size=4194304 pool=cephfs_data_ssd"
テストが終わったら、unmountしておきましょう。
fusermount -u /mnt/cephfs/
以上が、CephFSを利用する手順でした。一つのclusterで複数のCephFSが利用できるようになれば便利ですね。