動機
NAS、使ってますか?
エ○動画で埋まってますか?
私は最近3DCGを使ったアニメ作りを趣味にしているのですが、プロジェクトをGit(LFS)で管理しています。ソースがほぼ全部バイナリなので1プロジェクト終わる頃にはリポジトリとテンポラリファイルで数十ギガくらいに膨れ上がります。
これが2TBのNASには結構キツイので先を見据えて容量の大きいNASに買い換えようとしたのですが……
お高い!( ゚д゚ )クワッ!!
現在ドル円161円、コンピューター製品が全部お高いのです。RAID5の4TBクラスを買うと軽く10万円はしてきます。もうちょっと、こう、ご容赦をですね?(´・ω:;.:...
以前仕事でMapRの環境構築やったのですが、ストレージ自体は便利なのですがまぁメンドクサイ。
そのメンドクサさがなく、十数万円出せばコード差すだけで使える市販のNASは小規模ならかなりコスパが高いのです。
でも、個人にはやっぱりお高い!( ゚д゚ )クワッ!!
そこでMicroCephですよ。
※普通にCephで構築するのに比べてだいぶ楽だけど、それでもmdadmよりだいぶメンドクサかったです😇
比較表(※個人の感想です)
やりたいこと | USB-HDD | NAS(RAID1) | NAS(RAID5) | MD(RAID10) | Ceph |
---|---|---|---|---|---|
バックアップ | ○ | ○ | ○ | ○ | ○ |
多重化 | × | ○ | ○ | ○ | ○ |
ネットワークアクセス | × | ○ | ○ | ○ | ○ |
データエラー検知 | × | × | ○ | x | ○ |
容量追加 | △ | × | △ | ○ | ○ |
自動圧縮 | ○ | △ | △ | ○ | ○ |
速度 | ○ | × | × | × | × |
今回やりたいのは、今後年々増えていく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
簡単!
※あとipが変わると立ち上がらなくなるので、ipを固定しておいてください
基本的にipを変えないでくれって言ってます。
失敗したときは
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とブロックデバイスという2つのアクセス方法から選べます(NFSもあるけどたぶん使わないので割愛)
両方使ってみて今のところ運用が簡単なのがブロックデバイス、速度が安定して速いのがFileSystemって感じてます。
ブロックデバイスを使う場合はこちらに移動してください、FileSystemよりだいぶ簡単でした。
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
※ceph-commonを入れると通常のcephコマンドが使えるのですが、microcephのバージョンと違うと思わぬ動作をすることがあるので注意してください(ハマりました_(:3」∠)_)
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>
クライアント側でマウントしたディレクトリ内に書き込みすると、サーバ側のマウントしたディレクトリ内に反映されます☺️
ベンチマーク
WSLでCephFS(SSD1台ループバック:Wifi接続)
WSLでCephFS(USB-HDD6TBx3:Wifi接続)
Ceph速ぇーと思った?
ちゃうねん、Sambaがべらぼうに遅いだけやねん(´・ω・`)
あとCephFSクライアントがキャッシュしてて、ストレージの実力以上に数字がでてる感じがあります
CephのホストにCephFSでマウントしてSambaアクセス(CIFS3.1.1:Wifi接続)
Samba通すとボロボロやで(´・ω:;.:...
実際の使用感
Windowsのエクスプローラーから大きなファイルを転送するとなぜかWSLにマウントしたCephFS経由が一番遅かったりします。
代わりに3つくらい並列で転送してもスピードが落ちません、が、Sambaが5倍速くらい出てるので普通にSambaを使った方がよさそうです。
市販のNAS | WSLでCephFS | ホストでCephFS(Samba) | ホストでRBD(Samba) |
---|---|---|---|
25MB/s | 12MB/s | 75MB/s | 70MB/s |
運用メモはこちら
最終的にRAID10にしました(´・ω:;.:...
RBD運用にした後本番環境にお引っ越ししたのですが、そのさいIP/Host名を変えられないことがわりと致命的になりましての……
と言うわけでMicroCephの環境を潰してRAID10(≠1+0)にしました。LinuxのRAID10は1+0と違ってチャンクサイズで分割してチャンク数のレプリカを別ストレージに配置する方式とのことで、実は奇数台でも運用できます。
123
↓ cnunks=2
| 1 | 1 | 2 |
| 2 | 3 | 3 |
ベンチマーク
USB-HDD6TBx3でRAID10(CIFS3.1.1:有線LAN)
実際のスピードはRBDとRAID10でほぼ同等でした(通信速度の限界)