今回は ZFS プールの作成,ファイルシステムの作成について解説していきます.
また,ZFS を利用する際の注意点についても解説します.
ZFS プール・ファイルシステムの作成後の基本的な動作についても解説していきます.
- ZFS に関するお話
- FreeBSD で ZFS を利用する – ZFS 概要
- FreeBSD で ZFS を利用する – ZFS プールの作成 (パーティション切らない編)
- FreeBSD で ZFS を利用する – ZFS プールの機能について理解する
- FreeBSD で ZFS を利用する – ファイルシステムを管理する
- FreeBSD で ZFS を利用する – send/recv を使い倒す
- FreeBSD で ZFS を利用する – RAWボリュームを切り出す & iSCSI として提供する
- FreeBSD で ZFS を利用する – ファイルシステムの圧縮を利用する・比較する
- FreeBSD で ZFS を利用する – ZFS のキャッシュの仕組みを理解する
- FreeBSD で ZFS を利用する – キャッシュを構成・設定する
- FreeBSD で ZFS を利用する – 重複排除を利用する・確認する
- FreeBSD で ZFS を利用する – ZFS ファイルシステムの機能について理解する (1)
- FreeBSD で ZFS を利用する – ZFS ファイルシステムの機能について理解する (2)
- FreeBSD で ZFS を利用する – ZFS ファイルシステムの機能について理解する (3)
- FreeBSD で ZFS を利用する – ZFS ファイルシステムの機能について理解する (4)
はじめに
今回の環境
今回の 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 プールを引き続き利用して各設定やメンテナンスについて触れていきたいと思います.
コメント