RHCS 3 の CephFS を使う

今回は、RHCS 3 で CephFS を使う方法を紹介しようと思います。公式ドキュメントは[こちら](https://access.redhat.com/documentation/en-us/red_hat_ceph_storage/3/html-single/ceph_file_system_guide/)です。ドキュメントには、ansile-playbookを利用する方法や、(tech previewですが) 複数ファイルシステムを利用する方法がなかったので、紹介しようと思います。

1. ansible-playbookを利用して、CephFSを構築
2. 2つ目のFilesystemのデプロイとクライアントからの利用方法

みたいな流れで書いています。なお、環境は、[こちらの記事](https://qiita.com/nak3/items/402ddbf01982e34de0e5)で利用した環境と全く同じで、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)](http://docs.ceph.com/docs/kraken/install/manual-deployment/#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が利用できるようになれば便利ですね。