Solaris 11.4 では、zpool add したデバイスを remove できるようになっています。以前は zpool add すると外せなかったのでかなりの勇気が必要でしたが、remove できるようになったので構成変更がより柔軟にできるようになりました。
zpoolのバージョンが44以上だと、Device removelという機能が有効になります。
$ zpool upgrade -v ... 44 Device removal ...
こんな感じの構成で、mirror-0 を remove してみたいと思います。上記のサイトの例では、mirror を remove することができるようです。
$ zpool status epool pool: epool state: ONLINE scan: ... config: NAME STATE READ WRITE CKSUM epool ONLINE 0 0 0 mirror-0 ONLINE 0 0 0 c2t2d0 ONLINE 0 0 0 c2t3d0 ONLINE 0 0 0 mirror-1 ONLINE 0 0 0 c2t1d0 ONLINE 0 0 0 c2t0d0 ONLINE 0 0 0 errors: No known data errors
# zpool remove epool mirror-0 cannot remove device(s): operation not supported on this type of pool
あれれ、remove できませんね。
理由はわかりませんがmirrorはremoveできないのかもしれないので、detachでmirrorを解除してみました。
# zpool detach epool c2t3d0
mirror-0がなくなってディスク1本になりました。
$ zpool status epool pool: epool state: ONLINE scan: ... config: NAME STATE READ WRITE CKSUM epool ONLINE 0 0 0 c2t2d0 ONLINE 0 0 0 mirror-1 ONLINE 0 0 0 c2t1d0 ONLINE 0 0 0 c2t0d0 ONLINE 0 0 0 errors: No known data errors
こんどは、残った1本をremoveしてみます。
# zpool remove epool c2t2d0
おっ、コマンドが通りました。
STATEを見るとREMOVINGになっています。
$ zpool status epool pool: epool state: ONLINE status: One or more devices are being removed. action: Wait for the resilver to complete. Run 'zpool status -v' to see device specific details. scan: resilver in progress since Wed Feb 6 21:26:33 2019 10.8G scanned out of 988G at 560M/s, 29m48s to go 0 resilvered config: NAME STATE READ WRITE CKSUM epool ONLINE 0 0 0 c2t2d0 REMOVING 0 0 0 mirror-1 ONLINE 0 0 0 c2t1d0 ONLINE 0 0 0 c2t0d0 ONLINE 0 0 0 errors: No known data errors
zpool iostat -v で見ると、少しずつデータが移動しているのがわかります。
$ zpool iostat -v epool 1 capacity operations bandwidth pool alloc free read write read write -------------------------- ----- ----- ----- ----- ----- ----- epool 1023G 5.36T 0 6.73K 0 171M c2t2d0 - - 0 0 0 0 mirror-1 524G 4.94T 0 6.74K 0 171M c2t1d0 - - 0 185 0 172M c2t0d0 - - 0 187 0 174M -------------------------- ----- ----- ----- ----- ----- ----- ...
resilver時はディスクがかなり高負荷になり性能に影響が出ます。I/O負荷が低いときに実施するのがおすすめです。
resilver完了後にzdbで見てみると、mirror-0の部分(children[0]のところ)がpseudoデバイスとして取り込まれているような感じに見えます。 もしかしてashiftが違う(512bセクタと4kbセクタ)HDDが混在していたpoolだったのでこうなったのかもしれません。パフォーマンスに影響が出るかもしれないですね。
$ zdb epool: version: 44 name: 'epool' state: 0 txg: 39458571 pool_guid: 4817329454252204261 timestamp: 1549469022 hostid: 564057 hostname: 'xxxx' vdev_children: 2 vdev_tree: guid: 4817329454252204261 id: 0 type: 'root' children[0]: guid: 8473064149679056020 id: 0 type: 'pseudo' path: '$VDEV-C18B8487D547E670' phys_path: 'epool/$VDEV-C18B8487D547E670' removing: 1 metaslab_array: 27 metaslab_shift: 33 ashift: 9 asize: 1000191557632 is_log: 0 is_meta: 0 DTL: 5887 create_txg: 4 children[1]: guid: 16792445297974810689 id: 1 type: 'mirror' whole_disk: 0 metaslab_array: 111 metaslab_shift: 33 ashift: 12 asize: 5995774345216 is_log: 0 is_meta: 0 create_txg: 23955738 children[0]: guid: 15198708556418494849 id: 0 type: 'disk' path: '/dev/dsk/c2t1d0s0' devid: 'id1,sd@SATA_____WDC_WD60EZRZ-00G_____WD-WX61D68AAPFE/a' phys_path: '/pci@0,0/pci8086,2036@1f,2/disk@1,0:a' whole_disk: 1 DTL: 4160 create_txg: 23955738 msgid: 'ZFS-8000-QJ' children[1]: guid: 6065348894095674914 id: 1 type: 'disk' path: '/dev/dsk/c2t0d0s0' devid: 'id1,sd@SATA_____WDC_WD60EZRZ-00G_____WD-WX61D68AA6EP/a' phys_path: '/pci@0,0/pci8086,2036@1f,2/disk@0,0:a' whole_disk: 1 DTL: 5328 create_txg: 23955738 msgid: 'ZFS-8000-QJ'