web-dev-qa-db-ja.com

テスト後にソフトウェアRAID1メンバーを再追加した後、ファイルシステムが破損しました。どうして?

同僚と私は、仮想デバイス上に2つのパーティションを持つ2つの物理ディスクで構成されるmdadmを使用してソフトウェアRAID1をセットアップしました。セットアップは正常に行われ、RAIDディスクの1つから直接起動すると次のようになりました。

# cat /proc/mdstat 
Personalities : [raid1] [linear] [multipath] [raid0] [raid6] [raid5] [raid4] [raid10] 
md127 : active raid1 sda1[0] sdb1[1]
      92094464 blocks super 1.2 [2/2] [UU]

md1 : active (auto-read-only) raid1 sda2[0] sdb2[2]
      4069376 blocks super 1.2 [2/2] [UU]

unused devices: <none>

次に、セットアップをテストするために、マシンをシャットダウンし、ディスクの1つを切断して、再起動しました。システムは正常に起動し、自然に劣化した状態になりました。

Personalities : [linear] [multipath] [raid0] [raid1] [raid6] [raid5] [raid4] [raid10] 
md127 : active raid1 sda1[1]
      92094464 blocks super 1.2 [2/1] [_U]

md1 : active (auto-read-only) raid1 sda2[2]
      4069376 blocks super 1.2 [2/1] [_U]

unused devices: <none>

次に、マシンを再度シャットダウンし、切断されたディスクを再接続して、もう一方のディスクを切断しました。繰り返しますが、次の予想される状態で、すべてがうまくいきました。

Personalities : [linear] [multipath] [raid0] [raid1] [raid6] [raid5] [raid4] [raid10] 
md127 : active raid1 sda1[0]
      92094464 blocks super 1.2 [2/1] [U_]

md1 : active (auto-read-only) raid1 sda2[0]
      4069376 blocks super 1.2 [2/1] [U_]

unused devices: <none>

最後に、最後にシャットダウンし、すべてを再接続しましたが、取得したのは次のとおりです。

Personalities : [raid1] [linear] [multipath] [raid0] [raid6] [raid5] [raid4] [raid10] 
md1 : active (auto-read-only) raid1 sdb2[2] sda2[0]
      4069376 blocks super 1.2 [2/2] [UU]

md127 : active raid1 sdb1[1]
      92094464 blocks super 1.2 [2/1] [_U]

unused devices: <none>

ご覧のとおり、最初のパーティション(2番目のエントリ、何らかの理由でスワップされた)は劣化状態にあります(2番目は劣化していませんが、これは単なるスワップパーティションです)。特に気になりませんでした。結局のところ、シミュレートされたディスクの交互の障害の後、2つのパーティションは完全に等しくなくなることが予想されます。不足しているパーティションを次のように追加しました。

# mdadm --manage /dev/md127 --add /dev/sda1
mdadm: re-added /dev/sda1

/dev/sdaのパーティションが/dev/sdbのパーティションと同期(上書き)されることを期待していました。代わりに、ファイルシステムが破損しました(数秒以内に多数のエラーが発生しました)。


この経験の後、3番目のディスクから再起動し、/dev/md127でファイルシステムを再初期化し(適切な方法としてmkfs.ext4の-cオプションを使用)、再起動して再び機能するRAIDに戻しました。次に、もう一度、シャットダウンし、一方のディスクを切断して起動し、再度シャットダウンして、ディスクを再接続しました。今回は、もう一方のディスクも接続したままにして、起動しました。今、私たちはこれを手に入れました:

Personalities : [raid1] [linear] [multipath] [raid0] [raid6] [raid5] [raid4] [raid10] 
md127 : active raid1 sda1[0]
      92094464 blocks super 1.2 [2/1] [U_]

md1 : active (auto-read-only) raid1 sdb2[2] sda2[0]
      4069376 blocks super 1.2 [2/2] [UU]

unused devices: <none>

上記のように--addオプションを使用しただけでも、同じことが再び起こるのではないかと心配しています。

2つの質問があります:

  1. 交互の障害をシミュレートした後、ファイルシステムが破損した原因は何ですか?私の推測では、これはbothディスクが最初の切断直前の状態から分岐していることと関係があり、これはどういうわけかmdadm --addをだまして再同期を行わなかったと思います。マウントされた状態を権限として使用し、追加されたディスクをそれに同期するようにmdadmに指示するコマンドの正しいシーケンスは何でしたか?
  2. 現在の状況(1つのシミュレートされた障害と再接続、つまり、切断直前の状態から分岐したディスクのoneのみ)では、欠落しているデバイスを再度追加する適切な方法は何ですか?上記のようにaddコマンドを使用すると、再同期できますか?なぜ自動的に再同期しなかったのですか?

それが役立つ場合は、mdadm --examineからの現在の出力は次のとおりです。

# mdadm --examine /dev/sda1
/dev/sda1:
          Magic : a92b4efc
        Version : 1.2
    Feature Map : 0x0
     Array UUID : 726d9204:889a4c89:b7a1bdb9:a77d8130
           Name : testhost:0  (local to Host testhost)
  Creation Time : Mon Feb  4 14:39:21 2019
     Raid Level : raid1
   Raid Devices : 2

 Avail Dev Size : 184188928 (87.83 GiB 94.30 GB)
     Array Size : 92094464 (87.83 GiB 94.30 GB)
    Data Offset : 131072 sectors
   Super Offset : 8 sectors
   Unused Space : before=130984 sectors, after=0 sectors
          State : clean
    Device UUID : 46077734:6a094293:96f92dc3:0a09706e

    Update Time : Tue Feb  5 13:36:59 2019
  Bad Block Log : 512 entries available at offset 72 sectors
       Checksum : 139d1d09 - correct
         Events : 974


   Device Role : Active device 0
   Array State : A. ('A' == active, '.' == missing, 'R' == replacing)
# mdadm --examine /dev/sdb1
/dev/sdb1:
          Magic : a92b4efc
        Version : 1.2
    Feature Map : 0x0
     Array UUID : 726d9204:889a4c89:b7a1bdb9:a77d8130
           Name : testhost:0  (local to Host testhost)
  Creation Time : Mon Feb  4 14:39:21 2019
     Raid Level : raid1
   Raid Devices : 2

 Avail Dev Size : 184188928 (87.83 GiB 94.30 GB)
     Array Size : 92094464 (87.83 GiB 94.30 GB)
    Data Offset : 131072 sectors
   Super Offset : 8 sectors
   Unused Space : before=130984 sectors, after=0 sectors
          State : clean
    Device UUID : dcffbed3:147347dc:b64ebb8d:97ab5956

    Update Time : Tue Feb  5 10:47:41 2019
  Bad Block Log : 512 entries available at offset 72 sectors
       Checksum : e774af76 - correct
         Events : 142


   Device Role : Active device 1
   Array State : AA ('A' == active, '.' == missing, 'R' == replacing)
1

何が悪かったのかわかりました。私はこれを mdadmのドキュメント で見つけました:

デバイスがアクティブなアレイに追加されると、mdadmは、デバイスにメタデータがあるかどうかを確認します。これは、デバイスが最近アレイのメンバーであったことを示しています。含まれている場合は、デバイスを「再追加」しようとします。デバイスが削除されてから変更がない場合、またはアレイに変更があったものを記録した書き込み意図のビットマップがある場合、デバイスはすぐに配列の完全なメンバーになり、ビットマップに記録されたそれらの違いは解決されます。

(私の強調)

両方のデバイスが最初の切断時から分岐したため、記録された変更は相互に互換性がなく、ファイルシステムが細断されました。

このような場合の解決策は、不足しているデバイスを追加する前に、そのデバイスでmdadm --zero-superblockを呼び出すことです。これにより、クリーンな再構築が強制されます。

2番目のケースでは、デバイスの1つだけが分岐しましたが、おそらく無害でしたが、試したことはありません。物理ドライブを交換する必要がある実際の障害の場合、そもそもメタデータがないので問題ないはずです。

1