IP Force 特許公報掲載プロジェクト 2022.1.31 β版

知財求人 - 知財ポータルサイト「IP Force」

▶ ウェカ.アイオー リミテッドの特許一覧

特許7512472複数の故障ドメインに及ぶストレージシステム
<>
  • 特許-複数の故障ドメインに及ぶストレージシステム 図1
  • 特許-複数の故障ドメインに及ぶストレージシステム 図2
  • 特許-複数の故障ドメインに及ぶストレージシステム 図3
  • 特許-複数の故障ドメインに及ぶストレージシステム 図4
  • 特許-複数の故障ドメインに及ぶストレージシステム 図5
  • 特許-複数の故障ドメインに及ぶストレージシステム 図6
  • 特許-複数の故障ドメインに及ぶストレージシステム 図7
< >
(19)【発行国】日本国特許庁(JP)
(12)【公報種別】特許公報(B2)
(11)【特許番号】
(24)【登録日】2024-06-28
(45)【発行日】2024-07-08
(54)【発明の名称】複数の故障ドメインに及ぶストレージシステム
(51)【国際特許分類】
   G06F 11/10 20060101AFI20240701BHJP
【FI】
G06F11/10 680
【請求項の数】 20
【外国語出願】
(21)【出願番号】P 2023076567
(22)【出願日】2023-05-08
(62)【分割の表示】P 2020569858の分割
【原出願日】2019-06-04
(65)【公開番号】P2023099186
(43)【公開日】2023-07-11
【審査請求日】2023-06-07
(31)【優先権主張番号】16/275,737
(32)【優先日】2019-02-14
(33)【優先権主張国・地域又は機関】US
(31)【優先権主張番号】62/683,841
(32)【優先日】2018-06-12
(33)【優先権主張国・地域又は機関】US
(73)【特許権者】
【識別番号】520483279
【氏名又は名称】ウェカ.アイオー リミテッド
(74)【代理人】
【識別番号】100118902
【弁理士】
【氏名又は名称】山本 修
(74)【代理人】
【識別番号】100106208
【弁理士】
【氏名又は名称】宮前 徹
(74)【代理人】
【識別番号】100196508
【弁理士】
【氏名又は名称】松尾 淳一
(74)【代理人】
【識別番号】100195408
【弁理士】
【氏名又は名称】武藤 陽子
(72)【発明者】
【氏名】ベン ダヤン,マオール
(72)【発明者】
【氏名】パルモン,オムリ
(72)【発明者】
【氏名】ズビベル,リラン
(72)【発明者】
【氏名】アルディッティ,カナエル
【審査官】坂庭 剛史
(56)【参考文献】
【文献】特開2017-004514(JP,A)
【文献】特開2014-123218(JP,A)
【文献】米国特許出願公開第2013/0036340(US,A1)
【文献】特開2016-161970(JP,A)
【文献】特開2017-162068(JP,A)
(58)【調査した分野】(Int.Cl.,DB名)
G06F 11/10
(57)【特許請求の範囲】
【請求項1】
第1のストレージシステムと、
第2のストレージシステムと、
第1のバックエンドと、
第2のバックエンドと
を備え、
前記第1のバックエンドおよび前記第2のバックエンドは、前記第1のバックエンドがアクティブコントローラであることについてのコンセンサスに達するように動作可能であり、
データアクセスが前記第2のバックエンドにダイレクトされた場合、前記第2のバックエンドは、前記データアクセスを前記第1のバックエンドにリダイレクトし、
前記第1のバックエンドは、耐障害性ストライプを構築するように動作可能であり、前記耐障害性ストライプは、前記第1のストレージシステムに位置する第1のブロックのセットと、前記第2のストレージシステムに位置する第2のブロックのセットとを備える、
システム。
【請求項2】
請求項1に記載のシステムにおいて、前記第1のストレージシステムは、複数のソリッドステートドライブを備える、システム。
【請求項3】
請求項1に記載のシステムにおいて、前記第1のストレージシステムは、1つまたは複数のサーバを備える、システム。
【請求項4】
請求項1に記載のシステムにおいて、前記第1のストレージシステムが、ラックおよびネットワークスイッチを備える、システム。
【請求項5】
請求項1に記載のシステムにおいて、前記第1のストレージシステムと前記第2のストレージシステムとが互いの通信を喪失した場合、第3のストレージシステムが前記第1のストレージシステムと前記第2のストレージシステムとのどちらが、データを再構築することにより前記システムを動かし続けるのかを判定するように動作可能である、システム。
【請求項6】
請求項1に記載のシステムにおいて、第3のストレージシステムによって許可が与えられない限り、前記第1のストレージシステムも前記第2のストレージシステムも前記耐障害性ストライプを再構築しない、システム。
【請求項7】
請求項1に記載のシステムにおいて、前記第1のバックエンドは、前記耐障害性ストライプを最初に構築するバケットを備える、システム。
【請求項8】
請求項1に記載のシステムにおいて、前記第1のバックエンドは、前記耐障害性ストライプのリーダであるバケットを備える、システム。
【請求項9】
請求項1に記載のシステムにおいて、前記第1のストレージシステムが故障した場合、前記第2のバックエンドは、前記耐障害性ストライプのリーダになるバケットを備え、前記第2のストレージシステムは、前記第2のバックエンドを備える、システム。
【請求項10】
請求項1に記載のシステムにおいて、前記第1のストレージシステムは、可用性グループを備える、システム。
【請求項11】
第1のバックエンドと第2のバックエンドとの間で、前記第1のバックエンドがアクティブコントローラであるということについてのコンセンサスに達するステップと、
データアクセスが前記第2のバックエンドにダイレクトされた場合に、前記データアクセスを前記第1のバックエンドにリダイレクトするステップと、
耐障害性ストライプを構築するために前記第1のバックエンドを用いるステップであって、前記耐障害性ストライプは、第1のストレージシステムに位置する第1のブロックのセットと、第2のストレージシステムに位置する第2のブロックのセットとを備える、ステップと
を備える方法。
【請求項12】
請求項11に記載の方法において、前記第1のストレージシステムは、複数のストレージデバイスを備える、方法。
【請求項13】
請求項11に記載の方法において、前記第1のストレージシステムは、1つまたは複数のサーバを備える、方法。
【請求項14】
請求項11に記載の方法において、前記第1のストレージシステムは、ラックおよびネットワークスイッチを備える、方法。
【請求項15】
請求項11に記載の方法において、前記第1のストレージシステムと前記第2のストレージシステムとが互いの通信を喪失した場合、前記第1のストレージシステムと前記第2のストレージシステムとのどちらが、前記耐障害性ストライプを再構築するのかを判定するステップを備える方法。
【請求項16】
請求項11に記載の方法において、第3のストレージシステムによって許可が与えられない限り、前記第1のストレージシステムも前記第2のストレージシステムも前記耐障害性ストライプを再構築しない、方法。
【請求項17】
請求項11に記載の方法において、前記第1のバックエンド内のバケットによって前記耐障害性ストライプを構築する、方法。
【請求項18】
請求項11に記載の方法において、前記第1のバックエンドのバケットが、前記耐障害性ストライプのリーダである、方法。
【請求項19】
請求項11に記載の方法において、前記第1のストレージシステムが故障した場合、前記耐障害性ストライプのリーダになるように、前記第2のバックエンドのバケットを昇格させるステップであって、前記第2のストレージシステムは、前記第2のバックエンドを備える、ステップ、を備える方法。
【請求項20】
請求項11に記載の方法において、前記第1のストレージシステムが、可用性グループを備える、方法。
【発明の詳細な説明】
【技術分野】
【0001】
優先権の主張
[0001]本出願は、2018年6月12日に出願の「Storage System Spanning Multiple Failure Domains」と題する米国仮特許出願第62/683,841号、および、2019年2月14日に出願の「Storage System Spanning Multiple Failure Domains」と題する米国特許出願第16/275,737号の優先権を主張する。
【背景技術】
【0002】
[0002]データストレージへの従来のアプローチの限界および短所は、図面を参照しながら本開示の以降で示される本方法およびシステムのいくつかの態様と、このようなアプローチとの比較を通じて、当業者には明らかになるであろう。
【0003】
参照による組込み
[0003]「Distributed Erasure Coded Virtual Filesystem」と題する米国特許出願第15/243,519号が、本明細書によって全体として参照により本明細書に組み込まれる。
【発明の概要】
【発明が解決しようとする課題】
【0004】
[0004]特許請求の範囲でより完全に示されるように、図の少なくとも1つによって実質的に示されるような、および/または、図の少なくとも1つに関連して説明されるような、分散型ファイルシステムにおける複数の故障ドメインに及ぶストレージシステムを構築するための方法およびシステムが提供される。
【図面の簡単な説明】
【0005】
図1】本開示の態様による分散型ファイルシステムの様々な実例の構成を示す図である。
図2】本開示の態様による分散型ファイルシステムノードの実例の構成を示す図である。
図3】本開示の実例の実装形態による分散型ファイルシステムの別の表現を示す図である。
図4】本開示の実例の実装形態による分散型ファイルシステムの別の表現を示す図である。
図5】本開示の実例の実装形態による分散型ファイルシステムを生成するための実例の方法を示す流れ図である。
図6】2つの分散型耐障害性(failure resilient)アドレス空間が複数のソリッドステートストレージディスク上に常駐する実例の実装形態を示す図である。
図7】本開示の実例の実装形態による仮想ファイルシステムの不揮発性メモリに記憶されたデータを保護するために使用することができる前方誤り訂正方式を示す図である。
【発明を実施するための形態】
【0006】
[0012]従来、ファイルシステムは、メタデータ構造(例えば、ディレクトリ、ファイル、属性、ファイル内容)に対して集中型制御を使用する。ローカルファイルシステムが単一のサーバからアクセス可能であり、このサーバが故障した場合、さらなる保護がない場合、ファイルシステムのデータは失われる可能性がある。保護を追加するために、いくつかのファイルシステムは(例えば、ネットワークアプライアンス(NetApp)によって提供されるように)、能動的-受動的手法でコントローラの1つまたは複数のペアを使用して、2つ以上のコンピュータにまたがるメタデータを複製してきた。他の解決策は、(例えば、IBM GPFS、Dell EMC Isilon、Lustre、等によって提供されるような)クラスタ方式で複数のメタデータサーバを使用してきた。それでも、従来のクラスタ型システムにおけるメタデータサーバの数は少数に限定されるので、このようなシステムは、規模を変更することができない。
【0007】
[0013]本開示におけるシステムは、小さいクラスタに適用可能であり、数千ものノードまで規模を変更することもできる。例えば、ソリッドステートドライブ(SSD:solid-state drive)の形で入手できるフラッシュメモリといった、不揮発性メモリ(NVM:non-volatile memory)に関して実施形態の例が論じられる。NVMは、4kBのブロックおよび128MBのチャンクに分割されてもよい。大きさ(extent)は、例えば、高速アクセスのためのRAMといった、揮発性メモリに記憶することができ、NVMストレージによってバックアップも行われる。大きさは、例えば、ブロックに記憶されたデータのうちの1MBに対して256個のポインタといった、ブロックに対するポインタを記憶することができる。他の実施形態では、より大きいまたは小さいメモリ分割が使用されてもよい。本開示におけるメタデータの機能は、多くのサーバにわたって効果的に拡散されてもよい。例えば、ファイルシステムの名前空間の特定の部分に大きい負荷が向けられる「ホットスポット」の場合、この負荷は、複数のノードにわたって分散されることが可能である。
【0008】
[0014]図1は、本開示の態様による分散型ファイルシステムの様々な実例の構成を示す。ローカルエリアネットワーク(LAN)102が図1に示され、(j≧1のとき、1からJまでの整数でインデックスをつけられた)1つまたは複数のノード120を備え、任意選択として、(断続線によって示された)(M≧1のとき、1からMまでの整数でインデックスをつけられた)1つもしくは複数の専用ストレージノード106、(N≧1のとき、1からNまでの整数でインデックスをつけられた)1つもしくは複数の計算ノード104、および/または、リモートネットワーク118にLAN102を接続するエッジルータを備える。リモートネットワーク118は、任意選択として、(K≧1のとき、1からKまでの整数でインデックスをつけられた)1つもしくは複数のストレージサービス114、および/または(L≧1のとき、1からLまでの整数でインデックスをつけられた)1つもしくは複数の専用ストレージノード115を備える。
【0009】
[0015]各ノード120(jは整数であり、ここで、1≦j≦Jである)は、ネットワーク型コンピューティングデバイス(例えば、サーバ、パーソナルコンピュータ、または同様のもの)であり、デバイス104のオペレーティングシステム上で直接的に、および/または、デバイス104で動く1つもしくは複数の仮想マシンにおいて、プロセス(例えば、クライアントプロセス)を動かすための回路機器を備える。
【0010】
[0016]計算ノード104は、ネットワーク型デバイスであり、仮想バックエンドなしで仮想フロントエンドを動かすことができる。計算ノード104は、単一ルート入出力仮想化(SR-IOV:single root input/output virtualization)をネットワークインターフェースカード(NIC:network interface card)に取り入れること、および、全てのプロセッサコアを使い尽くすことによって、仮想フロントエンドを動かすことができる。代替として、計算ノード104は、Linux(登録商標、以下同様。)カーネルのネットワーキングスタックを通じたネットワーク形成を迂回させること(routing)、および、カーネルのプロセススケジューリングを使用することによって仮想フロントエンドを動かすことができ、したがって、全コアを要求しない。これは、ユーザが全てのコアをファイルシステムにアロケートしたくない場合、または、ネットワーキングハードウェアがファイルシステム要件と互換性がない場合に有用である。
【0011】
[0017]図2は、本開示の態様によるノードの実例の構成を示す。ノードは、フロントエンド202およびドライバ208、メモリコントローラ204、バックエンド206、ならびにSSDエージェント214を備える。フロントエンド202は、仮想フロントエンドであってもよく、メモリコントローラ204は、仮想メモリコントローラであってもよく、バックエンド206は、仮想バックエンドであってもよく、ドライバ208は、仮想ドライバであってもよい。本開示で使用されるように、仮想ファイルシステム(VFS:virtual filesystem)プロセスは、フロントエンド202、メモリコントローラ204、バックエンド206、およびSSDエージェント214の1つまたは複数を実装するプロセスである。したがって、1つの実例の実装形態では、ノードのリソース(例えば、プロセスリソースおよびメモリリソース)は、クライアントプロセスとVFSプロセスの間で共有されてもよい。VFSのプロセスは、クライアントアプリケーションの性能への影響を最小化するために、比較的少量のリソースを要求するように構成されてもよい。フロントエンド202、メモリコントローラ204、ならびに/または、バックエンド206および/もしくはSSDエージェント214は、ホスト201のプロセッサ上で、またはネットワークアダプタ218のプロセッサ上で動くことができる。マルチコアプロセッサについて、異なるVFSプロセスが、異なるコア上で動くことができ、サービスの異なるサブセットを動かすことができる。クライアントプロセス212の観点から、仮想ファイルシステムとのインターフェースは、VFSプロセスが動いている特定の物理マシンから独立している。クライアントプロセスは、ドライバ208およびフロントエンド202の役割を果たすために、ドライバ208およびフロントエンド202が存在することしか必要としない。
【0012】
[0018]ノードは、オペレーティングシステム上で直接的に動く単一のテナントサーバ(例えば、ベアメタル)として、または、ベアメタルサーバ内の仮想マシン(VM:virtual machine)および/もしくはコンテナ(例えば、Linuxコンテナ(LXC:Linux container))として実装することができる。VFSは、VM環境としてLXCコンテナ内で動くことができる。したがって、VMの内部では、動くことができるものだけがVFSを備えるLXCコンテナである。代表的なベアメタル環境には、ユーザ空間アプリケーションがあり、VFSがLXCコンテナ内で動く。他のコンテナ型アプリケーションをサーバが動かしている場合、VFSは、コンテナ導入環境(例えばDocker)の管理範囲外のLXCコンテナの内部で動くことができる。
【0013】
[0019]ノードは、オペレーティングシステムおよび/または仮想マシンモニタ(VMM:virtual machine monitor)(例えば、ハイパーバイザ)によってサービスされてもよい。VMMは、ホスト201上でノードを作り出し、動かすために使用されてもよい。複数のコアが、VFSを動かしている単一のLXCコンテナの内部に常駐することができ、VFSは、単一のLinuxカーネルを使用して、単一のホスト201上で動くことができる。したがって、単一のホスト201は、複数のフロントエンド202、複数のメモリコントローラ204、複数のバックエンド206、および/または、1つもしくは複数のドライバ208を備えることができる。ドライバ208は、LXCコンテナの範囲外のカーネル空間で動くことができる。
【0014】
[0020]ユーザ空間222でネットワーキングスタック210を動かすために、SR-IOV PCIe仮想機能が使用されてもよい。SR-IOVは、PCI Expressの分離を可能にし、その結果、単一の物理的なPCI Expressが仮想環境で共有されることが可能になり、単一の物理サーバマシン上の異なる仮想構成要素に、異なる仮
想機能が提供されることが可能になる。I/Oスタック210は、VFSノードが標準的なTCP/IPスタック220をバイパスし、ネットワークアダプタ218と直接的に通信することを可能にする。VFSドライバ208へのロックレス・キューを通じて、ポータブルオペレーティングシステムインターフェースフォーUNIX(登録商標)(POSIX)のVFS機能が提供されてもよい。また、SR-IOVまたは完全なPCIe物理機能アドレスが、ユーザ空間222で不揮発性メモリエクスプレス(NVMe:non-volatile memory express)ドライバ214を動かすために使用されてもよく、したがって、Linux IOスタックを完全にバイパスする。NVMeは、PCI Express(PCIe)バスを介して取り付けられた不揮発性ストレージ媒体216にアクセスために使用されてもよい。不揮発性ストレージ媒体220は、例えば、ソリッドステートドライブ(SSD)の形で入手できるフラッシュメモリ、または、SSDもしくはメモリモジュール(DIMM)の形で入手できる可能性があるストレージクラスメモリ(SCM)であってもよい。他の例は、3D-XPointなどのストレージクラスメモリ技術を含むことができる。
【0015】
[0021]SSDは、SSDエージェント214およびネットワーキング210と、物理的なSSD216を連結することによって、ネットワーク型デバイスとして実装されてもよい。代替として、SSDは、NVMe-oF(NVMe over Fabrics)などの、ネットワークプロトコルを使用することによって、ネットワーク接続型NVMe SSD222または224として実装されてもよい。NVMe-oFは、冗長なネットワークリンクを使用して、NVMeデバイスへのアクセスを可能にすることができ、このことにより、より高いレベルまたは回復力をもたらす。ネットワークアダプタ226、228、230および232は、NVMe SSD222および224を、サーバを使用しないネットワーク型NVMe-oFデバイスに変換するために、NVMe SSD222および224への接続のためのハードウェアアクセラレーションを備えることができる。NVMe SSDs222および224は、それぞれ、2つの物理ポートを備えることができ、データ全てが、これらのポートのいずれかを通じてアクセスされる可能性がある。
【0016】
[0022]各クライアントプロセス/アプリケーション212は、オペレーティングシステム上で直接動くことができるか、または、オペレーティングシステムおよび/もしくはハイパーバイザによってサービスされた仮想マシンおよび/もしくはコンテナ内で動くことができる。クライアントプロセス212は、その基本機能の実施中に、ストレージからデータを読み込むこと、および/または、ストレージにデータを書き込むことができる。それでも、クライアントプロセス212の基本機能は、ストレージ関連のものではない(すなわち、プロセスは、そのデータが確実に記憶され、必要なときに検索可能であることにしか関心がなく、どこで、いつ、またはどのようにデータが記憶されるかには関心がない)。このようなプロセスを生じる実例のアプリケーションは、eメールサーバ、ウェブサーバ、オフィス生産性アプリケーション、顧客関係管理(CRM)、アニメーテッドビデオレンダリング、ゲノミクス計算、チップデザイン、ソフトウェアビルド、およびエンタープライズリソースプラニング(ERP)を含む。
【0017】
[0023]クライアントアプリケーション212は、VFSドライバ208と通信する、カーネル224へのシステムコールを行うことができる。VFSドライバ208は、VFSフロントエンド202のキューに、対応するリクエストを入れる。いくつかのVFSフロントエンドが存在する場合、ドライバは、異なるフロントエンドにアクセスを負荷分散させることができ、確実に、単一のファイル/ディレクトリが同じフロントエンドを介して常にアクセスされるようにする。これは、ファイルまたはディレクトリのIDに基づいて、フロントエンドをシャーディングする(shard)ことによって行うことができる。VFSフロントエンド202は、その動作を担当するバケットに基づいて、適切なVFSバックエンドにファイルシステムリクエストをルートするためのインターフェースを提供する。適切なVFSバックエンドは、同じホスト上にあってもよく、または別のホスト上にあってもよい。
【0018】
[0024]VFSバックエンド206は、いくつかのバケットをホストし、バケットのうちの各1つが、仮想ファイルシステムを別のやり方で管理するためのタスク(例えば、負荷分散、ジャーナリング、メタデータの維持、キャッシング、階層間のデータの移動、古くなったデータの削除、破損したデータの訂正、等)を受け取り、実行するというファイルシステムリクエストをサービスする。
【0019】
[0025]VFS SSDエージェント214は、それぞれのストレージデバイス216との対話を遂行する。これは、例えば、アドレスを翻訳すること、および、(例えば、SATA、SAS、PCIe、または他の適切なバス上の)ストレージデバイスに発行されるコマンドを生成することを含むことができる。したがって、VFS SSDエージェント214は、ストレージデバイス216と、仮想ファイルシステムのVFSバックエンド206との間の中間体として動作する。SSDエージェント214は、NVMe-oF(NVMe over Fabrics)などの、標準プロトコルをサポートする標準的なネットワークストレージデバイスと通信することもできる。
【0020】
[0026]図3は、本開示の実例の実装形態による分散型ファイルシステムの別の表現を示す。図3では、要素302は、上記の図2について説明されたものなどの、仮想ファイルシステムを常駐させる様々なノード(計算、ストレージ、および/またはVFS)の、メモリリソース(例えば、DRAMおよび/または他の短期メモリ)、ならびに処理リソース(例えば、x86プロセッサ、ARMプロセッサ、NIC、ASIC、FPGA、および/または同様のもの)を表す。要素308は、仮想ファイルシステムの長期ストレージを提供する1つまたは複数の物理ストレージデバイス216を表す。
【0021】
[0027]図3に示されるように、物理ストレージは、複数の分散型耐障害性アドレス空間(DFRAS:distributed failure resilient address space)518に編成される。これらのそれぞれは、複数のチャンク310を含み、複数のチャンク310は、複数のブロック312を含む。チャンク310へのブロック312の編成は、いくつかの実装形態で利便性があるだけであり、全ての実装形態で行われなくてもよい。各ブロック312は、コミットされたデータ316(これは、様々な状態を呈することができ、下記で論じられる)、および/または、コミットされたデータ316を説明または参照するメタデータ314を記憶する。
【0022】
[0028]複数のDFRASへのストレージ308の編成は、仮想ファイルシステムのノードの多く(おそらく全て)からの高性能並行コミットを可能にする(例えば、図1の全てのノード104~104、106~106、および120~120が、同時コミットを並行に実施することができる)。1つの実例の実装形態では、仮想ファイルシステムのノードのそれぞれは、複数のDFRASのうちのそれぞれの1つまたは複数を所有し、ノードが所有するDFRASへの排他的な読込み/コミットアクセス権を有することができる。
【0023】
[0029]各バケットは、DFRASを所有し、したがって、DFRASに書き込むときに、他のどのノードとも協調する必要はない。各バケットは、多くの異なるSSD上の多くの異なるチャンクにまたがってストライプを構築することができ、したがって、バケットのDFRASを有する各バケットは、多くのパラメータに現在基づいて、どの「チャンクストライプ」に書き込むべきかを選ぶことができ、このバケットにチャンクがアロケートされると、そうするために必要な協調はない。全てのバケットは、なにも協調する必要なく、全てのSSDに効果的に書き込むことができる。
【0024】
[0030]各DFRASが、特定のノード上で動くDFRASの所有者バケットだけに所有され、アクセス可能であることは、(ストレージ308への実際の読込み/コミットに対して非同期的に実施されることが可能な、例えば、初期化中、またはノードの故障後の、DFRASを保持するバケットの(再)割当て中を除いて)VFSのノードのそれぞれが、他のどのノードとも協調する必要なく、ストレージ308の一部を制御することを可能にする。したがって、このような実装形態では、各ノードは、他のノードが何をしているかに関わらず、ノードのバケットのDFRASに対して読込み/コミットを行うことができ、ストレージ308への読込みおよびコミットの際に、どのようなコンセンサスにも達する必要はない。さらに、特定のノードの故障の場合には、特定のノードが複数のバケットを所有するということが、他のノードへのノードの作業負荷の、よりインテリジェントかつ効率的な再配分を可能にする(ある程度、全作業負荷を単一のノードに割り当てなければならず、これは、「ホットスポット」作り出す可能性がある)。この点に関して、いくつかの実装形態では、バケットの数は、任意の1つのバケットが、別のノードにかけることになる負荷を比較的小さくすることができるように、システムにおけるノードの数に比べて大きくてもよい。これは、他のノードの能力および容量に応じた、故障したノードの負荷のきめ細かい再配分を可能にする(例えば、能力および容量が大きいノードには、より大きい割合の故障したノードバケットが与えられてもよい)。
【0025】
[0031]このような動作を可能にするために、ストレージ308への読込みおよびコミットが、適切なノードにリダイレクトされることが可能になるように、バケットの現在の所有ノードに各バケットをマッピングするメタデータが維持されてもよい。
【0026】
[0032]全ファイルシステムのメタデータ空間(例えば、ディレクトリ、ファイル属性、ファイル内の内容範囲、等)が、小さく一様な断片(例えば「シャード(shard)」)に分解される(例えば、細断される、またはシャーディングされる)ことが可能なので、負荷分散は可能である。例えば、30k個のサーバを有する大きいシステムは、128k個または256k個のシャードにメタデータ空間を細断することができる。
【0027】
[0033]それぞれのこのようなメタデータのシャードは、「バケット」内に維持されてもよい。各VFSノードは、いくつかのバケットにまたがって担当することができる。所与のバックエンド上でバケットがメタデータのシャードをサーブしているとき、バケットは、「アクティブ」であるか、または、このバケットの「リーダ(leader)」であるとみなされる。典型的には、VFSノードよりはるかに多くのバケットがある。例えば、6個のノードを有する小さいシステムは、120個のバケットを有することができ、1,000個のノードを有するより大きいシステムは、8k個のバケットを有することができる。
【0028】
[0034]各バケットは、ノードが、ノードのバケットに対してペンタグループを形成する典型的には5つのノードといった、ノードの小さいセット上に対してアクティブであってもよい。クラスタ構成は、各バケットへのペンタグループの割当てについて、全ての参加ノードを最新に保つ。
【0029】
[0035]各ペンタグループは、それ自体を監視する。例えば、クラスタが10k個のサーバを有し、各サーバが6個のバケットを有する場合、各サーバは、そのバケットのステータスを維持するために、30個の異なるサーバと会話する必要しかなくなる(6個のバケットは、6個のペンタグループを有することになるので、6×5=30である)。これは、集中型エンティティが全てのノードを監視し、クラスタ全体の状態を保たなければならない場合より、はるかに少ない数である。ペンタグループの使用は、クラスタサイズが大きくなったときでも、より多くの作業をノードが実施しないので、より大きいクラスタで性能の規模を変更することを可能にする。これは、「ダム(dumb)」モードでは、小さいクラスタが、物理ノードが存在するよりも多くの通信を実際に生成する可能性があるという短所を課す可能性があるが、この短所は、サーバが共有するバケット全てを有する2つのサーバ間で、ただ1つのハートビートを送ることによって克服される(クラスタが大きくなるにつれて、これは、ただ1つのバケットに変化することになるが、小さい5つのサーバクラスタを有している場合、クラスタは、全てのメッセージに全てのバケットを含むだけになり、各サーバは、他の4つと会話するだけになる)。ペンタグループは、Raftコンセンサスアルゴリズムに似たアルゴリズムを使用して、決定する(すなわち、コンセンサスに達する)ことができる。
【0030】
[0036]各バケットは、バケットを動かすことができる計算ノードのグループを有することができる。例えば、5つのVFSノードは、1つのバケットを動かすことができる。それでも、グループ内のノードのただ1つが、任意の与えられた瞬間におけるコントローラ/リーダである。さらに、2つのバケットは、十分大きいクラスタのために同じグループを共有しない。クラスタ内に5つまたは6つのノードしかない場合、ほとんどのバケットは、バックエンドを共有することができる。適度に大きいクラスタには、多くの別個のノードグループがある。例えば、26個のノードで、
【数1】
より多くの可能な5ノードグループ(すなわち、ペンタグループ)がある。
【0031】
[0037]グループ内の全てのノードは、ノードがこのバケットの実際のアクティブコントローラ(すなわち、リーダ)であることについて、知っており、同意する(すなわち、コンセンサスに達する)。バケットにアクセスするノードは、グループの(例えば、5つの)メンバから、このバケットに対するリーダだった最後のノードを覚えていること(「キャッシュすること」)ができる。ノードが、バケットリーダにアクセスする場合、バケットリーダは、リクエストされた動作を実施する。現在のリーダではないノードにバケットがアクセスする場合、このノードは、アクセスを「リダイレクトする」ようにリーダに指示する。キャッシュされたリーダノードにアクセスするタイムアウトがある場合、接触するノードは、同じペンタグループの異なるノードを試行することができる。クラスタ内のノード全てがクラスタの共通「構成」を共有し、これにより、ノードは、どのサーバが各バケットを動かすことができるかについて知ることができる。
【0032】
[0038]各バケットは、ファイルシステム上で動いているアプリケーションによってどれだけ激しくバケットが使用されているかを示す負荷値/使用量値を有することができる。例えば、11個の軽く使用されるバケットを有するサーバノードは、使用されるバケットの数に不均衡がある場合でも、9個の激しく使用されるバケットを有するサーバの前に動かすために、メタデータの別のバケットを受け取ることができる。負荷値は、平均レスポンスレイテンシ、同時に動く動作の数、消費されるメモリ、または他の基準値に従って決定されてもよい。
【0033】
[0039]再配分は、VFSノードが故障していないときでも同様に発生させることができる。追跡した負荷基準値に基づいて、1つのノードが、他よりもビジー状態であることをシステムが識別した場合、システムは、あまりビジー状態ではない別のサーバに、システムのバケットのうちの1つを移動させる(すなわち、「フェールオーバー」させる)ことができる。それでも、異なるホストにバケットを実際に移す前に、書込みと読込みをそらすことによって、負荷分散が達成されてもよい。それぞれの書込みは、最終的に、DFRASによって判定されたノードの異なるグループで終わる可能性があるので、より高い負
荷を有するノードが、データが書き込まれているストライプの中にあるように選択される可能性はない。また、システムは、非常に負荷の高いノードからの読込みをサーブしないように選ぶこともできる。例えば、「劣化モード読込み(degraded mode read)」が実施されてもよく、非常に負荷の高いノードにおけるブロックは、同じストライプの他のブロックから再現される。劣化モード読込みは、同じストライプ内の残りのノードによって実施される読込みであり、データは、障害保護を介して再現される。劣化モード読込みは、このノードがダウンしていることを、読込みのイニシエータが仮定することができるので、読込みレイテンシがとても高いときに実施されてもよい。より高い読込みレイテンシを作り出すのに十分、負荷が高い場合、クラスタは、他のノードからこのデータを読み込むこと、および、劣化モード読込みを使用して、必要なデータを再現することに戻ることができる。
【0034】
[0040]各バケットは、独自の分散型イレイジャコーディングインスタンス(すなわち、DFRAS518)を管理し、他のバケットと連携して、読込みまたは書込み動作を実施する必要がない。異なるバケットに対してそれぞれ、同時に作業する何千もの同時の分散型イレイジャコーディングインスタンスが潜在的に存在する。これは、任意の大きいファイルシステムが、協調される必要がない独立した断片に分割されることを効果的に可能にするので、スケーリング性能の切り離せない部分であり、したがって、スケールに関わらず高性能をもたらす。
【0035】
[0041]各バケットは、そのシャードに属するファイルシステム動作全体を遂行する。例えば、ディレクトリ構造、ファイル属性、およびファイルデータ範囲は、特定のバケットの管轄区域に属することになる。
【0036】
[0042]任意のフロントエンドから行われる動作は、どのバケットがこの動作を所有しているかを見つけ出すことによってスタートする。次に、このバケットに対するバックエンドリーダ、およびノードが決定される。この決定は、既知の最新のリーダを試行することによって実施されてもよい。既知の最新のリーダが現在のリーダではない場合、このノードは、どのノードが現在のリーダであるかを知ることができる。既知の最新のリーダが、もはやバケットのペンタグループの一部ではない場合、このバックエンドは、フロントエンドが構成に戻って、バケットのペンタグループのメンバを見つけるべきであることをフロントエンドに知らせることになる。動作の分散は、標準システム内の単一のコンピュータによってではなく、複数のサーバによって、複雑な動作が遂行されることを可能にする。
【0037】
[0043]クラスタのサイズが小さく(例えば、5)、ペンタグループが使用される場合、同じグループを共有するバケットが存在することになる。クラスタサイズが大きくなると、2つのグループが同一にならないように、バケットが再分散される。
【0038】
[0044]故障ドメインは、単一の構成要素の故障により、故障する(完全に、または一時的に利用不能になる)可能性のあるストレージデバイスのセットである。単一のサーバの故障がSSDのグループをダウンさせることになる場合、単一のサーバ上のSSDのこのグループは、故障ドメインとみなされてもよい。ラックが単一のネットワークスイッチを有する場合、このラックは、スイッチの故障により、全ラックがアクセス不能になる場合、故障ドメインとみなされる可能性がある。故障ドメインは、設置時に構成されてもよい。また、故障ドメインの構成は、グラフィカルユーザインターフェース(GUI)、コマンドラインインターフェース(CLI)、またはアプリケーションプログラミングインターフェース(API)から制御されてもよい。故障ドメインの定義が設定されていない場合、単一のサーバが、故障ドメインとして使用されてもよい。このサーバ上にあるSSDの全てが、データ配置の観点から、大きい単一のSSDとして扱われてもよい。
【0039】
[0045]図4は、本開示の実例の実装形態による分散型ファイルシステム400の表現を示す。分散型ファイルシステム400は、第1の故障ドメイン409a、第2の故障ドメイン409b、および第3の故障ドメイン409cを備える。
【0040】
[0046]第1の故障ドメイン409aは、少なくとも1つのサーバ401a、および少なくとも1つのストレージデバイス411aを備える。サーバ401aは、第1のフロントエンド403aおよび第1のバックエンド405aを備える。第1のバックエンド405aは、少なくとも1つのバケット407aを備える。少なくとも1つのストレージデバイス411aは、複数のソリッドステートデバイスを備えることができる。少なくとも1つのストレージデバイス411aは、例えば、ブロックa1およびブロックa2といった、複数のブロックに構成されてもよい。
【0041】
[0047]第2の故障ドメイン409bは、少なくとも1つのサーバ401bおよび少なくとも1つのストレージデバイス411bを備える。サーバ401bは、第2のフロントエンド403bおよび第2のバックエンド405bを備える。第2のバックエンド405bは、少なくとも1つのバケット407bを備える。少なくとも1つのストレージデバイス411bは、複数のソリッドステートデバイスを備えることができる。少なくとも1つのストレージデバイス411bは、例えば、ブロックb1およびブロックb2といった、複数のブロックに構成されてもよい。
【0042】
[0048]第3の故障ドメイン409cは、少なくとも1つのサーバ401cおよび少なくとも1つのストレージデバイス411cを備える。サーバ401cは、第3のフロントエンド403cおよび第3のバックエンド405cを備える。第3のバックエンド405cは、少なくとも1つのバケット407cを備える。少なくとも1つのストレージデバイス411cは、複数のソリッドステートデバイスを備えることができる。少なくとも1つのストレージデバイス411cは、例えば、ブロックc1およびブロックc2といった、複数のブロックに構成されてもよい。
【0043】
[0049]バケット407a、407b、および407cは、複数のブロックを含む耐障害性ストライプを構築するように動作可能である。例えば、第1のバックエンド405aにおけるバケット407aは、ストライプ413を構築することができ、ストライプ413は、第1の故障ドメイン409aのブロックa1およびa2、第2の第1の故障ドメイン409bのブロックb1およびb2、ならびに、第3の故障ドメイン409cのブロックc1およびc2を含む。複数のブロックa1、a2、b1、b2、c1、およびc2のうちの2つ以上のブロックは、エラー訂正情報を含むように構成される。
【0044】
[0050]第1の故障ドメイン409aの故障時、ブロックa1およびa2は、ブロックb1、b2、c1、および/またはc2に応じて再生成されてもよい。第2の故障ドメイン409bの故障時、ブロックb1およびb2は、ブロックa1、a2、c1、および/またはc2に応じて再生成されてもよい。
【0045】
[0051]第1の故障ドメイン409aおよび第2の故障ドメイン409bが互いに通信を喪失した場合、第3の故障ドメイン409cは、第1の故障ドメイン409aと第2の故障ドメイン409bのどちらが、システムを動かし続けることになるかを判定するように動作可能である。第3の故障ドメイン409cによって許可が与えられない限り、第1の故障ドメイン409aも第2の故障ドメイン409bも耐障害性ストライプ413を再構築しない。第3の故障ドメイン409cのブロックc1およびc2は、ストライプ413を再構築する際に使用されるデータを含んでも、含まなくてもよい。
【0046】
[0052]第1のバックエンド405aにおけるバケット405cが、耐障害性ストライプ413の初期リーダであってもよい。それでも、第1の故障ドメインの故障時には、第2のバックエンド405bのバケット407bが、再構築された耐障害性ストライプ413のリーダになることができる。再構築された耐障害性ストライプ413は、第1の故障ドメイン409aが利用不能である場合、ブロックa1およびa2を使用することができない。
【0047】
[0053]大きい故障ドメインが定義されてもよい。例えば、この故障ドメイン内のサーバ全てにあるSSDの全ては、データ配置およびストライプ構成が考慮されるとき、SSDの全てが、1つの大きいSSDストレージデバイスであるかのように扱われてもよい。これは、同じ故障ドメイン上の同じストライプに対する2つのデータブロックがなくても、ストライプが他の故障ドメインから常に再構築されることを可能にするので、ファイルシステムが、完全な故障ドメインの故障に耐えることを可能にする。
【0048】
[0054]より大きい故障ドメインは、ストライプグループの量を減らし、再構築時間を増加させる。再構築プロセスは、他の故障ドメイン内の全ての利用可能なコンピュータから動くことができるので、全てのストライプが、同時に再構築されてもよい。
【0049】
[0055]最も広いストライプサイズは、故障ドメインの量で限定されてもよい。例えば、10個の故障ドメインでは、8つのデータブロックが、2つのエラー保護/訂正ブロックで(すなわち、8+2個のストライプを使用して)保護されることが可能である。同様に、10個の故障ドメインでは、6つのデータブロックが、4つのエラー保護/訂正ブロックで(すなわち、6+4個のストライプを使用して)保護されることが可能である。
【0050】
[0056]また、故障ドメインは、各故障ドメイン内の単一のストライプから、データ配置の最大量を限定することができる。例えば、3つまたは4つのデータセンタを大都市圏に有する組織は、そのデータセンタ全てにまたがってクラスタを動かすことができるので、1つのデータセンタが故障した場合、残りのデータセンタが動作を続けることができる。
【0051】
[0057]3つのデータセンタでは、ファイルシステムは、5+4個の方式で保護されることが可能であり、ここで、3つ以下のデータが、同じ故障ドメインにあってもよい。この例では、データセンタが故障した場合でも、再構築するために使用されることが可能な各ストライプからの、少なくとも6つのデータを有する2つの他のデータセンタが依然として存在する。3つのデータセンタのケースは、同じ故障ドメイン内に2つ以下のデータがある4+2個の保護を使用することもできる。4つのデータセンタでは、例えば、同じ故障ドメイン内に2つ以下のデータがある4+2個の保護が使用されることが可能である。
【0052】
[0058]2つのデータセンタは、各データセンタ内に2つ以下のデータピース/ブロックがある2+2個のデータ保護を使用することができる。それでも、このケースは、どのデータセンタが活動しているかをファイルシステムが判定する必要があり、このことにより、独立して作動をスタートする2つのデータセンタにクラスタが単に分かれる「スプリットブレイン」の状況を防ぐ。「スプリットブレイン」のシナリオを防ぐために、別のインスタンス/サーバが、第3のデータセンタに追加されてもよい。第3のデータセンタは、2つのデータセンタとの通信を監視/制御することができ、第1および第2のデータセンタが互いに通信を喪失した場合、(例えば、第3の故障ドメインにおける)この第3のデータセンタは、サーバのどちらの半分が、システムとして動き続けることができるかを判定すること(ならびに、第1および第2のデータセンタ内のサーバに知らせること)ができる。動作し続ける(およびデータの再構築をスタートする)ための許可を、タイブレーカノード(第3のデータセンタ)がハーフクラスタに与えない限り、ハーフクラスタは、ハーフクラスタ自体で作動することを促進されることはない。
【0053】
[0059]このような状況の中で再構築するとき、残りの故障ドメインが全てダウンしている限り、ファイルシステムは、アップしている残りの故障ドメインにデータを再構築して、個々のサーバ故障に対する高い回復力を維持することになる。この故障ドメインがオンラインに戻ると、データは、各故障ドメイン上の各ストライプから、データピースの必要な最大量を維持するために、再配布される(もう一度再構築される)ことになる。
【0054】
[0060]可用性グループは、ともにフェールオーバーし、故障ドメインとみなされるサーバのグループである。可用性グループがアップしているとき、可用性グループは、データにアクセスすることができる。可用性グループがともにダウンしているとき、他のサーバは、システムの定義されたデータセットにまたがるデータに依然としてアクセスすることができる。可用性グループは、データ分散を制御する別の方式である。可用性グループは、互いに保護するサーバおよびファイルシステムのグループ(例えば、大きい名前空間のサブセット)を選ぶ。可用性グループは、例えば、このデータセンタ内の特定の部屋にあってもよい。これらのサーバがアップしている限り、このファイルシステムのための全てのデータが、他のサーバにではなく、これらのサーバに記憶されることになる。その結果、他のサーバが故障しても(例えば、データセンタの他の部屋が電力を喪失しても)、このファイルシステムは、これらのサーバ上で依然として利用可能になる。また、可用性グループは、単一のラック内の全てのサーバとして定義することができる。このラックがアップし、動いている限り、サービスは、クラスタの他のラックから独立したこのラックから動作を続けることができる。
【0055】
[0061]図5は、本開示の実例の実装形態による分散型ファイルシステムを生成するための実例の方法を示す流れ図である。ブロック501では、複数のデータピースが、第1の故障ドメインによって受け取られる。ブロック503では、複数のエラー訂正ピースが、複数のデータピースに応じて生成される。ブロック505では、複数のブロックを含む耐障害性ストライプが、第1の故障ドメインの第1のバックエンドによって構築される。耐障害性ストライプは、第1のバックエンド内のバケットによって構築されてもよい。第1のバックエンド内のこのバケットは、別のバケットがリーダに昇格されるまで、耐障害性ストライプのリーダになる。
【0056】
[0062]複数のブロックの各ブロックは、複数のデータピースのうちの1つのデータピース、または複数のエラー訂正ピースのうちの1つのエラー訂正ピースを含む。ブロック507では、耐障害性ストライプの2つ以上のブロックが、第1の故障ドメイン内に置かれ、耐障害性ストライプの2つ以上の他のブロックが、第2の故障ドメイン内に置かれる。
【0057】
[0063]ブロック509では、第1の故障ドメインが故障した場合、第1の故障ドメイン内のブロックが、第2の故障ドメイン内のブロックに応じて再生成される。ブロック511では、第2の故障ドメインが故障した場合、第2の故障ドメイン内のブロックが、第1の故障ドメイン内のブロックに応じて再生成される。
【0058】
[0064]ネットワーククラスタ内に2個の故障ドメインしかない場合、第1および第2の故障ドメインが互いに通信を喪失したことを、別のデバイスが検出することができる。この他のデバイスは、次に、第1の故障ドメインと第2の故障ドメインのどちらが、耐障害性ストライプを再構築することになるかを判定することができる。一定の実施形態では、第3の故障ドメインによって許可が与えられない限り、第1の故障ドメインも第2の故障ドメインも耐障害性ストライプを再構築することができない。
【0059】
[0065]バケットリーダが、故障しているドメイン内にある場合、別の故障ドメイン内のバケットが、耐障害性ストライプが再構築されたときに、耐障害性ストライプのリーダに
なるように昇格されてもよい。
【0060】
[0066]図6は、複数のソリッドステートストレージディスク上に2つの分散型耐障害性アドレス空間が常駐する実例の実装形態を示す。
【0061】
[0067]チャンク9101,1~910D,Cは、複数のチャンクストライプ920~920(Sは整数である)に編成されてもよい。1つの実例の実装形態では、各チャンクストライプ920(sは整数であり、ここで、1≦s≦Sである)は、前方誤り訂正(例えば、イレイジャコーディング)を使用して別々に保護される。したがって、任意の特定のチャンクストライプ920sにおけるチャンク910d,cの数は、所望のレベルのデータ保護に基づいて決定されてもよい。
【0062】
[0068]例証のために、各チャンクストライプ920が、N=M+K(ここで、N、M、およびKのそれぞれは整数である)個のチャンク910d,cを含むと仮定すると、N個のチャンク910d,cのうちのM個は、データディジット(典型的には、現在のストレージデバイスのためのバイナリディジットまたは「ビット」)を記憶することができ、N個のチャンク910d,cのうちのK個は、保護ディジット(やはり、典型的には、ビット)を記憶することができる。各ストライプ920について、次に、仮想ファイルシステムは、N個の異なる故障ドメインからN個のチャンク910d,cを割り当てることができる。
【0063】
[0069]本明細書で使用されるように、「故障ドメイン」は、構成要素のうちの任意のただ1つの故障(構成要素が電力を喪失すること、反応しなくなること、および/または同様のもの)が、構成要素全ての故障を生じる可能性がある構成要素のグループを指す。例えば、ラックが、単一のトップオブザラックスイッチを有する場合、このスイッチの故障が、このラック上の(例えば、計算、ストレージ、および/またはVFSノードといった)構成要素全てへの接続をダウンさせることになる。したがって、残りのシステムに対して、これは、このラック上の構成要素全てが一緒に故障した場合に等しい。本開示による仮想ファイルシステムは、チャンク910より少ない故障ドメインを含むことができる。
【0064】
[0070]仮想ファイルシステムのノードが、このようなノードあたり1つのストレージデバイス906しかないという完全に冗長な方式で接続され、電力供給される1つの実例の実装形態では、故障ドメインは、この単一のストレージデバイス906だけになる可能性がある。したがって、1つの実例の実装形態では、各チャンクストライプ920は、ストレージデバイス906~906のうちのN個のそれぞれに常駐する複数のチャンク910d,cを含む(したがって、DはNより大きいか、または等しい)。このような実装形態の例が図9に示される。
【0065】
[0071]図6では、D=7、N=5、M=4、K=1であり、ストレージは、2つのDFRASに編成される。これらの数は例証にすぎず、限定することを意図するものではない。第1のDFRASの3つのチャンクストライプ920が、例証として任意にコールアウトされる。第1のチャンクストライプ920は、チャンク9101,1、9102,2、9103,3、9104,5、および9105,6からなり、第2のチャンクストライプ920は、チャンク9103,2、9104,3、9105,3、9106,2、および9107,3からなり、第3のチャンクストライプ920は、チャンク9101,4、9102,4、9103,5、9105,7、および9107,5からなる。
【0066】
[0072]図6の単純な例ではD=7かつN=5であるが、実際の実装形態では、Dは、(例えば、1より大きい整数の倍数による、および場合によっては、多くの桁数による)Nよりはるかに大きくてもよく、2つの値は、N個のストレージデバイス906の同じセットに(または、より一般には、N個の故障ドメインの同じセットに)常駐する単一のDFRASの任意の2つのチャンクストライプ920の確率が所望の閾値を下回るように選ばれてもよい。このように、任意の単一のストレージデバイス906(または、より一般には、任意の単一の故障ドメイン)の故障は、(DおよびNの選ばれた値、N個のストレージデバイス906のサイズ、ならびに故障ドメインの配置に基づいて決定された所望の統計学的確率で)任意の特定のストライプ920の多くても1つのチャンク910b,cの喪失を生じることになる。さらに、2重の故障により、圧倒的多数のストライプが、多くても1つのチャンク910b,cを喪失することになり、(DおよびNの値に基づいて決定された)少数のストライプだけが、任意の特定のストライプ920から2つのチャンクを喪失することになる(例えば、2つの故障ストライプの数は、1つの故障ストライプの数より指数関数的に小さくなる可能性がある)。
【0067】
[0073]例えば、各ストレージデバイス906が1TBであり、各チャンクが128MBである場合、ストレージデバイス906の故障により、(DおよびNの選ばれた値、N個のストレージデバイス906のサイズ、ならびに故障ドメインの配置に基づいて決定された所望の統計学的確率で)7812(=1TB/128MB)個のチャンクストライプ920が1つのチャンク910を喪失することになる。それぞれのこのような影響を受けたチャンクストライプ920について、喪失チャンク910d,cは、適切な前方誤り訂正アルゴリズム、およびチャンクストライプ920の他のN-1個のチャンクを使用して、素早く再現されることが可能である。さらに、影響を受けた7812個のチャンクストライプが、ストレージデバイス906~906の全てにわたって一様に分散されるので、喪失した7812個のブロック910d,cを再現することは、(DおよびNの選ばれた値、N個のストレージデバイス906のサイズ、ならびに故障ドメインの配置に基づいて決定された所望の統計学的確率で)ストレージデバイス906~906のそれぞれから同じ量のデータを読み込むことを伴うことになる(すなわち、喪失データを再現する負担は、故障からの非常に素早い回復をもたらすように、ストレージデバイス906~906の全てにわたって一様に分散される)。
【0068】
[0074]次に、ストレージデバイス906~906のうちの2つの同時故障(または、より一般には、2つの故障ドメインの同時故障)のケースに移ると、ストレージデバイス906~906の全てにわたる各DFRASのチャンクストライプ920~920の一様な分散により、非常に少数のチャンクストライプ920~920だけが、これらのN個のチャンクのうちの2つを喪失していることになる。仮想ファイルシステムは、チャンクストライプ920~920とストレージデバイス906~906との間のマッピングを示すメタデータに基づいて、このような2つの喪失チャンクストライプを素早く識別するように動作可能であってもよい。このような2つの喪失チャンクストライプが識別されると、仮想ファイルシステムは、1つの喪失チャンクストライプの再現を始める前に、これらの2つの喪失チャンクストライプの再現を優先させることができる。残りのチャンクストライプは、単一の喪失チャンクだけを有することになり、これら(影響を受けたチャンクストライプの大半)について、2つのストレージデバイス906の同時故障は、ただ1つのストレージデバイス906の故障と同じである。類似の原理は、第3の同時故障などに適用される(3つの故障ブロックを有するチャンクストライプの数は、2つの同時故障シナリオにおける2つの故障ブロックを有する数よりむしろ小さくなる)。1つの実例の実装形態では、チャンクストライプ920の再現が実施される比率は、チャンクストライプ920内の喪失の数に基づいて制御されてもよい。これは、例えば、再現のための読込みおよびコミットが実施される比率、再現のためのFEC計算が実施される比率、再現のためのネットワークメッセージが通信される比率、等を制御することによって達成されてもよい。
【0069】
[0075]図7は、本開示の実例の実装形態による仮想ファイルシステムの不揮発性メモリ
に記憶されたデータを保護するために使用されることが可能な前方誤り訂正方式を示す。DFRASのブロックストライプ930~930のストレージブロック9021,1~9027,7が示される。図7の保護方式では、各ストライプの5つのブロックが、データディジットのストレージのためのものであり、各ストライプの2つのブロックが、保護ディジットのデータストレージのためのものである(すなわち、M=5かつK=2である)。図7では、以下の方程式(1)~(9)を使用して、保護ディジットが計算される。
【数2】
【0070】
[0076]したがって、図7における4つのストライプ930~930は、マルチストライプ(この場合、4つのストライプ)FEC保護ドメインの一部であり、ブロックストライプ930~930のいずれかにおける任意の2つ以下のブロックの喪失は、上記の方程式(1)~(9)の様々な組合せを使用することによって回復されることが可能である。比較として、単一のストライプ保護ドメインの例は、D1、D2、D3、D4、D5がP1によってのみ保護され、D1、D2、D3、D4、D5、およびP1が、ストライプ930に全て書き込まれる場合である(930は、単一のストライプFEC保護ドメインである)。
【0071】
[0077]本開示の実例の実装形態によれば、複数のコンピューティングデバイスは、ネットワークを介して互いに通信連結され、複数のコンピューティングデバイスのそれぞれは、複数のストレージデバイスの1つまたは複数を備える。複数の耐障害性アドレス空間は、複数の耐障害性アドレス空間のそれぞれが複数のストレージデバイスに及ぶように、複数のストレージデバイスにわたって分散される。複数の耐障害性アドレス空間のうちのそれぞれの1つは、複数のストライプ(例えば、図6および図7におけるような複数の930)に編成される。複数のストライプのそれぞれの1つまたは複数のストライプは、複数の前方誤り訂正(FEC)保護ドメイン(例えば、図6などにおけるマルチストライプFECドメイン)のうちのそれぞれの1つの一部である。複数のストライプのそれぞれは、複数のストレージブロック(例えば、複数の912)を含むことができる。複数のストライプのうちの特定の1つの各ブロックは、複数のストレージデバイスのうちの異なる1つに常駐することができる。複数のストレージブロックの第1の部分(例えば、図7のストライプ930の9021,2~9021,6からなる5つの量)は、データディジットの記憶のためのものであってもよく、複数のストレージブロックの第2の部分(例えば、図7のストライプ930の9021,1および9021,7の2つの量)は、データディジットに少なくとも部分的に基づいて計算された保護ディジットの記憶のためのものであってもよい。
【0072】
[0078]複数のコンピューティングデバイスは、複数のストライプにランクをつけるように動作可能であってもよい。ランクは、複数の耐障害性アドレス空間のうちの1つへの次のコミット動作のために、複数のストライプのどれを使用するべきかを選択するために使用されてもよい。ランクは、保護されたおよび/または保護されていないストレージブロックが、どれだけ複数のストライプのそれぞれにあるかに基づくことができる。複数のストライプのうちの任意の特定の1つについて、ランクは、複数のストライプのうちの特定の1つを有する複数のストレージデバイス上に記憶されたビットマップに基づくことができる。ランクは、データを現在記憶しているどれだけのブロックが、複数のストライプのそれぞれにあるかに基づくことができる。ランクは、複数のストライプのそれぞれにコミットするための、読込みおよび書込みのオーバヘッドに基づくことができる。耐障害性アドレス空間のそれぞれは、複数のコンピューティングデバイスのうちのただ1つによって、いつでも所有されてよく、複数の耐障害性アドレス空間のうちのそれぞれの1つは、その所有者によってのみ、読込みおよび書込みが行われてもよい。コンピューティングデバイスのそれぞれは、耐障害性アドレス空間の複数を所有することができる。複数のストレージデバイスは、複数の故障ドメインに編成されてもよい。複数のストライプのうちのそれぞれの1つが、複数の故障ドメインに及んでもよい。耐障害性アドレス空間のそれぞれは、複数の故障ドメインの全てに及んでもよく、これにより、複数の故障ドメインのうちの任意の特定の1つの故障時に、喪失データを再現するための作業負荷が、複数の故障ドメインの他のそれぞれの間に分散される。複数のストライプは、複数の故障ドメインのうちの2つの同時故障の場合、複数の故障ドメインの故障した2つに常駐する複数のストライプのうちの任意の特定の1つの2つのブロックの機会が、複数の故障ドメインの故障した2つに常駐する複数のストライプのうちの任意の特定の1つのただ1つのブロックの機会より指数関数的に小さくなるように、複数の故障ドメインにわたって分散されてもよい。
【0073】
[0079]複数のコンピューティングデバイスは、2つの故障ブロックを有する複数のストライプのいずれかを最初に再現し、次に、ただ1つの故障ブロックを有する複数のストライプのいずれかを再現するように動作可能であってもよい。複数のコンピューティングデバイスは、ただ1つの故障ブロックを有する複数のストライプの再現の比率より(例えば、より大きい割合の再現専用のCPUクロックサイクル、より大きい割合の再現専用のネットワーク伝送機会、および/または同様のものによる)高い比率で、2つの故障ブロックを有する複数のストライプの再現を実施するように動作可能であってもよい。複数のコンピューティングデバイスは、故障ドメインの1つまたは複数の故障の場合、複数のストライプのうちの同じ1つの他のブロックがどれだけ失われたかに基づいて、任意の特定の喪失ブロックが再現される比率を決定するように動作可能であってもよい。複数の故障ドメインの1つまたは複数は、複数のストレージデバイスを含む。複数のFEC保護ドメインのそれぞれは、複数のストライプのうちの複数のストライプに及んでもよい。
【0074】
[0080]複数のストライプは、複数のグループ(例えば、図6におけるようなチャンクストライプ920~920)に編成されてもよく、ここで、複数のグループのそれぞれは、複数のストライプの1つまたは複数を含み、複数のコンピューティングデバイスは、グループのそれぞれについて、グループの複数のストライプの1つまたは複数にランクをつけるように動作可能である。複数のコンピューティングデバイスは、グループの複数のストライプの1つまたは複数が、決定された尺度をもはや満たさなくなるまで、複数のグ
ループのうちの選択された1つへの連続コミット動作を実施すること、および、複数のグループのうちの選択された1つが、決定された尺度をもはや満たさなくなると、複数のグループのうちの異なる1つを選択することを行うように動作可能であってもよい。尺度は、新しいデータが書き込まれるのに、どれだけのブロックが利用可能であるかに基づくことができる。
【0075】
[0081]一定の実装形態を参照しつつ、本方法および/またはシステムが説明されてきたが、本方法および/またはシステムの範囲から逸脱することなく、様々な変更が行われてもよく、同等物が代用されてもよいということが当業者によって理解されよう。さらに、本開示の範囲から逸脱することなく、本開示の教示に、特定の状況または材料を適合させるために、多くの修正が行われてもよい。したがって、本方法および/またはシステムが、開示された特定の実装形態に限定されるのではなく、本方法および/またはシステムが、添付の特許請求の範囲に入る全ての実装形態を含むことになるということを意図するものである。
【0076】
[0082]本明細書で利用されるように、用語「回路」および「回路機器」は、物理的な電子構成要素(すなわちハードウェア)、ならびに、ハードウェアを構成するか、ハードウェアによって実行されるか、またはそうでなければ、ハードウェアと関連付けられる可能性のある任意のソフトウェアおよび/またはファームウェア(「コード」)を指す。本明細書で使用されるように、例えば、特定のプロセッサおよびメモリは、コードの第1の1つまたは複数のラインを実行するときの第1の「回路機器」を備えることができ、コードの第2の1つまたは複数のラインを実行するときの第2の「回路機器」を備えることができる。本明細書で利用されるように、「および/または」は、リスト内の項目の任意の1つまたは複数が「および/または」によって結合されることを意味する。例として、「xおよび/またはy」は、3要素のセット{(x),(y),(x,y)}のうちのいずれかの要素を意味する。言い換えれば、「xおよび/またはy」は、「xおよびyの1つまたは両方」を意味する。別の例として、「x、y、および/またはz」は、7要素のセット{(x),(y),(z),(x,y),(x,z),(y,z),(x,y,z)}のうちのいずれかの要素を意味する。言い換えれば、「x、y、および/またはz」は、「x、y、およびzの1つまたは複数」を意味する。本明細書で利用されるように、用語「例示的な」は、非限定的な例、事例、または例証として機能することを意味する。本明細書で利用されるように、用語「例えば(e.g.,)」および「例えば(for example)」は、1つまたは複数の非限定的な例、事例、または例証のリストを設定する。本明細書で利用されるように、回路機器は、(例えば、ユーザ構成可能設定、工場での調整(factory trim)、等によって)機能の実施が無効にされるか、有効にされないかに関わらず、機能を実施するのに必要なハードウェアおよびコードを(いずれかが必要な場合)回路機器が備えるときはいつでも、機能を実施するように「動作可能」である。
図1
図2
図3
図4
図5
図6
図7