ZFSをEC2で使ってみる

今回はEC2上でZFSを使ってみました。EBSをストレージとして使用し、プールやボリュームの作成を行っています。
2023.03.31

この記事は公開されてから1年以上経過しています。情報が古い可能性がありますので、ご注意ください。

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を使ってみました。ボリュームの管理機能がついていたり、スナップショットの作成が簡単であったりとなかなか高機能で便利だと思います。 今回は紹介を省きましたが、暗号化や圧縮にも対応しているのでいろいろと便利そうです。

参考