Web更新

宮崎悟氏のUbuntuでZFSを使ってみよう第四回「ZFSで使用できるストレージプールを確認しよう(2)」

前回のおさらい

前回はzpoolで基本的なRAID構成であるストライプとミラーが構成できることを説明しました。
さて今回は、zpoolで構築できる、RAID5以上のボリュームについて説明したいと思います。

RAIDZ

RAIDZ(RAIDZ1とも呼びます)はいわゆるRAID5に相当する構成です。データはブロックサイズで分散してディスクに配置し、そのデータブロックのパリティ(誤り訂正補正)を他ディスクに分散して配置します。そのため、構成するディスク1台が故障してもディスクを交換すれば、パリティからデータを復旧することが可能になります。
今回は1GBのファイルを複数用意して、挙動を確認します。

# dd if=/dev/zero of=/tmp/disk01 bs=$((1024*1024)) count=1000
-rw-rw-r-- 1 root root 1000M Jan  4 10:52 /tmp/disk01
# for i in $(seq 2 9) ; do cp /tmp/disk01 /tmp/disk0$i ;done

RAIDZは以下のように作成します。RAID5と同様に、3つ以上のディスクで構成します。

# zpool create tank raidz /tmp/disk0[1-3]
# zpool list tank
NAME   SIZE  ALLOC   FREE  EXPANDSZ   FRAG    CAP  DEDUP  HEALTH  ALTROOT
tank  2.91G   187K  2.91G         -     0%     0%  1.00x  ONLINE  -
# zfs list tank
NAME   USED  AVAIL  REFER  MOUNTPOINT
tank  98.6K  1.81G  30.6K  /tank
# zpool status tank
  pool: tank
 state: ONLINE
  scan: none requested
config:

        NAME             STATE     READ WRITE CKSUM
        tank             ONLINE       0     0     0
          raidz1-0       ONLINE       0     0     0
            /tmp/disk01  ONLINE       0     0     0
            /tmp/disk02  ONLINE       0     0     0
            /tmp/disk03  ONLINE       0     0     0

errors: No known data errors

zpoolでは2.9GBですが、zfsとしては1.8GBが確保されます。zpool/zfs合わせて200MBほどが管理領域として確保されます。

RAIDZ2、RAIDZ3

RAIDZ2はRAID6相当で、RAIDZがパリティ1つなのに対し2つのパリティを持ちます。また、3つのパリティを持つRAIDZ3もあります。RAIDZ2~3のパリティはそれぞれアルゴリズムが異なるものを使用し、パリティが破壊されても他アルゴリズムでの復旧を行うことで、さらに堅牢性をあげています。

RAIDZ2/RAIDZ3は以下のように作成します。RAIDZ2は4本以上、RAIDZ3は5本以上のディスクで構成します。

# zpool destroy tank
# zpool list tank
NAME   SIZE  ALLOC   FREE  EXPANDSZ   FRAG    CAP  DEDUP  HEALTH  ALTROOT
tank  3.88G   624K  3.87G         -     0%     0%  1.00x  ONLINE  -
# zfs list tank
NAME   USED  AVAIL  REFER  MOUNTPOINT
tank   109K  1.80G  32.9K  /tank
# zpool status tank
  pool: tank
 state: ONLINE
  scan: none requested
config:

        NAME             STATE     READ WRITE CKSUM
        tank             ONLINE       0     0     0
          raidz2-0       ONLINE       0     0     0
            /tmp/disk01  ONLINE       0     0     0
            /tmp/disk02  ONLINE       0     0     0
            /tmp/disk03  ONLINE       0     0     0
            /tmp/disk04  ONLINE       0     0     0

errors: No known data errors
# zpool destroy tank

# zpool create  tank raidz3 /tmp/disk0[1-5]
# zpool list tank
NAME   SIZE  ALLOC   FREE  EXPANDSZ   FRAG    CAP  DEDUP  HEALTH  ALTROOT
tank  4.84G   832K  4.84G         -     0%     0%  1.00x  ONLINE  -
# zfs list tank
NAME   USED  AVAIL  REFER  MOUNTPOINT
tank   112K  1.80G  35.1K  /tank
# zpool status tank
  pool: tank
 state: ONLINE
  scan: none requested
config:

        NAME             STATE     READ WRITE CKSUM
        tank             ONLINE       0     0     0
          raidz3-0       ONLINE       0     0     0
            /tmp/disk01  ONLINE       0     0     0
            /tmp/disk02  ONLINE       0     0     0
            /tmp/disk03  ONLINE       0     0     0
            /tmp/disk04  ONLINE       0     0     0
            /tmp/disk05  ONLINE       0     0     0

errors: No known data errors

RAIDZ2、RAIDZ3ともに、zpool上では構成したディスクの本数に比例した容量を持ちますが、zfs上ではRAIDZと同じ1.8GBが有効な容量となります。

RAIDZのストライプ構成

RAIDZ1~3は、複数個束ねてストライプ構成にすることが可能です。いわゆるRAID50やRAID60のような構成です。RAIDZ1~3は、パリティ計算をCPUで行うことからストライプ幅(構成するディスク量)を多くしても遅くなりがちですが、RAIDZ1~3をストライプ構成することにより、高速化することが可能です。

# zpool create tank raidz /tmp/disk0[1-3] raidz /tmp/disk0[4-6] raidz /tmp/disk0[7-9]
# zpool list tank
NAME   SIZE  ALLOC   FREE  EXPANDSZ   FRAG    CAP  DEDUP  HEALTH  ALTROOT
tank  8.72G   193K  8.72G         -     0%     0%  1.00x  ONLINE  -
# sudo zfs list tank
NAME   USED  AVAIL  REFER  MOUNTPOINT
tank   103K  5.63G  30.6K  /tank
# zpool status tank
  pool: tank
 state: ONLINE
  scan: none requested
config:

        NAME             STATE     READ WRITE CKSUM
        tank             ONLINE       0     0     0
          raidz1-0       ONLINE       0     0     0
            /tmp/disk01  ONLINE       0     0     0
            /tmp/disk02  ONLINE       0     0     0
            /tmp/disk03  ONLINE       0     0     0
          raidz1-1       ONLINE       0     0     0
            /tmp/disk04  ONLINE       0     0     0
            /tmp/disk05  ONLINE       0     0     0
            /tmp/disk06  ONLINE       0     0     0
          raidz1-2       ONLINE       0     0     0
            /tmp/disk07  ONLINE       0     0     0
            /tmp/disk08  ONLINE       0     0     0
            /tmp/disk09  ONLINE       0     0     0

errors: No known data errors

これらの構成は、同じRAID構成であればストレージプールに追加可能ですが、ストライプ幅やRAID構成が異なるものを追加することは出来ません。それぞれ、以下のようにエラーが発生します。

# zpool destroy tank
# sudo zpool create tank raidz /tmp/disk0[1-3]
# zpool add tank raidz2 /tmp/disk0[4-7]
invalid vdev specification
use '-f' to override the following errors:
mismatched replication level: pool uses 1 device parity and new vdev uses 2
# zpool add tank raidz /tmp/disk0[4-7]
invalid vdev specification
use '-f' to override the following errors:
mismatched replication level: pool uses 3-way raidz and new vdev uses 4-way raidz
# zpool add tank raidz /tmp/disk0[4-6]

今回はストレージプールについて説明いたしたが、いかがだったでしょうか。次回はストレージプールとZFSの関係について説明していきたいと思いますので、お楽しみに。

さて、このコラムを掲載いただいているデジタル・ヒュージ・テクノロジー社は老舗のOSSインテグレーターです。特にLinuxは強く、OSSを活用した業務システムの実績も多いです。興味がある方は以下のページもご覧ください。
DHT OSS導入コンサルティングサービス
https://kusanagi.dht-jpn.co.jp/solutions/dht-oss-consulting/

関連記事一覧