ZFS で複数のデバイスを replace するのなら一度に全て2016年02月21日 13時25分13秒

ZFS のプールを扱う zpool には replace コマンドがある。稼働中のディスクを交換するためのコマンドだ。

ディスク容量の拡張などで、ディスクの交換をする。raidz では最低四台のディスクが必要になるし、mirror 等の構成でも二台からになる。特に raidz を用いている場合の容量は、最小のディスクサイズが元になるので、無駄なく使うにはディスクの大きさを揃えることになる。そして、拡張するには全てを交換することになる。

FreeBSD 10.2-RELEASE で実験してみたところ、zpool replace は複数のディスクを同時に交換することが出来る。そして、replace の作業は scrub の作業を行いつつデータを新しいディスクに移す作業のようだ。複数の replace の要求があると、replace を同時に進める。結局やることは scrab とデータの書き出しなので、恐らく同時に進めるのが実装的に一番簡単なのだろう。逆に、同時に進めるために、二つめの replace の要求をすると、一つ目が停止し、最初から同時に再開となる。

四つのデバイスを使った構成で raidz を構築している。今回、容量の拡張で、二つのデバイスを同時に変更、そして、一時的なデータ領域の移動に一つをファイルに移している。

# zpool status
  pool: bkup
 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 Sat Feb 20 22:37:02 2016
        9.00G scanned out of 692G at 13.3M/s, 14h38m to go
        6.53G resilvered, 1.30% done
config:

        NAME                    STATE     READ WRITE CKSUM
        bkup                    ONLINE       0     0     0
          raidz1-0              ONLINE       0     0     0
            replacing-0         ONLINE       0     0     0
              gpt/zfs1          ONLINE       0     0     0
              gpt/zfs5          ONLINE       0     0     0  (resilvering)
            replacing-1         ONLINE       0     0     0
              gpt/zfs2          ONLINE       0     0     0
              gpt/zfs6          ONLINE       0     0     0  (resilvering)
            gpt/zfs3            ONLINE       0     0     0
            replacing-3         ONLINE       0     0     0
              gpt/zfs4          ONLINE       0     0     0
              /mnt/ufs/bkup.zfs ONLINE       0     0     0  (resilvering)
USB-2.0 が限界の HP Pavilion dv6426us で 2GB のメモリで動いている為、速度は遅い。32bit CPU なので、i386 カーネルの zfs。

尚、replace の速度は、IO やバスの制限は掛かるものの、replace 自体の速度は何台同時に変えていても、大きな変化は無いようだ。一台の時と、三台のときでは一割り程度しか変わっていない。そして、scarb の時間は利用量に影響されるので、必要のないファイルは replace の前に消しておくと時間の節約になる。