イレイジャーコーディングは、分散ストレージシステムにとって重要なデータ保護方法です。このブログ投稿では、イレイジャー コーディングがデータ保護に関する企業の要件をどのように満たすか、およびそれが MinIO にどのように実装されるかについて説明します。
ハードウェア障害、特にドライブ障害はよくあることなので、どのような企業環境においてもデータ保護は不可欠です。
従来、ハードウェアの耐障害性を提供するために、さまざまなタイプの RAID テクノロジーまたはミラーリング/レプリケーションが使用されてきました。ミラーリングとレプリケーションは、データの 1 つ以上の完全な冗長コピーに依存します。これは、ストレージを消費するコストのかかる方法です。 RAID5 や RAID6 などのより複雑なテクノロジは、ストレージのオーバーヘッドを削減しながら、同じフォールト トレランスを提供します。 RAID は単一ノードのデータ保護には優れたソリューションですが、障害が発生したドライブをオンラインに戻すには再構築操作に時間がかかるため、拡張できません。
多くの分散システムは、データ保護のために 3 方向レプリケーションを使用します。この場合、元のデータは 3 つの異なるドライブに完全に書き込まれ、どの 1 つのドライブでも元のデータを修復または読み取ることができます。レプリケーションはストレージ使用率の点で非効率であるだけでなく、障害から回復する際の運用効率も非効率です。ドライブに障害が発生すると、システムはパフォーマンスが低下した読み取り専用モードになり、障害が発生したドライブを交換するために無傷のドライブを新しいドライブに完全にコピーします。
イレイジャーコーディングは回復力があり効率的であるため、分散ストレージのデータ保護に適用されます。データ ファイルをデータ ブロックとパリティ ブロックに分割してエンコードし、エンコードされたデータの一部が利用できない場合でもプライマリ データを回復できるようにします。水平方向に拡張可能な分散ストレージ システムは、イレイジャー コーディングを利用して、エンコードされたデータを複数のドライブとノードにまたがって保存することでデータ保護を実現します。ドライブまたはノードに障害が発生したり、データが破損したりした場合、他のドライブやノードに保存されているブロックから元のデータを再構築できます。
イレイジャー コーディングは、ノードとドライブ間でデータをストライピングすることで、他のテクノロジーと同じ数のドライブ障害に耐えることができ、はるかに高い効率を実現します。さまざまな消失符号化アルゴリズムがあり、リードソロモンなどの最大距離分離 (MDS) コードが最大の記憶効率を実現します。
オブジェクト ストレージでは、保護されるデータの単位はオブジェクトです。オブジェクトは n 個のドライブに保存できます。 k が潜在的な障害を示す場合、k < n であり、MDS コードを使用すると、システムは n - k 個のドライブ障害を許容することを保証できます。これは、k 個のドライブがあれば任意のオブジェクトにアクセスできることを意味します。
サイズが M バイトのオブジェクトを考慮すると、コード化された各オブジェクトのサイズは M / k になります (メタデータのサイズは無視します)。上記の N ウェイ レプリケーションと比較して、消去コーディングが n = 5 および k = 3 に構成されている場合、分散ストレージ システムは 2 台のドライブの損失を許容しながら、ストレージ効率を 80% 向上させることができます。たとえば、10 PB のデータ レプリケーションには 30 PB 以上のストレージが必要ですが、オブジェクト ストレージではイレイジャー コーディングを使用して同じデータを安全に保存し保護するには 15 ~ 20 PB が必要です。イレイジャーコーディングは、パリティブロックに対するデータのさまざまな比率に合わせて構成できるため、さまざまなストレージ効率が得られます。 MinIO は、環境の要件を決定するのに役立つ便利な消去コード計算ツールを維持しています。
MinIO は、可能な限り最高のパフォーマンスを実現するためにアセンブリ コードで記述された、オブジェクトごとのインライン消去コーディング (参照用の MinIO 公式ドキュメント) でデータを保護します。 MinIO は、インテル AVX512 命令を利用して、複数のノードにわたってホスト CPU リソースを最大限に活用し、高速イレイジャー コーディングを実現します。標準 CPU、高速 NVMe ドライブ、および 100 Gbps ネットワークにより、ほぼワイヤ速度での Erasure Code オブジェクトの書き込みがサポートされます。
MinIO は、リードソロモン コードを使用して、オブジェクトをデータ ブロックとパリティ ブロックにストライプ化し、必要な冗長レベルに構成できます。これは、8 パリティ構成の 16 ドライブ設定では、オブジェクトが 8 つのデータ ブロックと 8 つのパリティ ブロックとしてストライプ化されることを意味します。パリティであれデータであれ、最大 7 ((n/2)–1) 個のドライブを失った場合でも、残りのドライブからデータを確実に再構築できます。 MinIO の実装により、複数のデバイスが失われたり使用できなくなったりした場合でも、オブジェクトの読み取りや新しいオブジェクトの書き込みが可能になります。
MinIO は、消去セットのサイズに基づいてオブジェクトをデータ ブロックとパリティ ブロックに分割し、各ドライブにオブジェクトあたり 1 ブロックしか含まれないように、データ ブロックとパリティ ブロックをセット内のドライブ全体にランダムかつ均一に分散します。ドライブには複数のオブジェクトのデータ ブロックとパリティ ブロックの両方が含まれる場合がありますが、システム内に十分な数のドライブがある限り、1 つのオブジェクトに含まれるブロックはドライブごとに 1 つだけです。バージョン管理されたオブジェクトの場合、MinIO は、いずれか 1 つのドライブで重複をゼロに維持しながら、データとパリティのストレージとして同じドライブを選択します。
以下の表は、構成可能なデータとパリティのオプション、および付随するストレージ使用率を備えた MinIO のイレイジャー コーディングの例を示しています。
合計ドライブ数 (n) | データドライブ (d) | パリティドライブ (p) | ストレージ使用率 |
---|---|---|---|
16 | 8 | 8 | 2.00 |
16 | 9 | 7 | 1.79 |
16 | 10 | 6 | 1.60 |
16 | 11 | 5 | 1.45 |
16 | 12 | 4 | 1.34 |
16 | 13 | 3 | 1.23 |
16 | 14 | 2 | 1.14 |
MinIO のバックエンドのレイアウトは実際には非常にシンプルです。入ってくるすべてのオブジェクトには消去セットが割り当てられます。消去セットは基本的にドライブのセットであり、クラスターはディスクの総量によって決まる 1 つ以上の消去セットで構成されます。
MinIO で使用される形式とレイアウトを理解するために、簡単な例を見てみましょう。
フォーマットは、それぞれ 1 つのドライブを備えた 4 つのノードがあるか、それぞれ 100 のドライブを備えた 4 つのノードがあるかに関係なく、データとパリティ ドライブの比率に関係することに注意することが重要です (MinIO は、高密度の JBOD 構成でデプロイされることがよくあります)。
それぞれ 100 台のドライブを備えた 4 つのノードを構成して、デフォルトの消去セット サイズ 16 を使用できます。これは論理レイアウトであり、イレイジャー コーディング計算の定義の一部です。 16 ドライブごとに、8 つのデータ ドライブと 8 つのパリティ ドライブで構成される 1 つの消去セットがあります。この場合、消去セットは 400 台の物理ドライブに基づいており、データ ドライブとパリティ ドライブに均等に分割されており、最大 175 台のドライブの損失を許容できます。
MinIO の XL メタデータは、オブジェクトとともにアトミックに書き込まれ、そのオブジェクトに関連するすべての情報が含まれています。 MinIO 内には他のメタデータはありません。その意味は劇的です。すべてがオブジェクトに自己完結しており、すべてがシンプルかつ自己記述的です。 XL メタデータは、消去コード アルゴリズム (たとえば、2 つのパリティを持つ 2 つのデータ、ブロック サイズ、チェックサム) を示します。データ自体と一緒にチェックサムを書き込むことで、MinIO はストリーミング データをサポートしながらメモリを最適化することができ、ストリーミング データをメモリに保持してからディスクに書き込み、最終的に CRC-32 チェックサムを生成するシステムよりも明らかな利点が得られます。
大きなオブジェクトの場合、つまり。 10 MB を超えるファイルが MinIO に書き込まれると、S3 API はそれをマルチパート アップロードに分割します。パーツのサイズは、クライアントがアップロードするときに決定します。 S3 では、各部分が 5 MB 以上 (最後の部分を除く)、5 GB 以下である必要があります。 S3 仕様に基づいて、オブジェクトには最大 10,000 個のパーツを含めることができます。 320 MB のオブジェクトを想像してください。このオブジェクトが 64 の部分に分割されている場合、MinIO はその部分をpart.1、part.2、...最大part.64としてドライブに書き込みます。これらのパーツのサイズはほぼ同じです。たとえば、マルチパートとしてアップロードされた 320 MB のオブジェクトは、64 の 5 MB のパーツに分割されます。
アップロードされた各部分は、ストライプ全体にわたって消去符号化されます。 Part.1 はアップロードされたオブジェクトの最初の部分であり、すべての部分がドライブ間で水平にストライプ化されています。各部分は、データ ブロック、パリティ ブロック、および XL メタデータで構成されます。 MinIO は書き込みをローテーションするため、システムは常に同じドライブにデータを書き込み、同じドライブにパリティを書き込むわけではありません。すべてのオブジェクトが独立して回転されるため、クラスター内のすべてのドライブを均一かつ効率的に使用できると同時に、データ保護も強化されます。
オブジェクトを取得するために、MinIO はハッシュ計算を実行してオブジェクトが保存された場所を特定し、ハッシュを読み取り、必要な消去セットとドライブにアクセスします。オブジェクトが読み取られると、XL メタデータで説明されているデータ ブロックとパリティ ブロックが存在します。 MinIO で設定されているデフォルトの消去は 12 個のデータと 4 個のパリティです。これは、MinIO が 12 個のドライブを読み取ることができる限り、オブジェクトを処理できることを意味します。
イレーズコーディングには、分散システムでのデータ保護に使用される他のテクノロジーに比べて、いくつかの重要な利点があります。
イレイジャーコーディングが RAID よりもオブジェクトストレージに適している理由はいくつかあります。 MinIO イレイジャー コーディングは、複数のドライブやノードに障害が発生した場合のデータ損失からオブジェクトを保護するだけでなく、オブジェクト レベルでの保護と修復も行います。一度に 1 つのオブジェクトを修復できる機能は、ボリューム レベルで修復する RAID に比べて劇的な利点です。破損したオブジェクトは、RAID では数時間かかるのに対し、MinIO では数秒で復元できます。ドライブが故障して交換されると、MinIO は新しいドライブを認識して消去セットに追加し、すべてのドライブにわたってオブジェクトを検証します。さらに重要なのは、読み取りと書き込みが相互に影響を及ぼさないため、大規模なパフォーマンスが可能になることです。ペタバイト規模のストレージに数千億のオブジェクトを含む MinIO の導入が行われています。
MinIO での消去コードの実装により、データセンターの運用効率が向上します。レプリケーションとは異なり、ドライブやノード間でのデータの再構築や再同期に時間のかかる作業は必要ありません。些細なことのように聞こえるかもしれませんが、オブジェクトの移動/コピーには非常にコストがかかる場合があり、16 TB ドライブに障害が発生し、データセンター ネットワークを介して別のドライブにコピーされると、ストレージ システムとネットワークに多大な負担がかかります。
このブログ投稿が好奇心をそそられた場合は、より長いイレイジャー コーディング入門書をご利用いただけます。 MinIO をダウンロードして、イレイジャー コーディングによるデータ保護を今すぐ始めてください。
ここでも公開されています。