ZFSをEC2で使ってみる
ZFSとは
ZFSは元々Oracle社のSoralis上で実装されたファイルシステムです。 LinuxにもZFS on Linuxとして実装されておりカーネルモジュールとして動作します。
ZFSは以下のような特徴があります。
- 差分スナップショットの作成
- コピーオンライトの対応
- RAID-ZというRAID-5に近い仕組みの実装
- 暗号化や圧縮の対応
セットアップ
今回はEC2用のUbuntu22.04のイメージを使用してセットアップします。 手順は公式のものに従います。
$ sudo apt update $ sudo apt install zfsutils-linux
公式の手順ではリポジトリを追加していますが、不要でした。
ZFSをつかってみる
ZFSを使う上で抑えて抑えておくと良い単語を以下に整理しておきます。
用語解説
- プール: 複数のデバイスのグループ。ここにボリュームを作成していく。
- ボリューム: 実際に使用するデータ領域。一つのプールに対して複数作成できる。パーティションのような存在。
- RAID-Z: RAID-5に近い機能。パリティの数を1-3で選択可能。プールの構成に関わってくる。
プールの作成
今回は10GiBのEBSボリュームを3つアタッチしてあります。
今回は3つのボリュームからRAID-Z(パリティは1つ)でプールを構築します。
$ lsblk NAME MAJ:MIN RM SIZE RO TYPE MOUNTPOINTS ... nvme0n1 259:0 0 8G 0 disk # これはルートボリューム ├─nvme0n1p1 259:2 0 7.9G 0 part / ├─nvme0n1p14 259:3 0 4M 0 part └─nvme0n1p15 259:4 0 106M 0 part /boot/efi nvme1n1 259:1 0 10G 0 disk # ZFS用のボリューム nvme3n1 259:5 0 10G 0 disk # ZFS用のボリューム nvme2n1 259:6 0 10G 0 disk # ZFS用のボリューム # zpool create のコマンドは以下 # zpool create <プール名> <RAID構成> <デバイス> $ sudo zpool create sample-pool raidz /dev/nvme1n1 /dev/nvme2n1 /dev/nvme3n1 $ zpool status pool: sample-pool state: ONLINE config: NAME STATE READ WRITE CKSUM sample-pool ONLINE 0 0 0 raidz1-0 ONLINE 0 0 0 nvme1n1 ONLINE 0 0 0 nvme2n1 ONLINE 0 0 0 nvme3n1 ONLINE 0 0 0 errors: No known data errors
無事に構築できたようです。 エラーも出ていません。
ボリュームの作成
sample-volume
という名前でボリュームを作ってみます。
$ sudo zfs create sample-pool/sample-volume $ zfs list NAME USED AVAIL REFER MOUNTPOINT sample-pool 163K 19.0G 30.6K /sample-pool sample-pool/sample-volume 30.6K 19.0G 30.6K /sample-pool/sample-volume $ zfs get mountpoint NAME PROPERTY VALUE SOURCE sample-pool mountpoint /sample-pool default sample-pool/sample-volume mountpoint /sample-pool/sample-volume default
無事に作成できたようです。 使用可能な領域が19になっているのはパリティが存在するためです。 パリティが一つあるため、使用可能な領域がn-1/nになります。(RAID5と同じです)
ボリュームは/sample-pool
以下に自動でマウントされます。
適当にダミーのファイルを置いてみます。
$ sudo dd if=/dev/zero of=/sample-pool/sample-volume/dummy bs=1M count=1024 $ echo "Hello, ZFS!" | sudo tee /sample-pool/sample-volume/hello.txt $ zfs list NAME USED AVAIL REFER MOUNTPOINT sample-pool 1023M 18.0G 30.6K /sample-pool sample-pool/sample-volume 1023M 18.0G 1023M /sample-pool/sample-volume
しっかりと使用率が上昇していますね。
その他の機能
他にもいくつか機能があるので見ていきます。
スナップショット
スナップショットの作成
先程のボリュームからスナップショットを作成します。
$ sudo zfs snapshot sample-pool/sample-volume@snap0 $ zfs list -t snapshot NAME USED AVAIL REFER MOUNTPOINT sample-pool/sample-volume@snap0 0B - 1023M - # ファイルを編集して再度スナップショット作成 $ echo "Hello, ZFS! edtied..." | sudo tee /sample-pool/sample-volume/hello.txt $ sudo zfs snapshot sample-pool/sample-volume@snap1 $ zfs list -t snapshot NAME USED AVAIL REFER MOUNTPOINT sample-pool/sample-volume@snap0 16.7K - 1023M - # 差分でスナップショットを作成するため使用率が増加 sample-pool/sample-volume@snap1 0B - 1023M -
無事にスナップショットが作成できたようです。
ちなみにこのスナップショットを別プールに移動させたり、別のサーバーに送ったりすることもできます。
スナップショットからの復元
スナップショットから復元してみます。
$ sudo zfs clone sample-pool/sample-volume@snap1 sample-pool/sample-volume-cloned $ zfs list NAME USED AVAIL REFER MOUNTPOINT sample-pool 1023M 18.0G 30.6K /sample-pool sample-pool/sample-volume 1023M 18.0G 1023M /sample-pool/sample-volume sample-pool/sample-volume-cloned 0B 18.0G 1023M /sample-pool/sample-volume-cloned # スナップショットから作成されたボリューム
RAIDの回復
ディスクが故障した想定で、プール内のデバイスの置換を行ってみます。 今回はEBSを使用しているので、デバイスが故障してデータが喪失するといったリスクはほぼ無いとおもいますが...
$ lsblk NAME MAJ:MIN RM SIZE RO TYPE MOUNTPOINTS ... nvme0n1 259:0 0 8G 0 disk ├─nvme0n1p1 259:2 0 7.9G 0 part / ├─nvme0n1p14 259:3 0 4M 0 part └─nvme0n1p15 259:4 0 106M 0 part /boot/efi nvme1n1 259:1 0 10G 0 disk ├─nvme1n1p1 259:7 0 10G 0 part └─nvme1n1p9 259:8 0 8M 0 part nvme3n1 259:5 0 10G 0 disk ├─nvme3n1p1 259:9 0 10G 0 part └─nvme3n1p9 259:10 0 8M 0 part nvme2n1 259:6 0 10G 0 disk ├─nvme2n1p1 259:11 0 10G 0 part └─nvme2n1p9 259:12 0 8M 0 part nvme4n1 259:13 0 10G 0 disk # デバイスの入れ替えは以下のコマンドで行います。 # zpool replace <プール名> <プール内のデバイス> <新しいデバイス> $ sudo zpool replace sample-pool /dev/nvme1n1 /dev/nvme4n1 $ zpool status pool: sample-pool state: ONLINE status: One or more devices is currently being resilvered. The pool will continue to function, possibly in a degraded state. action: Wait for the resilver to complete. scan: resilver in progress since Thu Mar 30 12:46:43 2023 1.50G scanned at 256M/s, 1.28G issued at 218M/s, 1.50G total 432M resilvered, 85.09% done, 00:00:01 to go config: NAME STATE READ WRITE CKSUM sample-pool ONLINE 0 0 0 raidz1-0 ONLINE 0 0 0 replacing-0 ONLINE 0 0 0 nvme1n1 ONLINE 0 0 0 nvme4n1 ONLINE 0 0 0 (resilvering) #置換が進行中 nvme2n1 ONLINE 0 0 0 nvme3n1 ONLINE 0 0 0 errors: No known data errors # 暫く経つと完了する $ zpool status pool: sample-pool state: ONLINE scan: resilvered 512M in 00:00:07 with 0 errors on Thu Mar 30 12:46:50 2023 config: NAME STATE READ WRITE CKSUM sample-pool ONLINE 0 0 0 raidz1-0 ONLINE 0 0 0 nvme4n1 ONLINE 0 0 0 nvme2n1 ONLINE 0 0 0 nvme3n1 ONLINE 0 0 0 errors: No known data errors
おわりに
今回はZFSを使ってみました。ボリュームの管理機能がついていたり、スナップショットの作成が簡単であったりとなかなか高機能で便利だと思います。 今回は紹介を省きましたが、暗号化や圧縮にも対応しているのでいろいろと便利そうです。