![劣化せずにZFS RAID-Z[123]を拡張できますか?](https://rvso.com/image/1609701/%E5%8A%A3%E5%8C%96%E3%81%9B%E3%81%9A%E3%81%ABZFS%20RAID-Z%5B123%5D%E3%82%92%E6%8B%A1%E5%BC%B5%E3%81%A7%E3%81%8D%E3%81%BE%E3%81%99%E3%81%8B%EF%BC%9F.png)
ZFS では、RAID-Z (または RAID-Z2 または RAID-Z3) vdev を拡張する唯一の方法は、ディスクをより大きなディスクに置き換えることであり、ジオメトリを変更する方法はありません。ただし、そのプロセスでアレイを劣化させることなくこれを行うことは可能ですか?
たとえば、4 つのディスクを持つ RAID-Z アレイがあるとします。1x2TB と 3x1TB で、3 TB の使用可能スペースになります。すべてのドライブが動作しているので、アレイを拡張するために 2TB をさらに 3 つ購入します (使用可能容量は 6 TB になります)。各 1 TB を 1 つずつ取り外して 2 TB に交換し、各再シルバーを強制すると、アレイが不必要に繰り返し劣化し、その過程で障害のリスクが高まります。
可能であれば、各ディスクを交換する前にミラーリングすることが望ましいです。つまり、最初の 2 TB を予備ベイに追加し、最初の 1 TB ディスクをそれにミラーリングし、次に 1 TB を取り外し、取り外したドライブのスロットに 2 TB を入れます。次に、2 番目と 3 番目の 1 TB ディスクについて繰り返します。これにより、再ミラーリングやパリティの再計算の必要性がなくなる可能性があります。
そんな事は可能なのでしょうか?
答え1
提案された解決策は可能ですが、いくつかの重大な欠点があります。
zpool import -o readonly=on ${YOUR_ZFS_POOL}
ディスクのクローン作成中は、プール ( ) に何も書き込むことはできません。zpool export ${YOUR_ZFS_POOL}
切り替えるディスクごとにプール ( ) をエクスポートする必要があります。
vdev ディスクのクローンを作成した後、次の操作を行う必要があります。
- プールをエクスポートします(
zpool export ${YOUR_ZFS_POOL}
)。 zpool labelclear ${OLD_DISK_DEVICE}
古いディスクを 消去( )するか、物理的に削除します。
警告:ディスクを消去すると元に戻すことはできません。- 必要に応じて、新しいディスク上の vdev パーティションを拡張します。
- プールをインポートします(
zpool import ${YOUR_ZFS_POOL}
)。
警告:この時点以降は元に戻すことはできません。古いディスクを同じプール内でオンラインにすることはできなくなります。 - ディスクを拡張します(
zpool online -e ${NEW_DISK_VDEV}
)。
交換するディスクごとにこれらの手順を繰り返すと、新しい容量が有効になります。
ZFS に組み込まれている置換機能は、上記のセクションで説明した余分な複雑さをすべて回避するように設計されています。再シルバー中に RAID-Z zpool が破損することを心配している場合は、次のことを実行してください。
- より冗長性のあるプール(RAID-Z2、RAID-Z3)を作成するか、
- アレイを拡張しながら、プールを別の場所にバックアップします。
さらに、実際にディスクが故障した場合、RAID-Z で満足できるでしょうか?
予算が厳しく、データセットをバックアップする場所を確保する余裕がない場合は、クローン作成はトランザクションの「すべてまたは何もしない」操作になるため、計画を実行する方が確かに安全です。ただし、プールはしばらくの間読み取り専用またはオフラインになること、またクローン作成後の手順でミスを犯すリスクがあることに留意してください。
使用zpool replace
例:
- ブロックデバイス全体ではなく、使用されているストレージのみがコピーされるため、より高速になります。
シーケンシャルスクラブ/リシルバー機能 - ダウンタイムはありません。なぜなら、リシルバーが行われている間もプールは完全に稼働しているからです。
- ディスクを交換するZFSのワークフローを使用するため、人為的なエラーを排除できます。