Ceph(Mimic)を構築してSambaとかで使ってみる

**この記事は[高知工科大 Advent Calendar 2018](https://adventar.org/calendars/2959)の7日目の記事です。**

#概要
[Ceph(v13.2.2 Mimic)](http://docs.ceph.com/docs/mimic/)を構築して試してみる。

#Cephとは？
OSSな分散ストレージです。SPOFを無くすよう作られています。CpehはRADOSGW, RADOSBlockDevice (RBD), CephFSの3つの使い方があります。簡単に書くとRADOSGWSはObjectStorageで、「Amazon S3」「OpenStackのSwift」と互換性があります。RBDはVMなどにブロック単位でのアクセスを提供します。CephFSはPOSIX互換の分散ファイルシステムを提供します。

Cephクラスタは主にMonitor, Managers, MDS, OSDで構成されます。
MonitorはCRUSHマップなどのクラスターの状態の維持、クライアントの認証などを行います。
Managerはストレージの利用率やシステム負荷などを監視し、Webブラウザで開けるダッシュボードを提供します。
MDSはメタデータサーバで、CephFSを使うために必要です。
OSDはDiskのことです。Disk1台ごとに1つのOSDプロセスが必要です。

詳しくは[公式](http://docs.ceph.com/docs/mimic/)を読むことをお勧めします。

#環境
家で余っていた以下の機材で検証します。OSはUbuntu18.04LTSです。
推奨環境は[公式](http://docs.ceph.com/docs/mimic/start/hardware-recommendations/)に記載されています。
今回は2つのNW用意します。外部からCephを利用する場合はPublicNetwork。Ceph内でのレプリケートなどの内部トラフィック用のClusterNetworkです。分けなくてもクラスタは組めますが分けることが推奨です。

|Hostname|PublicIP|ClusterIP|CPU|Memory|HDD
|:-:|:-:|:-:|:-:|:-:|:-:|:-:|
|ubuntu-ceph01|192.0.2.1|198.51.100.1|XeonE3-1240v3|24GB| 2TB 2TB|
|ubuntu-ceph02|192.0.2.2|198.51.100.2|XeonE3-1230v5|16GB| 2TB 2TB|
|ubuntu-ceph03|192.0.2.3|198.51.100.3|XeonE3-1220v3|24GB| 300GB 300GB|

#構築
ceph-deployを用いた方法で構築します。ceph-deployはパスなしsudoをSSH経由で行い、各ノードを設定していきます。ですので、各ノードに以下の設定をします。

##デプロイ用ユーザの作成
Cephを各ノードにデプロイするためのユーザを作ります。ここで「ceph」という**名前を使わないでください。**
今回は「cephadmin」という名前にします。また各ノードにssh-copy-idなどで同じ公開鍵を入れ、`/etc/hostname`と同じ名前でSSH出来るようにしておきます。

```
sudo useradd -d /home/cephadmin -m cephadmin
sudo passwd cephadmin
```


パスなしSudoが通るようにします。

```
echo "cephadmin ALL = (root) NOPASSWD:ALL" | sudo tee /etc/sudoers.d/cephadmin
sudo chmod 0440 /etc/sudoers.d/cephadmin
```

##ceph-deployのインストール

```
wget -q -O- 'https://download.ceph.com/keys/release.asc' | sudo apt-key add -
echo deb https://download.ceph.com/debian-mimic/ $(lsb_release -sc) main | sudo tee /etc/apt/sources.list.d/ceph.list
sudo apt update
sudo apt install ceph-deploy
```

##作業ディレクトリの作成
```
mkdir ceph-test
cd ceph-test
```

##最初のMonitorノード投入
```
ceph-deploy --username cephadmin
ceph-deploy --username cephadmin new ubuntu-ceph01
```

##ceph.confに設定を追記
今のディレクトリにceph.confというファイルが出来るのでNWの設定を追記します

```conf:ceph.conf
public network = 192.0.2.0/24
cluster network = 192.51.100.0/24
```

##各ノードへCephのインストール
python-minimalをインストールしていないと失敗したので、入れておきます。

```
sudo apt install python-minimal
ceph-deploy --username cephadmin install ubuntu-ceph01 ubuntu-ceph02 ubuntu-ceph03
```

##Monitorを初期化し、設定ファイルとKeyを各ノードに分配します。
```
ceph-deploy --username cephadmin mon create-initial
ceph-deploy --username cephadmin admin ubuntu-ceph01 ubuntu-ceph02 ubuntu-ceph03
```

##最初のManager投入
最初のManagerノードを投入します。

```
ceph-deploy --username cephadmin mgr create ubuntu-ceph01
```

##OSDの投入
Cephで使うDiskをOSDとして投入していきます。zapコマンドはDiskをOSDとして使えるように初期化します。意図しないDiskを選択しないように注意。

```
ceph-deploy --username cephadmin disk zap ubuntu-ceph01 /dev/sdb
ceph-deploy --username cephadmin osd create --data /dev/sdb ubuntu-ceph01
ceph-deploy --username cephadmin disk zap ubuntu-ceph01 /dev/sdc
ceph-deploy --username cephadmin osd create --data /dev/sdc ubuntu-ceph01

ceph-deploy --username cephadmin disk zap ubuntu-ceph02 /dev/sdb
ceph-deploy --username cephadmin osd create --data /dev/sdb ubuntu-ceph02
ceph-deploy --username cephadmin disk zap ubuntu-ceph02 /dev/sdc
ceph-deploy --username cephadmin osd create --data /dev/sdc ubuntu-ceph02

ceph-deploy --username cephadmin disk zap ubuntu-ceph03 /dev/sdb
ceph-deploy --username cephadmin osd create --data /dev/sdb ubuntu-ceph03
ceph-deploy --username cephadmin disk zap ubuntu-ceph03 /dev/sdc
ceph-deploy --username cephadmin osd create --data /dev/sdc ubuntu-ceph03
```

##構築確認
これで最低限のクラスタができたので確認します。

```
sudo ceph health
```
`HEALTH_OK`が出れば構築できています。

#次にノードに追加機能やダッシュボードを導入します

##Monitorノードの追加
今回はノード数が3なので、全部Monitorにします。

```
ceph-deploy --username cephadmin mon add ubuntu-ceph02
ceph-deploy --username cephadmin mon add ubuntu-ceph03
```

##Managerノードの追加
ManagerノードはActiveStanby方式で動作します。Activeなノードが停止した場合に他のノードが引き継ぎます。
Monitor同様、今回は全ノード投入します。

```
ceph-deploy --username cephadmin mgr create ubuntu-ceph02 ubuntu-ceph03
```

##MDS投入
CephFSが使うMetaDataServerを構築します。CephFSを使わない場合は不要です。

```
ceph-deploy --username cephadmin mds create ubuntu-ceph01
```

##ObjectGatewayを投入
今回はubuntu-ceph02に投入します。

```
ceph-deploy --username cephadmin rgw create ubuntu-ceph02
```

##Cephダッシュボードの導入
```
sudo apt install python-routes
sudo ceph mgr module enable dashboard
sudo ceph dashboard create-self-signed-cert

sudo ceph mgr module disable dashboard
sudo ceph mgr module enable dashboard

sudo ceph dashboard set-login-credentials <username> <password>
```


##ダッシュボードがCephへのアクセスで使うアカウントを作成
```
sudo radosgw-admin user create --uid=<username> --display-name=<displayname> --system
```
実行すると作成したUserの認証情報がでるので、`"access_key"``"secret_key"`を次の設定で入れます。

##Cephダッシュボードが使うアカウントを登録
```
sudo ceph dashboard set-rgw-api-access-key <access_key>
sudo ceph dashboard set-rgw-api-secret-key <secret_key>
```
ここまで終了するとCephダッシュボードが使えるようになり、https://192.0.2.1:8443 にブラウザでアクセスして先ほど設定したset-login-credentialsのユーザ名とパスワードを入力すると以下のような管理画面を開くことができます。

![cephd.JPG](https://qiita-image-store.s3.amazonaws.com/0/106927/572f9b56-57f8-6e19-2851-569f11a14b87.jpeg)

#Cephを使う

##ObjectStorage
今回はubuntu-ceph02にObjectGatewayを構築したのでhttp://192.0.2.2:7480 を開くと以下のような画面が出ると思います。出ていれば構築は出来ていると思います。
![cephob.JPG](https://qiita-image-store.s3.amazonaws.com/0/106927/9a624956-84ea-e767-4e7e-2bb2c9b5cea4.jpeg)

あとはダッシュボードなどでユーザとバケット作成して使うだけです。以下のPythonコードでUploadと一覧を取得する簡単なテストを行いました。バケット名は`test-bucket`です。

```python:upload.py
import boto3

access_key = 'access_key'
secret_key = 'secret_key'


client = boto3.client(
    service_name = 's3',
    aws_access_key_id = access_key,
    aws_secret_access_key = secret_key,
    use_ssl = False,
    endpoint_url = 'http://192.0.2.2:7480',
)

filename = 'test.txt'
bucket_name = 'test-bucket'
object_key = 'test.txt'

client.upload_file(filename, bucket_name, object_key)
```

```python:get.py
import boto3

access_key = 'access_key'
secret_key = 'secret_key'

client = boto3.resource(
    service_name = 's3',
    aws_access_key_id = access_key,
    aws_secret_access_key = secret_key,
    use_ssl = False,
    endpoint_url = 'http://192.0.2.2:7480',
)

bucket_name = 'test-bucket'
Bucket_data = client.Bucket(bucket_name)

keys = [obj.key for obj in Bucket_data.objects.all()]
print(keys)
```

```txt:実行結果例
['test.txt', 'test2.txt']
```

##Samba4で共有フォルダを作成
Samba4には[vfs_ceph](http://www.samba.gr.jp/project/translation/current/htmldocs/manpages/vfs_ceph.8.html)というモジュールを用いてNASのような形でCephにアクセスできます。
今回はubuntu-ceph01経由で公開します。

まず共有フォルダ用のプールを作成します。

```
sudo ceph osd pool create cephfs_data 64
sudo ceph osd pool create cephfs_metadata 64
```

今回はcephfs01という名前として、先ほど作ったプールを割り当てます。

```
sudo ceph fs new cephfs01 cephfs_metadata cephfs_data
```

Sambaの設定。Sambaのユーザ認証や共有フォルダの設定は出来ているものとして、以下のようにsmb.confを編集します。
/etc/samba/smb.conf に以下を追記

```conf:smb.conf
[sharename]
path = /
vfs objects = ceph
ceph:config_file = /etc/ceph/ceph.conf
read only = no
oplocks = no
kernel share modes = no

```
Sambaを再起動。これでCephベースの共有フォルダが使用できます。

```
sudo systemctl restart smbd
```
Windowsでマウントすればこんな感じ。容量が600GB弱なのはubuntu-ceph03の容量に合わせているから。
![cephs.JPG](https://qiita-image-store.s3.amazonaws.com/0/106927/b1af5be8-d35c-c095-a637-4e14fbf119d7.jpeg)

ただこの状態だとubuntu-ceph01がSPOFなので、[CTDBなどでSambaもクラスタ化](https://wiki.samba.org/index.php/CTDB_and_Clustered_Samba)すると良さそうです。(まだ試してないです)
#その他
Cephを消す方法とCRUSHマップの編集方法
##失敗したとき
何か失敗してリセットしたいときは、以下のコマンドを投入してCephを削除できます。
また私の環境では、OSDとして使ったDiskにLVM?の構成が残っていたので、もう一度使うにはそれを手動で削除する必要がありました。

```
ceph-deploy --username cephadmin purge ubuntu-ceph01 ubuntu-ceph02 ubuntu-ceph03
ceph-deploy --username cephadmin purgedata ubuntu-ceph01 ubuntu-ceph02 ubuntu-ceph03
ceph-deploy --username cephadmin forgetkeys
rm ceph.*
```

##CRUSHマップの編集
今回は各ノードの容量が4TB, 4TB, 600GBと偏ってるのでデフォルトのレプリケート数3を満たせません。(初期のCRUSHマップは各OSDの容量から重みが決定されているため)
今回は検証用と割り切って、重みを全部同じにするため、CRUSHマップを編集しました。

```
sudo ceph osd getcrushmap -o <出力ファイル名>
crushtool -d <出力ファイル名> -o <デコード済み出力ファイル名>
vi <デコード済み出力ファイル名>
CRUSHマップを編集する
crushtool -c <デコード済み出力ファイル名> -o <コンパイル済み新CRUSHマップ>
sudo ceph osd setcrushmap -i <コンパイル済み新CRUSHマップ>
```

##参考文献
Ceph 公式 https://ceph.com/
Ceph Documentation http://docs.ceph.com/docs/mimic/
Ceph (Mimic) を Ubuntu 18.04 に入れた時の構築メモ https://qiita.com/yakumo/items/a558e2266ee65b6d5aff
vfs_ceph http://www.samba.gr.jp/project/translation/current/htmldocs/manpages/vfs_ceph.8.html