web-dev-qa-db-ja.com

ZFSでデータを「再バランス」する方法は? (データがすべてのストライプミラーに分散されていることを確認してください)

例としてストライプミラー(RAID 10)を使用して、2つのディスクが4つに拡張された場合、2つのディスクのデータを2つのミラー間でどのように「再バランス」(分散)できますか?

つまり、1つのミラーに書き込まれたファイルを2つのミラーに書き込んで、ストライプディスクを利用するにはどうすればよいでしょうか。

7
Greg

新しく書き込まれた(追加された)データのみが現在アクティブなすべてのvdev間で分割されます。ZFSには明示的なリバランス操作はありません。

2つの可能な解決策:

  1. すべての古いデータが再度書き込まれるまで待ちます(CoWのため、これには非常に長い時間がかかる可能性があり、最悪の場合、ディスクを完全に書き込むのにかかる時間の2倍になります)。
  2. すべてのデータを削除して、新たに書き込みます(zfs send/recvは、すべてのデータをプールから出し、何も失うことなく戻すのに役立ちます)。これは一度にすべてを実行する必要はなく、同じプールで実行できます。

より正確には、2番目のソリューションを選択し、システムの負荷が低い時間帯(たとえば夜間)に各ファイルシステムを個別に転送します。

  • 適切なサイズのファイルシステム(および子孫のファイルシステム、再帰的に)のスナップショット(zfs snapshot -r)を取得する
  • zfs send | zfs recvを適切なオプションとともに使用して、スナップショットを新しく作成された一時ファイルシステムに送信します(スペースが許す場合は同じプールに置くことができます)。このファイルシステムは、古いファイルシステムと同じ階層の場所にある必要があります。
  • コピーが完了した後(ディスクは読み取りと書き込みを行う必要があるため、時間がかかる場合があります)、古いスナップショットと古いファイルシステムをzfs destroy
  • zfs rename一時システムを古い名前に
  • zfs mountを使用してマウントポイントを確認および変更し、置き換えられたファイルシステムの以前の状況を再調整します。
  • すべてのファイルシステムが移動されるまで繰り返します
7
user121391

可能な3番目の解決策(このFreeNASフォーラムでSirMasterが言及している post ):

  • 新しいディスクをzpoolに追加します
  • 多くのファイルを別の新しい/ mnt/pool/temp /ディレクトリにコピーします
  • 元のファイルを削除:rm -rf original/
  • ディレクトリ名を元に戻す:mv temp/ original/

これは、ZFSが最も空き容量の多いvdev(この場合は空の新しいドライブ)に比例して書き込みを行うため、機能します。 (0.7以降では、zfsは 書き込みにはより高速なドライブを優先します ですが、2つの新しいドライブが元のドライブと同じかそれ以上のパフォーマンスであると想定できます)

おそらくzfs send | zfs recvよりも低速ですが、スナップショットを作成または破棄する必要がないため、より単純です。

zpool list -vを前後に実行して、vdevの使用率を確認できます。

また、ファイルごとにコピー/削除/名前変更の手順を実行するphp script も見つかりました。これは answer でリンクされていました(ただし、zvolと同様) question 数年前のもの。 (このスクリプトを個人的にテストしていません)

1
jason_uruguru