MicroCephで超高速に作る、懐が厳しいニキのための自家製NAS①構築編

# 動機

NAS、使ってますか？
エ○動画で埋まってますか？

私は最近3DCGを使ったアニメ作りを趣味にしているのですが、プロジェクトをGit(LFS)で管理しています。ソースがほぼ全部バイナリなので１プロジェクト終わる頃にはリポジトリとテンポラリファイルで数十ギガくらいに膨れ上がります。

これが2TBのNASには結構キツイので先を見据えて容量の大きいNASに買い換えようとしたのですが……

お高い！( ﾟдﾟ )ｸﾜｯ!!

現在ドル円161円、コンピューター製品が全部お高いのです。RAID5の4TBクラスを買うと軽く１０万円はしてきます。もうちょっと、こう、ご容赦をですね？(´・ω:;.:... 

以前仕事でMapRの環境構築やったのですが、ストレージ自体は便利なのですがまぁメンドクサイ。

そのメンドクサさがなく、十数万円出せばコード差すだけで使える市販のNASは小規模ならかなりコスパが高いのです。

でも、個人にはやっぱりお高い！( ﾟдﾟ )ｸﾜｯ!!

そこでMicroCephですよ。

※普通にCephで構築するのに比べてだいぶ楽だけど、それでもmdadmよりだいぶメンドクサかったです😇

# 比較表(※個人の感想です)

<center>

| やりたいこと | USB-HDD | NAS(RAID1) | NAS(RAID5) | MD(RAID10) | Ceph |
|-|-|-|-|-|-|
| バックアップ | ○ | ○ | ○ | ○ | ○ |
| 多重化 | × | ○ | ○ | ○ | ○ |
| ネットワークアクセス | × | ○ | ○ | ○ | ○ |
| データエラー検知 | × | × | ○ | x | ○ |
| 容量追加 | △ | × | △ | ○ | ○ |
| 自動圧縮 | ○ | △ | △ | ○ | ○ |
| 速度 | ○ | × | × | × | × |

</center>

今回やりたいのは、今後年々増えていく3Dアニメ制作のデータの多重化バックアップに対してストレージ増量の余地を確保しておきたい **(お安く)** っていうことです。

決してエ○動画の保存容量のためではないので！(ストリーミング契約しているので！)

この表から行くとNAS(RAID5)かMD(RAID10)かCephが選択肢に入りますが、最初に述べたとおりNAS製品はお高いのでRAID10かCephが選択肢になりました。

ここでおとなしく情報が出回ってるMD(RAID10)でやるでも良かったのですが、MicroCephが面白そうだったので試してみることにしました。

# 情報源

今回使うMicrocephはこちら
https://canonical-microceph.readthedocs-hosted.com/en/reef-stable/

Ceph本家
https://docs.ceph.com/en/reef/start/intro/

# インストール
MicroCephはSnapなので環境をあまり汚さないのがいいですね。

始めるだけならUbuntuのサイトに書いてあります。日本語のサイトの内容はちょっと古い感じなので、canonical本家のドキュメントを見た方がいいでしょう。
https://canonical-microceph.readthedocs-hosted.com/en/reef-stable/tutorial/single-node/

まずはインストール
```
$ sudo snap install microceph
$ sudo snap refresh --hold microceph
```

続いて初期化。これでサーバが起動します。
```
$ sudo microceph cluster bootstrap
$ ps aux | grep ceph
root       28251  3.2  0.0   4772  1908 ?        Ss   15:49   0:03 snapfuse /var/lib/snapd/snaps/microceph_999.snap /snap/microceph/999 -o ro,nodev,allow_other,suid
root       28637  0.2  0.1 2162176 30860 ?       Ssl  15:49   0:00 microcephd --state-dir /var/snap/microceph/common/state
(省略)
root       29344  0.0  0.0   2892   972 ?        Ss   15:50   0:00 /bin/sh /snap/microceph/999/commands/osd.start
```

簡単！

<font color=red>**※あとipが変わると立ち上がらなくなるので、ipを固定しておいてください**</font>

基本的にipを変えないでくれって言ってます。

https://docs.ceph.com/en/reef/rados/operations/add-or-rm-mons/#changing-a-monitor-s-ip-address

### 失敗したときは

Snapでremoveして最初からやり直してください。Snapなので基本的にあんまり環境は汚さないです。

```
$ sudo snap remove microceph
```

### 停止／再開(※運用前)

停止

```
$ sudo snap stop --disable microceph
```

再開

```
$ sudo snap start --enable microceph
```

### MicroCephのsocketが見つからないとき

ホスト再起動時とかにたまにあるっぽい？

```
$ sudo snap restart microceph
```


# ディスクの追加

ドキュメントに従って実行すると、ローカルディスクに4Gのストレージ用ファイルを3つ作ってそれをストレージとして使ってくれます。

後でストレージの追加・削除が簡単にできるので、最初はドキュメント通りに作っておきます。

add/removeが本当に簡単で、addの後ろに/dev/sdbってやるだけでストレージが追加できたので、もうこのまま本運用できちゃうんじゃないかなって思いました。
```
$ sudo microceph disk add loop,4G,3
```
※ストレージは最低3つ必要なので、ストレージが3つのときはremoveできません

ステータスを見るとusageのところが12GiBになってます。ただCephはレプリケーションで3つ(以上)に多重化しますので、使える容量は1/3です(ﾉ∀`)

```
$ sudo microceph.ceph status
  cluster:
    id:     5aee1701-4bb6-401e-bfaf-12d524d44dfd
    health: HEALTH_OK
(省略)
  data:
    pools:   1 pools, 1 pgs
    objects: 2 objects, 577 KiB
    usage:   82 MiB used, 12 GiB / 12 GiB avail
    pgs:     1 active+clean
```

# 利用方法の選択

FileSystemとブロックデバイスという２つのアクセス方法から選べます(NFSもあるけどたぶん使わないので割愛)

両方使ってみて今のところ運用が簡単なのがブロックデバイス、速度が安定して速いのがFileSystemって感じてます。

ブロックデバイスを使う場合はこちらに移動してください、FileSystemよりだいぶ簡単でした。

https://qiita.com/jp_ibis/items/ec782c4cd0fbbb871b01#rbd%E3%81%AE%E6%A7%8B%E7%AF%89

FileSystemを使う場合は下に読み進めて進めてください。

# FileSystemの追加

Cephが一つの超巨大なストレージを作ってくれるのですがそのまま使うとアクセス制御等で使い勝手が悪いです。基本的には大きなストレージを切り分けて必要に応じた設定で使うのですが、その切り分けたストレージを表す論理パーティションがpoolです。

さらにこのpoolを複数まとめてユーザーが使えるストレージにした物をFileSystemと呼ぶようです。例えば最小限のFileSystemの場合、メタデータ用pool1つとデータ用pool1つの組み合わさせが必要になります。

組織や用途ごとにFileSystemを作ったりするのですが、今回は個人利用目的なので自動で作成されるプールとFileSystemだけを使っていきます。またアクセス用のユーザーも用途別に用意したりしますが、やっぱり今回は個人用なのでadminという最初から用意されているフルで読み書きができるユーザーを使用します。

```
$ sudo microceph.ceph auth export client.admin
        key = ********************************
        caps mds = "allow *"
        caps mgr = "allow *"
        caps mon = "allow *"
        caps osd = "allow *"
```

ここからは読むドキュメントが変わります
https://docs.ceph.com/en/nautilus/cephfs/fs-volumes/

Cephのデータ管理にはデータそのものに加えメタデータ領域が必要になります。ceph fs createコマンドで一つずつ作ることもできますが、volume createで一気に作ってくれるようなのでこれを使います。

```
$ sudo microceph.ceph fs volume create cephfs01
```

ceph fs lsで確認することができます

```
$ sudo microceph.ceph fs ls
name: cephfs01, metadata pool: cephfs.cephfs01.meta, data pools: [cephfs.cephfs01.data ]
```
name: FileSystem名
metadata pool: メタデータpool名
data pools: [データpool名,...]

# マウントして使う

### CephFS/RBD共通設定

CephFSの時はmount時にcephというtypeを使用、RBDの時は`rbd map`コマンドを使用するわけですが、これらを使うためにceph-commonをインストールしておく必要があります。

```
$ sudo apt install ceph-common
```

<font color="red">**※ceph-commonを入れると通常のcephコマンドが使えるのですが、microcephのバージョンと違うと思わぬ動作をすることがあるので注意してください(ハマりました\_(:3」∠)\_)**</font>

ceph-commonのコマンドは`/etc/ceph`の設定を見に行きます。まずはここにceph.confとadminユーザー用の鍵ファイルを配置します。

snapのcephの設定ファイルが`/var/snap/microceph/current/conf`の中にありますので、この中のファイルへシンボリックリンクを張ります。

```
$ cd /etc/ceph
$ sudo ln -s /var/snap/microceph/current/conf/ceph.conf .
$ sudo ln -s /var/snap/microceph/current/conf/ceph.client.admin.keyring .
```

### CephFSでマウントする

適当にマウント先を作っておきます

```
$ sudo mkdir /mnt/mycephfs
```

ドキュメントを読むと次のようにマウントしろと書いてあります
https://docs.ceph.com/en/quincy/cephfs/mount-using-kernel-driver/
```
$ mount -t ceph <name>@<fsid>.<fs_name>=/ /mnt/mycephfs
```

ただしfsidは省略可ということで、\<name\>をadminに\<fs_name\>をcephfs01にして実行します。

```
$ sudo mount -t ceph admin@.cephfs01=/ /mnt/mycephfs
```

適当に100MBほどファイルを書き込んで状態を見てみます

```
$ cd /mnt/mycephfs
$ sudo mkdir tmp && sudo chmod 777 tmp
$ dd if=/dev/zero of=tmp/dummy.dat bs=1024k count=100
$ sudo microceph.ceph status
(省略)
  data:
    volumes: 1/1 healthy
    pools:   3 pools, 49 pgs
    objects: 49 objects, 101 MiB
    usage:   382 MiB used, 12 GiB / 12 GiB avail
    pgs:     49 active+clean

  io:
    client:   255 B/s wr, 0 op/s rd, 0 op/s wr
```

usageが300MBほど増えてioに書き込み速度が出てますね！

### ネットワーク越しにマウントする

MicroCephを入れたホストのFireWallに穴を開けておきます。

データ通信用に6800:7568、モニターへのアクセス用(制御用)に3300か6789を使用するようです。
https://docs.ceph.com/en/latest/rados/configuration/network-config-ref/

```
$ sudo vi /etc/ufw/application.d/cephfs
[CephFS]
title=CephFS
description=CephFS
ports=6789,3300,6800:7568/tcp

$ sudo ufw allow cephfs
```

※Windows(WSL)の場合FireWallはWindows側も明けなきゃダメかも

続いてクライアント用のUbuntu(WSL可)を用意してそちらで作業します。

最低限ceph-commonが必要です。

```
$ sudo apt install ceph-common
```
MicroCephを入れたホストの/etc/cephの中にある

> ceph.client.admin.keyring
> ceph.conf

上記2つのファイルを、クライアント用のPCの/etc/ceph下になんとかしてコピーします。

頑張れば見ながら書き写せるレベルの量ですが、最近ならクラウド経由とかRDPでコピペとかが簡単かと思います。SSH可能ならSCPで一発ですしcatしてコピペでもいける量です。

ファイルがコピーできたら、mountコマンドにMicroCephを入れたホストのIPを設定するmon_addrオプションを付けてマウントします(PORTは省略可)
https://docs.ceph.com/en/latest/man/8/mount.ceph/

```
$ sudo mount -t ceph admin@.cephfs01=/ /mnt/mycephfs -o mon_addr=<IP_ADDR>:<PORT>
```

クライアント側でマウントしたディレクトリ内に書き込みすると、サーバ側のマウントしたディレクトリ内に反映されます☺️

# ベンチマーク

某市販のNAS(CIFS2.0:有線LAN)
![449387859_8551833104899601_5928616663966448136_n.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/140718/7eaec0ca-fc75-db7d-6f14-c79e28ca21a2.jpeg)

WSLでCephFS(SSD１台ループバック:Wifi接続)
![449132886_8551833118232933_618434726533453862_n.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/140718/fcfb8f61-e527-c67b-27dc-9b730e97b821.jpeg)

WSLでCephFS(USB-HDD6TBx3:Wifi接続)
![449773192_8568541509895427_1009226043095852850_n.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/140718/257df99e-e897-19f7-43b6-0e9113353e8b.jpeg)

Ceph速ぇーと思った？
ちゃうねん、Sambaがべらぼうに遅いだけやねん(´・ω・`)

*あとCephFSクライアントがキャッシュしてて、ストレージの実力以上に数字がでてる感じがあります*

CephのホストにCephFSでマウントしてSambaアクセス(CIFS3.1.1:Wifi接続)
![スクリーンショット 2024-07-03 191927.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/140718/46eaf46c-0ba3-821d-af06-e3617b861561.png)

Samba通すとボロボロやで(´・ω:;.:... 

### 実際の使用感

Windowsのエクスプローラーから大きなファイルを転送するとなぜかWSLにマウントしたCephFS経由が一番遅かったりします。


代わりに３つくらい並列で転送してもスピードが落ちません、が、Sambaが５倍速くらい出てるので普通にSambaを使った方がよさそうです。

|市販のNAS|WSLでCephFS|ホストでCephFS(Samba)|ホストでRBD(Samba)|
|-|-|-|-|
|25MB/s|12MB/s|75MB/s|70MB/s|

# 運用メモはこちら
https://qiita.com/jp_ibis/items/4902169bb9c4789c9fc3

# 最終的にRAID10にしました(´・ω:;.:... 

RBD運用にした後本番環境にお引っ越ししたのですが、そのさいIP/Host名を変えられないことがわりと致命的になりましての……

https://qiita.com/jp_ibis/items/ec782c4cd0fbbb871b01

と言うわけでMicroCephの環境を潰してRAID10(≠1+0)にしました。LinuxのRAID10は1+0と違ってチャンクサイズで分割してチャンク数のレプリカを別ストレージに配置する方式とのことで、実は奇数台でも運用できます。

　123
　 ↓ cnunks=2
| 1 | 1 | 2 |
| 2 | 3 | 3 |

### ベンチマーク

USB-HDD6TBx3でRAID10(CIFS3.1.1:有線LAN)

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/140718/427d8280-f50e-5e93-8bde-858288512d0a.png)

実際のスピードはRBDとRAID10でほぼ同等でした(通信速度の限界)

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/140718/45706290-fa0f-dc22-7362-875ef30a3bf8.png)