ZFSと言うとSolarisのものというイメージがありましたが、Linux版も良い感じに仕上がっているという事でメモ。
Ubuntuでzfsutilsをaptすれば導入も楽にできるので、これから始める場合はUbuntu 22.04が良いと思います。なぜなら、dRAIDというRAIDレベルが使えるから。
dRAIDは簡単に言うと再構築めっちゃ早いRAID。
仕組みとしてはホットスペアを分散して再構築を並列化するという仕組みで、RAID ADAPT,Declusterd RAID,DDPなど
ベンダーによって色々な名前がついたやつをOpen Sourceでもできるというわけ。
ただ、バージョンがOpenZFS 2.1以降で対応なので、Ubuntu20.04とそれ以前のバージョンで自動で落としたOpenZFSだと含まれていません。
なので、Ubuntuは22.04以降の方が何かと楽です。
参考リンク
https://openzfs.github.io/openzfs-docs/Basic%20Concepts/dRAID%20Howto.html
1,Ubuntuでパッケージインストール
2,zpoolコマンド
3,zfs コマンド
4,性能測定時のコツ
5,その他運用の為のコマンド等
OS環境:Ubuntu22.04 Desktop
サーバー:Supermicro 1U server
Storage:Seagate JBOD
1,Ubuntuでパッケージインストール
#apt update
#apt install zfsutils-linux
#zfs --version
zfs-2.1.5-1ubuntu6~22.04.1
zfs-kmod-2.1.5-1ubuntu6
おわり
2,zpoolコマンド
Syntax的には
zpool create 名前 raidレベル デバイス
なので、sdbからsdfまでの5本のドライブを使ったRAID5的なraidz1の場合は以下のように。
#zpool create tank raidz1 /dev/sd[b-f]
どうやらzfs界隈ではtankという名前が一般的らしい。
ただ、今回はdRAIDにするのでちょっと違う形式。
zpool create <pool> draid[<parity>][:<data>d][:<children>c][:<spares>s] <vdevs...>
parity - パリティ数でデフォルトは1(RAID5的な)、今回は2が良い。
data - データデバイスの数でデフォルトは8で今回も8。
children - デバイスの全体数
spares - スペア数でデフォルトは0、今回は2。
なので、コマンド的にはこんな感じです。
#zpool create tank draid2:8d:12c:2s /dev/disk/by-id/scsi-36000c500d98a3b7f0000000000000000 /dev/disk/by-id/scsi-3xxxxxx以後続く
デバイス名(vdev)はsdxという名前だと起動の順番が入れ替わった際に名前がずれてヒサンな事になるので、/dev/disk/by-idにあるSCSI IDで名前を指定。
外付けJBODを使用する際は絶対こちらをお勧めします。経験的に(苦笑)。
実行するとPoolが作成されますが、以前何かで該当デバイスを使用していた場合エラーになります。
その時はparted /dev/sdxで一個ずつクリアしていくか、createの後に-fを付けて強引に「押し通ーーる」(アシタカ風に)するとすんなり作成できます。
某lvmだとこの辺が結構面倒くさい。
状況の確認はzpool status コマンド
# zpool status
pool: tank
state: ONLINE
config:
NAME STATE READ WRITE CKSUM
tank ONLINE 0 0 0
draid2:8d:24c:2s-0 ONLINE 0 0 0
scsi-36000c500d98a3b7f0000000000000000 ONLINE 0 0 0
/////////12個分/////////
scsi-36000c500d98a6cf30001000000000000 ONLINE 0 0 0
spares
draid2-0-0 AVAIL
draid2-0-1 AVAIL
errors: No known data errors
Sparesというのがデバイスとしては無く、Availableなブロックとして見えているのが解ります。
これで、PoolとしてはOKです。
ちなみに消すときはdestroyコマンドだけ。これも楽。
ただ、マウントしててもサクッと消えるのでご利用は慎重に。
#zpool destroy tank
3,zfs コマンド
zfsではzpoolコマンドとzfsコマンドだけでほぼ何でもできる。
zfsコマンドではzpoolで作ったpoolに実際のファイルシステムとマウントポイントを設定。
とりあえず先ほど作ったtankにdataというディレクトリでマウント。
#zfs create tank/data
#zfs list
NAME USED AVAIL REFER MOUNTPOINT
tank 3.84M 139T 767K /tank
tank/data 767K 139T 767K /tank/data
これで、/tank/dataがマウントまでされ、再起動しても勝手に再マウントされるのでfstabの記載とかしなくてもOK。
4,性能測定時のコツ
zfsといえばホストのメモリー使いが上手くパフォーマンスに定評がありますが、単純なディスクのベンチマークを取るときは逆に性能が解らくなります。
キャッシュを使いたくないベンチマーク野郎(俺)は以下でオフにできます。
# zfs get primarycache
NAME PROPERTY VALUE SOURCE
tank primarycache all default
tank/data primarycache all local
該当のディレクトリがallになっていたらnoneにする。
#zfs set primarycache=none tank/data
NAME PROPERTY VALUE SOURCE
tank primarycache all default
tank/data primarycache none local
これでベンチマーク中にarcstatを見て、sizeの列でメモリが使用されていなければ純粋なディスクの性能が解りますよ。
# arcstat
time read miss miss% dmis dm% pmis pm% mmis mm% size c avail
16:35:06 0 0 0 0 0 0 0 0 0 9.2G 41G 74G
size: 実際使っているメモリ
c: ARC ターゲットサイズ
avail: 使えるメモリ容量
5,その他運用の為のコマンド等
OpenZFSのリンクからどうぞ。
参考リンク
https://openzfs.github.io/openzfs-docs/man/master/1/index.html
https://openzfs.github.io/openzfs-docs/Basic%20Concepts/dRAID%20Howto.html
以上、いつか誰かの役に立ちますように。