FreeBSD で ZFS を利用する – ZFS プールの作成 (パーティション切らない編)

ZFS

今回は ZFS プールの作成,ファイルシステムの作成について解説していきます.
また,ZFS を利用する際の注意点についても解説します.

ZFS プール・ファイルシステムの作成後の基本的な動作についても解説していきます.

はじめに

今回の環境

今回の ZFS を構築する為の環境はこのようなホスト・ディスクの構成です.今後の話で適宜変更が入る場合もありますが,
前提としては5個の HDDがあると考えてください.
容量はすべて 100GB の HDD として作成しています.

ZFS を始める前の注意点

まっとうなサーバーで ZFS を利用する場合の注意点がありますので先に説明します.
RAID カード (RAID-HBA) を搭載している場合は,RAID カード側で RAID を構成せず,JBOD で1個ずつボリュームを作成して切り出すか,パススルーでホストに見せるようにしてください.
RAID カードで RAID を構成した場合,前回説明したエンドツーエンドのチェックサムが有効に働きませんし,ZFS のパフォーマンスを十分に引き出すことができません.

それを承知の上であれば構いませんが… ちょっとした一手間で済みますので是非パススルーに変更してください.

ちなみに,筆者の環境 (実環境) では RAID-HBA の RAID 機能を無効化したファームウェアに置き換えて利用をしています.

ZFS を利用するための前準備

kernel module の読み込みと rc.fonf および loader.conf へ追記します.

# kldload zfs

# kldstat
Id Refs Address                Size Name
 1   17 0xffffffff80200000  1f3e2d0 kernel
 2    1 0xffffffff82319000     3218 intpm.ko
 3    1 0xffffffff8231d000     2180 smbus.ko
 4    1 0xffffffff82320000     7490 vmci.ko
 5    1 0xffffffff82400000   3c4778 zfs.ko

# cat /etc/rc.conf
zfs_enable="YES"

# cat /boot/loader.conf
zfs_load=YES"

単純なプールを構成する

まずは ZFS でのミラーもない単純なプールを構成し,ここで基本的な挙動を確認していく形をとりたいと思います.
RAID0 (コンカチ?) プールの作成は zpool create コマンドで行います.
zpool create プール名 ディスク名… です.
5個あるディスクのうち,2個を使ってプールを構成します.

# zpool create pool0 da1 da2

作成されたプールのステータスは zpool status コマンドで確認できます.

# zpool status pool0
  pool: pool0
 state: ONLINE
config:

        NAME        STATE     READ WRITE CKSUM
        pool0       ONLINE       0     0     0
          da1       ONLINE       0     0     0
          da2       ONLINE       0     0     0

プールを作成すると,指定したプール名で ZFS としても作成がされており,ファイルシステムとして利用可能な状態となっています.

# zfs list
NAME    USED  AVAIL     REFER  MOUNTPOINT
pool0   108K   193G       24K  /pool0

# df
Filesystem 1K-blocks    Used     Avail Capacity  Mounted on
/dev/da0p2  19279260 3142132  14594788    18%    /
devfs              1       1         0   100%    /dev
pool0      202178476      24 202178452     0%    /pool0

データを書き込み,IO 状態を確認する

dd でデータを書き込んでいき,二つのディスクへのアクセスがどのようになるのかを確認します.
100MB のファイルを順次書き込んでいった際の iostat の結果は次のとおりです.
概ね均等に二つのディスクに対して書き込みが行われています.

# zpool iostat -v 5
              capacity     operations     bandwidth
pool        alloc   free   read  write   read  write
----------  -----  -----  -----  -----  -----  -----
pool0       80.8M   199G      0      2    183   870K
  da1       41.2M  99.5G      0      1     91   433K
  da2       39.6M  99.5G      0      1     91   437K
----------  -----  -----  -----  -----  -----  -----
              capacity     operations     bandwidth
pool        alloc   free   read  write   read  write
----------  -----  -----  -----  -----  -----  -----
pool0        673M   198G      0    184      0   111M
  da1        333M  99.2G      0     99      0  55.2M
  da2        339M  99.2G      0     85      0  56.0M
----------  -----  -----  -----  -----  -----  -----
              capacity     operations     bandwidth
pool        alloc   free   read  write   read  write
----------  -----  -----  -----  -----  -----  -----
pool0       1021M   198G      0    234      0   110M
  da1        508M  99.0G      0    130      0  55.3M
  da2        513M  99.0G      0    103      0  55.2M
----------  -----  -----  -----  -----  -----  -----

ZFS を拡張する

先ほど2個のディスクだった所にもう2個追加をして,合計4個のディスクのプールに拡張します.


プールへの追加を行う場合は zpool add コマンドを用います.

# zpool add pool0 da3 da4

ステータスを見てみますと,4個のディスクになっています.

# zpool status pool0
  pool: pool0
 state: ONLINE
config:

        NAME        STATE     READ WRITE CKSUM
        pool0       ONLINE       0     0     0
          da1       ONLINE       0     0     0
          da2       ONLINE       0     0     0
          da3       ONLINE       0     0     0
          da4       ONLINE       0     0     0

また,先ほど表示するのを忘れましたが,list コマンドを用いて容量の確認も可能です.
100GB x 4 ですので,400GB (概ね) の容量になっています.

# zpool list
NAME    SIZE  ALLOC   FREE  CKPOINT  EXPANDSZ   FRAG    CAP  DEDUP    HEALTH  ALTROOT
pool0   398G  9.77G   388G        -         -     0%     2%  1.00x    ONLINE  -

データを書き込み,IO 状態を確認する

再度データを書き込み,IO 状態を確認していきたいと思います.
先ほどとの違いは,2個で作成している状態である程度のデータが書き込まれているので,ここで新たにデータを書いた場合にどのような挙動になるのか.
というのを確認していきます.
先ほどは 100MB x 100個のデータを書いていきましたので,続いて同様にデータを書いていきたいと思います.

# zpool iostat -v 5
              capacity     operations     bandwidth
pool        alloc   free   read  write   read  write
----------  -----  -----  -----  -----  -----  -----
pool0       9.85G   388G      0     40    179  19.5M
  da1       4.91G  94.6G      0     19     55  9.68M
  da2       4.89G  94.6G      0     19     50  9.65M
  da3       20.3M  99.5G      0      0    108   253K
  da4       21.4M  99.5G      0      0    108   254K
----------  -----  -----  -----  -----  -----  -----
              capacity     operations     bandwidth
pool        alloc   free   read  write   read  write
----------  -----  -----  -----  -----  -----  -----
pool0       10.5G   387G      0    355      0   110M
  da1       5.07G  94.4G      0    116      0  26.0M
  da2       5.05G  94.5G      0    135      0  24.8M
  da3        201M  99.3G      0     53      0  29.7M
  da4        203M  99.3G      0     49      0  29.9M
----------  -----  -----  -----  -----  -----  -----
              capacity     operations     bandwidth
pool        alloc   free   read  write   read  write
----------  -----  -----  -----  -----  -----  -----
pool0       10.8G   387G      0    300    102   111M
  da1       5.15G  94.4G      0    104    102  26.6M
  da2       5.12G  94.4G      0    110      0  26.6M
  da3        295M  99.2G      0     42      0  29.0M
  da4        295M  99.2G      0     43      0  28.8M
----------  -----  -----  -----  -----  -----  -----
              capacity     operations     bandwidth
pool        alloc   free   read  write   read  write
----------  -----  -----  -----  -----  -----  -----
pool0       11.5G   386G      0    254      0   111M
  da1       5.32G  94.2G      0     75      0  26.7M
  da2       5.29G  94.2G      0     71      0  26.2M
  da3        473M  99.0G      0     56      0  28.5M
  da4        478M  99.0G      0     50      0  29.2M
----------  -----  -----  -----  -----  -----  -----

このケースだと,元々のディスクの使用量が少なかったため概ね均等に (先頭2個のディスクの方が多いですが) 書き込みが行われていく形となりました.
ZFS はディスクの空き容量,IO 状況をみながら適切にデータを書いていくとの事ですので,ある程度バラツキが出るのはそういうものなのだと思われます.
拡張においてコンカチの扱いではなく,追加したディスクに対しても元ディスクの空き容量にとらわれずに書き込みが発生するんだ.という事を押さえて頂ければと思います.

ZFS を削除する

続いてミラー構成の ZFS を試したいため,今の ZFS (プール) を削除したいと思います.
プールの削除は zpool destroy コマンドを用います.

# zpool destroy pool0

削除したため,プールは存在しない状態になっています.status コマンドの結果としてもこのとおりとなります.

# zpool status
no pools available

ミラーのプールを作成する

続いて ZFS でのミラープールを構成します.
5個あるディスクのうち,2個を使ってプールを構成します.
ミラープールの作成は zpool create コマンドで行います.
zpool create プール名 mirror ディスク名1 ディスク名2 です.
mirror disk disk と並べますが,3つ指定すると3面ミラーとなります.

# zpool create pool0 mirror da1 da2

ステータスで見るとこのような形で,ミラーとして構成され,ミラーセットとして da1, da2 があるということが分かります.

# zpool status
  pool: pool0
 state: ONLINE
config:

        NAME        STATE     READ WRITE CKSUM
        pool0       ONLINE       0     0     0
          mirror-0  ONLINE       0     0     0
            da1     ONLINE       0     0     0
            da2     ONLINE       0     0     0

ミラープールを拡張する

先ほど2個のディスクだった所にもう2個追加をして,合計4個のディスクのプールに拡張します.
プールへの追加を行う場合は zpool add コマンドを用います.

ミラープールの作成と同様に mirror の引数と共にディスクを指定します.

# zpool add pool0 mirror da3 da4

ステータスとしてはこのような形になります.

# zpool status
  pool: pool0
 state: ONLINE
config:

        NAME        STATE     READ WRITE CKSUM
        pool0       ONLINE       0     0     0
          mirror-0  ONLINE       0     0     0
            da1     ONLINE       0     0     0
            da2     ONLINE       0     0     0
          mirror-1  ONLINE       0     0     0
            da3     ONLINE       0     0     0
            da4     ONLINE       0     0     0

ステータスをみるとこのような形です.100GB ミラーが2セットなので 200GB の容量になります.

# zpool list pool0
NAME    SIZE  ALLOC   FREE  CKPOINT  EXPANDSZ   FRAG    CAP  DEDUP    HEALTH  ALTROOT
pool0   199G   158K   199G        -         -     0%     0%  1.00x    ONLINE  -

データを書き込み,IO 状態を確認する

このミラープールに対してデータを書き込んでいき,どのように IO が発生するかを確認していきます.
以下のとおり,ミラーセットそれぞれに対して IO が発生しています.概ね RAID10 のような動きとなります.

# zpool iostat -v 5
              capacity     operations     bandwidth
pool        alloc   free   read  write   read  write
----------  -----  -----  -----  -----  -----  -----
pool0        158K   199G      0     71      0  27.6M
  mirror-0   130K  99.5G      0     35      0  13.8M
    da1         -      -      0     17      0  6.87M
    da2         -      -      0     17      0  6.97M
  mirror-1    27K  99.5G      0     36      0  13.8M
    da3         -      -      0     18      0  6.89M
    da4         -      -      0     17      0  6.87M
----------  -----  -----  -----  -----  -----  -----
              capacity     operations     bandwidth
pool        alloc   free   read  write   read  write
----------  -----  -----  -----  -----  -----  -----
pool0       81.1M   199G      0    182      0   110M
  mirror-0  40.7M  99.5G      0     91      0  55.1M
    da1         -      -      0     46      0  27.6M
    da2         -      -      0     45      0  27.5M
  mirror-1  40.4M  99.5G      0     90      0  55.2M
    da3         -      -      0     45      0  27.6M
    da4         -      -      0     45      0  27.6M
----------  -----  -----  -----  -----  -----  -----
              capacity     operations     bandwidth
pool        alloc   free   read  write   read  write
----------  -----  -----  -----  -----  -----  -----
pool0        451M   199G      0    216      0   111M
  mirror-0   224M  99.3G      0    110      0  55.2M
    da1         -      -      0     56      0  27.7M
    da2         -      -      0     54      0  27.5M
  mirror-1   226M  99.3G      0    105      0  55.8M
    da3         -      -      0     52      0  28.0M
    da4         -      -      0     53      0  27.9M
----------  -----  -----  -----  -----  -----  -----

RAIDZ プールを作成する

続いて,RAIDZ (RAID5) プールを作成してみます.
5個あるディスクのうち,3個を使ってプールを構成します.
RAIDZの作成は zpool create コマンドで行います.
zpool create プール名 raidz ディスク名1 ディスク名2 ディスク名3 です.
raidz disk disk disk と並べますが,最小が3個でもっと多くを指定することが可能です.

# zpool create pool0 raidz da1 da2 da3

ステータスを表示すると,raidz1 の中に3本のディスクがある事が分かります.

# zpool status pool0
  pool: pool0
 state: ONLINE
config:

        NAME        STATE     READ WRITE CKSUM
        pool0       ONLINE       0     0     0
          raidz1-0  ONLINE       0     0     0
            da1     ONLINE       0     0     0
            da2     ONLINE       0     0     0
            da3     ONLINE       0     0     0

リストを表示すると,3本で構成した RAIDZ (RAID5) ですが,3本分が表示されています.
実際にはパリティ分も消費されていきますので使用可能な容量についてはディスク1つ分は減っていきます.

# zpool list pool0
NAME    SIZE  ALLOC   FREE  CKPOINT  EXPANDSZ   FRAG    CAP  DEDUP    HEALTH  ALTROOT
pool0   298G   190K   298G        -         -     0%     0%  1.00x    ONLINE  -

先ほど3個のディスクだった所にもう3個追加をして,合計6個のディスクのプールに拡張します.
(ディスク本数を変えて増やしています)
プールへの追加を行う場合は zpool add コマンドを用います.

ミラープールの作成と同様に raidz の引数と共にディスクを指定します.

# zpool add pool0 raidz da4 da5 da6

ステータスおよびリストの結果はこのような形になります.

# zpool status pool0
  pool: pool0
 state: ONLINE
config:

        NAME        STATE     READ WRITE CKSUM
        pool0       ONLINE       0     0     0
          raidz1-0  ONLINE       0     0     0
            da1     ONLINE       0     0     0
            da2     ONLINE       0     0     0
            da3     ONLINE       0     0     0
          raidz1-1  ONLINE       0     0     0
            da4     ONLINE       0     0     0
            da5     ONLINE       0     0     0
            da6     ONLINE       0     0     0

# zpool list pool0
NAME    SIZE  ALLOC   FREE  CKPOINT  EXPANDSZ   FRAG    CAP  DEDUP    HEALTH  ALTROOT
pool0   596G   253K   596G        -         -     0%     0%  1.00x    ONLINE  -

データを書き込み,IO 状態を確認する

この RAIDZ プールに対してデータを書き込んでいき,どのように IO が発生するかを確認していきます.
以下のとおり,RAIDZ セットそれぞれに対して IO が発生しています.概ね RAID50 のような動きとなります.
また,ミラープールとの比較としてパリティ計算・書き込みが発生している分少し書き込みパフォーマンスが落ちているような状況に見えます.(誤差程度ですが)

# zpool iostat -v 5
              capacity     operations     bandwidth
pool        alloc   free   read  write   read  write
----------  -----  -----  -----  -----  -----  -----
pool0        121M   596G      0    333      0   107M
  raidz1-0  62.0M   298G      0    180      0  53.8M
    da1         -      -      0     59      0  17.8M
    da2         -      -      0     60      0  18.0M
    da3         -      -      0     60      0  18.0M
  raidz1-1  59.1M   298G      0    153      0  53.7M
    da4         -      -      0     51      0  17.9M
    da5         -      -      0     51      0  17.8M
    da6         -      -      0     50      0  17.9M
----------  -----  -----  -----  -----  -----  -----
              capacity     operations     bandwidth
pool        alloc   free   read  write   read  write
----------  -----  -----  -----  -----  -----  -----
pool0        668M   595G      0    373      0   109M
  raidz1-0   332M   298G      0    199      0  54.4M
    da1         -      -      0     66      0  18.2M
    da2         -      -      0     66      0  18.2M
    da3         -      -      0     66      0  18.1M
  raidz1-1   336M   298G      0    173      0  54.9M
    da4         -      -      0     58      0  18.3M
    da5         -      -      0     57      0  18.3M
    da6         -      -      0     57      0  18.2M
----------  -----  -----  -----  -----  -----  -----
              capacity     operations     bandwidth
pool        alloc   free   read  write   read  write
----------  -----  -----  -----  -----  -----  -----
pool0       1.19G   595G      0    385      0   110M
  raidz1-0   608M   297G      0    178      0  55.4M
    da1         -      -      0     60      0  18.4M
    da2         -      -      0     58      0  18.3M
    da3         -      -      0     59      0  18.7M
  raidz1-1   608M   297G      0    206      0  54.9M
    da4         -      -      0     69      0  18.3M
    da5         -      -      0     68      0  18.3M
    da6         -      -      0     69      0  18.3M
----------  -----  -----  -----  -----  -----  -----

RAIDZ2, RAIDZ3 についても同様ですのでここは省かせて頂きます.

以上,プールの作成及び IO のかかり方について解説しました.
次回はこの作成した RAIDZ プールを引き続き利用して各設定やメンテナンスについて触れていきたいと思います.

コメント

タイトルとURLをコピーしました