ZFS:ドライブを失った後、正しいコピー数をどのように復元しますか?


12

zfs copies=2を使用して、これらのコピーの一部を含むドライブを紛失した場合、影響を受けるファイルのデータブロックの新しいコピーを作成するようにシステムに指示するにはどうすればよいですか?または、zfsは、不良データブロックを検出するとすぐに、余分なコピーのデータブロックの追加を開始しますか?

スクラブはこれを行いますか?

(v0.6.0.56-rc8、ZFSプールバージョン28、ZFSファイルシステムバージョン5、Ubuntu 11.10)

回答:


10

"copies = 2"(または3)は、冗長性のないプール(単一ディスクまたはストライプ)で使用するように設計されています。目標は、デバイス全体の障害ではなく、小さなディスク破損を回復できるようにすることです。後者の場合、プールはマウントできないため、同じブロックの復元は発生しません。

冗長性(mirroring / raidz / raidz2 / raidz3)がある場合、dittoブロックは他のブロックと同じであり、スクラブ/再同期によってそれらが再作成されます。


これは、@ Redmumbaが言うことと直接矛盾します。Redmumbaはコードへのリンクを提供します。あなたが言っていることについていくつかの情報源を引用できますか?特に、copys = Nがデバイス全体の障害に対処できない理由について、良い引用を読みたいです。これは、私が読んだものと一致しません。
ジェームズムーア

1
@James Mooreデバイス全体に障害が発生した後、そのディスクに同じブロックは書き込まれません。プールレベルには冗長性がないため、障害のあるディスクを新しいディスクと交換することはできません。この状況を適切に回復する唯一の方法は、プールの完全バックアップを行い、正常なデバイスでプールを再作成し、最初のバックアップが完了する前に意図しない再起動が発生しないことを確認しながらバックアップから復元することです。そうしないと、プールがインポートできず、データが失われる可能性があります。これは、不良ディスクの回復がオンラインで行われ、再起動後も存続する冗長プールと比較すると、かなりの負担です。
jlliagre

1
ここにリファレンスがあります:docs.oracle.com/cd/E19082-01/817-2271/gbbvf/… For a device to be replaced, the pool must be in the ONLINE state. The device must be part of a redundant configuration, or it must be healthy (in the ONLINE state).私は、copys = 2または3が冗長構成とはみなされないと仮定します。
jlliagre

1
ただし、覚えておくべきことの1つは、元々持っていてcopies=1それをcopies=2にアップした場合は、後で再同期/スクラブすることです。これにより、これらのインスタンスが作成されます。しかし、@ jilliagreは正しいです。同じブロックは冗長構成を構成しません。プール内に複数のデバイスがある場合でも、ブロックが別のデバイスに設定される保証はありません。
アンドリューM.

1
「copies = N where N> 1」機能は、冗長性を追加するためのものではありません。データ破損を解決することを目的としています。zfsに書き込まれたものはすべてチェックサムまたはハッシュされます。読み戻されると、チェックサム/ハッシュが検証されます。N = 1の場合、チェックサム/ハッシュ検証の失敗により、アプリにエラーが返されます。N> 1の場合、他のコピーの1つを調べて、他のすべてのコピーを修復するために使用できます。
ロングネック

9

この質問は本当に興味をそそられるものであり、ドキュメントを1時間かけて注いだ後、コードに飛び込みました。ここに私が見つけたものがあります。

まず、いくつかの用語。Dittoブロック(ミラーではなく、これらのコピー)は書き込み時に自動的に作成されますが、元のコピーと同じ仮想デバイス(vdev)にある場合とない場合があります。一方、ミラー化されたブロックは常に別の仮想デバイスに反映されます。

ただし、コードは両方のタイプのブロックを子として参照します。ここで、dittoブロックは単なる子であることがわかりますio_vd == NULL(これはwrite関数にあります)。ミラーブロックの場合io_vd、対応する仮想デバイス(2番目のディスクなど)に設定されます。

そのことを念頭に置いて、読み取り部分に到達するgood_copiesと、予想されるものが含まれていない場合、すべての子(ミラーブロックまたは同ブロック)を潜在的に安全でないものとして扱い、必要に応じて書き換えます。したがって、あなたの質問に対する答えはそうです-はい、少なくとも1つの良いコピーがあり、次のいずれかがあればそれらを書き換えます:

  • データを読み取ろうとしたときの予期しないエラー、
  • あなたは再同期しています、または
  • スクラブしています。

ふう!誰かが欠陥を指摘できるかもしれませんが、私はこの小さな演習を通してZFSについて学ぶことを楽しんでおり、これが役立つことを願っています!


1
問題は@jlliagreの答えにあります。デバイスを失うとプールは死んでしまいます。プールにまだ十分なディットブロックがあるという事実は重要ではないようです。それを回避する方法はありますか?
ジェームズムーア

4
@JamesMooreでは、故障したデバイスの最初の1MBがあれば、アレイを劣化状態で強制的にオンラインにすることができます。おそらく、障害が発生したデバイスのメタデータのみが必要です。jbodスタイルのzpoolでこれをテストしましたが、動作します:raidzの破損したラベルを回復します。zpoolを壊す前と後にmd5sumを実行しましたが、インポート後、copys = 1ファイルシステムのみが破損しました。コピー数= 2とコピー数= 3のファイルシステムは完全に一致しました。
ジョディC

2

@jlliagreと、ディスク(vdevs)の1つが死んでもプールが冗長ではない(ミラー/ raidz)場合、zpool全体が死ぬと考えている人たち。本当じゃない; マルチディスクプールがします常にそれがミラーやRAIDZない場合であっても、単一の完全なディスク障害を切り抜けます。

ZFSメタデータは常に少なくとも2回コピーされるため、ディスク全体(またはその一部)の全体的な障害によってファイルシステムがダウンすることはありません。さらに、多くのファイル、特に小さいファイルはすべてのディスクに分散されないため、必ずしもディスク障害によって障害が発生するわけではありません。OPは、dittoブロック(ユーザーデータコピー> 1)を使用するマルチディスクプールの場合について質問しています。ここでは、単一の完全なディスク障害がなければならない決してあらゆるデータの損失につながるん。ZFSは常に元のブロックから遠く離れたブロックを配置しようとします。複数のvdevを持つプールの場合、これは常に別のvdevを意味します(例外は1つのvdevがプールの50%を超える場合で、非常に珍しいことです) 。また、ファイルシステムのメタデータは、常に同レベルの+1または+2倍コピーされるため、常にディスク障害に耐えることができます。さらに、3つ以上のディスクがある場合、データを失うことなく最大半数のディスクを失うことができます。ZFSは、2つの隣接するディスクを失うことがない限り、データ損失がないように、次のディスクに同じブロックを保存します。(ditto = 2の3つの隣接ディスク障害)。

ファイルにアクセスするのに十分なデータのコピーがある場合(それらのコピーが2つのブロック、ミラー、またはraidzからのものである場合)、ファイルにアクセスすると、失われたデータのコピーがすべて修復されます。これがスクラブの目的です。すべてのデータを読み取り、冗長なコピーを使用して不良なものを修正します。OPの質問に直接答えるには、故障したドライブを交換した後にスクラブを行うだけで、すべてのコピーが復元されます。

いつものように、バッキングストアのvdevが通常のスパースファイルであるプールを作成することにより、概念を簡単に試すことができます。vdevファイルを削除または破損することにより、あらゆるタイプの障害をシミュレートでき、途中でプール、ファイルシステム、およびデータの整合性を検証できます。

編集:実験後、copys == 2のマルチディスク非冗長プールでディスクに障害が発生すると、zfsはプールに障害を起こすようです。1つまたは複数のディスクでの部分的なデータ破損は存続可能であり、スクラブで修正する必要があります。


こうした種類の実験の恐ろしい点は、セットアップがすぐに、または少なくともすぐに失敗することを私に伝えるのに優れていることです。それらは、セットアップがときどき失敗することを私に伝えるのにはあまり適していません。いずれにしても、障害のあるプールをどのように戻すかは明確ではありません。このようなプールを3つのスパースファイルでセットアップしようとしましたが、スパースファイルの1つを削除するとプール全体に致命的な問題が発生するようです。zpool replaceは失敗したファイルを置き換えません。zpoolscrubは5%でストールします(これらは非常に小さなプールです)。また、illumos.org / msg / ZFS-8000-5Eのエラーページは楽観的ではありません。
ジェームズムーア

私の実験と同様の結果が得られ、回答後にのみ行われました。私は通常raidzのみを使用し、信頼できる情報源であると信じていた情報(オラクルのブログ)に基づいて回答していました。コピーが1を超えるマルチディスクJBODタイプのプールは、ディスク障害に耐えることができるとは信じられません。
アーロンB
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.