MicroCephで超高速に作る、懐が厳しいニキのための自家製NAS③RBD運用編

環境構築は前の記事

https://qiita.com/jp_ibis/items/7b09bd2a4a1b70167ad3

# なにもしてない(嘘)のに壊れた(´；ω；｀)ﾌﾞﾜｯ

CephFSベースでの運用でたまに失敗して泣きながらリペアしてたりしましたが、そこそこ安定し始めたので徐々に本運用にスライドさせてました。

どうやらSambaよりCephFSの方が速いみたいなので、Windowsからデータを送るときはWSLのUbuntu内にCephFSでマウントして……みたいなことしてましたが、さすがにいちいちWSL立ち上げるのも面倒なのでWindowsに直接CephFSを突っ込もうとしたのですが……

https://docs.ceph.com/en/latest/cephfs/ceph-dokan/

Windowsが立ち上がらなくなりました(´；ω；｀)ﾌﾞﾜｯ

セーフモードでも立ち上がらないとかなかなかやっかいなことになりましたが、ドライバの署名を無効にすると立ち上がりました。それでそそくさとドライバをアンインストールして今に至る_(:3」∠)_

だめかー。Windows用ドライバ、安定しないかー(´・ω・`)

当初の目論見としてはWindowsにCephFSを入れて高速大量転送しつつ、他端末等からはSamba経由でファイルアクセスする予定でした。

WSLを通せばそれも可能ですがいちいちWSLを立ち上げるのがメンドクサイ。ちょっとした変更をGitでcommitしたいだけみたいなとき、このWSLを立ち上げる手間が苦痛です。

もういっそCephFSをやめてファイル転送はSambaにまとめちゃおうかと考えたわけですが、そうなるとCephFSではなくRBDの方も選択肢に入ります。

***※RBDを設定中に知ったのですが、RBDもネットワーク越しマウントできました***

RBDを使ってみたかったのもあって、CephのホストにRBDでマウントしてSamba経由でファイル転送するやり方に変更してみました。

https://docs.ceph.com/en/latest/rbd/

余談ですが、私はRBDとRDBをすぐに間違えます(´・ω・`)

# RBDの構築

https://docs.ceph.com/en/latest/start/quick-rbd/

サーバ側でRBD用のpool(論理パーティション)を作ってimage(仮想ディスク)として適当なサイズを切り出します。

クライアント側で切り出したimageをブロックデバイスとして登録(map)します。

### サーバ側作業

それではまずはRBD用のpoolを作ります。今回はrbd-dataという名前で進めます。

```bash
プールを作って
$ sudo microceph.ceph osd pool create rbd-data

RBDのpoolとして初期化
$ sudo microceph.rbd pool init rbd-data
```

続いてimageの作成を行います。

ドキュメントにはクライアント側のコマンドって書いてあってクライアントのコマンドでも作れるのですが、サーバに変更を加えるのでサーバ側の作業としておきます。

サイズ指定がありますが **最大サイズの指定なだけなので、後から増減させることができます**。

気楽に作成しちゃいましょう。

```bash
$ sudo microceph.rbd create rbd-data/rbd01 --size 4096 --image-feature layering
```

### クライアント側作業

CephFSの時と同様、クライアント側のコマンドはceph-commonが入っていれば使えます。

ceph-commonのインストールがまだならこちらを参照して設定してください。

https://qiita.com/jp_ibis/items/7b09bd2a4a1b70167ad3#cephfsrbd%E5%85%B1%E9%80%9A%E8%A8%AD%E5%AE%9A

RBDのイメージをクライアント側のブロックデバイスとして見えるようにします。ネットワーク越しにmapすることもできるようですが(WSLは不可っぽい)、今回はホストで全部やるのでモニターアドレス指定は不要です。

```bash
$ sudo rbd map rbd-data/rbd01 --name client.admin
```
※再起動するとマップされたデバイスは消えます

lsblkでマウントできるブロックデバイスが作成できているか見ておきます。

```bash
$ lsblk
省略
rbd0        251:0    0     4G  0 disk 
省略
```

デバイス名がrbd0となっています。これを使うこともできますがimageが増えたときにデバイス名とimageの対応を覚えておくのが面倒です。

`/dev/rbd/<pool名>/<image名>`も同じデバイスとして使えるので、こちらを使うようにしておいた方がトラブルは少ないでしょう。

続いてフォーマット。xfs等好きなフォーマットで可。

```bash
$ sudo mkfs.ext4 -m0 /dev/rbd/rbd-data/rbd01
```

後はフォーマットされたデバイスとして普通にマウントして使えます。

```bash
$ sudo mkdir /mnt/rbd
$ sudo mount -t ext4 /dev/rbd/rbd-data/rbd01 /mnt/rbd
```

### 起動時にマウントする

**<font color="red">※HDDを外してたりsystemdの起動順がずれた等でRBDのmapやマウントに失敗すると、OSが起動しなくなります！</font>**

デバイスmapを行うサービス`rbdmap.service`があるのでそちらを使います。

まずは設定から。

イメージ名とユーザー(とそのキー)を指定しておきます。

```bash
$ sudo vi /etc/ceph/rbdmap
rbd-data/rbd01  id=admin,keyring=/etc/ceph/ceph.client.admin.keyring
```

設定が書けたらサービスを実行します。

```bash
$ sudo systemctl start rbdmap.service

ホスト起動時に自動でstartするように
$ sudo systemctl enable rbdmap.service
```

自動マウントはfstabに普通のブロックデバイスと同様の設定を書いておきます。

```bash
$ sudo vi /etc/fstab
/dev/rbd/rbd-data/rbd01 /mnt/rbd ext4 defaults 0 0

反映
$ sudo systemctl daemon-reload
```

**サービス起動順やHW構成の変更時には十分気をつけてください。**

#### OS起動時に自動でマウントしないように(個人向け)

rbdmap.serviceをdisableにして、fstabにnoautoを付けておきます。

```bash
$ sudo systemctl disable rbdmap.service

$ sudo vi /etc/fstab
/dev/rbd/rbd-data/rbd01 /mnt/rbd ext4 defaults,noauto 0 0

反映
$ sudo systemctl daemon-reload
```

簡単なコマンドでmapしてマウントできます。

```bash
$ sudo systemctl start rbdmap.service
$ sudo mount -a
```

### リサイズ

RBD自体のリサイズは簡単にできますが、ファイルフォーマットのリサイズも行う必要があります。

ext4の場合resize2fsが使えます。

```bash
$ sudo microceph.rbd resize rbd-data/rbd01 --size 3T

ファイルフォーマット側のリサイズ
$ sudo e2fsck -fy /dev/rbd/rbd-data/rbd01
$ sudo resize2fs /dev/rbd/rbd-data/rbd01

dfで確認
$ df -h /dev/rbd/rbd-data/rbd01
Filesystem      Size  Used Avail Use% Mounted on
/dev/rbd0       3.0T  604G  2.4T  20% /mnt/rbd
```

# ベンチマーク

RBDをマウントしたホストにSamba経由でアクセス(CIFS3.1.1:Wifi接続)

![スクリーンショット 2024-07-15 201834.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/140718/2a8dea5d-dd5f-798c-31bf-fab7fc2f9209.png)

CephFSでSamba経由した時とほぼ一緒な感じです。微妙に速度が落ちてますかね？

CephFSの時と同じでベンチマーク上では速度が出てませんが、実際に大きなファイルを転送すると結構速いです。

# ダッシュボードのインストール等

ダッシュボードの追加やバックアップ・リストアに関してはCephFSの時にやっちゃってるのでここでは省略。

https://qiita.com/jp_ibis/items/4902169bb9c4789c9fc3

# データコピー

CephFSに頑張ってデータを移したばかりですが仕方ありません。CephFSからRBDにさらに移し替えます。この辺いろいろやり方があると思いますが、私は`rsync -daP`派です。

```bash
まずは確認
$ sudo rsync -ndaP /mnt/cephfs /mnt/rbd

よさそうならnを取って実行
$ sudo rsync -daP /mnt/cephfs /mnt/rbd
```

なぜか1ディレクトリコピーし損ねてたので、`rsync -ndav`か`find`なりで漏れがないか確認した方がいいかも。

```bash
$ find /mnt/cephfs /mnt/rbd -type f -printf "%s %P\n" | sort | uniq -u
```

# 本番環境へ移行

ここまでお試しでNotePCで構築・運用してきました。いざ本番環境に移行です。

### 本番用機材

6TBのHDD x 3台
楽天ビック：40,295円

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/140718/b768ad53-81a3-29bd-40fe-e0b42cfce29e.png)

HDDケース
Amazon：10488円

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/140718/229bb76f-2bfd-a6d1-e993-03526c745995.png)

ホストPC
Amazon：23,800円

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/140718/c121acc7-f138-a315-ccce-dd27d9771525.png)

合計：74583円

ポイントが結構残ってたので、わりと余裕をもって10万円を切りました☺️

### Cephのホスト変更

環境移行時の注意ですが<font color=red>**ホスト名とipは移行前の環境と同じ**</font>でなければなりません。

この辺りがRAIDと違ってメンドクサイところですね。クラスターがホスト名やipをガッツリ固定前提になっているので、ipやホスト名を変えての環境移行はちょっと難しいです。

ホスト名とipが同じでさえあればバックアップと同じ手順でバックアップのtar.gzの展開先を新しい環境の/var/snap/microcephにすればそれでお引っ越し完了です。

https://qiita.com/jp_ibis/items/4902169bb9c4789c9fc3#%E3%83%90%E3%83%83%E3%82%AF%E3%82%A2%E3%83%83%E3%83%97%E3%81%A8%E3%83%AA%E3%82%B9%E3%83%88%E3%82%A2

まずはなんとかしてバックアップを新しいホストに持って来ます。

後はリストアと同じ手順です。

1. Microcephをインストールしてcluster bootsrapまでする
    ```bash
    $ sudo snap install microceph
    $ sudo snap refresh --hold microceph
    $ sudo microceph cluster bootstrap
    ```
1. 一旦MicroCephを停止して、/var/snap/microcephを削除して置き換える
    ```bash
    $ sudo snap stop --disable microceph
    $ sudo rm -r /var/snap/microceph
    $ sudo tar -xzvf microceph-YYYYMMDD.tar.gz -C /    
    ```
1. ホストを再起動してからMicroCephを起動する
    ```bash
    $ sudo reboot
    $ sudo snap start --enable microceph
    ```
これで上手くい……かない_(:3」∠)_

起動直後はPGがinactiveになったりして泣きそうになりましたが、`deep-scrub`を有効に戻してあちこち診断しながら何度かホストごと再起動しているうちに勝手に復活しました。

謎ぃ(´・ω・`)

### 移行先でマウントする

新しいホストにceph-commonを入れてRBDデバイスのmapをやり直します。

```bash
$ sudo apt install ceph-common

ceph-commonの設定
$ 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 .
```

map用の設定を行います。

```bash
$ sudo vi /etc/ceph/rbdmap
rbd-data/rbd01  id=admin,keyring=/etc/ceph/ceph.client.admin.keyring

disable必須！
$ sudo systemctl disable rbdmap.service
$ sudo systemctl start rbdmap.service
```

mount用の設定を行います。

```bash
$ sudo vi /etc/fstab
/dev/rbd/rbd-data/rbd01 /mnt/rbd ext4 defaults,noauto 0 0

反映
$ sudo systemctl daemon-reload
```

設定を使ってmap&mountします。

```bash
$ sudo systemctl start rbdmap.service
$ sudo mount -a
```

お引っ越し完了☺️

```bash
$ ls /mnt/rbd/
backup/     lost+found/ repos/      share/
```

### ベンチマーク

新しいホスト(MiniPC)上のRBD(CIFS3.1.1:有線LAN)

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/140718/d3d0d698-bc3c-9565-b900-cd7f560d3ba3.png)

有線LANになったのでさらに速くなりました☺️

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/140718/a9029a79-d233-ff19-9a15-1de610fc89dd.png)

# 夏休みの自由研究終了

ホスト名やipが同じでないといけないというのはちょっと辛いですね。

調べてみたらorchやらceph-volumeやらceph-monやらを使って環境移行できるようですが、基本的には **それ(ip)を かえるなんて とんでもない！** ってことみたいです。

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

MicroCephの範囲を超えてくるので(orchは非サポート)、ip・ホスト名変更については諦める方向にします。

ip・ホスト名を変えたいときは新しいip・ホストのストレージを作って、普通にデータコピーしろってことでしょう。

### 個人には辛い😢

そうはいってもホームルーターを変えただけでネットワークグループごとまるっとかわるのが個人環境。

余計な労力をかけないことを考えたらRAID10の方がいいかな……って😇