ZFSのdRAIDをLinuxで実装



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 - パリティ数でデフォルトは１（RAID5的な）、今回は２が良い。
data - データデバイスの数でデフォルトは８で今回も８。
children - デバイスの全体数
spares - スペア数でデフォルトは０、今回は２。
なので、コマンド的にはこんな感じです。
```
#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
	    /////////１２個分/////////
	    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

# 
以上、いつか誰かの役に立ちますように。