web-dev-qa-db-ja.com

ZFS:zpool内のすべてのディスクにzvolを再配布しますか?

ZFSがzpool内のすべてのディスクに特定のファイルシステムを再配布するように促す方法はありますか?

FC経由でLUNとしてエクスポートされる固定サイズのZFSボリュームがあるシナリオを考えています。現在のzpoolは小さく、1 TBのミラーリングされたディスクが2つあり、zvolは合計で750GBです。たとえば、zpoolのサイズを12 TBのディスクに突然拡張したとしても、zvolは最初の2つのスピンドルだけに効果的に「収容」されると思います。

より多くのスピンドル=より多​​くのIOPSがある場合、12スピンドルすべてにzvolを「再分散」してそれらを活用するためにどのような方法を使用できますか?

12
growse

データのバランスを再調整するには、拡張されたzpoolにデータを再書き込みする必要があります。それ以外の場合、時間が経過すると、書き込みはプール全体に分散されます。

8
ewwhite

Zvolが初期デバイスのみに保存される理由はありません。プールを拡大すると、ZFSは使用可能なすべての基本デバイスの更新されたデータに広がります。 ZFSには固定パーティションはありません。

3
jlliagre

これはewwhiteの回答の「続き」です。

データをリバランスするには、拡張されたzpoolにデータを再書き込みする必要があります

私は、Ubuntu 14.04ホストでこれを自動化するためにPHPスクリプト( githubで利用可能 )を作成しました。

PHP CLIツールをSudo apt-get install php5-cliを実行してスクリプトを実行し、最初の引数としてプールデータへのパスを渡します。例えば。

php main.php /path/to/my/files

理想的には、プール内のすべてのデータに対してスクリプトを2回実行する必要があります。最初の実行ではドライブ使用率のバランスが取られますが、個々のファイルは最後に追加されたドライブに過剰に割り当てられます。 2回目の実行では、各ファイルがドライブ間で「公平に」分散されます。異なるサイズのペア(4 TBミラー+ 3 TBミラー+ 3 TBミラー)のRAID 10を使用しているため、ドライブ容量を混合していない場合にのみ均等に分散されるため、均等ではなく公平に言います。

スクリプトを使用する理由

  • 「インプレース」で問題を修正する必要があります。例えば。別のシステムにデータを書き出すことはできません。ここでデータを削除して、もう一度すべて書き戻します。
  • 50%を超えてプールをいっぱいにしたため、ファイルシステム全体を一度にコピーしてから、元のファイルシステムを削除することはできませんでした。
  • 適切に実行する必要がある特定のファイルのみがある場合は、それらのファイルに対してスクリプトを2回実行するだけで済みます。ただし、2回目の実行は、最初の実行がドライブ使用率のバランスをとることに成功した場合にのみ有効です。
  • データがたくさんあるので、進捗状況を確認したい。

ドライブ使用率が達成されているかどうかを確認するにはどうすればよいですか?

Iostatツールを一定期間使用します(例:iostat -m 5)と書き込みを確認します。それらが同じであれば、あなたは均等な広がりを達成しています。 RAID 10で2ペアの3TBドライブを備えた4TBのペアを実行しているため、2つの4はわずかに多く書き込まれます。 enter image description here

ドライブの使用率が「不均衡」である場合、iostatは、新しいドライブが不均衡に書き込まれている以下のスクリーンショットのようなものを表示します。また、データがないため、読み取りが0であるため、それらが新しいドライブであることもわかります。 enter image description here

スクリプトは完璧ではなく、回避策だけですが、当面は、ZFSがBTRFSのようなリバランス機能を実装するまで(フィンガーが交差するまで)機能します。

0
Programster

まあこれは少しハックですが、zvolを使用してマシンを停止した場合、zfsはファイルシステムをbar.zvolと呼ばれるlocalhost上のローカルファイルに送信し、その後ファイルバックシステムを再び受信します。これにより、データのバランスが再調整されます。

zfs send tank/bar > bar.zvol

zfs receive tank/bar < bar.zvol
0
Christian