zpool remove を試すメモ

Solaris 11.4 では、zpool add したデバイスを remove できるようになっています。以前は zpool add すると外せなかったのでかなりの勇気が必要でしたが、remove できるようになったので構成変更がより柔軟にできるようになりました。

docs.oracle.com

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'