(58)【調査した分野】(Int.Cl.,DB名)
前記グローバルメタデータは、各オブジェクトチャンクがブロックまたはブロックのリストかどうかを特定するフィールドを含み、第2のオブジェクトチャンクはブロックであり、前記第1のオブジェクトチャンクはブロックのリストである、請求項1に記載の方法。
前記グローバルメタデータは、各オブジェクトチャンクがどのジャーナルに格納されるかを特定し、各それぞれのジャーナルレプリカは、前記それぞれのジャーナルレプリカに格納される各ブロックの位置を特定するブロックインデックスを含む、請求項1または2に記載の方法。
各オブジェクトチャンクについてのデータが暗号化され、各オブジェクトチャンクについての復号化キーが前記グローバルメタデータに格納され、前記方法はさらに、前記グローバルメタデータから対応する復号化キーを削除することによって、オブジェクトチャンクを事実上削除し、これにより、前記オブジェクトについてのデータをアクセス不能にすることを含む、請求項1〜5のいずれか1項に記載の方法。
前記第1のオブジェクトは、前記第1のオブジェクトチャンクとは異なる第2のオブジェクトチャンクを含む2つ以上のオブジェクトチャンクを含み、前記第2のオブジェクトチャンクは、関連付けられる配置ポリシーが前記第1の配置ポリシーとマッチする、前記第1のジャーナルとは異なる第2のジャーナルに格納される、請求項7〜10のいずれか1項に記載の方法。
前記グローバルメタデータは、各オブジェクトチャンクがどのジャーナルに格納されるかを特定し、各それぞれのジャーナルレプリカは、前記それぞれのジャーナルレプリカに格納される各ブロックの位置を特定するブロックインデックスを含む、請求項7〜11のいずれか1項に記載の方法。
前記グローバルメタデータから対応する復号化キーを削除することによって、オブジェクトチャンクを事実上削除し、これにより、前記オブジェクトについてのデータをアクセス不能にすることをさらに含む、請求項16に記載の方法。
複数のインスタンスを有する分散ストレージシステムにおけるオブジェクトレプリカの配置を管理するためのコンピュータシステムであって、各それぞれのインスタンスは、
1つ以上のプロセッサと、
メモリと、
前記メモリに格納される1つ以上のプログラムとを含み、前記1つ以上のプログラムは、請求項1〜17のいずれか1項に記載の方法を実行するために前記1つ以上のプロセッサによって実行可能である命令を含む、コンピュータシステム。
【発明を実施するための形態】
【0017】
図面を通じて、同様の参照番号は対応する部分を指す。
実現例の説明
分散ストレージシステムにおいてオブジェクトの配置を管理するための技術について論じる前に、これらの技術が使用され得る例示的なシステムを提示することは有益である。
【0018】
分散ストレージシステムの概略
図1に示されるように、開示された実現例は分散ストレージシステムを記載する。地球100上のさまざまな位置に、複数のインスタンス102−1、102−2、…、102−Nが存在しており、ネットワーク通信リンク104−1、104−2、…104−Mによって接続されている。なお、この明細書において、「インスタンス」は「ストレージ位置」とも称される。また、1つ以上のインスタンス(ストレージ位置)が特定の物理的位置(たとえばビルディング、互いから所定の距離内のビルディングのセットなど)に位置してもよい。いくつかの実現例において、インスタンス(たとえばインスタンス102−1)は、データセンタに対応する。いくつかの実現例において、複数のインスタンスは、同じデータセンタに物理的に位置する。単一の実現例は、異なる地理的位置にある個々のインスタンスと、インスタンスの1つ以上のクラスタとの両方を有し得、各クラスタは、複数のインスタンスを含み、各クラスタ内のインスタンスは単一の地理的位置に存在する。
【0019】
図1の概念図は、特定の数のネットワーク通信リンク104−1などを示すが、典型的な実現例は、それより多いまたは少ないネットワーク通信リンクを有してもよい。いくつかの実現例において、インスタンスの同じ対同士の間に2つ以上のネットワーク通信リンクが存在する。たとえば、ネットワーク通信リンク104−5および104−6は、インスタンス102−2とインスタンス102−6との間のネットワーク接続を提供する。いくつかの実現例において、ネットワーク通信リンクは光ファイバーケーブルを含む。いくつかの実現例において、ネットワーク通信リンクのうちのいくつかは、マイクロ波のような無線技術を使用する。いくつかの実現例において、各ネットワーク通信リンクは、特定の帯域幅、および/または、その帯域幅の使用についての特定のコストを有する。いくつかの実現例において、ネットワーク通信リンクのうち1つ以上にわたるデータ転送に関して、スループットレート、可用性の時間、リンクの信頼性などを含む統計が維持される。典型的に、各インスタンスは、データストアおよび関連するデータベースを有しており、タスクのすべてを実行するためにサーバコンピュータ(
図4に示されるような「インスタンスサーバ」)のファーム(farm)を利用する。いくつかの実現例において、分散ストレージシステムの1つ以上のインスタンスは限定された機能を有する。たとえば、限定された機能は、他のインスタンス同士の間のデータ送信のためのリピータ(repeater)として動作することを含み得る。なお、限定された機能のインスタンスは、データストアのうちのいずれかを含んでもよいし、含まなくてもよい。
【0020】
図2は、いくつかの実現例に従った、分散ストレージシステム200の要素を示すブロック図である。分散ストレージシステム200は、インスタンス102−1、102−2、102−3、102−4、…、102−Nを含む。それぞれのインスタンス102−1は、インスタンス同士間でオブジェクトチャンク238をレプリケートするレプリケーションモジュール220を含む。いくつかの実現例において、オブジェクトチャンク238は、それぞれのインスタンス102−1のデータストア224に格納される。
図6に示されるように、各オブジェクトチャンク238は、オブジェクト226、または、オブジェクト226の部分を含む。データストア224は、オブジェクトを格納することが可能である分散データベース、ファイルシステム、テープバックアップ、および、任意の他のタイプのストレージシステムまたはデバイスを含み得る。いくつかの実現例において、オブジェクト226またはジャーナル230をレプリケートするために、レプリケーションモジュール220は、1つ以上のレプリケーションキュー222−1、222−2、…、222−Lを使用する。レプリケートされるべきオブジェクトまたはジャーナルについてのレプリケーション要求がレプリケーションキュー222に配置され、リソース(たとえば帯域幅)が利用可能な場合、オブジェクトまたはジャーナルがレプリケートされる。いくつかの実現例において、レプリケーションキュー222におけるレプリケーション要求は、割り当てられたプライオリティを有しており、帯域幅が利用可能になると、最も高いプライオリティのレプリケーション要求がレプリケートされる。
【0021】
いくつかの実現例において、バックグラウンドレプリケーションプロセスは、配置ポリシー212、ならびに、統計サーバ208によって提供されるアクセスデータ210および/またはグローバル状態211に基づき、オブジェクトまたはジャーナルのコピーを作成および削除する。配置ポリシー212は、オブジェクトのどれだけ多くのコピーが所望であるか、どこに当該コピーが存在するべきであるか、および、どのタイプのデータストアに当該データが保存されるべきであるかを特定している。統計サーバ208によって提供されるアクセスデータ210(たとえばオブジェクトのレプリカがアクセスされたストレージ位置、オブジェクトのレプリカがストレージ位置にてアクセスされた時間、ストレージ位置でのオブジェクトのアクセスの頻度などに関するデータ)および/またはグローバル状態211とともに配置ポリシー212を使用して、位置割当デーモン(LAD: location assignment daemon)206は、オブジェクトまたはジャーナルの新しいコピーをどこに作成するべきかと、どのコピーが削除され得るかとを決定する。新しいコピーが作成されるべきである場合、レプリケーション要求はレプリケーションキュー222に挿入される。いくつかの実現例において、LAD206は、分散ストレージシステム200についてグローバルにオブジェクトまたはジャーナルのレプリカを管理する。言いかえれば、分散ストレージシステム200において1つのLAD206のみが存在する。配置ポリシー212の使用およびLAD206のオペレーションは以下により詳細に記載される。
【0022】
なお、一般に、それぞれの配置ポリシー212は、保存するべきオブジェクトのレプリカの数、どのタイプのデータストアにレプリカが保存されるべきであるか、コピーが保存されるべきストレージ位置などを特定し得る。いくつかの実現例では、オブジェクトについてのそれぞれの配置ポリシー212は、分散ストレージシステムに存在しなければならないオブジェクトの最小数のレプリカと、分散ストレージシステムに存在することが許されるオブジェクトの最大数のレプリカと、オブジェクトのレプリカが格納されるべきであるストレージデバイスタイプと、オブジェクトのレプリカが格納され得る位置と、オブジェクトのレプリカが格納され得ない位置と、オブジェクトについての配置ポリシーが適用されるオブジェクトについてのある範囲の期間とからなる群から選択される基準を含む。たとえば、第1の配置ポリシーは、ウェブメールアプリケーションにおける各オブジェクトが、最低2つのレプリカおよび最大5つのレプリカを有さなければならないということを特定し得、当該オブジェクトのレプリカは中国の外のデータセンタに格納され得、各オブジェクトの少なくとも1つのレプリカがテープ上に格納されなければならない。ウェブメールアプリケーションについての第2の配置ポリシーはさらに、30日より古いオブジェクトについて、最低1つのレプリカおよび最大3つのレプリカが分散ストレージシステム200に格納されるということを特定し得、オブジェクトのレプリカは中国の外のデータセンタに格納され得、各オブジェクトの少なくとも1つのレプリカがテープ上に格納されなければならない。
【0023】
いくつかの実現例において、ユーザ240は、ウェブブラウザ244を実行可能であるコンピュータシステムまたは他のデバイスであり得るユーザシステム242とインタラクションする。ユーザアプリケーション246は、ウェブブラウザにおいて実行されており、ネットワークを使用して分散ストレージシステム200に格納されたデータへのアクセスするよう、データベースクライアント248によって提供される機能を使用する。ネットワークは、インターネット、ローカルエリアネットワーク(LAN)、ワイドエリアネットワーク(WAN)、無線ネットワーク(WiFi)、ローカルイントラネット、または、これらの任意の組合せであり得る。いくつかの実現例では、データベースクライアント248は、要求に応答するために適切なインスタンスを識別するよう、グローバル構成ストア204における情報を使用する。いくつかの実現例において、ユーザアプリケーション246は、ウェブブラウザ244なしでユーザシステム242上で実行される。例示的なユーザアプリケーションは、電子メールアプリケーションおよびオンラインビデオアプリケーションを含む。
【0024】
いくつかの実現例において、各インスタンスは、分散ストレージシステムに格納されるオブジェクトの各々についてオブジェクトメタデータ228を格納する。いくつかのインスタンスは、インスタンス(「ローカルインスタンス」と称される)に格納されるレプリカを有するオブジェクトについてのみオブジェクトメタデータ228を格納する。いくつかのインスタンスは、分散ストレージシステムにおいて任意の場所に格納されたすべてのオブジェクトのついてのオブジェクトメタデータ228を格納する(「グローバルインスタンス」と称される)。オブジェクトメタデータ228は、
図3、
図4および
図5に関してより詳細に記載される。
【0025】
いくつかの実現例では、各インスタンスは、分散ストレージシステム200に格納されるジャーナルの各々について、ジャーナルメタデータ236を格納する。いくつかのインスタンスは、インスタンスに格納されるレプリカを有するジャーナルについてのみ、ジャーナルメタデータ236を格納する。いくつかのインスタンスは、分散ストレージシステムにおけるいずれかの場所に格納されるすべてのジャーナルについてジャーナルメタデータを格納する。ジャーナルメタデータは、
図3、
図4、
図5および
図8に関して以下により詳細に記載される。
【0026】
複数のタイプのジャーナルがデータストア224に格納される。ジャーナルの大多数は、クローズド(closed)ジャーナル230である。クローズドジャーナル230は、いずれの付加的なオブジェクトチャンクも格納しないが、コンテンツを削除およびコンパクト化(compacted)し得る。いくつかの実現例では、同じ配置ポリシー212についての2つ以上の小さなクローズドジャーナル230は、単一の置換クローズドジャーナル230を形成するためにともに結合(stitched)され得る。クローズドジャーナル230内のデータは削除およびコンパクト化され得るので、クローズドジャーナル230は、時間とともに小さくなり、これにより、結合の候補になり得る。
【0027】
クローズドジャーナル230に加えて、インスタンス102はオープンジャーナル232および234を有し得る。
図2に示されるように、オープンジャーナルは、プライマリジャーナル232またはセカンダリジャーナル234のいずれかとして指定される。プライマリジャーナル232およびセカンダリジャーナル234はペアとなり、異なるインスタンスに位置する。以下により詳細に記載されるように、プライマリジャーナル232は、格納のためのチャンク238を受け取り、対応するセカンダリジャーナル234が格納されているインスタンスにチャンク238のコピーを送信する。
【0028】
図3は、いくつかの実現例に従ったサーバ300のブロック図である。サーバ300は典型的に、1つ以上の処理ユニット(CPU)302と、現在の日付および/または時間を報告するクロック303と、1つ以上のネットワークまたは他の通信インターフェイス304と、メモリ314と、これらのコンポーネントを相互接続するための1つ以上の通信バス312とを含む。通信バス312は、システムコンポーネントを相互接続しシステムコンポーネント同士間の通信を制御する回路(チップセットとも時に称される)を含み得る。いくつかの実現例では、クロック303は、クロックサーバ(たとえばクォーラムクロックサーバまたはネットワーク上の任意の他のクロックサーバなど)と周期的に同期するローカルクロックである。サーバ300は、表示デバイス308および入力デバイス310(たとえばキーボード、マウス、タッチスクリーン、キーパッドなど)を含むユーザインターフェイス306を随意に含み得る。メモリ314は、DRAM、SRAM、DDR RAMまたは他のランダムアクセスソリッドステートメモリデバイスのような高速ランダムアクセスメモリを含み、また、1つ以上の磁気ディスクストレージデバイス、光学ディスクストレージデバイス、フラッシュメモリデバイス、または、他の不揮発性ソリッドステートストレージデバイスといった不揮発性メモリを含んでもよい。メモリ314は、CPU302からリモートに位置する1つ以上のストレージデバイスを随意に含み得る。メモリ314、または、代替的にはメモリ314内の不揮発性メモリデバイスは、コンピュータ読取可能ストレージ媒体を含む。いくつかの実現例において、メモリ314は、以下のプログラム、モジュールおよびデータ構造またはそのサブセットを格納する。すなわち、
・さまざまな基本的なシステムサービスを処理するとともにハードウェア依存タスクを実行するためのプロシージャを含むオペレーティングシステム316、
・インターネット、他のワイドエリアネットワーク、ローカルエリアネットワーク、メトロポリタンエリアネットワークなどのような、1つ以上の通信インターフェイス304(有線または無線)および1つ以上の通信ネットワークを介して他のコンピュータにサーバ300を接続するために使用される通信モジュール318、
・入力デバイス310を介してユーザからコマンドを受け取り、かつ、表示デバイス308においてユーザインターフェイスオブジェクトを生成する随意のユーザインターフェイスモジュール320、
・本願明細書に記載されるような構成204、
・本願明細書に記載されるようなLAD206、
・本願明細書に記載されるようなアクセスデータ210、
・本願明細書に記載されるようなグローバル状態211、
・本願明細書に記載されるような配置ポリシー212、
・分散ストレージシステムに格納されるオブジェクトについてのオブジェクトメタデータ228(オブジェクトメタデータ228は、分散ストレージシステム内のオブジェクトを一意に識別するオブジェクトID330を含み得る。メタデータ228は、人またはエンティティの名称および/または識別子(たとえば電子メールアドレス)であり得るオブジェクトのオーサ(author)332を含み得る。いくつかの実現例では識別子は一意である。メタデータは、オブジェクトが作成された(たとえば、分散ストレージシステムにアップロードされた)日付スタンプまたはタイムスタンプ334を含み得る。メタデータは、バイトまたはアロケーションブロックで典型的に測定されるオブジェクトのサイズ336を含み得る。メタデータは、個々に割り当てられ得るか、または、他の基準に基づき割り当てられ得る割当配置ポリシー338を含む(たとえば米国からアップロードされるすべてビデオは、同じ割当配置ポリシー338を有し得る)。配置ポリシーの使用は、
図5〜
図6および
図9A〜
図9Cに関して以下により詳細に記載される。メタデータ228は、各オブジェクトについてのコンテンツチャンクを識別するチャンクID346のセットを含む。いくつかの実現例において、チャンクIDはオブジェクト内のオフセットとして特定される。たとえば、第1のチャンクは0のオフセットを有する。いくつかの実現例において、オフセットはメガバイトで特定される。いくつかの実現例において、チャンクIDは(GUIDのような)一意識別子である。いくつかの実現例において、各チャンクIDは、チャンクのオフセットにオブジェクトIDを連結することにより形成される。いくつかの実現例では、チャンクIDは、コンテンツハッシュまたはコンテンツダイジェストを使用して形成される。各チャンクIDに対応するのは、割当ジャーナルID348であり、割当ジャーナルID348は、対応するチャンクがどのジャーナルに格納されるか示す。)、ならびに、
・分散ストレージシステム200に格納される各ジャーナルについてのジャーナルメタデータ236(ジャーナルメタデータ236は、各ジャーナルについてのジャーナルID370と、ジャーナルが格納されるジャーナル位置372のセットとを含む。ジャーナル位置372は、ジャーナルが格納される各インスタンス102を特定し、ジャーナルを格納するインスタンス102にあるデータストア224を特定し得る。ジャーナルメタデータ236はさらに、各ジャーナルに関連付けられる配置ポリシーID374を含む。配置ポリシーID374は、ジャーナルに関連付けられる一意の配置ポリシー212を識別する。)
を格納する。
【0029】
上記の識別された要素の各々は、以前に言及されたメモリデバイスのうちの1つ以上に格納され得、上に記載された機能を実行するための命令のセットに対応する。命令のセットは、1つ以上のプロセッサ(たとえばCPU302)によって実行され得る。上記の識別されたモジュールまたはプログラム(すなわち命令のセット)は、別個のソフトウェアプログラム、プロシージャまたはモジュールとして実現される必要はなく、したがって、これらのモジュールのさまざまなサブセットは、さまざまな実現例において組み合わせられ得るか、または、そうでなければ再構成され得る。いくつかの実現例において、メモリ314は、上で識別されたモジュールおよびデータ構造のサブセットを格納し得る。さらに、メモリ314は、上で記載されていない付加的なモジュールおよびデータ構造を格納し得る。
【0030】
図3は「サーバ」を示すが、
図3は、本願明細書において記載される実現例の構造図としてよりも、サーバ300のセットに存在し得るさまざまな特徴の機能説明としてより多く意図される。実際には、および、当業者によって認識されるように、別々に示された項目は、組み合わされ得、いくつかの項目は分離され得る。たとえば、
図3に別々に示されるいくつかの項目は単一のサーバ上で実現され得、また、単一の項目は、1つ以上のサーバによって実現され得る。サーバの実際の数、および、特徴がどのようにそれらの間で割り当てられるかは、実現例ごとに変動することになり、ピーク使用期間の間および平均使用期間の間にシステムが処理しなければならないデータトラフィックの量に部分的に依存し得る。いくつかの実現例では、LAD206のサブセット、アクセスデータ210、グローバル状態211および配置ポリシー212は、別個のサーバ上に位置する。たとえば、LAD206はサーバ(またはサーバのセット)に位置し得、アクセスデータ210およびグローバル状態211は、統計サーバ208(または統計サーバ208のセット)に位置され得るとともに統計サーバ208(または統計サーバ208のセット)によって維持され得、配置ポリシー212は別のサーバ(または別のサーバのセット)に位置し得る。
【0031】
図4は、いくつかの実現例に従った、インスタンス102についてのインスタンスサーバ400のブロック図である。インスタンスサーバ400は典型的に、モジュールを実行するための1つ以上の処理ユニット(CPU)402と、現在の日付および/または時間を報告するクロック403と、メモリ414に格納され、これにより処理オペレーションを実行するプログラムおよび/または命令と、1つ以上のネットワークまたは他の通信インターフェイス404と、メモリ414と、これらのコンポーネントを相互接続するための1つ以上の通信バス412とを含む。いくつかの実現例において、クロック403は、周期的にクロックサーバと同期するローカルクロックである(たとえばクォーラムクロックサーバまたはネットワーク上の任意の他のクロックサーバなど)。いくつかの実現例において、インスタンスサーバ400は、表示デバイス408および1つ以上の入力デバイス410を含むユーザインターフェイス406を含む。いくつかの実現例では、メモリ414は、DRAM、SRAM、DDR RAMまたは他のランダムアクセスソリッドステートメモリデバイスのような高速ランダムアクセスメモリを含む。いくつかの実現例では、メモリ414は、1つ以上の磁気ディスクストレージデバイス、光学ディスクストレージデバイス、フラッシュメモリデバイス、または、他の不揮発性ソリッドステートストレージデバイスといった不揮発性メモリを含み、いくつかの実現例において、メモリ414は、CPU402からリモートに位置する1つ以上のストレージデバイスを含む。メモリ414、または、代替的にはメモリ414内の不揮発性メモリデバイスは、コンピュータ読取可能ストレージ媒体を含む。いくつかの実現例では、メモリ414またはメモリ414のコンピュータ読取可能ストレージ媒体は、以下のプログラム、モジュールおよびデータ構造、または、そのサブセットを格納する。すなわち、
・さまざまな基本的なシステムサービスを処理するとともにハードウェア依存タスクを実行するためのプロシージャを含むオペレーティングシステム416、
・インターネット、他のワイドエリアネットワーク、ローカルエリアネットワーク、メトロポリタンエリアネットワークなどといった、1つ以上の通信ネットワークインターフェイス404(有線または無線)および1つ以上の通信ネットワークを介して他のインスタンスサーバまたはコンピュータにインスタンスサーバ400を接続するために使用される通信モジュール418、
・入力デバイス410を介してユーザからコマンドを受け取り、かつ、表示デバイス408においてユーザインターフェイスオブジェクトを生成する随意のユーザインターフェイスモジュール420、
・本願明細書に記載されるようなレプリケーションモジュール220およびレプリケーションキュー222、
・
図3に関して記載されような、ジャーナル230、232および234にオブジェクトチャンク238を格納するデータストア224(たとえば分散データベース、ファイルシステム、テープストレージ、ビッグテーブル(Big Tables)など)、
・サーバ300に関して
図3に記載されたような、オブジェクトメタデータ228および対応するメタデータ要素330〜338、346および348、ならびに、
・サーバ300に関して
図3に記載されるような、ジャーナルメタデータ236ならびに対応するジャーナルメタデータ要素370、372および374
を格納する。
【0032】
上記の識別された要素の各々は、以前に言及されたメモリデバイスのうちの1つ以上に格納され得、上に記載された機能を実行するための命令のセットに対応する。命令のセットは、1つ以上のプロセッサ(たとえばCPU402)によって実行され得る。上記の識別されたモジュールまたはプログラム(すなわち命令のセット)は、別個のソフトウェアプログラム、プロシージャまたはモジュールとして実現される必要はなく、したがって、これらのモジュールのさまざまなサブセットは、さまざまな実現例において組み合わせられ得るか、または、そうでなければ再構成され得る。いくつかの実現例において、メモリ414は、上で識別されたモジュールおよびデータ構造のサブセットを格納し得る。さらに、メモリ414は、上で記載されていない付加的なモジュールおよびデータ構造を格納し得る。
【0033】
図4は「インスタンスサーバ」を示すが、
図4は、本願明細書において記載される実現例の構造図としてよりも、インスタンスサーバ400のセットに存在し得るさまざまな特徴の機能説明としてより多く意図される。実際には、および、当業者によって認識されるように、別々に示された項目は組み合わされ得、いくつかの項目は分離され得る。たとえば、
図4に別々に示されるいくつかの項目は単一のサーバ上で実現され得、また、単一の項目は、1つ以上のサーバによって実現され得る。サーバの実際の数、および、特徴がどのようにそれらの間で割り当てられるかは、実現例ごとに変動することになり、ピーク使用期間の間および平均使用期間の間にサーバが処理しなければならないデータトラフィックの量に部分的に依存し得る。たとえば、単一のインスタンス102では、100個のインスタンスサーバ400または何千個ものインスタンスサーバ400が存在してもよい。
【0034】
いくつかの実現例において、クライアントに対してより速い応答を提供し、かつ、フォルトトレランスを提供するために、インスタンスにおいて実行される各プログラムまたはプロセスは、複数のコンピュータの間で分散される。プログラムまたはプロセスの各々に割り当てられるインスタンスサーバ400の数は変動し得るとともに、ワークロードに依存し得る。
【0035】
図5は、いくつかの実現例に従ったオブジェクトチャンクの格納のためのジャーナルの使用を示す。
図5は、データストア224と、オブジェクトメタデータ228の部分と、ジャーナルメタデータ236の部分とを示しており、これらはすべて例示的なインスタンス102に存在する。このデータストア224には多くのジャーナル230、232および234が格納されているので、2次元グリッドにおいてそれらを視覚的に構成することは有用である。(もちろん、視覚表示は、データストアにおけるジャーナルの実際の物理的なストレージとは無関係である。)図において、ジャーナルはジャーナルの「ロウ(row)」にパーティショニングされ、各ロウは単一の配置ポリシー212に対応する。たとえば、第1のロウ502−P1は、配置ポリシーP1(212)に対応し、クローズドジャーナル230、オープンプライマリジャーナル232、および、オープンセカンダリジャーナル234を含む。第1のロウ502−P1におけるこれらのジャーナルのすべては、配置ポリシーP1に関連付けられる。第2のロウ502−P2は、配置ポリシーP2(212)に対応し、最後のロウ502−PNは配置ポリシーPN(212)に対応する。典型的に、配置ポリシーの数は10個、20個、50個または恐らく100個といったように少ない。配置ポリシーの数が増加すると、オブジェクトレプリカの管理はあまり効率的でなくなる。
【0036】
さらに、データストア224におけるジャーナルは、
図5において2つのカラムへ視覚的にパーティショニングされる。第1のカラムは、ジャーナルの大多数であるクローズドジャーナル230を識別する。第2のカラムは、オープンプライマリジャーナル232およびオープンセカンダリジャーナル234を含む。各ジャーナルにおいてさまざまな長方形238によって示されるように、各ジャーナル(クローズドジャーナル230、オープンプライマリジャーナル232またはオープンセカンダリジャーナル234)はオブジェクトチャンク238を含む。オブジェクトチャンクはさまざまなサイズであり得るが、実現例は典型的に固定最大サイズをセットする(たとえば2メガバイト、4メガバイトまたは8メガバイト)。ジャーナル内におけるオブジェクトチャンク238の図は、ジャーナルがさまざまなサイズの多くのオブジェクトチャンクを格納するが、そうでなければオブジェクトチャンクの実際の物理的な格納を示しているわけではないという事実を正確に伝える(たとえば、割り当てられていないスペースの初めに各新しいオブジェクトチャンク238が追加されるので、オブジェクトチャンク同士間には未使用のスペースは一般に存在しない)。
【0037】
図5は、オープンジャーナル232および234のさまざまな組合せが各配置ポリシーについて可能であることを示す。本願明細書において図および説明において異なるジャーナルレプリカを識別するために、「232.P4.7」といった三部分ラベルが使用される場合がある。第1の部分(たとえば「232」)は、ジャーナルのタイプを識別し(230=クローズド,232=オープンプライマリ,234=オープンセカンダリ)、第2の部分(たとえば「P4」)は、当該ジャーナルについての配置ポリシーを特定し、第3の部分(たとえば「7」)は、当該ジャーナルについてのシーケンシャル番号を単に特定する(たとえば「232.P4.7」における「7」は、配置ポリシーP4についての第7番目のオープンジャーナルを特定する)。
【0038】
図5に示されるように、配置ポリシーP1について、単一のオープンプライマリジャーナル232.P1.1が存在し、オープンセカンダリジャーナルは存在しない。配置ポリシーP2について、2つのオープンプライマリジャーナル232.P2.1および232.P2.2が存在する。配置ポリシーPNについて、1つのオープンプライマリジャーナル232.PN.1および1つのオープンセカンダリジャーナル234.PN.1が存在する。これらの例が示すように、オープンプライマリジャーナル232およびオープンセカンダリジャーナル234の数は、配置ポリシー同士間で変動し得、典型的に、各配置ポリシー212についての新しいオブジェクト226の予想される数と、それらのオブジェクト226についての所望の位置とに基づき、各ポリシー212について構成される。
【0039】
各インスタンス102はさらに、以前に
図3に関して記載されたように、オブジェクトメタデータ228およびジャーナルメタデータ236の両方を格納する。各オブジェクト226について、オブジェクトメタデータ228は、(一意にオブジェクトを識別する)オブジェクトID330と、オブジェクトからオブジェクトチャンク238を識別する1つ以上のチャンクID346のセットと、各チャンクID236に関連付けられる割り当てられたジャーナルID348とを含む。オブジェクトが複数のチャンク238を有する場合、チャンク238は、(たとえばロードバランシングのために)同じジャーナルにすべて格納される必要は必ずしもないので、オブジェクトメタデータ228は、各チャンクID346に割り当てられるジャーナルID348をトラッキングしなければならない。
【0040】
各インスタンス102はさらに、インスタンス102に格納される各ジャーナルについてジャーナルメタデータ236を格納する。メタデータ236は、各ジャーナルについてのジャーナルID370と、位置372のセットとを含む。いくつかの実現例において、位置IDは、ジャーナルが格納されるインスタンスを識別する。いくつかの実現例において、位置IDはさらに、特定されたインスタンスにあるデータストアを識別する。いくつかの実現例において、インスタンス識別子およびデータストア識別子は、各ジャーナルについて別個の属性として格納される。いくつかの実現例において、ジャーナルは、単一のインスタンスにある2つ以上のデータストアに格納され得る(たとえばファイルシステムデータストアおよびテープバックアップデータストア)。ジャーナルメタデータ236はさらに、各ジャーナルに対応する一意の配置ポリシー212を特定する配置ポリシーID374を含む。各ジャーナルは、配置ポリシー338がジャーナルの配置ポリシーとマッチするオブジェクトチャンク238のみを格納する。
【0041】
図6は、いくつかの実現例が新しいオブジェクト226の格納をどのように管理するかを示す。
図6に示されるように、各新しいオブジェクトはオブジェクトコンテンツ(すなわちオブジェクト226自体)と、オブジェクトID330(たとえば58440912)と、割当配置ポリシー330(たとえばP3)とを有する。新しいオブジェクト226は、オンライン電子メールアプリケーションおよびビデオシェアリングウェブサイトなどといった多くの異なるアプリケーション246から得られ得る。分散ストレージシステム200は、新しいオブジェクト226を受け取り、インスタンス102−1のような適切なインスタンスに新しいオブジェクト226を方向付け(602)する。いくつかの実現例において、アプリケーション246は新しいオブジェクト226を特定のインスタンス102−1に方向付けする。アプリケーション246によって選択されるインスタンス102−1が適切でない場合、いくつかの実現例は、オブジェクト226を適切なインスタンスに転送する(たとえば、配置ポリシー212がヨーロッパにおける格納を特定せず、オブジェクト226がヨーロッパにおけるインスタンスにおいて受け取られる場合、当該インスタンスは、オブジェクト226を別のインスタンスに転送し得る)。
【0042】
たいていのオブジェクトは、中程度のサイズ(たとえば300キロバイト未満)を有するが、大きいオブジェクトがいくつか存在する。いくつかの実現例は、大きいオブジェクトを複数のチャンク238へ分割する(604)。一般に、各実現例は、典型的に単位がメガバイトで特定される(たとえば2、4、8、16、または32メガバイト)チャンクサイズをセットするか、または、当該チャンクサイズをセットするために構成可能であるパラメータを有する。チャンクサイズより大きい各オブジェクトは複数のチャンクへ分割され、チャンクサイズ以下のサイズを有する各オブジェクトは単一のチャンクからなる。
図6における例示において、3つのチャンクC1、C2およびC3が存在する。この例示において、チャンクの各々は7文字の英数字チャンクID346を有しているが、一意に各オブジェクト内のチャンクを識別する多くの代替的なチャンクIDフォーマットが可能である。いくつかの実現例において、チャンクID346は、コンテンツハッシュまたはコンテンツダイジェストを使用して生成される。
【0043】
いくつかの実現例において、多くのオブジェクト重複物が存在する場合がある(たとえば、メール添付物がある人々のグループに送られ、その後、多くのさらなる人々に転送される)ので、重複除外(de-duplication)は効率的な格納に有用であり得る。したがって、いくつかの実施形態において、オープンプライマリジャーナルに「新しい」チャンク238のみを格納する(606)よう、各新しいチャンク238のコンテンツが、(たとえばコンテンツハッシュまたはコンテンツダイジェストを使用して)既存のオブジェクトチャンク238と比較される(606)。
図5に示されるように、チャンクC2は新しく、配置ポリシーP3に対応しているので、チャンクC2は、配置ポリシーP3に対応するオープンプライマリジャーナル232.P3.1に格納される。もちろん、重複除外は配置ポリシーの文脈内にのみ存在する。2つのチャンクが同一であるが、異なる配置ポリシーに割り当てられている場合、2つのチャンクは異なるジャーナルに保存されることになる。言い換えれば、新しいチャンクが受け取られる場合、新しいチャンクは、同じ配置ポリシーについてのチャンクとのみ比較される。同じ配置ポリシーについて保存された同一のチャンクが既に存在する場合にのみ、チャンクは「重複物」である。
【0044】
オブジェクトチャンクC2が新しいかどうかにかかわらず、インスタンス102−1は、チャンク238についてオブジェクトメタデータ228を格納する(608)。
図3〜
図5に関して上述したように、メタデータ228は、オブジェクトID330と、チャンクID346と、各チャンクが格納されるジャーナルについてのジャーナルID348とを含む。いくつかの実現例において、オブジェクトチャンク238についてのチャンクID346は単に、オブジェクト内のチャンク238の開始に対するオフセットである。
図6に示されるオブジェクトメタデータ228はさらに、単一のオブジェクトについてのチャンクが同じジャーナルに格納される必要はないということを示す。チャンクC1およびC3(チャンクID C190056およびC098663)は、ジャーナルID J77298045を有するジャーナル232.P3.2に存在し、チャンクC2(チャンクID C250116)は、ジャーナルID J82117094を有するジャーナル232.P3.1に存在する。
【0045】
チャンクC2はセカンダリジャーナル234.P3.1における格納のために、インスタンス102−2に送信され(610)、チャンクC1およびC3は、セカンダリジャーナル234.P3.2における格納のためにインスタンス102−2に送信される(612)。
【0046】
図6はさらに、プライマリジャーナル232が、その対応するセカンダリジャーナルと物理的に同一である必要はないことを示す。まず、チャンクC1およびC3がプライマリジャーナル232.P3.2においてその順に格納され、これらのチャンクはセカンダリジャーナル234.P3.2においてその逆の順に格納されるということが分かる。ジャーナルがオープンである間、個々のチャンク238は、独立してレプリケートされるか、異なるネットワークパスを横断するか、または、異なるプロセッサ402によって処理され得るので、それらが同じ順でセカンダリジャーナル234.P3.2にロードされる保証はない。異なる順が存在し得るという事実は、
図7に関して以下に記載されるように、各ジャーナル内のチャンクインデックスによって扱われる。さらに、プライマリジャーナル232.P3.1は、当該図において「G」とラベル付されたガーベッジ「チャンク」620の存在を示す。アップロードの間に時として、スペースを消費する障害またはグリッチが存在する場合がある。たとえばアップロードの間に、オブジェクトのためのスペースが割り当てられるが、チャンクが実際に追加されない場合がある。ソフトウェアはアップロードを再び試み、これにより、チャンクのための新しいスペースが割り当てられる。これは、ジャーナル232内にホール(hole)またはガーベッジ(garbage)を残し得る。この場合、ガーベッジ620はセカンダリジャーナルに送信されないので、プライマリジャーナルはセカンダリジャーナルと物理的に異なる。
【0047】
図7は、いくつかの実現例に従ったオープンジャーナルの構造を示す。
図7はオープンプライマリジャーナル232を記載するが、オープンセカンダリジャーナル234の構造は同じまたは同様である。ジャーナル232は、ヘッダー702およびストレージスペース714のブロックを有する。ストレージスペース714は、既にオブジェクトチャンク238を格納している充填部分710と、現在未使用である非充填部分712とを含む。これらの記述子は、いくつかの理由により完全には正確ではない。第1に、「充填」スペース710は、有用なコンテンツを有さないガーベッジ部分620を含み得る。第2に、未使用スペースは必ずしもすべて同時に割り当てられるわけではない。いくつかの実現例は、ジャーナルについて全スペースを一度に割り当て、充填されると、(端部に少ない量の未使用スペースを潜在的に残して)当該ジャーナルをクローズする。しかしながら、他の実現例では、付加的なスペースのブロックは、ジャーナルがあるサイズの限界に達するか、または、ある量の時間(たとえば1日)が経過するまで、必要に応じて割り当てられる。
【0048】
ジャーナルについてのヘッダー702は、ジャーナル232に関する重要な内部情報を含む。ヘッダー702は、未使用スペース712がジャーナルにおいてどこで開始するかを特定するフィールド704を含む。新しいチャンク238が充填スペース710の端部に追加されるごとに、オフセット704は、ジャーナル232が次のチャンクを格納するよう準備されるように、チャンク238のサイズだけインクリメントされる。
【0049】
ヘッダー702はさらにチャンクインデックス706を含む。ジャーナル232についてのチャンクインデックス706は、各チャンク238がジャーナル232内のどこに位置するのかと、そのサイズとを特定し、これにより、(不揮発性ストレージまたはキャッシュからにかかわらず)チャンクデータの高速読出を可能にする。チャンクインデックス706についてのキーは、一意にチャンクを識別するチャンクID346である。なお、複数の異なるオブジェクトID330は、同じ物理的なチャンクを指し得る。多くのエントリが同じオブジェクトチャンク238を指す大きなチャンクインデックス704を回避するために、実現例は典型的に、同じ物理的なコンテンツを参照するために単一のチャンクIDを利用する。たとえば、チャンクID346は、コンテンツハッシュまたはコンテンツダイジェスト(またはこれらの組合せ)であり得る。各チャンクID346について、チャンクインデックス720は、ストレージスペース714内のチャンク238についてのオフセット720およびサイズ722を特定する。オフセット720は、ジャーナル232の始めからのオフセット、または、充填スペース710の始めからのオフセットとして特定され得る。いくつかの実現例では、チャンクインデックスは、チャンクが削除されて充填スペース710がコンパクト化される際に後で使用される削除マーカといった付加的な情報を有する。
【0050】
ヘッダー702は同様に、実現例の詳細に対応するよう、他のジャーナルデータ708を含み得る。たとえば、他のジャーナルデータ708は、ジャーナルの始めからストレージスペース714の始めまでのオフセットを特定し得る(すなわちヘッダーのサイズ)。いくつかの実現例では、他のジャーナルデータは、短いライフスパンを有するように指定されるジャーナルについての「生存時間(time to live)」パラメータを含む。
【0051】
図7におけるジャーナルの構造はオープンプライマリジャーナル232のためのものであるが、同じ基本構造は、オープンセカンダリジャーナル234およびクローズドジャーナル230に同様に適用される。
【0052】
図8は、いくつかの実現例に従って、ジャーナルが1つのインスタンスから別のインスタンスにレプリケートされる場合、オブジェクトメタデータ228およびジャーナルメタデータ236に何が起こるかを示す。この例示において、ジャーナルID J82117094を有するクローズドジャーナル230は、(インスタンスID=723を有する)インスタンス102−1から(インスタンスID428を有する)インスタンス102−4にレプリケート(820)される。ジャーナル230自体が単位としてレプリケートされるので、全コンテンツが正確にレプリケートされる。たとえば、(チャンクID C408335を有する)チャンクC8は、ジャーナル内のまったく同じ位置にある。もちろん、レプリケーションの後、インスタンス102−1および102−4は独立して削除およびコンパクションを扱うので、それらの物理構造は、レプリケーションの後、同じままであることは保証されない。
【0053】
図8はさらに、レプリケーション820の前および後のオブジェクトメタデータ228およびジャーナルメタデータ236の部分を示す。示されるように、オブジェクトメタデータ228におけるレコード802〜814はレプリケーション820によって変更されていない。各オブジェクト226は同じチャンク238を有し、チャンク238は同じジャーナル230に格納される。たとえば、(ロウ804における)チャンクID C408335を有するチャンクは変更されない。他方、ジャーナルID J82117094(370−1)を有するジャーナル230についてのジャーナルメタデータ236は変更される。ジャーナル位置372のセットは、372−1(A)から、(インスタンス102−4についての)新しい位置428を含む372−1(B)に変更する。
【0054】
図9A〜
図9Cは、いくつかの実現例に従った分散ストレージシステム200においてオブジェクトレプリカの配置を管理する(902)方法900を示す。当該方法は、1つ以上のプロセッサおよびメモリを有する分散ストレージシステムの第1のインスタンス102において実行(904)される。メモリは、複数のオブジェクトを格納する(906)。メモリはさらに、1つ以上のプロセッサによる実行のための1つ以上のプログラムを格納する(908)。いくつかの実現例において、方法900のすべてまたは一部は、位置割当デーモン206によって実行される。いくつかの実現例において、分散ストレージシステムは複数のインスタンスを有する(910)。これらの実現例のうちのいくつかにおいて、インスタンスの少なくともサブセットは、異なる地理的位置にて存在する(910)。いくつかの実現例において、各インスタンスはデータセンタに対応する。いくつかの実現例において、各データセンタは1つ以上のインスタンスを含む。
【0055】
第1のインスタンスでは、1つ以上のジャーナル232が、オブジェクトチャンクの格納のためにオープンにされる(912)。各ジャーナルは、単一のそれぞれの配置ポリシー212に関連付けられる(914)。いくつかの実現例では、各配置ポリシーは、対象数のオブジェクトレプリカと、オブジェクトレプリカについての位置の対象セットとを特定する(926)。いくつかの実現例では、配置ポリシー212は、データストア224のどのタイプがインスタンスのうちのいくつかにおいて使用されるべきであるか(たとえばディスクまたはテープ)を特定し得る。いくつかの実現例では、分散ストレージシステム200は、どのジャーナルに各オブジェクトチャンク238が格納されているかを特定するオブジェクトメタデータ228を含む(918)。これは、
図3〜
図5に関して以前に記載された。いくつかの実現例では、各それぞれのジャーナルは、それぞれのジャーナルに格納された各オブジェクトの位置を特定するチャンクインデックス706を含む(920)。これは、
図7により詳細に記載された。特に、ジャーナル内の各チャンクの位置は、ジャーナル自身に対して識別され、したがって、チャンクインデックス706は、ジャーナルがどこに格納されるかにかかわらず正確である。たとえば、オフセットとしてジャーナル内のチャンクの位置を特定することによって、チャンクはリラティブアドレッシング(relative addressing)によってアクセスされ得る。
【0056】
開示された実現例は典型的に、各ジャーナルが格納される位置372を特定するジャーナルメタデータ236を含む(922)。これは、
図3〜
図5および
図8において以前に記載された。
【0057】
オープンプライマリジャーナル232およびオープンセカンダリジャーナル234の分散は、利用可能なインスタンス102と、配置ポリシー212と、配置ポリシー212による新しいオブジェクト226の予想される分散と、新しいオブジェクトがどこ(たとえばヨーロッパ、北米、アジア)からロードされるかと、利用可能なインスタンス102の各々での処理リソースと、さまざまなインスタンス同士間のネットワーク帯域幅とを含む多くのファクタに依存する。たとえば、多くのオブジェクトが、特定のインスタンスにおいて特定の配置ポリシーでアップロードされる場合、そのインスタンスでの同じ配置ポリシーについて、複数のジャーナルがオープンにされる(924)。いくつかのシナリオにおいて、ロードバランシングに必要とされる場合、単一のインスタンス102において、同じ配置ポリシー212について、5個、10個、またはそれ以上のオープンジャーナルが存在し得る。
【0058】
図5および
図6に関して上述したように、いくつかの実現例は、第1のインスタンスにおいてオープンにされたジャーナルに対応するジャーナルをオープンにするよう、メッセージを分散ストレージシステム200の第3のインスタンスに送信する(916)。このシナリオにおいて、第1のインスタンスにおいてオープンにされたジャーナル232はプライマリジャーナルと称され、第3のインスタンスでオープンにされたジャーナル234はセカンダリジャーナルと称される。(もちろん、第1のインスタンスはセカンダリジャーナルも有し得、第3のインスタンスはプライマリジャーナルを有し得る)。
【0059】
第1のインスタンス102では、少なくとも第1のオブジェクトチャンクを含む(928)第1のオブジェクト226が受け取られる(928)。これは、
図6に関して上に記載された。第1のオブジェクト226は第1の配置ポリシー212に関連付けられており、したがって、オブジェクト226を含むオブジェクトチャンク238のすべては第1の配置ポリシー212に関連付けられる。第1のオブジェクトチャンク238は、関連付けられる配置ポリシーが第1の配置ポリシー212とマッチする第1のジャーナル232に格納される(930)。第1のジャーナル232は、配置ポリシーが第1の配置ポリシーとマッチするオブジェクトについてのオブジェクトチャンクのみを格納する(932)。いくつかの実現例では、第1のジャーナル232に格納された各オブジェクトチャンク238は、第3のジャーナル234における格納のために、第3のインスタンスに送信される(934)。
【0060】
受け取られたオブジェクトがチャンクサイズより大きい場合、オブジェクトは複数のチャンク238へ分割される。この場合、第1のオブジェクト226は2つ以上のオブジェクトチャンクを含む(936)。典型的に、第2のオブジェクトチャンクは、第1のオブジェクトチャンクと異なる(936)。(単一のオブジェクト内に2つの同一のチャンクを有することは稀であるが、たとえば、オブジェクトが空のスペースの非常に大きな部分を有する場合に起こり得る。)いくつかの状況では、第2のオブジェクトチャンクが、関連付けられる配置ポリシーが第1の配置ポリシーとマッチする、第1のジャーナルとは異なる第2のジャーナル232に格納される(938)。第2のジャーナルは、配置ポリシーが第1の配置ポリシーとマッチするオブジェクトについてのオブジェクトチャンクのみを格納する(938)。これにより、多くのチャンクを含むオブジェクトは、多くの異なるジャーナルにわたって分散されるチャンクを有し得る。
【0061】
オブジェクト226を受け取り、かつ、第1のジャーナル232にチャンク238を格納するこのプロセスは、関連付けられる配置ポリシー338が第1の配置ポリシー212にマッチする複数のオブジェクト226について、第1の終了条件が発生するまで繰り返される(940)。いくつかの実現例では、第1の終了条件は、第1のジャーナルのサイズが予め規定されたしきい値を越える(942)場合に発生する。いくつかの実現例では、第1の終了条件は、第1のジャーナルが予め規定された時間スパンの間オープンであった場合(944)に発生する。いくつかの実現例は、さまざまな態様でサイズおよび時間を組み合わせる。たとえば、いくつかの実現例は、時間スパンおよびサイズ限界の両方を特定しており、終了条件は、上記のうちのいずれか一方が最初に発生することである。
【0062】
終了条件が発生した後、第1のジャーナルはクローズされ(946)、これにより、如何なる付加的なオブジェクトチャンクも第1のジャーナル232に格納されることを防止する。一般に、実現例は、第1のジャーナルをクローズする前に、同じ配置ポリシーについての他のジャーナル232がまだオープンである(または新しいジャーナルがオープンである)ことを確認する。新しいオブジェクトがいつでも到着し得るので、格納のためにオープンジャーナルを利用可能にしておくことが重要である。別のインスタンスに対応するセカンダリジャーナル234が存在する場合、第1のインスタンスは、第1の終了条件が発生する場合に対応するセカンダリジャーナルをクローズするよう、他のインスタンスにメッセージを送信する(948)。
【0063】
第1のジャーナル232がクローズされた後、ジャーナルはその配置ポリシーに従う。配置ポリシー212を満足させることは、ジャーナルレプリカを移動させること、ジャーナルレプリカの新しいコピーを作成すること、または、ジャーナルのレプリカを削除することを必要とし得る。いくつかの状況では、第1のジャーナル232は、配置ポリシー212に従って、分散ストレージシステム200の第2のインスタンス102にレプリケートされる(950)。(他の状況において、第1のジャーナルのレプリカは削除される。)プライマリオープンジャーナル232およびセカンダリオープンジャーナル234を有する実現例では、それらがひとたびクローズされると、2つの同等なクローズドジャーナル230が存在することになる。したがって、レプリケーション950のためのソースとして、レプリカのいずれかが使用され得る。レプリケーション950が発生する(すなわちトランザクションの一部として)と、第2のインスタンスにジャーナルのコピーが存在することを示すよう、第1のジャーナルについてのジャーナルメタデータ236は更新される(952)。これは
図8に関して上に記載された。
【0064】
ジャーナル230がクローズされた後、オブジェクトチャンク238が削除され得る。たとえば、オブジェクトはメール添付物に対応し得る。電子メールの受信者が電子メールを削除すれば、当該添付物についての格納分は削除され得る。ある期間の後、当該削除により各ジャーナル内にホールが存在するので、当該無駄にされているスペースを除去するようジャーナルをコンパクト化することが有用である。これは、揮発性メモリのフラグメンテーション、および、未使用スペースをより大きな連続ブロックへと統合するデフラグメンテーションのプロセスに類似している。
【0065】
格納されたオブジェクトチャンクが多くの(たとえば何百、何千または何百万の)異なるオブジェクトに対応し得るので、ジャーナルにおけるオブジェクトチャンクは、当該オブジェクトチャンクへの参照がもはや存在しない場合にのみ削除され得る。したがって、第1のクローズドジャーナル230がひとたび選択される(954)と、プロセス900は、オブジェクトメタデータ228において参照が存在しない第1のクローズドジャーナル230に格納された1つ以上のオブジェクトチャンクを識別する(956)。これらの識別されたチャンク238について、対応するレコードを除去するようチャンクインデックス706が更新される(958)。いくつかの実現例では、識別されたオブジェクトチャンクに以前に割り当てられたスペースは、上書きされる(たとえば各バイトがASCII0にセットされる)が、他の実現例では、当該スペースはもはや参照されない。いくつかの実現例では、割り当てを解除されたストレージスペースは、他のジャーナルデータ708の一部としてトラッキングされる。たとえば、いくつかの実現例は、割り当てを解除されたストレージスペース(たとえばオフセットおよびサイズ)のリストを維持するか、または、割り当てを解除されたスペースをリンク付けされたリストとしてトラッキングする。
【0066】
いくつかの実現例では、ガーベッジコレクションアルゴリズムは、クローズドジャーナルの各々をコンパクト化する(960)よう、周期的に実行される。当該コンパクションプロセスは、格納されたオブジェクトチャンクを連続的なブロックへ統合し(960)、これにより、ジャーナル230のサイズを低減する。時間にわたって、より多くのオブジェクトチャンクが削除されると、ジャーナル230は小さくなり得る。多くの小さなジャーナルを管理することには、個々のオブジェクトを管理することと同様のオーバーヘッドが存在するので、ジャーナルの格納の利益は縮小される。この問題に対応するために、いくつかの実現例は、2つ以上のクローズドジャーナル同士を結合して(962)単一の置換ジャーナルを形成し、当該2つ以上のジャーナルに以前に格納されたオブジェクトチャンクは置換ジャーナルに格納されているということを示すようオブジェクトメタデータ228を更新する(962)。結合オペレーションは、完全に新しいジャーナルを形成することと、関連するオブジェクトのすべてについてメタデータを更新することとを必要とするので、結合は通常、ジャーナルが相対的に小さくなったシナリオに限定される。
【0067】
図10Aおよび
図10Bは、分散ストレージシステムにおいて、オブジェクトおよび関連付けられるメタデータを格納するための2つの実現例を示す。
図10Aにおいて示される実現例は、完全に階層的(hierarchical)である。すなわち、すべてのオブジェクトは1つ以上のチャンクへ分割され、すべてのチャンクは1つ以上のブロックへ分割されている。なお、1つのチャンクまたは1つのブロックのみが存在する場合も、当該構造は階層的である。他方、
図10Bに示される実現例は単に、部分的に階層的である。この実現例において、いくつかのチャンクは、ブロックのリストを指す「スーパーチャンク」である。たとえばスーパーチャンクは、100個のブロック、1000個のブロック、またはそれ以上のブロックを有するブロックリストを有し得る。スーパーチャンクでないチャンクは単にブロックである。すなわち、チャンク識別子は、ブロックのリストではなく、オブジェクトデータの実際のストレージを指す。このハイブリッドアプローチは、(階層が必要でない)小さなオブジェクトと、ストレージ階層が非常により効率的である非常に大きいオブジェクトとの両方を含む分散ストレージシステムに有用であり得る。
【0068】
図2〜
図4に示されるように、グローバルメタデータ1002は、オブジェクトメタデータ228およびジャーナルメタデータ236を含む。いくつかの実現例において、各チャンクID346は、チャンクについてのデータを複合化するために使用される復号化キー1040を割り当てられる。これらの実現例では、同じ復号化キーは、複数のブロックへ分割されるチャンクについて、チャンクにおけるすべてのブロックに適用されることになる。各チャンクは、事実上一意である自身の復号化キー1040を有する。新しいキーが生成される場合、いくつかの実現例は一意性を保証するが、いくつかの実現例は新しいキーをランダムに生成し、キーの繰り返しが起こる可能性はあまり高くない。復号化キー1040は、新しいオブジェクトが格納される際に、新しいオブジェクトを暗号化するために使用される暗号キーに対応する。復号化キー1040は各オブジェクトチャンクにアクセスするために必要とされるので、復号化キーを削除することは、オブジェクトチャンクの「ソフトな(soft)」削除として使用され得る。復号化キーがなくなると、暗号化されたストレージは「ガーベッジ」となり、実際のデータはアクセス不能となる。これにより、ガーベッジコレクションアルゴリズムは、コンパクション同士の間により多くの時間を得ることが可能になり、ガーベッジコレクションプロセスは、実行されると、より多くのストレージスペースを回収することができる。
【0069】
さらに、(オープンとして示される)ジャーナル232と、対応するローカルメタデータ1004とが
図10Aにおいて示される。いくつかの実現例では、ジャーナル232についてのローカルメタデータ1004は、ヘッダー702の一部として、ジャーナル自身に格納される。他の実現例では、ジャーナルについてのローカルメタデータ1004は別個のファイルとして(またはデータベースなどに)格納され、ジャーナルに関連付けられる。非階層的なストレージについてのジャーナル232の構造は
図7に関して上で示された。この実現例では、チャンクを格納するのではなく、ストレージの基本単位は、ブロック1016−1,1016−2,…,1016−Nといったブロック1016である。各実現例は典型的に、2メガバイト、4メガバイト、8メガバイトまたは16メガバイトといったような最大のブロックサイズを特定する。
【0070】
上に示されるように、ローカルメタデータ1004はジャーナル232のヘッダー702に格納され得るか、または、別々に格納され得る。各チャンク識別子346について、1つ以上のブロック識別子1008を含む対応するブロックリスト1006(典型的に一意のブロックリスト)が存在する。小さなチャンクについては、ブロックリスト1006は、単一のブロック識別子1008を含み得る。ローカルメタデータ1004はさらに、各ブロックがジャーナル232内でどこに位置するかを特定するブロックインデックス1010を含む。いくつかの実現例において、ブロックの位置はオフセットおよびサイズによって特定される。いくつかの実現例におけるブロックオフセット1012は、ストレージスペース714の始めからのオフセットまたはジャーナルファイル232の始めについてのオフセットである。典型的に、ブロックサイズ1014はバイトで特定されるが、他の実現例は、サイズの代替的な基本単位(たとえば2バイト、4バイトまたは8バイト)を使用する。ローカルメタデータの1つの局面は、ジャーナルが別のインスタンスに移動またはレプリケートされる場合に、ローカルメタデータは変更しないということである。すなわち、あるチャンクについてのブロックリスト1006は同じままであり、ブロックID1008は同じままであり、ジャーナル内のブロックオフセット1012は同じままであり、ブロックサイズは同じままである。
【0071】
図10Bは
図10Aと同様であるが、部分的に階層的な構造を示す。
図10Bの部分的に階層的な構造において、グローバルメタデータ1002は、各チャンクが通常のブロックか、または、ブロックのリストを参照する(すなわちスーパーチャンクである)かどうかを示す「スーパーチャンク」フィールド1020を含む。いくつかの実現例において、ほとんどのオブジェクトは小さく、単一のチャンクからなる。この場合、チャンクID346は、チャンク/ブロックインデックス1024においてブロックを直接的に識別する。すなわち、チャンクID346はチャンク/ブロックID1026である。したがって、スーパーチャンクでないチャンクの場合、ジャーナル232における対応するブロック1016についてオフセット1028およびサイズ1030を見つけるために、チャンク/ブロックインデックス1024における適切なレコードをルックアップするよう、チャンクID346が使用され得る。
【0072】
スーパーチャンクの場合、チャンクID346は、ローカルメタデータ1004においてルックアップされ得る(スーパー)チャンクID1022である。スーパーチャンクID1022に対応するのはブロックリスト1006であり、ブロックリスト1006はブロックID1008のセットを含む。この場合、ブロックIDの各々は、スーパーチャンクID1022についてのブロックリスト1006においてブロックID1026の各々についてオフセット1028およびサイズ1030を識別するよう、チャンク/ブロックインデックス1024においてルックアップされ得る。上記のように、オフセット1028およびサイズ1030は、ジャーナル232のストレージスペース714において実際のブロックストレージの位置を識別する。したがって、スーパーチャンクはさらなるレベルの階層を有するが、グローバルメタデータ1002に格納されるチャンクメタデータの量を低減する。これは、1つのインスタンスから別のインスタンスにシャードを移動させることをより容易かつ効率的にする。
【0073】
図11A〜
図11Dは、いくつかの実現例に従った、分散ストレージシステム200においてオブジェクトレプリカの配置を管理する(1102)方法1100を示す。この方法は、1つ以上のプロセッサおよびメモリを有する分散ストレージシステムの第1のインスタンス102において実行される(1104)。メモリは、1つ以上のプロセッサによる実行のための1つ以上のプログラムを格納する(1106)。いくつかの実現例において、方法1100のすべてまたは部分は位置割当デーモン206によって実行される。いくつかの実現例において、分散ストレージシステムは複数のインスタンスを有する(1108)。これらの実現例のうちのいくつかでは、インスタンスの少なくともサブセットは、異なる地理的位置に存在する(1108)。いくつかの実現例において、各インスタンスはデータセンタに対応する。いくつかの実現例において、各データセンタは1つ以上のインスタンスを含む。
【0074】
第1のインスタンスでは、1つ以上のジャーナル232がオブジェクトチャンクの格納のためにオープンにされる(1110)。各ジャーナルは、単一のそれぞれの配置ポリシー212に関連付けられる(1112)。いくつかの実現例では、各配置ポリシーは、対象数のオブジェクトレプリカと、オブジェクトレプリカについての位置の対象セットとを特定する(1122)。いくつかの実現例では、配置ポリシー212は、データストア224のどのタイプがインスタンスのうちのいくつかにおいて使用されるべきであるか(たとえばディスクまたはテープ)を特定し得る。いくつかの実現例では、分散ストレージシステム200は、どのジャーナルに各オブジェクトチャンク238が格納されているかを特定するオブジェクトメタデータ228(グローバルメタデータ1002の部分)を含む(1114)。これは、
図3〜
図5、
図10Aおよび
図10Bに関して以前に記載された。いくつかの実現例では、各それぞれのジャーナルは、それぞれのジャーナルに格納された各ブロックの位置を特定するブロックインデックス1010または1026を含む(1116)。これは、
図7(非階層的)、
図10Aおよび
図10Bにより詳細に記載された。特に、ジャーナル232内の各ブロック1016の位置は、ジャーナル自身に対して識別され、したがって、ブロックインデックス1010または1026は、ジャーナル232がどこに格納されるかにかかわらず正確である。たとえば、オフセットとしてジャーナル232内のブロック1016の位置を特定することによって、ブロック1016はリラティブアドレッシング(relative addressing)によってアクセスされ得る。
【0075】
開示された実現例は典型的に、各ジャーナルが格納される位置372を特定するジャーナルメタデータ236(グローバルメタデータ1002の一部)を含む(1118)。これは、
図3〜
図5および
図8に以前に記載された。
【0076】
オープンプライマリジャーナル232およびオープンセカンダリジャーナル234の分散は、利用可能なインスタンス102と、配置ポリシー212と、配置ポリシー212有する新しいオブジェクト226の予想される分散と、新しいオブジェクトがどこ(たとえばヨーロッパ、北米、アジア)からロードされるかと、利用可能なインスタンス102の各々での処理リソースと、さまざまなインスタンス同士間のネットワーク帯域幅とを含む多くのファクタに依存する。たとえば、多くのオブジェクトが、特定のインスタンスにて特定の配置ポリシーでアップロードされる場合、そのインスタンスでの同じ配置ポリシーについて、複数のジャーナルがオープンにされる(1120)。いくつかのシナリオにおいて、ロードバランシングに必要とされる場合、単一のインスタンス102において、同じ配置ポリシー212について、5個、10個、またはそれ以上のオープンジャーナルが存在し得る。
【0077】
第1のインスタンス102では、少なくとも第1のオブジェクトチャンクを含む(1124)第1のオブジェクト226が受け取られる(1124)。これは、
図6に関して上に記載された。第1のオブジェクト226は第1の配置ポリシー212に関連付けられており(1124)、したがって、オブジェクト226を含むオブジェクトチャンク238のすべては第1の配置ポリシー212に関連付けられる。第1のオブジェクトチャンクは、
図10Aおよび
図10Bに関して上述したように、第1の複数のブロックを含む(1126)。いくつかの実現例において、プロセス1100は、チャンクおよびブロックに既にパーティショニングされたオブジェクト238を受け取る(1124)。たとえば、オブジェクトをアップロードするクライアントデバイスによって分割が実行され得る。他の実現例において、プロセス1100は、オブジェクトをストリームとして受け取り、格納された基準(たとえば対象ブロックおよびチャンクサイズ、利用可能なオープンジャーナル、利用可能なインスタンス、利用可能な帯域幅など)に従ってチャンクおよびブロックへオブジェクトを分割する。いくつかの実現例では、まだオブジェクトについてデータを受け取っている間、チャンクの動的割り当てが実行され、その一方、他の実現例は、全オブジェクトが受け取られた後にのみオブジェクトをチャンクおよびブロックへ分割する。
【0078】
チャンクおよびブロックの階層は、さまざまな態様で、オブジェクトのサイズのようなさまざまなファクタに基づいて形成され得る。いくつかの実現例において、階層は、アップロードプロセスの間に動的に構築される。たとえば、第1のオブジェクトチャンクが作成され、しきい値数のブロックがチャンクに割り当てられるまで、データのストリームが、第1のオブジェクトチャンクに割り当てられるブロックへ分割される。その時点において、第2のチャンクが作成され、新しいブロックが第2のチャンクに追加される。別の実現例では、データのストリームは最初は、ストレージのブロックとして格納され、ブロックがもはや存在しない場合、ブロックはチャンクへとグループ化される。
【0079】
いくつかの実現例において、すべてのオブジェクトチャンク238は1つ以上のブロックを含む(1128)。これは、
図10Aに関して上で示された。いくつかの実現例において、グローバルメタデータ1002は、各オブジェクトチャンク238がブロックまたはブロックのリストであるかどうかを特定するフィールド1020を含む(1130)。これは、
図10Bにおいて上で示される。いくつかのインスタンスにおいて、第1のオブジェクトチャンクはブロック(すなわちスーパーチャンク)のリストであり(1132)、第2のチャンクは通常のブロック(スーパーチャンクでない)である(1132)。
【0080】
第1の複数のブロック1016は、関連付けられる配置ポリシーが第1の配置ポリシー212とマッチする第1のジャーナル232に格納される(1134)。第1のジャーナル232は、配置ポリシーが第1の配置ポリシーとマッチするオブジェクトについてのブロックのみを格納する(1136)。
【0081】
受け取られたオブジェクトが特定されたサイズ(たとえばチャンクサイズまたはブロックサイズ)より大きい場合、オブジェクトは、複数のチャンク238および/または複数のブロック1016へ分割される。いくつかのインスタンスにおいて、第1のオブジェクト226は2つ以上のオブジェクトチャンクを含む(1138)。典型的に、第2のオブジェクトチャンクは、第1のオブジェクトチャンクと異なる(1138)。(単一のオブジェクト内に2つの同一のチャンクを有することは稀であるが、たとえば、オブジェクトが空のスペースの非常に大きな部分を有する場合に起こり得る。)いくつかの状況では、第2のオブジェクトチャンクが、関連付けられる配置ポリシーが第1の配置ポリシーとマッチする第1のジャーナルとは異なる第2のジャーナル232に格納される(1140)。第2のジャーナルは、配置ポリシーが第1の配置ポリシーとマッチするオブジェクトについてのオブジェクトチャンクのみを格納する(1140)。これにより、多くのチャンクを含むオブジェクトは、多くの異なるジャーナルにわたって分散されるチャンクを有し得る。
【0082】
いくつかの実現例では、そのプロセスは、各オブジェクトチャンクについてデータを暗号化し(1142)、グローバルメタデータにおける各オブジェクトチャンクについての復号化キーを格納する(1142)。これは、
図10Aおよび
図10Bにおいて上で示された。いくつかの実現例では、チャンクが複数のブロックへ分割される場合、チャンク内のブロックの各々は同じ暗号キーで暗号化されるので、同じ復号化キーで複合化され得る。他の実現例において、各ブロックは、ブロックインデックス1010または1026の一部として格納され得るそれ自身の復号化キーを有する。グローバルメタデータ1002に復号化キー1040を格納する実現例では、チャンクは単純に、復号化キーを削除すること(1144)によって事実上削除され得る。オリジナルチャンクについてデータを抽出する方法がないので、チャンクはアクセス不能である。これはいくつかの利点を提供する。第1に、チャンクを削除することは迅速かつ有効である。第2に、削除されたデータにアクセスする現実のリスクがないので、より効率的なガーベッジコレクションプロセスが実現され得る。特に、ガーベッジコレクションは適切な間隔でスケジューリングされ得、ディスクからストレージの物理的な削除(physical deletes of storage)をバッチ処理し得る。コンパクションはリソース集中的なプロセスであるので、多くの削除を一緒にバッチ処理する能力は、効率を劇的に増加させ得る。第3に、いくつかの実現例は、暗号化された「意味のないこと(gibberish)」は、意味のあるコンテンツに戻すように変換され得ないので、ストレージスペースの物理的な消去を必要としない。
【0083】
プロセス1100は、第1のオブジェクトについてのグローバルメタデータを格納する(1146)。これは、
図3〜
図5、
図10Aおよび
図10Bにおいて上で示された。グローバルメタデータ1002は、第1のオブジェクトに対応するオブジェクトチャンクの第1のリストを含む(1148)。特に、第1のリストは、第1のオブジェクトチャンク238についてのオブジェクト識別子330を含む(1150)。グローバルメタデータ1002はさらに、ジャーナルの各々についての位置と同様に各チャンクが格納されるジャーナルを識別する。
【0084】
グローバルメタデータ1002に加えて、ローカルメタデータ1004が各ジャーナル232について格納される。いくつかの実現例では、各ジャーナルについてのローカルメタデータ1004は、ジャーナル232自身のヘッダー702に格納される。他の実現例において、ローカルメタデータ1004はジャーナルとは別々に格納される。別々に格納される場合、各ジャーナルについてのローカルメタデータ1004は別々に格納されてもよく(たとえば各ジャーナルに対応する異なるメタデータファイル)、または、ローカルメタデータは(たとえばデータベースにおいて)一緒にグループ化されてもよい。
【0085】
第1のインスタンスは、第1のオブジェクトチャンク238についてのローカルメタデータ1004を格納する(1152)。ローカルメタデータ1004は、第1の複数のブロックにおける各ブロックを識別するブロックリストを含む(1154)。なお、ブロックリストは、グローバルメタデータ1002ではなく、ローカルメタデータ1004に格納される。ローカルメタデータ1004に格納されたブロックリスト1006は、ブロックがどのように各ジャーナル内に割り当てられるかをトラッキングする。第1のジャーナル232についてのローカルメタデータは、第1のジャーナル232に関連付けられる(1156)。いくつかの実現例では、ジャーナルとのローカルメタデータの関連付けは、ジャーナルにローカルメタデータを格納することによって行なわれており、これによりジャーナルがより独立する(self-contained)。いくつかの実現例では、ジャーナル232についてのローカルメタデータは別々に(たとえば別個のファイルにおいて)格納され、(たとえば、ジャーナルの名称と、関連付けられるメタデータファイルの名称とにジャーナルID370を含むことによって)ジャーナルに関連付けられる。データベースにローカルメタデータを格納する実現例において、ジャーナルID370は典型的にメタデータテーブルについてのプライマリキーの一部である。
【0086】
オブジェクト226を受け取り、かつ、第1のジャーナル232にチャンク238を格納するこのプロセスは、関連付けられる配置ポリシー338が第1の配置ポリシー212にマッチする複数のオブジェクト226について、第1の終了条件が発生するまで繰り返される(1158)。いくつかの実現例では、第1の終了条件は、第1のジャーナルのサイズが予め規定されたしきい値を越える(1160)場合に発生する。いくつかの実現例では、第1の終了条件は、第1のジャーナルが予め規定された時間スパンの間オープンであった場合(1162)に発生する。いくつかの実現例は、さまざまな態様でサイズおよび時間を組み合わせる。たとえば、いくつかの実現例は、時間スパンおよびサイズ限界の両方を特定しており、終了条件は、上記のうちのいずれか一方が最初に発生することである。
【0087】
終了条件が発生した後、第1のジャーナルはクローズされ(1164)、これにより、如何なる付加的なブロックも第1のジャーナル232に格納されることを防止する。一般に、実現例は、第1のジャーナルをクローズする前に、同じ配置ポリシーについての他のジャーナル232がまだオープンである(または新しいジャーナルがオープンである)ことを確認する。新しいオブジェクトがいつでも到着し得るので、格納のためにオープンジャーナルを利用可能にしておくことが重要である。
【0088】
第1のジャーナル232がクローズされた後、ジャーナルはその配置ポリシーに従う。配置ポリシー212を満足させることは、ジャーナルレプリカを移動させること、ジャーナルレプリカの新しいコピーを作成すること、または、ジャーナルのレプリカを削除することを必要とし得る。いくつかの状況では、第1のジャーナル232は、配置ポリシー212に従って、分散ストレージシステム200の第2のインスタンス102にレプリケートされる(1166)。(他の状況において、第1のジャーナルのレプリカは削除される。)プライマリオープンジャーナル232およびセカンダリオープンジャーナル234を有する実現例では、それらがひとたびクローズされると、2つの同等なクローズドジャーナル230が存在することになる。したがって、レプリケーション1166のためのソースとして、レプリカのいずれかが使用され得る。レプリケーション1166が発生する(たとえばトランザクションの一部として)と、第2のインスタンスにジャーナルのコピーが存在することを示すよう、第1のジャーナルについてのグローバルメタデータ1002が更新される(1168)。他方、ローカルメタデータ1004はレプリケーションによって変更されない(1168)。これは、
図8、
図10Aおよび
図10Bに関して上で記載された。
【0089】
ジャーナル230がクローズされた後、オブジェクトチャンク238が削除され得る。たとえば、オブジェクトはメール添付物に対応し得る。電子メールの受信者が電子メールを削除すれば、当該添付物についての格納分は削除され得る。ある期間の後、当該削除により各ジャーナル内にホールが存在するので、当該無駄にされているスペースを除去するようジャーナルをコンパクト化することが有用である。これは、揮発性メモリのフラグメンテーション、および、未使用スペースをより大きな連続するストレージへと統合するデフラグメンテーションのプロセスに類似している。
【0090】
格納されたオブジェクトチャンクが多くの(たとえば何百、何千または何百万の)異なるオブジェクトに対応し得るので、ジャーナルにおけるオブジェクトチャンクは、当該オブジェクトチャンクへの参照がもはや存在しない場合にのみ削除され得る。したがって、第1のクローズドジャーナル230がひとたび選択される(1170)と、プロセス1100は、オブジェクトメタデータ228において参照が存在しない第1のクローズドジャーナル230に格納された1つ以上のオブジェクトチャンクを識別する(1172)。いくつかの実現例では、ガーベッジコレクションアルゴリズムは、クローズドジャーナルの各々をコンパクト化する(1174)よう、周期的に実行される。当該コンパクションプロセスは、格納されたブロックを連続的なストレージへと統合し(1174)、これにより、ジャーナル230のサイズを低減する。
【0091】
時間にわたって、より多くのオブジェクトチャンクが削除されると、ジャーナル230は小さくなり得る。多くの小さなジャーナルを管理することには、個々のオブジェクトを管理することと同様のオーバーヘッドが存在するので、ジャーナルの格納の利益は縮小される。この問題に対応するために、いくつかの実現例は、2つ以上のクローズドジャーナル同士を結合して(1176)単一の置換ジャーナルを形成し、当該2つ以上のジャーナルに以前に格納されたオブジェクトチャンクは置換ジャーナルに格納されているということを示すようオブジェクトメタデータ228を更新する(1176)。結合オペレーションは、完全に新しいジャーナルを形成することと、関連するオブジェクトのすべてについてメタデータを更新することとを必要とするので、結合は通常、ジャーナルが相対的に小さくなったシナリオに限定される。
【0092】
図12は、いくつかの実現例に従った、
図10Bに関して以前に示されるように分散ストレージシステムにチャンクを格納する例を示す。この例において、2つのチャンク238−1および238−2が示される。チャンク238−1は、チャンクID346−1の通常のチャンクである(すなわちスーパーチャンクでない)。チャンク238−1は、通常のチャンクであるので、チャンク/ブロックインデックス1024において直接的にルックアップされ得る。この図において、チャンク/ブロックインデックス1024は、データが格納されるジャーナル232のヘッダー702に格納される。このチャンク/ブロックについては、オフセット1028はy(1028−y)である。このオフセットを使用すると、対応するブロックB1016−Bは、ストレージスペース714において発見され得る。
【0093】
しかしながら、チャンク238−2は(スーパー)チャンクID346−2を有するスーパーチャンクである。ここで示されるように、スーパーチャンク238−2は、ブロックリストテーブル1006におけるエントリを指す。各スーパーチャンクID1022について、複数の対応するブロックID1008が存在する。
図12は、2つの対応するブロック1008−1および1008−2を示すが、非常に大きいオブジェクトの場合、単一のチャンクについて非常に多くのブロックが存在し得る。その後、ブロックID1008−1および1008−2は、ブロックについてオフセット1028−xおよび1028−zを発見するよう、チャンク/ブロックインデックス1024においてルックアップされる。最後に、オフセット1028−xおよび1028−zを使用して、対応するブロック1016−Aおよび1016−Cはストレージスペース714に位置する。この例では、2つのブロックは連続しておらず、実際は、チャンク238−1についてのブロック1016−Bは、チャンク238−2についての2つのブロックを分離する。もちろん、各ブロックについての適切なデータのみが読み出されるように、各ブロックのサイズも使用される。これは、
図10Bに関して上で記載された。
【0094】
(チャンク238−1のような)通常のチャンクを許可しない実現例は完全に階層的である。また、チャンクとブロックとの間の割り当ては、実現例または他の動的なファクタに基づき変動する。たとえば、100個のブロックを有する単一のチャンクまたは25個のブロックを各々備えた4つのチャンクとして、同じオブジェクトが格納され得る。いくつかの実現例は、実際の使用からの経験的なフィードバックに基づいて、チャンクの数を変更する。
【0095】
説明の目的のためである上記の記載は、特定の実現例を参照して記載された。しかしながら、上記の例示的な議論は、網羅的であるように意図されておらず、または、本発明を開示されたそのままの形態に限定するよう意図されていない。上記の教示に鑑みて多くの修正例および変形例が可能である。上記の実現例は、本発明の原理およびその実際的な適用を最もよく説明するために選択および記載されたものであり、これにより他の当業者が、考慮される特定の使用に好適なさまざまな修正例とともに、本発明およびさまざまな実現例を最もよく利用するのが可能になる。