2016年2月16日火曜日

ZFS (on OpenIndiana VM on ESXi) のディスク交換

先日 ZFS の RAID-Z1 アレイがデグレードした。デグレードしたアレイは下記の構成。
  • WD RED 4TB X5、パリティ一発の構成
  • メンバディスクは2014年頃に購入してからこれまでは安定
  • たびたび自宅のブレーカー断 が発生。その仮定でディスクに損傷がおきている可能性はありそう
  • ESXi に SATA ポート経由で接続し、 RAW デバイスマッピングを介して OpenIndiana VM に接続

はじめに現れた症状

VMware 上の OpenIndiana で動く ZFS ストレージをその ESXi 自体で NFS データストアとしてマウントしているが、そこで動く BIND が落ちて自宅のネットワークが不調になった。原因なんだろうなーと思ったが、どうやら ZFS アレイのデグレが原因の模様。

 root@vm230:~# zpool status
  pool: array3
 state: DEGRADED
status: One or more devices has experienced an unrecoverable error.  An
        attempt was made to correct the error.  Applications are unaffected.
action: Determine if the device needs to be replaced, and clear the errors
        using 'zpool clear' or replace the device with 'zpool replace'.
   see: http://illumos.org/msg/ZFS-8000-9P
  scan: scrub repaired 523M in 22h40m with 0 errors on Sun Feb 14 07:48:45 2016
config:

        NAME        STATE     READ WRITE CKSUM
        array3      DEGRADED     0     0     0
          raidz1-0  DEGRADED     0     0     0
            c3t1d0  ONLINE       0     0     0
            c3t5d0  ONLINE       0     0     0
            c3t4d0  DEGRADED     0     0 8.15K  too many errors
            c3t2d0  ONLINE       0     0     0
            c3t3d0  DEGRADED     0     0 1.36K  too many errors
        logs
          c3t8d0    ONLINE       0     0     0
        cache
          c3t9d0    ONLINE       0     0     0
VMware ESXi 側で仮想マシンの仮想ディスクのレイテンシを確認すると最悪値が 10 秒に達している仮想ディスク(c3t4d0)があり、ハードウェアレベルの障害と確証を持った。OpenIndiana カーネル側には下記のようなメッセージが出力されていた。ディスクがエラーを起こしているときに出しているようだ。
Feb 16 10:26:55 vm230 scsi: [ID 107833 kern.warning] WARNING: /pci@0,0/pci15ad,1976@10/sd@3,0 (sd4):
Feb 16 10:26:55 vm230   disk not responding to selection

この状態における zpool scrub の必要性

色々試してみてわかったんだけど、ディスクを交換するつもりなら事前に scrub する必要はなかった。
まず、DEGRADED となっているメンバはドライブ障害が発生している旨フラグが立っているものの、まだ ZFS が見捨てたわけではなく、稼働中だということを示している。ここが UNAVAIL もしくは REMOVED だとドライブがそもそも応答しないかパス障害になっているので、もうひとつドライブが見えなくなった時点でこの ZFS プールはオフラインになるだろう。だが今回は DEGRADED ステートになりつつも、障害が起きているドライブ2台はまだ辛うじてオンラインのまま。
ここで zpool scrub を行えばアレイ全体を検査と自動修復を行えるけども、のちに実行する zpool replace コマンド中でも事実上スクラブ相当の処理が行われる。一時的にディスクが UNAVAIL になったためアレイセットのなかで置いて行かれた状態などであれば scrub する意味があるだろうけど、今回は辛うじて全ドライブがオンラインのままだし、ディスク交換前に scrub を繰り返してとどめを刺しても仕方ないので、結果論としてスクラブを試す強い理由はなかった。せいぜいディスクのエラーカウンタをリセットした後にスクラブしてみて不良かを再判断できる程度。

交換用ディスクを調達、 VM に接続

今回は東芝製MD04ACA6 (6TB)をメンバディスクとして使ってみる。RAID-Zなので不具合が出たディスクだけ6TBのディスクにしなくとも、4TB前後で十分なのだが、これから数年後に4TBクラスのディスクが大量に転がっているのは避けたいし。 先の zpool status の状況からディスク2台に障害がおきていると想定し、交換用のディスクは2台準備した。
問題のディスクは SUPERMICRO 社製 X9SRA の SATA ポートに接続されている。残念ながら SATA ポート自体は ZFS プールのメンバ群などで埋まっているので、相手いる SAS ポートに今回用意した SATA ディスクを接続して復旧作業を進める。(一般的にSASポートはSATAディスクも扱える)
横着だがマシンが稼働した状態のまま SATA ケーブルでシステムボードの SAS ポートとMD04ACA6を接続し、SATA電源ケーブルを慎重にプラグし活性接続。ディスクトラブルが起きているときはマシンの電源を切りたくないし、可能ならマウント(インポート)している仮想マシンの電源も落としたくない。 vSphere Client を介して VMware ESXi に対しストレージのリスキャンをかけると接続したディスクが認識されていたので ESXi の再起動なしに先に進めそう。
ESXi 上で ls -l /vmfs/devices/ を実行してみると、新しく接続したディスクが naa.50000396aba018c8 として認識されていたので、このディスクを RAW マッピングする VMDK ファイルを生成する。
/vmfs/volumes/(snip)/vm230b # vmkfstools -z \
    /vmfs/devices/disks/naa.50000396aba018c8 \
    array3f_50000396aba018c8.vmdk
残念ながら仮想マシンを止めないと OpenIndiana に対して仮想ディスクを追加できない(と思う)。 ZFS プールは DEGRADED 状態だがメンバが足りていないわけではないし、仮想マシンを起動しなおした時点で今みえている仮想ディスクが見えなくなることも考えづらい。 DEGRADED 状態でも辛うじて I/O はできているようなので、なんとかなるだろうと判断(でもこわい。慎重を期すならここで別のファイルシステムにバックアップをとったほうがいい)。再起動後もきちんと戻ってくると信じて VM シャットダウン、仮想ディスクを追加して OI 再起動。
root@vm230:~# format
Searching for disks...done

c3t6d0: configured with capacity of 5589.03GB


AVAILABLE DISK SELECTIONS:
       0. c3t0d0 <VMware-Virtualdisk-1.0 cyl 2085 alt 2 hd 255 sec 63>
          /pci@0,0/pci15ad,1976@10/sd@0,0
       1. c3t1d0 <VMware-Virtual disk-1.0-3.64TB>
          /pci@0,0/pci15ad,1976@10/sd@1,0
       2. c3t2d0 <VMware-Virtual disk-1.0-3.64TB>
          /pci@0,0/pci15ad,1976@10/sd@2,0
       3. c3t3d0 <VMware-Virtual disk-1.0-3.64TB>
          /pci@0,0/pci15ad,1976@10/sd@3,0
       4. c3t4d0 <VMware-Virtual disk-1.0-3.64TB>
          /pci@0,0/pci15ad,1976@10/sd@4,0
       5. c3t5d0 <VMware-Virtual disk-1.0-3.64TB>
          /pci@0,0/pci15ad,1976@10/sd@5,0
       6. c3t6d0 <ATA-TOSHIBA MD04ACA6-FS2A-5.46TB>
          /pci@0,0/pci15ad,1976@10/sd@6,0
       7. c3t8d0 <VMware-Virtual disk-1.0-1.00GB>
          /pci@0,0/pci15ad,1976@10/sd@8,0
       8. c3t9d0 <VMware-Virtual disk-1.0-200.00GB>
          /pci@0,0/pci15ad,1976@10/sd@9,0

新しく接続したディスクは c3t6d0 として認識されている。なお、仮想ディスクの構成はこうなっていた(ずっと前に適当に構築したので完全に忘れていた)
  • c3t0d0 (SCSi 0:0): OSイメージ
  • c3t1d0 (SCSi 0:1): データ用ZFSプールのメンバディスク 1
  • c3t2d0 (SCSi 0:2): データ用ZFSプールのメンバディスク 2
  • c3t3d0 (SCSi 0:3): データ用ZFSプールのメンバディスク 3 (エラーが発生)
  • c3t4d0 (SCSi 0:4): データ用ZFSプールのメンバディスク 4 (エラーが多く発生)
  • c3t5d0 (SCSi 0:5): データ用ZFSプールのメンバディスク 5
  • c3t8d0 (SCSi 0:8): データ用ZFSプールのslog
  • c3t9d0 (SCSi 0:9): データ用ZFSプールのL2ARC
ここに下記デバイスを追加した。
  • c3t6d0 (SCSi 0:6): データ用ZFSプールの交換用メンバデバイス

いざリプレース

zpool replace でエラーが多数発生しているメンバディスクを新ディスクに置き換える。
root@vm230:~# zpool replace array3 c3t4d0 c3t6d0
root@vm230:~# zpool status
  pool: array3
 state: DEGRADED
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 Mon Feb 15 06:14:01 2016
    51.9M scanned out of 17.4T at 5.76M/s, (scan is slow, no estimated time)
    9.94M resilvered, 0.00% done
config:

        NAME             STATE     READ WRITE CKSUM
        array3           DEGRADED     0     0     0
          raidz1-0       DEGRADED     0     0     0
            c3t1d0       ONLINE       0     0     0
            c3t5d0       ONLINE       0     0     0
            replacing-2  DEGRADED     0     0     0
              c3t4d0     DEGRADED     0     0     0  too many errors
              c3t6d0     ONLINE       0     0     0  (resilvering)
            c3t2d0       ONLINE       0     0     0
            c3t3d0       DEGRADED     0     0     0  too many errors
        logs
          c3t8d0         ONLINE       0     0     0
        cache
          c3t9d0         ONLINE       0     0     0

errors: No known data errors

約21時間後に zpool replace が完了。死んだディスクをリプレースしたディスクで置き換えたが、現在接続されている SAS ポートから SATA ポートへ新ディスクを移動させると VMware の RAW マッピングがきれる事が想定される。このため一度 zpool export した状態で VM を停止する。
SAS ポートに接続していた新ドライブを死んだドライブの位置に移動し ESXi でデバイススキャンをかけると vmfs/devices/disks/t10.ATA_____TOSHIBA_MD04ACA600__(snip)Y5C7K3SERIAL というパスで認識された。やっぱりパスが変わった。SERIAL の部分は実際にはディスクのシリアル番号が入っている。先に作成した RAW デバイスマッピングを削除して作り直し。
# rm array3f_50000396aba018c8*
# vmkfstools -z \
    /vmfs/devices/disks/t10.ATA_____TOSHIBA_MD04ACA600__(snip)Y5C7K3SERIAL 
    \ array3f_Y5C7K3SERIAL.vmdk


仮想マシンの構成変更。リプレースされて不要になった c3td40 = SCSI 0:4 およびパスが変わってしまった c3t6d0 = SCSI0:6 を VM から削除。新たに作成した array3f_Y5C7K3SERIAL.vmdk を SCSI 0:4 として追加。
VM を起動し zpool import array3 する。これで1台目の重傷ドライブが交換完了となりアレイのステータスは ONLINE に。
ただ、重傷だったオリジナルの c3t4d0 のほかに c3t3d0 でもエラーが出ていた。
重傷ドライブのせいで同時にデグレったかのように見えたのかも??と思いつつも、とりあえず軽傷なほうも zpool replace してみることにする。やることはさっきと同じ。 SAS ポートに次のドライブを接続して RAW デバイスマッピングを作成し、 SCSI 0:6 として追加して、 zpool replace で c3t3d0 から置き換える。
しばらくは順調だったけども、 resilver が 20% 越えたあたりからチェックサムエラーが出たり dmesg に下記メッセージがでたので、このディスクもやっぱりハードウェアレベルで異常があることは間違いなさそう。
Feb 16 10:26:55 vm230 scsi: [ID 107833 kern.warning] WARNING: /pci@0,0/pci15ad,1976@10/sd@3,0 (sd4):
Feb 16 10:26:55 vm230   disk not responding to selection

24時間もたてば replace は終わっているだろう。そうしたらいったん zpool export して VM を落としておき、古い c3t3d0 を取り外して、 SAS ポートに接続されている新ディスクを c3t3d0 として改めて追加し zpool import しなおせばディスク交換終了の見込み。