web-dev-qa-db-ja.com

ZFSホットスペアが機能しない

Vmに休眠中のZFSテストプールを設定しています。

    NAME        STATE     READ WRITE CKSUM
    pool        DEGRADED     0     0     0
      mirror-0  DEGRADED     0     0     0
        sdb     ONLINE       0     0     0
        sdc     ONLINE       0     0     0
    spares
      sdd       AVAIL

Zfsプールで自動的に使用できなくなったドライブを交換する機能をテストしようとしています。たとえば、何らかの理由でドライブがシステムから取り外された場合、ドライブが取り外された直後にスペアダイビングが行われる可能性があります。 spareドライブを構成しました。これを読んだところ、これで目標が達成されるはずだと理解できました。また、autoreplaceフラグをonに設定して、不良ドライブが検出された場合はそれを交換するようにzfsに指示しました。 vmからドライブを削除するときは、sdbと言って、休眠中のように見えるzfsのステータスを再確認します。

    NAME        STATE     READ WRITE CKSUM
    pool        DEGRADED     0     0     0
      mirror-0  DEGRADED     0     0     0
        sdb     UNAVAIL      0     0     0
        sdc     ONLINE       0     0     0
    spares
      sdd       AVAIL

sdbデバイスは使用できなくなりますが、スペアに置き換えられることはありません。ユースケースを機能させる方法はありますか?

3
Tristan Vigil

イントロ

まず第一に、Ubuntu 16.04で同じ問題を抱えている人にとって、それは現在進行中のバグであり、私の知る限り、現時点では修正されていません。 githubの会話 ここ にアクセスして、私が参照しているバグを確認できます。第二に、私はこの投稿を熱狂的で中級のLinuxユーザーとして書いています。私は開発者ではないか、現在Linuxで職業として働いています。そうは言っても、私はこの問題に関して私が見つけた情報を私の知る限り提供します。

問題:

zfsonlinuxパッケージに組み込まれているホットスペア機能は、現在、マニュアルページに記載されているように機能しません。 zpoolのマニュアルページ:

Hot Spares
   ZFS allows devices to be associated with pools as "hot spares".
   These devices are not actively used in the pool, but when an active
   device fails, it is automatically replaced by a hot spare.

注:コールドスペア(スペアは自動的に交換されません)機能は機能しますが、mirrorsまたはraidz'sのいずれかで構成される構成でのみ機能します。休閑のような構成がある場合:

NAME      STATE     READ WRITE CKSUM
pool      ONLINE       0     0     0
  sdb     ONLINE       0     0     0
  sdc     ONLINE       0     0     0
spares
  sdd     AVAIL

ドライブに障害が発生すると、pool I/O is currently suspendedエラーのため、ドライブをスペアと交換できなくなります。

試みられた解決策:

これは私が経験した解決策のリストであり、結果は次のとおりです。

  1. ZFS自動置換:zpoolのマニュアルページと私の理解によると、autoreplace機能は、損傷したドライブをスペアと交換するのではなく、損傷したドライブを交換することです。その場所で見つかった新しいデバイスでそれ自体。 zpoolのマニュアルページ:

    If set to "on", any new device, found in the same physical location
    as a device that previously belonged to the pool, is automatically 
    formatted and replaced.
    

    autoreplaceを使用するのは良いことですが、ホットスペアの機能を実現するために必要だとは思いません。スペアを動作させることができなかったため、manページ以外では確認できません。

  2. ZED.rc:後で github の会話の中で、ZED_SPARE_ON_CHECKSUM_ERRORSフラグとZED_SPARE_ON_IO_ERRORSフラグをzed.rc内に設定する必要があることがわかりました。 @ user121391がこの投稿への回答で述べたように、zedサービス/デーモンは、プールのステータスを決定し、それに基づいて実行する必要があるものです。その状態で。 zpool eventsを実行すると、zed.dが動作していることがわかります。 Linux上のzed.dの詳細 ここ 。フラグを設定し、再起動し、万が一に備えて新しいプールを再構成した後、ホットスペアのテストが再びネガティブになりました。

  3. ZED.dスクリプト:@MichaelKjörlingのコメントで、ホットスペアシナリオを支援するために作成されたZEDにパッケージ化されたスクリプトについて言及しました。私は確かに/etc/zfs/zed.dにあるスクリプトを見つけました。これらのスクリプトは、githubページ ここ で表示できます。 zed.dの私の理解から、イベントがトリガーされると、ZEDデーモンはそのステータスに基づいてこれらのスクリプトの1つを実行します。とはいえ、io-spare.shchecksum-spare.shを手動で実行しようとしましたが、実行にかかった時間とプールのステータスが変更されていないことから判断すると、正しく実行されていないようです。多分これは問題の潜在的な原因です。

私の計画

ZFSのUbuntu16.04ユーザーの場合、私の知る限り、現在この問題に対する修正はないようです。テストで得られるパフォーマンスに応じて、mirroredまたはraidz(RAID5)の構成でZFSを引き続き使用する予定です(ミラーリングはより高速になりますが、の速度を確認したいraidz)ホットスペアは、これら両方の構成の冗長性を高めますが、残念ながら、zfsonlinuxプロジェクトがさらに開発されるまで待つ必要があります。

2
Tristan Vigil

クイック検索では、 following :が生成されます。

[Open] Solarisでは、これはイベントデーモンによって処理されます。自動置換のオン/オフは、デーモンに置換を行うかどうかを指示するだけです。 FreeBSDでは、自動置換設定はデフォルトでは何もしません。実際の置換のトリガーを処理するdevdルールを作成する必要があります。 Linuxが何をするのかはわかりませんが、systemdに追加できると確信しています

ZoLでは、ZFSイベントデーモンである [〜#〜] zed [〜#〜] も使用できるようです。

0
user121391