Ab.の日記: RAIDZ のデバイスを大きいものに順次 replace してみるテスト
置き換えたあとのデバイスの方が大きい場合は、置き換えが完了すると、プールの容量が大きくなります。
と書かれていたのがどのレベルで有効なのか気になって試してみました。
とりあえず 1G x4 の stripe set を作成して1Gのファイルを作ってみます。
# zpool create tank ad0s2d ad0s2e ad0s2f ad0s3d
# zpool list ; zpool status -v
NAME SIZE USED AVAIL CAP HEALTH ALTROOT
tank 3.97G 114K 3.97G 0% ONLINE -
pool: tank
state: ONLINE
scrub: none requested
config:
NAME STATE READ WRITE CKSUM
tank ONLINE 0 0 0
ad0s2d ONLINE 0 0 0
ad0s2e ONLINE 0 0 0
ad0s2f ONLINE 0 0 0
ad0s3d ONLINE 0 0 0
errors: No known data errors
# dd if=/dev/zero bs=1M count=1024 of=/tank/x
1024+0 records in
1024+0 records out
1073741824 bytes transferred in 9.590792 secs (111955491 bytes/sec)
# ll /tank/
total 1048764
-rw-r--r-- 1 root wheel 1073741824 Feb 20 01:15 x
# zpool list ; zpool status -v
NAME SIZE USED AVAIL CAP HEALTH ALTROOT
tank 3.97G 1.00G 2.97G 25% ONLINE -
pool: tank
state: ONLINE
scrub: none requested
config:
NAME STATE READ WRITE CKSUM
tank ONLINE 0 0 0
ad0s2d ONLINE 0 0 0
ad0s2e ONLINE 0 0 0
ad0s2f ONLINE 0 0 0
ad0s3d ONLINE 0 0 0
errors: No known data errors
# zpool destroy tank
トータルサイズは約4G、ディスク消費は 1.00G。
次は 1G x4 で raidz を作ってみます。
# zpool create tank raidz ad0s2d ad0s2e ad0s2f ad0s3d
# dd if=/dev/zero bs=1M count=1024 of=/tank/x
1024+0 records in
1024+0 records out
1073741824 bytes transferred in 20.177276 secs (53215401 bytes/sec)
# zpool list ; zpool status -v
NAME SIZE USED AVAIL CAP HEALTH ALTROOT
tank 3.97G 1.34G 2.63G 33% ONLINE -
pool: tank
state: ONLINE
scrub: none requested
config:
NAME STATE READ WRITE CKSUM
tank ONLINE 0 0 0
raidz1 ONLINE 0 0 0
ad0s2d ONLINE 0 0 0
ad0s2e ONLINE 0 0 0
ad0s2f ONLINE 0 0 0
ad0s3d ONLINE 0 0 0
errors: No known data errors
転送速度は半分になってしまいました。あと、1Gのファイルを作ったのにpoolの消費は1.34Gです。
これはパリティデータの分まで含めたサイズになってる訳ですね。
で、上から順に2Gのパーティションに置き換えていってみます。
# zpool replace tank ad0s2d ad0s2g
# zpool replace tank ad0s2e ad0s2h
# zpool replace tank ad0s2f ad0s3e
# zpool list ; zpool status -v
NAME SIZE USED AVAIL CAP HEALTH ALTROOT
tank 3.97G 1.34G 2.63G 33% ONLINE -
pool: tank
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.
scrub: resilver in progress, 35.37% done, 0h0m to go
config:
NAME STATE READ WRITE CKSUM
tank ONLINE 0 0 0
raidz1 ONLINE 0 0 0
ad0s2g ONLINE 0 0 0
ad0s2h ONLINE 0 0 0
replacing ONLINE 0 0 0
ad0s2f ONLINE 0 0 0
ad0s3e ONLINE 0 0 0
ad0s3d ONLINE 0 0 0
errors: No known data errors
# zpool export tank ; zpool import tank
# zpool list ; zpool status -v
NAME SIZE USED AVAIL CAP HEALTH ALTROOT
tank 3.97G 1.34G 2.63G 33% ONLINE -
pool: tank
state: ONLINE
scrub: none requested
config:
NAME STATE READ WRITE CKSUM
tank ONLINE 0 0 0
raidz1 ONLINE 0 0 0
ad0s2g ONLINE 0 0 0
ad0s2h ONLINE 0 0 0
ad0s3e ONLINE 0 0 0
ad0s3d ONLINE 0 0 0
errors: No known data errors
3つまで置き換えてもpoolのsizeは同じままです。
最後の1Gパーティションを置き換えます。
# zpool replace tank ad0s3d ad0s2a
# zpool list ; zpool status -v
NAME SIZE USED AVAIL CAP HEALTH ALTROOT
tank 3.97G 1.34G 2.63G 33% ONLINE -
pool: tank
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.
scrub: resilver in progress, 23.28% done, 0h0m to go
config:
NAME STATE READ WRITE CKSUM
tank ONLINE 0 0 0
raidz1 ONLINE 0 0 0
ad0s2g ONLINE 0 0 0
ad0s2h ONLINE 0 0 0
ad0s3e ONLINE 0 0 0
replacing ONLINE 0 0 0
ad0s3d ONLINE 0 0 0
ad0s2a ONLINE 0 0 0
errors: No known data errors
# zpool export tank ; zpool import tank
# zpool list ; zpool status -v
NAME SIZE USED AVAIL CAP HEALTH ALTROOT
tank 3.97G 1.34G 2.63G 33% ONLINE -
pool: tank
state: ONLINE
scrub: none requested
config:
NAME STATE READ WRITE CKSUM
tank ONLINE 0 0 0
raidz1 ONLINE 0 0 0
ad0s2g ONLINE 0 0 0
ad0s2h ONLINE 0 0 0
ad0s3e ONLINE 0 0 0
ad0s2a ONLINE 0 0 0
errors: No known data errors
あれ? export して import してもサイズが変わりません。
慌てず騒がずもう一回。
# zpool export tank ; zpool import tank
# zpool list ; zpool status -v
NAME SIZE USED AVAIL CAP HEALTH ALTROOT
tank 7.97G 1.34G 6.63G 16% ONLINE -
pool: tank
state: ONLINE
scrub: none requested
config:
NAME STATE READ WRITE CKSUM
tank ONLINE 0 0 0
raidz1 ONLINE 0 0 0
ad0s2g ONLINE 0 0 0
ad0s2h ONLINE 0 0 0
ad0s3e ONLINE 0 0 0
ad0s2a ONLINE 0 0 0
errors: No known data errors
めでたく容量が倍になりました。
やはり最小容量デバイスの単位で構成される模様です。
おそらく 500G と 750G の混在の場合に 750G の方を500G+250Gのパーティションに切って別々にpoolを作れば有効活用出来るでしょうけど、それはそれで管理が面倒そうなので止めておいた方がよさそうかな。
RAIDZ のデバイスを大きいものに順次 replace してみるテスト More ログイン