回答:
"copies = 2"(または3)は、冗長性のないプール(単一ディスクまたはストライプ)で使用するように設計されています。目標は、デバイス全体の障害ではなく、小さなディスク破損を回復できるようにすることです。後者の場合、プールはマウントできないため、同じブロックの復元は発生しません。
冗長性(mirroring / raidz / raidz2 / raidz3)がある場合、dittoブロックは他のブロックと同じであり、スクラブ/再同期によってそれらが再作成されます。
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が冗長構成とはみなされないと仮定します。
copies=1
それをcopies=2
にアップした場合は、後で再同期/スクラブすることです。これにより、これらのインスタンスが作成されます。しかし、@ jilliagreは正しいです。同じブロックは冗長構成を構成しません。プール内に複数のデバイスがある場合でも、ブロックが別のデバイスに設定される保証はありません。
この質問は本当に興味をそそられるものであり、ドキュメントを1時間かけて注いだ後、コードに飛び込みました。ここに私が見つけたものがあります。
まず、いくつかの用語。Dittoブロック(ミラーではなく、これらのコピー)は書き込み時に自動的に作成されますが、元のコピーと同じ仮想デバイス(vdev)にある場合とない場合があります。一方、ミラー化されたブロックは常に別の仮想デバイスに反映されます。
ただし、コードは両方のタイプのブロックを子として参照します。ここで、dittoブロックは単なる子であることがわかりますio_vd == NULL
(これはwrite関数にあります)。ミラーブロックの場合io_vd
、対応する仮想デバイス(2番目のディスクなど)に設定されます。
そのことを念頭に置いて、読み取り部分に到達するgood_copies
と、予想されるものが含まれていない場合、すべての子(ミラーブロックまたは同ブロック)を潜在的に安全でないものとして扱い、必要に応じて書き換えます。したがって、あなたの質問に対する答えはそうです-はい、少なくとも1つの良いコピーがあり、次のいずれかがあればそれらを書き換えます:
ふう!誰かが欠陥を指摘できるかもしれませんが、私はこの小さな演習を通してZFSについて学ぶことを楽しんでおり、これが役立つことを願っています!
@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つまたは複数のディスクでの部分的なデータ破損は存続可能であり、スクラブで修正する必要があります。