これは、ewwhiteの答えの「続き」です。
データをリバランスするために、拡張されたzpoolにデータを書き直す必要があります。
Ubuntu 14.04ホストでこれを自動化するPHPスクリプト(githubで入手可能)を作成しました。
PHP CLIツールをインストールしsudo apt-get install php5-cli
てスクリプトを実行するだけで、最初の引数としてプールデータへのパスを渡すだけです。例えば
php main.php /path/to/my/files
理想的には、プール内のすべてのデータに対してスクリプトを2回実行する必要があります。最初の実行ではドライブの使用率のバランスが取られますが、個々のファイルは最後に追加されたドライブに過剰に割り当てられます。2回目の実行により、各ファイルがドライブ間で「公平に」分散されます。私は、異なるサイズのペアのRAID 10(4TBミラー+ 3TBミラー+ 3TBミラー)でドライブ容量をミキシングしていない場合にのみ均等に分散されるため、均等ではなく公平に言います。
スクリプトを使用する理由
- 問題を「その場で」修正する必要があります。たとえば、データを別のシステムに書き出すことはできません。ここでデータを削除して、再び書き戻すことはできません。
- プールを50%以上いっぱいにしたため、元のファイルシステムを削除する前にファイルシステム全体を一度にコピーすることはできませんでした。
- 適切に実行する必要がある特定のファイルのみがある場合は、それらのファイルに対してスクリプトを2回実行するだけで済みます。ただし、2回目の実行は、最初の実行でドライブの使用率のバランスを取ることに成功した場合にのみ有効です。
- たくさんのデータがあり、進行状況の表示を確認できるようにしたいです。
ドライブの使用率が達成されたかどうかを確認するにはどうすればよいですか?
一定期間(例えばiostat -m 5
)iostatツールを使用し、書き込みを確認します。それらが同じである場合、均等な広がりを達成しています。RAID 10では2 TBの3 TBドライブで4 TBのペアを実行しているため、これらは下のスクリーンショットでは完全に均一ではありません。
ドライブの使用率が「アンバランス」の場合、iostatは、新しいドライブが不均衡に書き込まれている下のスクリーンショットのようなものを表示します。また、データがないため読み取りが0であるため、それらが新しいドライブであることもわかります。
このスクリプトは完璧ではなく、回避策にすぎませんが、ZFSがBTRFSが持っている(フィンガーが交差した)ようなリバランス機能をいつか実装するまではうまくいきます。