web-dev-qa-db-ja.com

ZFSまたはLVMまたはMD冗長異種ストレージの提案

私はほとんどの人が抱えているのと同じ問題を抱えています:信頼できるパーソナルストレージソリューションを作成する方法:

  1. ハードドライブは、驚くべき規則性で故障します。ファイルを失うことは容認できません。
  2. 時々新しいHDDを購入します。必然的に、最良の価格/ GBは、前回のHDD購入とはサイズが異なります。
  3. 2は、時間の経過とともに、ディスクの異種コレクションがあることを意味します。それらをすべて使いたいのですが、故障したディスクは通常、より大きなディスクに置き換えられます。

  4. データの整合性と信頼性は、速度よりも私にとって重要です。

ですから、この問題に数日間(そして何年も頭の後ろで)頭をぶつけた後、私は次の解決策を提案します。ネイティブのLinuxZFSに基づいてテストしたソリューションについて説明します。これは buntu PPAで利用可能 ですが、LVM、MD、およびbtrfsを使用して同じことを実現できます。このために、RAID1(ZFSミラーvdev)を使用します。

  1. ドライブのセットを指定して、各セットの容量が他のセットにできるだけ近くなるように、それらを2つのディスクのセットにグループ化します。
  2. 他のグループの小さいディスクの1つとまったく同じサイズのパーティションが存在するように、大きいディスクをパーティション分割します。
  3. 各ディスクが別のディスクにミラーを持つようにミラーvdevを作成します。

たとえば、新しい2TBドライブ、古い750GBドライブ、2つの古い400GBドライブ、および1つの古い500GBドライブのディスクセットについて考えてみます。最適なミラーパーティションには2TBの使用可能スペースがあり、次の図で説明されています。ここで、「:」はパーティションを区切り、「|」はディスクを分離します:

+------------------------------------------------------------------+
| 2TB (sda1)        : (sda2)       : (sda3)       : (sda4)         |
+------------------------------------------------------------------+--+
| 750 GB (sdb)      | 400 GB (sdc) | 400 GB (sdd) | 500 GB (sde1)  :XX|
+---------------------------------------------------------------------+

次のようにzpoolを作成します

zpool create archive mirror /dev/sda1 /dev/sdb mirror /dev/sda2 /dev/sdc mirror /dev/sda3 /dev/sdd mirror /dev/sda4 /dev/sde1

これにより、4つのミラーリングされたvdevが作成されます。ディスクのいずれかに障害が発生した場合は、(任意のサイズのディスクに)交換してパーティションを作成し、不足しているパーティションを再作成できます。 ZFS vdevをプールに追加できるが、削除できないことが重要です。したがって、可能であれば、新しいドライブを購入するときに、既存のvdevを再配置する必要があります。次の購入が3TBドライブだったとしましょう。次の図に示すように、最適な構成は3.5TB使用可能です。これは5つのvdevペアになりました。これは、ドライブを適切にパーティション分割し、連続して障害を発生させて再パーティション化することで実現できます。

+--------------------------------------------------------------+-------------+
| 3 TB (sdf1)       : (sdf2)      : (sdf3)      : (sdf4)       | 500GB (sde) |
+--------------------------------------------------------------+-------------+-+
| 2TB (sda1)        | 400GB (sdb) | 400GB (sdc) | 750GB (sdd1) : (sdd2)      :X| 
+------------------------------------------------------------------------------+

このミラーリングされたドライブのペアを維持することは、LVMまたはMD RAIDを使用して行うこともできます。これは、各ドライブに常にミラードライブまたはパーティションがあることを確認することです。すべてがミラーリングされているため、ドライブが追加または削除されたときに、ドライブに障害が発生したり、パーティションを再配置したりすることができます。 LVMまたはMDを使用すると、必要に応じてドライブを削除してアレイを縮小できますが、BTRFSと比較してZFSの回復ツールはそれほど洗練されていません。

この手順について何かコメントはありますか?優れたスクリプトは、ドライブのロスレス割り当てと再配置を処理できます。 LVM対MD対ZFSについてのコメントはありますか?結果として生じる奇妙にパーティション化されたアレイのパフォーマンスに関するコメントはありますか?同じドライブ上の複数のパーティションにまたがるデータ配置は、過度のヘッドシークと早期障害を引き起こしますか?

BTRFS開発者:全員がこれを望んでおり、LVMまたはMDは技術的に必要ではありません(私の意見では、最適ではありません)。冗長な異種アレイの保守を容易にすることは、btrfsにとってキラーな機能です。これは、LVM/MD/ZFSをそのままハックしたものです。 resliver/resyncを最小限に抑えることが非常に望ましいです。

はい、これは明らかに貧乏人のDroboです。そのための専用ハードウェアは必要ありません...

10
Bob McElrath

私はこれをZFSでテストしましたが、ZFSはすべてのvdevに読み取りと書き込みを分散するため、書き込みパフォーマンスは本来の約半分になります(したがって、I/Oを同じディスク上の複数の場所に分割します)。したがって、速度は、パーティションが最も多いディスクの速度によって制限されます。読み取り速度はディスク帯域幅と同じようです。 2つのディスク上のZFSパーティションのペアは、ディスクから並列に読み取ることができるため、いずれかの単一ディスクの読み取り速度が約2倍になることに注意してください。

MD LINEARアレイまたはLVMを使用して2つの半分を作成すると、上記のZFS提案と比較して2倍の書き込みパフォーマンスが得られますが、LVMとMDがデータの保存場所を認識できないという欠点があります。ディスク障害またはアップグレードが発生した場合は、アレイの一方の側を完全に破棄して再同期/再ライブし、次にもう一方の側を使用する必要があります。 (例:resync/resliverは2 *(アレイのサイズ)をコピーする必要があります)

したがって、最適なソリューションは、ディスクを同じサイズの「半分」に結合する2つのLVMまたはMDLINEARデバイスにまたがって単一のZFSミラーvdevを作成することであると思われます。これには、任意の1つのディスクの約2倍の読み取り帯域幅があり、書き込み帯域幅は個々のディスク帯域幅と同じです。

ZFSの代わりにBTRFSraid1を使用することもできますが、ZFSは読み取りを分散して帯域幅を2倍にするため、読み取り帯域幅は半分になりますが、BTRFSはそうではないようです(私のテストによると)。 BTRFSには、パーティションを縮小できるという利点がありますが、ZFSでは縮小できません(したがって、障害後に多くの空き領域がある場合、BTRFSを使用すると、ファイルシステムを縮小してからディスクを再配置することで、より小さな冗長アレイを再構築できます)。

これは手作業で行うのは面倒ですが、いくつかの優れたスクリプトを使用すれば簡単です。

4
Bob McElrath