(57)【要約】      （修正有）【課題】分割可能で、併合可能で、転送可能な複数の冗長なデータコンテナの複数のチェーンを採用することによって、複数のデータサービスを提供する。【解決手段】複数のデータブロック７０４，７０８をノードネットワーク内の複数の異なる物理ストレージノード内に位置している異なる複数のデータコンテナ７１６に分配して、ストレージノードネットワークの構成に応答して自動的に分割および／または併合可能で、異なる複数のストレージノードにわたって分配されている消失符号化されている複数のフラグメント内に保存する。複数のコンテナの冗長な複数のチェーンを利用している分散２次ストレージシステム内で提供されるデータサービスは、グローバル重複排除、動的拡張性、複数の冗長クラスのサポート、データの位置の検出、データの高速な読み取りと書き込み、ノードまたはディスクの障害によるデータの再構築を有することができる。【選択図】図７
2010079886.tif 000002
【特許請求の範囲】
【請求項１】
複数のデータブロックをノードネットワーク内の複数の異なる物理ストレージノード内に位置している異なる複数のデータコンテナに分配して、前記複数のノード内の前記複数のデータコンテナの冗長なチェーンを生成するステップと、
アクティブな複数のストレージノードの前記ネットワークへの追加を検出するステップと、
前記追加の検出に応答して、複数のコンテナの少なくとも１つのチェーンを自動的に分割するステップと、
ノード障害に対するシステム堅牢性を強化するように、前記複数のコンテナの少なくとも１つのチェーンから分割されたデータの少なくとも一部を前記複数のストレージノードの１つから前記複数のストレージノードの他の１つに転送するステップとを有する２次ストレージシステム上でデータを管理する方法。
【請求項２】
前記自動的に分割するステップは、少なくとも１つのデータコンテナを分割するステップを有し、前記データの少なくとも一部は、前記分割するステップ以前に、少なくとも１つのデータコンテナに保存されている、請求項１に記載の方法。
【請求項３】
前記自動的に分割するステップは、前記複数のコンテナの少なくとも１つのチェーンから少なくとも１つのデータコンテナを分割するステップを有し、前記データの少なくとも一部は、前記分割するステップ以前に、少なくとも１つのデータコンテナに保存されている請求項１に記載の方法。
【請求項４】
前記少なくとも１つのデータコンテナを他のデータコンテナと併合するステップをさらに有する請求項３に記載の方法。
【請求項５】
複数のデータコンテナの前記複数のチェーンの少なくとも１つは、複数のデータコンテナの他の複数のチェーンと同じメタデータを有し、前記メタデータはデータブロック情報を記述している請求項１に記載の方法。
【請求項６】
障害に応答して前記メタデータを使用してデータを再構築するステップをさらに有する請求項５に記載の方法。
【請求項７】
前記メタデータは前記複数のデータコンテナ内のデータブロック間の複数のポインタを有する請求項５に記載の方法。
【請求項８】
前記複数のポインタを使用してデータを消去するステップをさらに有する請求項７に記載の方法。
【請求項９】
消失符号化された複数のフラグメントを生成するように、前記複数のデータブロックを消失符号化するステップをさらに有し、前記分配するステップは、消失符号化された複数のフラグメントを、前記複数のデータブロックの１つからの前記複数のフラグメントが異なる複数のストレージノードに保存されるように、前記異なる複数のデータコンテナに保存するステップを有する請求項１に記載の方法。
【請求項１０】
前記複数のデータブロックの少なくとも１つが前記２次ストレージシステムで使用可能かどうかを判断するために、前記複数のデータコンテナの複数の冗長なチェーンのいずれかが複数のホールを有しているかどうかを判断するステップをさらに有する請求項９に記載の方法。
【請求項１１】
複数の物理ストレージノードのネットワークを有する、２次ストレージシステムであって、
各ストレージノードは、
他の複数のストレージノード内の複数のデータコンテナの複数のチェーンについて冗長な複数のデータコンテナのチェーン内の複数のデータブロックの複数のフラグメントを保存するように構成されているストレージ媒体と、
アクティブな複数のストレージノードの前記ネットワークへの追加を検出して、前記追加の検出に応答して前記ストレージ媒体上の複数のコンテナの少なくとも１つのチェーンを自動的に分割して、ノード障害に対するシステム堅牢性を強化するように、前記複数のコンテナの少なくとも１つのチェーンから分割されたデータの少なくとも一部を異なるストレージノードに転送するように構成されているストレージサーバとを有する２次ストレージシステム。
【請求項１２】
前記ストレージサーバは、データ読み取り、データ書き込み、データの可用性の判断、データ転送、分配されているグローバル複製排除の中の少なくとも１つを実行するようにさらに構成されている請求項１１に記載の２次ストレージシステム。
【請求項１３】
複数のデータコンテナの前記複数のチェーンの少なくとも１つは、複数のデータコンテナの他のチェーンと同じメタデータを有し、前記メタデータはデータブロック情報を記述している請求項１１に記載の２次ストレージシステム。
【請求項１４】
前記メタデータは前記複数のデータコンテナ内のデータブロック間の複数のポインタを有し、前記ストレージサーバは、前記複数のポインタを使用してデータ消去を実施するように構成されている請求項１３に記載の２次ストレージシステム。
【請求項１５】
前記複数のデータブロックの前記複数のフラグメントは、ハッシュ関数に従って、前記ストレージ媒体上で内容アドレス指定されている請求項１１に記載の２次ストレージシステム。
【請求項１６】
複数の内容アドレスの異なるプレフィックスは、複数のストレージノードの異なる複数の部分集合に関連付けられている請求項１５に記載の２次ストレージシステム。
【請求項１７】
前記自動分割は、複数のストレージノードの少なくとも１つの追加の部分集合を生成するように前記複数のプレフィックスの少なくとも１つを拡張することを有する請求項１６に記載の２次ストレージシステム。
【請求項１８】
前記転送は、前記複数のコンテナの少なくとも１つのチェーンから分割された前記データの少なくとも一部分を前記追加の部分集合に分配することを有する請求項１７に記載の２次ストレージシステム。
【請求項１９】
複数のデータブロックを前記ノードネットワーク内の複数の異なる物理ストレージノード内に位置している異なる複数のデータコンテナに分配して、前記複数のノード内の前記複数のデータコンテナの冗長なチェーンを生成するステップと、
前記ネットワーク内のアクティブな複数のストレージノードの数の変化を検出するステップと、
前記複数のコンテナの管理可能性を保証するように、前記変化の検出に応答して、前記複数のストレージノードの１つに位置している少なくとも１つのデータコンテナを、異なるストレージノード内に位置している他のデータコンテナに自動的に併合するステップとを有する２次ストレージシステム上でデータを管理する方法。
【請求項２０】
前記アクティブなノードの数の前記変化は、少なくとも１つのストレージノードの前記ネットワークへの追加、少なくとも１つのストレージノードの前記ネットワークからの削除の少なくとも１つを有する請求項１９に記載の方法。
【発明の詳細な説明】
【技術分野】
【０００１】
本出願は、２００８年９月１１日に出願された仮出願通し番号第６１／０９５，９９４号に対する優先権を主張する。
【０００２】
本発明は、一般的にデータの保存に関し、特に２次ストレージシステムへのデータの保存に関する。
【背景技術】
【０００３】
企業環境では重要な局面である２次ストレージ技術の開発は、企業によって課される増大する困難な要求と歩調を合わせなければならなかった。たとえば、そのような要求には、様々な程度の重要性を備えているデータに対する様々な程度の信頼性、可用性、および保持期間の同時提供がある。さらに、サーベンス・オクスリー法（ＳＯＸ）、医療保険の相互運用性と説明責任に関する法律（ＨＩＰＰＡ）、愛国者法、および米国証券取引委員会規則１７ａ−４（ｔ）などの法的な要件に合致するように、企業環境は、２次ストレージシステムに改善されたセキュリティ、追跡可能性、およびデータ監査を要求してきた。その結果、好ましい２次ストレージアーキテクチャは、厳重なデータ保持と消去手順とを厳格に定め、実施している。さらに、２次ストレージアーキテクチャは、データを保持し回復し、要求に応じてデータを提示しなければならないが、それができない場合、業務効率の深刻な損失ばかりではなく、罰金や刑事訴訟となることさえあるからである。さらに、企業は、比較的限定された情報技術（ＩＴ）予算を採用していることが多いため、ストレージの利用率の改善と増大するデータ管理コストの削減との両方に関して、効率も最重要でもある。さらに、増大し続ける作成されたデータとそれに対応した固定されたバックアップウィンドウについて、性能とバックアップ容量の適切な拡張に対する明確な要求がある。
【発明の概要】
【発明が解決しようとする課題】
【０００４】
ディスク対象重複排除仮想テープライブラリ（ＶＴＬ）、ディスクベースのバックエンドサーバ、および内容アドレス指定可能なソリューションの進歩によって実証されたように、これらの企業ニーズに対応する相当な進歩があった。しかし、既存のソリューションは、２次ストレージに保存されているデータの量の指数的な増加に関連した問題に適切に対応していない。
【０００５】
たとえば、ネットワークに構成され、共通の管理下にあるストレージエリアネットワーク（ＳＡＮ）などの１次ストレージとは異なり、２次ストレージは、各々が専用化され、複雑な、そしてしばしば手動の管理を使用することになるストレージアイランドである多数の高度に特化した専用構成要素を有している。したがって、総保有コスト（ＴＣＯ）の大部分は、複数の２次ストレージの構成要素の比較的大きな範囲の管理にあてられることがある。
【０００６】
さらに、既存のシステムは、固定された容量を各ストレージ装置に割り当て、重複排除をただ１つの装置に制限しており、そのために容量利用率が低下し、複数の構成要素上に保存されている複数の複製による空間の無駄使いにつながっている。たとえば、公知のシステムは大きな安価なディスクによる冗長アレイ（ＲＡＩＤ）システムを有しており、これが、潜在的に複数のしかし数が限定されているコントローラを有している１つのコントロールボックスを実現する。これらのシステムのデータ構成は、固定サイズのブロックインターフェイスに基づいている。さらに、これらのシステムは、固定データ冗長スキームを採用し、固定された最大容量を利用し、空であってもパーティション全体を再構築する再構成スキームを適用することにおいて限定されている。さらに、これらのシステムは、重複排除を実現する手段を有することができないが、これはそのようなシステムを使用した重複排除は、より高い階層内に実装しなければならないからである。
【０００７】
他の公知の装置は、ＤａｔａＤｏｍａｉｎなどの１つのボックス内の進歩したストレージ、またはＥＭＣ  Ｃｅｎｔｒａなどのクラスタ化されているストレージを実現する。これらの種類のシステムの欠点は、限定された容量と性能とを提供する、グローバルな重複排除（ＤａｔａＤｏｍａｉｎ）とは反対にボックス毎の重複排除を採用する、またはファイル全体に基づいている（ＥＭＣ  Ｃｅｎｔｅｒａ）ことである。これらのシステムは、重複排除などの高度なサービスのいくつかを提供するが、これらのシステムは集中化されていることが多く、これらのシステムによって保存されているメタデータ／データは標準的なＲＡＩＤスキームを超える冗長性は有していない。
【０００８】
最後に、これらの公知の２次ストレージ装置の各々は、固定され、限定された性能、信頼性、および可用性を実現するので、これらの面において企業の２次ストレージの非常に高い全体の要求を満たすことは非常に困難である。
【課題を解決するための手段】
【０００９】
本発明の様々な典型的な実施態様の方法とシステムとは、いくつかの異なるデータサービスの実装を促進するデータ構成スキームを提供することによって、従来技術の欠点に対応する。さらに、典型的な装置と方法とは、従来技術を改善するが、これは典型的な実装は、変化するネットワーク構成に自動的に対応し、冗長性を実現することによって、動的な状態を許容するからである。特に、典型的な実装は、変化しているネットワーク構成に応答してデータコンテナおよび／またはデータコンテナのチェーンを分割、併合、および／または転送してもよいが、これは公知のプロセスに対する顕著な利点である。
【００１０】
本発明の典型的な一実施態様において、２次ストレージ上のデータを管理する方法は、複数のデータブロックをノードネットワーク内の複数の異なる物理ストレージノード内に位置している異なる複数のデータコンテナに分配して、複数のノード内の複数のデータコンテナの冗長なチェーンを生成するステップと、アクティブな複数のストレージノードのネットワークへの追加を検出するステップと、追加の検出に応答して複数のコンテナの少なくとも１つのチェーンを自動的に分割するステップと、ノード障害に対するシステム堅牢性を強化するように、複数のコンテナの少なくとも１つのチェーンから分割されたデータの少なくとも一部を複数のストレージノードの１つから複数のストレージノードの他の１つに転送するステップとを有する。
【００１１】
本発明の代替の典型的な実施態様において、２次ストレージシステムは、複数の物理ストレージノードのネットワークを有し、各ストレージノードは、他の複数のストレージノード内の複数のデータコンテナの複数のチェーンについて冗長な複数のデータコンテナのチェーン内の複数のデータブロックの複数のフラグメントを保存するように構成されているストレージ媒体と、アクティブな複数のストレージノードのネットワークへの追加を検出し、追加の検出に応答してストレージ媒体上の複数のコンテナの少なくとも１つのチェーンを自動的に分割して、ノード障害に対するシステム堅牢性を強化するように、複数のコンテナの少なくとも１つのチェーンから分割されたデータの少なくとも一部を異なるストレージノードに転送するように構成されているストレージサーバとを有する。
【００１２】
本発明の代替の典型的な実施態様において、２次ストレージシステム上でデータを管理する方法は、複数のデータブロックをノードネットワーク内の複数の異なる物理ストレージノード内に位置している異なる複数のデータコンテナに分配して、複数のノード内の複数のデータコンテナの冗長なチェーンを生成するステップと、ネットワーク内のアクティブな複数のストレージノードの数の変化を検出するステップと、複数のコンテナの管理可能性を保証するように、変化の検出に応答して、複数のストレージノードの１つに位置している少なくとも１つのデータコンテナを、異なるストレージノード内に位置している他のデータコンテナに自動的に併合するステップとを有する。
【００１３】
これらの、そしてその他の特徴と利点とは、添付図面と共に読むべきそれらの具体的な実施形態の以下の詳細な説明から明らかになるであろう。
本開示は、好ましい実施形態の以下の説明において、図面を参照して詳細を示す。
【図面の簡単な説明】
【００１４】
【図１】本原理の１つの典型的な実装による２次ストレージシステムのバックエンド部分のデータブロック構成スキームのブロック図／流れ図である。
【図２】本原理の１つの典型的な実装による２次ストレージシステムのブロック図／流れ図である。
【図３】本原理の１つの典型的な実装による物理ストレージノードのブロック図／流れ図である。
【図４】本原理の１つの典型的な実装によるアクセスノードのブロック図／流れ図である。
【図５】本原理の１つの典型的な実施形態による、複数のデータブロックの複数のハッシュプレフィックスによる複数のストレージノードのグループ化を示している固定プレフィックスネットワークの図である。
【図６】本原理の１つの典型的な実装によるデータを分配するシステムのブロック図／流れ図である。
【図７】本原理の一実施形態によって、データの分割、連結、および削除と、ストレージノードのストレージノードネットワークへの追加または追加データのロードに応答したストレージ空間の再利用を示しているブロック図／流れ図である。
【図８】本原理の典型的な実装による２次ストレージシステム内でのデータ管理方法のブロック図／流れ図である。
【図９】本原理の１つの典型的な実装による２次ストレージシステムによって実行可能な複数のデータサービスを示しているブロック図／流れ図である。
【図１０Ａ】本原理の典型的な実装によるデータコンテナのチェーン内のホール（穴）を検出するようにスキャン動作中の異なる時間フレームを示しているブロック図／流れ図である。
【図１０Ｂ】本原理の典型的な実装によるデータコンテナのチェーン内のホールを検出するようにスキャン動作中の異なる時間フレームを示しているブロック図／流れ図である。
【図１０Ｃ】本原理の典型的な実装によるデータコンテナのチェーン内のホールを検出するようにスキャン動作中の異なる時間フレームを示しているブロック図／流れ図である。
【図１１】本原理の代替の典型的な実装による２次ストレージシステム内でのデータ管理方法のブロック図／流れ図である。
【発明を実施するための形態】
【００１５】
前述のように、商用の要求を満たすために、分散している複数の２次ストレージシステムは、様々なサービスを実施できなければならない。たとえば、保存されているデータの可用性の高速の判断（つまり、読み取ることができるかまたは失われているかの判断）、複数のデータ冗長クラスのサポート、任意の所与の瞬間についてのデータ冗長レベルの高速の判断（つまり、所与のデータが消失せずに耐えることができるノード／ディスク障害の数の判断）、冗長レベルが減少した場合の指定された冗長レベルまでのデータの高速の再構築、高レベルの性能でのデータの書き込みと読み取り、ネットワーク構成の変化（新規のノードの追加および／または古いノードの削除または障害など）に応答したデータ位置の調整による動的な拡張性の提供、オンデマンドデータ削除、およびグローバルで効果的な重複の排除が含まれる。
【００１６】
高性能グローバル重複排除、分散システム内での動的拡張性、削除サービス、障害回復などのこれらデータサービスの任意の１つは実装がそれ自体比較的容易であるのに対して、それらの各々を共に提供することはかなり困難である。たとえば、ストレージシステムが大きくなったり、複数のストレージノードの構成が変化したときに複製されたデータの位置の決定は困難であるので、重複排除と動的拡張性との間には拮抗した関係がある。さらに、重複排除の実現とオンデマンド削除との間には、相反する関係がある。たとえば、データの消失を防止するために、削除が予定されていたデータの重複排除を回避しなければならない。障害が発生した場合の削除の判断が一貫していなければならないため、耐障害性の実現と削除との間にも拮抗した関係がある。
【００１７】
前述のように、ＲＡＩＤなどの現在の２次ストレージシステムは、そのようなデータサービスの組み合わせを適切に提供することができない。本発明の典型的な実装は、効率と性能とを維持しながら、様々な種類のデータサービスによって課される要求をバランスさせる新規の手段を提供することによって、従来技術の欠陥に対応している。たとえば、以下で説明する典型的なデータ構成スキームによって、これらのサービス間の拮抗関係と相反関係とを解決して、これらのサービスの各々の２次ストレージシステムへの実装を促進することができる。
【００１８】
以下で説明するように、本発明の典型的な実施形態には、複数のストレージノードのグリッドとして構成されているバックエンドを有する商用ストレージシステムが含まれる。当業者には理解されるように、フロントエンドは、ネットワークファイルシステム（ＮＦＳ）プロトコルまたは一般的なインターネットファイルシステム（ＣＩＦＳ）プロトコルなどの標準的なファイルシステムインターフェイスを使用して実装可能な性能に対応した複数のアクセスノードの層を有していてもよい。本明細書で開示している本原理は、主に、内容アドレス指定可能なストレージに基づいている場合がある、２次ストレージシステムのバックエンド部分を対象にしている。
【００１９】
本原理の典型的な実装によれば、２次ストレージ容量は、全てのクライアントとバックアップデータやアーカイブデータなどの全ての種類の２次ストレージデータの間で動的に共有することができる。容量の共有に加えて、ストレージ容量の効率を改善するように、以下で説明するシステム全体にわたる重複排除を適用することができる。典型的なシステム実装は、可用性が高いが、これはオンライン拡張とアップグレードとをサポートし、複数のノードとネットワークの障害に耐え、障害後に自動的にデータを再構築し、ユーザに保存されているデータの回復を知らせることができるためである。保存されているデータの信頼性と可用性とは、各々の書き込みを行う複数のクライアントによってさらに動的に調整することができるが、これは以下でより完全に説明するように、バックエンドが複数のデータ冗長性クラスをサポートできるからである。
【００２０】
本原理の典型的な実施形態は、データ再構築、分散およびオンデマンドデータ削除、グローバル重複排除、およびデータ完全性管理などの効率的なデータサービスを実装するように以下で説明するように修正されるさまざまなスキームと特徴とを採用することができる。そのような特徴は、重複排除を安く安全に実装できるようにする、修正された内容アドレス指定ストレージパラダイムの利用を有していてもよい。他の特徴には、拡張可能で、耐障害性のシステムの構築と、重複排除のグローバルレベルへの拡張を可能にする修正分散ハッシュテーブルが含まれていてもよい。さらに、所望の冗長レベルと結果のストレージオーバーヘッドとの間の粒度の細かい制御によって、保存されているデータに冗長性を追加するように消失符号を採用してもよい。ハードウェア実装は、未使用時に大きく、しかし安価なストレージ容量を提供する、大きな、信頼性の高いＳＡＴＡディスクを利用することができる。安価だが強力な計算リソースを提供するので、マルチコアＣＰＵを採用することもできる。
【００２１】
本原理の典型的なシステム実装は、少なくとも数千の専用のストレージノードまたはストレージ装置に拡張可能であって、より大きな構成が潜在的に可能な未使用時ストレージ容量が数百ペタバイト程度となる。システム実装は、潜在的に多数のストレージノードを有することができるが、システムは対外的には１つの大きなシステムとして動作してもよい。さらに、本明細書で以下に説明するシステム実装は、１つの固定されているアクセスプロトコルを定義する必要はなく、ファイルシステムインターフェイスなどの標準を使用している従来のアプリケーションと非常に特別なアクセス方法を使用している新しいアプリケーションの両方をサポートすることができるように柔軟にすることができることにも注意すべきである。新しいプロトコルは、既存のプロトコルを使用しているクライアントを妨害せずに、新しいプロトコルドライバを使用してオンラインで追加することができる。したがって、システム実装は、ストリームデータアクセスを使用している場合、カスタム化されている新しいアプリケーションと商用レガシーアプリケーションの両方をサポートすることができる。
【００２２】
２次ストレージ実装の他の典型的な特徴によって、障害および更新と拡張のデータとシステムアクセシビリティに対する影響を限定したり取り除くことができるため、さまざまな状況におけるシステムの連続動作が可能になる。分散アーキテクチャのおかげで、たとえばローリングアップグレードなどのハードウェアまたはソフトウェアのアップグレード中の非停止システム可用性を維持し、それによってコストがかかる一切のダウンタイムの必要性をなくすことが可能であることも多い。さらに、典型的なシステムは、ディスク障害によるハードウェア障害、ネットワーク障害、停電の場合、そして何らかのソフトウェア障害の場合でさえも、自動自己回復が可能である。さらに、典型的なシステムは、特定の、構成可能な数の障害停止と、断続的なハードウェア障害とに耐えることができる。さらに、ランダムなデータ破壊の検出に、データ完全性検査の数個の層を採用することができる。
【００２３】
典型的なシステムの他の重要な機能は、高いデータ信頼性、可用性、および完全性の保証である。たとえば、データの各ブロックは、要求された数のディスクとノードの障害までブロックが存続するように、ユーザ選択冗長レベルで書き込むことができる。ユーザ選択可能な冗長レベルは、各ブロックをフラグメントに消失符号化することによって実現することができる。消失符号は、同じ量の容量オーバーヘッドについて、単純な複製に対して、桁違いに平均故障間隔を延長する。障害後、ブロックが読み取り可能なままである場合、ユーザに要求されたレベルに戻るまで冗長性を回復するように、システム実装は自動的にデータ再構築のスケジューリングを行うことができる。さらに、２次ストレージシステムの実装は、永久的なデータ消失が長期間隠れたままにならないことを保証することができる。システムのグローバルな状態は、全ての保存されているブロックが読み取り可能かどうかと、読み取り可能な場合に、データ消失が発生するまでに耐えることができるディスクとノードの障害の回数を示していていもよい。
【００２４】
ここで、同じ番号は同じまたは同様な構成要素を指している図面を詳細に、そして最初に図１を参照すると、本原理の１つの典型的な実装の２次ストレージ装置のデータブロック構成の表現１００を示している。データブロック構成のプログラミングモデルは、大量の、可変サイズの、内容アドレス指定されており、そして非常に弾力性のあるブロックの抽象化に基づいている。ブロックアドレスは、たとえばその内容のＳＨＡ−ｌハッシュから導出されてもよい。ブロックはデータと、任意採用で、書き込み済みのブロックを指しているポインタの配列とを有していてもよい。ブロックは、より良好な重複排除比を可能にする可変サイズであってもよい。さらに、ポインタは、オブジェクトによってもはや使用されないメモリが再利用される「ガーベッジコレクション」として実装されるデータ削除を促進するように露出していてもよい。さらに、２次ストレージシステムのバックエンド部分は、新しいプロトコルと従来のプロトコルとを実装するように、プロトコルドライバによって使用される低レベルブロックインターフェイスをエクスポートしてもよい。ファイルシステムなどの高レベルブロックインターフェイスの代わりのそのようなブロックインターフェイスの提供は、実装を簡略化し、バックエンドをフロントエンドからきれいに分離することを可能にしている。さらに、そのようなインターフェイスは、幅広い多くの高レベルプロトコルの効率的な実装も可能にする。
【００２５】
図１に示しているように、２次ストレージシステムのバックエンド部分の複数のブロックは、無閉路有効グラフ（ＤＡＧ）を構成してもよい。各ブロックのデータ部分は斜線が施してあるのに対して、ポインタ部分は斜線が施されていない。ドライバは複数のデータブロックの複数のツリーを描くように構成されていてもよい。しかし、典型的な２次ストレージシステムの重複排除の機能のため、これらのツリーは重複排除ブロックの位置で重なっており、有向グラフを構成している。さらに、ブロックアドレス用に使用されるハッシュが確実である限り、これらの構造内では閉路はあり得ない。
【００２６】
ＤＡＧ内の起点となる頂点は、通常「検索可能保持ルート」と呼ばれる特別なブロック型のブロックである。通常のデータとアドレスの配列以外に、保持ルートは、ブロックの位置を求めるために使用されるユーザ定義検索キーを有するように構成されていてもよい。そのようなキーは任意のデータとすることができる。ユーザは、暗号ブロック内容アドレスの代わりに、検索キーを入力することによって、検索可能ブロックを検索することができる。その結果、ユーザは保存されているデータにアクセスするために内容アドレスを覚える必要がない。たとえば、同じファイルシステムの複数のスナップショットは、ファイルシステム名とスナップショットごとに増分されるカウンタとを有している検索キーを備えている検索可能保持ルートとして構成されている各ルートを有することができる。検索可能ブロックはユーザに見えるアドレスを有しておらず、ポインタで指すことができない。そのため、検索可能ブロックは、ブロック構造内に閉路を作るために使用することはできない。
【００２７】
図１を再度参照すると、ブロックの組１００は、１０２と１０４の２つが保持ルートである３つのソース頂点１０２、１０４、および１０６を有している。その他のソース頂点１０６は通常のブロックであって、ＤＡＧのこの部分は依然として作成中であることを示している。
【００２８】
アプリケーションプログラミングインターフェイス（ＡＰＩ）操作には、以下で説明するように、通常ブロックの書き込みと読み出し、検索可能な保持ルートの書き込み、検索キーに基づく保持ルートの検索、関連付けられている削除ルート書き込みによって削除される保持ルートの指定されたキーを使用したマーキングが含まれていてもよい。ただし、データストリームの複数のブロックへの切断は、ドライバによって実施されてもよい。
【００２９】
本原理の１つの典型的な態様によれば、ブロックの書き込み時に、ユーザはブロックを複数の使用可能な冗長クラスの１つに割り当てることができる。各クラスは、データ冗長性とストレージオーバーヘッドとの間の異なるトレードオフを表していてもよい。たとえば、低冗長性データクラス内のブロックは、たった１回のディスク障害に耐えるのに対して、そのブロックサイズに対するストレージオーバーヘッドは最小である。それに対して、重要なデータクラス内のブロックは、異なるディスクと物理ノード上で多数回の複製が可能である。本原理の２次ストレージシステムは、これら２つの両極端の間のさまざまな冗長性クラスをサポートしている。
【００３０】
また、典型的な２次ストレージシステムは、１つのブロックを直接削除する方法は提供すべきではないが、これらはそのようなブロックは他のブロックから参照されている可能性があることに注意すべきである。逆に、ＡＰＩは、ユーザが保持ルートをマーキングして、ＤＡＧのどの部分を削除すべきかを示すことができるようにしてもよい。動作中ではない保持ルートをマーキングするために、ユーザは特別な「検索可能削除ルート」と呼ばれるブロックに削除される保持ルートの検索キーと同一の検索キーを割り当てることによって、そのブロックを書き込んでもよい。
【００３１】
たとえば、図１を再度参照すると、削除ルート１０８を保持ルートＳＰ１  １０２に関連付けてもよい。２次ストレージシステムによって採用されている削除アルゴリズムは、動作中の保持ルートから到達不能な全てのブロックに削除のためのマーキングをするように構成されていてもよい。たとえば、図１において、ユーザが削除ルート１０８を書き込む場合、点線を有している全てのブロック、ブロックＡ  １０６、Ｄ１１０、Ｂ  １１２、およびＥ１１２が削除のためにマーキングされてもよい。ただしブロックＡ  １０６も削除のためにマーキングされているが、これは、それを指している保持ルートが存在しないのに対して、ブロックＦ  １１６は保持されており、これは保持ルートＳＰ２  １０４から到達可能であるためである。ここで、ブロック１０４は動作中であるが、これは該当する削除ルートを有していないためである。データの削除中は、システムが削除されるブロックを特定する短い読み取り専用期間が存在する。実際の空間再利用は、通常の読み取り／書き込み中にバックグランド内で発生する。さらに、読み取り専用期間に入る前に、保持される全てのブロックは、動作中の保持ルートによって指されていなければならない
ここで図２を参照すると、前述のデータ構成モデルとＡＰＩ動作とを実装可能な、本原理の典型的な一実施形態の２次ストレージシステム２００の高レベルブロック図／フロー図を示している。当然、本明細書で説明する実施形態は、全体がハードウェアであってもよいし、ハードウェアとソフトウェアの構成要素の両方を有していてもよい。好ましい実施形態では、本発明は、ハードウェアと、ファームウェア、常駐ソフトウェア、マイクロコード等を有する、しかしこれらには限定されないソフトウェアとに実装されている。
【００３２】
実施形態は、コンピュータまたは任意の命令実行装置によってまたはそれらと共に使用されるプログラムコードを提供するコンピュータが使用可能なまたはコンピュータが読み取り可能な媒体からアクセス可能なコンピュータプログラム製品を有していてもよい。コンピュータが使用可能なまたはコンピュータが読み取り可能な媒体には、命令実行装置によってまたはそれと共に使用されるプログラムを保存する任意の装置が含まれる。媒体は、磁気、光学、電子、電磁、赤外線、または半導体の装置とすることができる。媒体は、半導体メモリ、磁気テープ、取り外し可能なコンピュータディスケット（登録商標）、ランダムアクセスメモリ（ＲＡＭ）、読み取り専用メモリ（ＲＯＭ）、固定磁気ディスク、光学ディスク等のコンピュータが読み取り可能な媒体を有していてもよい。
【００３３】
さらに、コンピュータ読み取り可能媒体は、コンピュータ読み取り可能プログラムを有していていもよく、コンピュータ読み取り可能プログラムは、コンピュータで実行されたときに、コンピュータに本明細書で開示している方法のステップを実行させるおよび／または複数のストレージノード上の１つまたは２つ以上のストレージサーバを実現する。同様に、機械によって実行可能な命令のプログラムを具体的に実現している機械によって読み取り可能なプログラムストレージ装置は、２次ストレージ装置上のデータを管理するための、以下でより完全に説明する方法の複数のステップを実行するように構成することができる。
【００３４】
装置２００は、ユーザ入力と対話し、データを保存し、検索し、削除し、さもなければ管理するようにユーザコマンドを実装するように構成されているアプリケーション層２０２を有していてもよい。アプリケーション層２０２の下位のＡＰＩ  ２０４は、アプリケーション層２０２と通信し、データ管理を実施するようにフロントエンドシステム２０６と対話するように構成されていてもよい。フロントエンドシステム２０６は、内部ネットワーク２１０と通信する複数のアクセスノード２０８ａ〜ｆを有していてもよい。さらに、フロントエンドシステム２０６は、アプリケーションプログラムインターフェイス２１４を介してバックエンドシステム２１２と対話してもよく、それに対してアプリケーションプログラムインターフェイス２１４はプロトコルドライバ２１６と対話してもよい。バックエンドシステム２１２は、アプリケーション層からは、大きなストレージユニット内のファイルシステムの集合と見なすことができる複数のストレージノード２１８ａ〜ｆのグリッドを有していてもよい。さらに、本明細書では簡潔になるように６つのストレージノードを示しているが、構成の選択に従って、任意の数のストレージノードを設けることができる。典型的な実施形態においては、アクセスノードの数は、１からストレージノードの半分の範囲とすることができるが、範囲はストレージノードとアクセスノードとを実装するために使用されるハードウェアに依存して変化してもよい。複数のバックエンドストレージノードは、内部ネットワーク２１０を介して通信することもできる。
【００３５】
図２を継続して参照しながら、ここで図３と４を参照すると、本原理の実施形態の典型的なストレージノード２１８と典型的なアクセスノード２０８とを示している。ストレージノード２１８は、１つまたは２つ以上のストレージサーバ３０２、処理ユニット３０４、および保存媒体３０４を有している。ストレージサーバは、処理ユニット３０４とストレージ媒体３０６との上で動作するように構成されているソフトウェア構成において実装されてもよい。同様に、アクセスノード２０８は１つまたは２つ以上のプロキシサーバ４０２、処理ユニット４０４、およびストレージ媒体４０６を有していてもよい。当然、複数のストレージノードとアクセスノードとは本明細書では別のマシン上に実装されているように記述されているが、複数のストレージノードとアクセスノードとが同じマシン上に実装できることが考えられる。したがって、当業者には理解されるように、１つのマシンが、複数のストレージノードとアクセスノードの両方を同時に実装してもよい。
【００３６】
当然、２次ストレージシステム２００は、本明細書で教えることを考慮すると、当業者に理解されるようにハードウェアとソフトウェアとの様々な形態で実装することができる。たとえば、適切なシステムは、１つのバックエンドストレージサーバ上で動作し、６つの５００ＧＢ  ＳＡＴＡディスク、６ＧＢのＲＡＭ、２つのデュアルコア３ＧＨｚ  ＣＰＵと２つのＧｉｇＥカードとを有するように構成されている複数のストレージノードを有することができる。その代わりに、各ストレージノードは、２つのバックエンドストレージサーバを実行し、１２の１ＴＢ  ＳＡＴＡディスク、２０ＧＢのＲＡＭ、２つの４ウェイ３ＧＨｚ  ＣＰＵと４つのＧｉｇＥカードとを有するように構成されていてもよい。さらに、たとえば、アクセスノード２０８は、６ＧＢ  ＲＡＭ、２つのデュアルコア３ＧＨｚ  ＣＰＵ、２つのＧｉｇＥカード、およびただの小さいローカルストレージを有していてもよい。さらに、複数のストレージノードとアクセスノードとは、Ｌｉｎｕｘ、バージョンＲｅｄ  Ｈａｔ  ＥＬ５．１を実行するようにも構成されていてもよい。しかし、ハードウェア構成要素の詳細な説明は例示に過ぎないことを理解すべきであって、それは、他の構成とハードウェア構成要素とを当業者が本明細書で開示されている教えを考慮して実装可能であるためである。
【００３７】
図２〜４を再度参照すると、前述のように、２次ストレージシステム２００の複数の構成要素は、複数のストレージサーバ３０２、プロキシサーバ４０２、およびプロトコルドライバ２１６を有していてもよい。さらに、各ストレージノード２１８は１つまたは２つ以上のストレージサーバ３０２のプロセスをホストするように構成されていてもよい。ストレージノード２１８上で実行されるストレージサーバ３０２の数は、その利用可能なリソースに依存している。ノード２１８が大きくなると、より多くのサーバ３０２が当然実行される。各サーバ３０２は、そのストレージノードの特定の数のディスクを排他的に担当するように構成されていてもよい。たとえばマルチコアＣＰＵを使用して、コアの数の各増加に対してストレージサーバ３０２当たりの並列性を一定に維持することが可能で、複数のストレージサーバを１つのストレージノード上に配置することができる。
【００３８】
前述のように、複数のプロキシサーバ４０２が複数のアクセスノード上で実行され、同じブロックＡＰＩをストレージサーバとしてエクスポートしてもよい。プロキシサーバ４０２は、複数のバックエンドノードを探し出して、最適化されたメッセージ経路設定とキャッシュ操作とを実施するようなサービスを提供するように構成されていてもよい。
【００３９】
複数のプロトコルドライバ２１６は、複数のアクセスプロトコルを実装するようにバックエンドシステム２１２によってエクスポートされたＡＰＩ  ２１６を使用するように構成されていてもよい。複数のプロトコルドライバは実行時に複数のストレージサーバ３０２とプロキシサーバ４０２とにロードされてもよい。どのノードに所与のドライバをロードするかは、使用可能なリソースとドライバリソース要求とに依存する。ファイルシステムドライバなどのリソースを要求するドライバは、プロキシサーバ４０２にロードされてもよい。
【００４０】
ストレージサーバ３０２は、分散環境で使用されるマルチコアＣＰＵ用に構成されてもよい。さらに、複数のストレージサーバ３０２の特徴は、複数のプログラマの複数のチームによる平行した開発のサポートを実現してもよい。さらに、ストレージサーバ３０２の複数の特徴は、結果として得られるシステムの保守性、試験容易性、および信頼性も実現してもよい。
【００４１】
ストレージサーバ３０２の特徴を実装するには、「パイプライン化ユニット」と呼ばれる複数のステーションを有している非同期パイプライン化メッセージパッシングフレームワークを採用することができる。パイプライン内の各ユニットは、単一スレッドであって、他のユニットと一切のデータ構造体の書き込み共有の必要がない。さらに、パイプライン化ユニットは、何らかの内部ワーカスレッドも有していてもよい。典型的な一実施形態では、複数のパイプライン化ユニットは、メッセージパッシングによってのみ通信する。そのため、複数のパイプライン化ユニットは、同じ物理ノード上に共に存在したり、複数のノードに分配されていてもよい。通信しているパイプライン化ユニットが同じノード上に共に存在している場合、読み取り専用共有を最適化として使用することができる。同期と並列性の問題は、１つのパイプライン化ユニットだけに限定することができる。さらに、各パイプライン化ユニットは、他のパイプライン化ユニットのスタブを提供することによって独立してテストすることができる。
【００４２】
拡張が容易になるように、データの保存位置を整理するために分散ハッシュテーブル（ＤＨＴ）を採用することができる。分散ストレージ装置は、ストレージ利用効率と十分なデータ冗長性を有していなければならないため、ＤＨＴの追加の機能を使用しなければならない。たとえば、追加の機能は、ストレージ利用率と、選択されたオーバーレイネットワークと消失符号化などのデータ冗長性スキームとの統合の容易さとを保証しなければならない。既存のＤＨＴがそのような特徴を適切に提供しないため、固定プレフィックスネットワーク（ＦＰＮ）分散ハッシュテーブルの修正版を使用することができる。
【００４３】
ここで図５を参照すると、本原理の典型的な実施形態の固定プレフィックスネットワークの表現５００を示している。ＦＰＮにおいて、各オーバーレイノード５０２、５０４は、両オーバーレイノードの識別子でもあるハッシュキープレフィックスが厳密に１つ割り当てられている。全てのプレフィックスが１つになって、ハッシュキー空間全体をカバーしており、オーバーレイネットワークはそれらを分割した状態に維持しようとし続ける。たとえば、ノード５０６〜５１２にいずれか１つのノードであるＦＰＮノードは、ＦＰＮノードの識別子と等しいハッシュキーを担当している。図５の上部は、プリフィックス空間を４つの互いに交わらない部分空間に分割している４つのＦＰＮノード５０６〜５１２をリーフとして有しているプレフィックスツリーを示している。
【００４４】
本原理の態様のＤＨＴについては、ＦＰＮは、図５に示しているように「スーパーノード」を使用して修正することができる。スーパーノードはＦＰＮノード（そして、その場合、ＦＰＮノードはハッシュキープレフィックスによって識別され）を表していてもよく、ノード障害に対する回復力を増大させるために数個の物理ノードにわたっている。たとえば、図５に示しているように、バックエンドネットワークが６つのストレージノード５１４ａ〜５１４ｆを有している場合、各スーパーノード５０６〜５１２は、独立している物理ストレージノード５１４ａ〜５１４ｆ上に配置可能な、複数のスーパーノードコンポーネント５１６の「スーパーノード濃度」と呼ばれる定数を有することができる。同じスーパーノードの複数のコンポーネントは「ピア」と呼ばれる。したがって、各スーパーノードは、ストレージノード５１４ａ〜５１４ｆの部分集合と見なすことができる。たとえば、スーパーノード５０６は、複数のストレージノードの部分集合５１４ａ〜５１４ｄを有していてもよい。さらに、各ストレージノードは、スーパーノードの総数未満である多数のスーパーノードに含まれていてもよい。たとえば、ノード５１４ａは、４つのスーパーノードのうち３つ、つまりスーパーノード５０６、５１０、および５１２に含まれていてもよい。
【００４５】
本原理の典型的な実装によれば、固定プレフィックスネットワークは、複数のデータブロックストレージを複数のストレージノードに割り当てるために使用することができる。たとえば、データのハッシュ後、ハッシュ結果の初めの２、３のビット、この例では最初の２ビットは、複数のデータブロックを各スーパーノードに分配するために使用することができる。たとえば、「００」で始まるハッシュ値を有しているデータブロックはスーパーノード５０６に割り当て可能で、「０１」で始まるハッシュ値を有しているデータブロックはスーパーノード５０８に割り当て可能で、「１０」で始まるハッシュ値を有しているデータブロックはスーパーノード５１０に割り当て可能で、「１１」で始まるハッシュ値を有しているデータブロックはスーパーノード５１２に割り当て可能である。その後、図６を参照して以下でより完全に説明するように、データブロックの複数の部分をデータブロックが割り当てられているスーパーノードの複数のコンポーネント５１６の間で分配することができる。ここで、スーパーノード５０６の複数のコンポーネントは、００：０、００：１、００：２、００：３と表される。その他のスーパーノードのコンポーネントも同様に表される。
【００４６】
ただし、スーパーノード濃度は、たとえば４〜３２の範囲にある。しかし、他の範囲を採用することができる。好ましい実施形態では、スーパーノード濃度は１２に設定されている。典型的な実施形態では、スーパーノード濃度は、全てのスーパーノードに対して同じで、システムの全寿命を通して一定であってもよい。
【００４７】
当然、複数のスーパーノードピアは、スーパーノードに適用すべきあらゆる変更を判断するために分散合意アルゴリズムを採用することができる。たとえば、ノード障害後、複数のスーパーノードピアは、どの物理ノード上で失われた複数のコンポーネントのインカーネーションを再作成すべきかを決定することができる。さらに、複数のスーパーノードピアは、どの代替の複数のノードが障害を起こしたノードに置き換わるかを決定することができる。たとえば、図５を再び参照すると、ノード１  ５１４ａで障害が発生した場合、スーパーノード５０６の他の複数のコンポーネントのデータで、消失符号化を使用してコンポーネント００：１をノード５  ５１４ｅにおいて再構築できる。同様に、ノード１  ５１４ａに障害が発生した場合、スーパーノード５１０のその他のコンポーネントのデータを使用してコンポーネント１０：０をノード３  ５１４ｃにおいて再構築することができる。さらに、スーパーノード５１２のその他のコンポーネントのデータを使用してコンポーネント１１：２をノード４  ５１４ｄにおいて再構築することができる。
【００４８】
本原理の２次ストレージの実施形態によって実現する読み取りと書き込みの処理については、書き込み時は、データのブロックがブロックのハッシュが所属しているハッシュキー空間に該当しているスーパーノードの複数のピアの１つへ送られてもよい。次に、書き込み処理ピアは、以下でより完全に説明するように、適切な複製が保存済みかどうかを確認してもよい。複製が見つかれば、そのアドレスが返され、そうでなければ、新しいブロックが圧縮され、ユーザに要求されれば、フラグメント化され、フラグメントが該当しているスーパーノードの残りの複数のピアに分配される。代替の実装によれば、アクセスノード上のブロックをハッシュして、データなしでハッシュ値だけをストレージノードに送信することによって重複排除を実行してもよい。ここで、複数のストレージノードは、アクセスノードから受信したハッシュ値を保存されている複数のブロックのハッシュ値と比較することによって、ブロックが複製かどうかを判断する。
【００４９】
読み取り要求も、データブロックのハッシュキーに該当しているスーパーノードの複数のピアの１つに送られる。ピアは局所的に見つけることができる最初のブロックメタデータを見つけ出して、消失符号化スキームに従ってデータブロックを再構築するために十分な最小の数のフラグメントを読み取るためにフラグメント読み取り要求を他の複数のピアに送信してもよい。複数の要求のいずれかがタイムアウトした場合、全ての残りのフラグメントを読み取ることができる。十分な数のフラグメントが見つかった後、ブロックを再構築し、展開し（ブロックが圧縮されている場合）、確認し、確認が成功した場合、ユーザに返すことが可能である。
【００５０】
一般に、読み取りはストリームアクセスに対しては非常に効果的であるが、これは全てのフラグメントが順番にあらかじめディスクからローカルキャッシュにプリフェッチできるからである。しかし、ピアによってフラグメントを見つけることは非常に手の込んだ処理となることがある。しばしば、フラグメントの場所は、ローカルノードインデックスとローカルキャッシュとを参照することによって決定することができるが、場合によっては、たとえば、コンポーネントの移動中または断続的な障害の後では、要求されたフラグメントはそのフラグメントの以前の複数の位置の１つだけにしか存在しないこともある。この場合、ピアは、たとえば、コンポーネントの以前の複数の位置の形跡を逆の順番で検索することによって、失われたデータの分散検索を指示してもよい。
【００５１】
本原理の２次ストレージシステムの実施形態に含まれることがある他の典型的な特徴は複数のデータブロックの複数のコンポーネントがシステムの異なる物理ストレージノード全体に適切に分散されることを保証する「ロードバランシング」である。複数の物理ストレージノード内にコンポーネントを分散させることによって、システムのサバイバビリティ、データの回復力と可用性、ストレージ稼働率、およびシステムパフォーマンスを改善する。たとえば、１つのマシンに配置するピアコンポーネントが多すぎると、該当しているノードが失われた場合に壊滅的な結果となることがある。その結果、影響を受けるスーパーノードは、障害から回復しないことがあり、これは回復できないコンポーネントが多すぎるためである。ストレージノードが回復可能であっても、データのいくつかあるいは全部が読み取り可能でないことがあるが、これは失われたフラグメントが多すぎるからである。また、使用可能なノードリソースに比例してコンポーネントが物理ストレージノードに割り当てられたときにシステムの性能が最大化されるが、これは各ストレージノードの負荷がストレージノードに割り当てられている複数のコンポ−ネットが対応しているハッシュキープレフィックス空間に比例しているからである。
【００５２】
典型的なシステム実装は、障害弾力性、性能、およびストレージ稼働率が最大化されている状態に到達するように、全ての物理マシンつまりストレージノードにわたってコンポーネント分配の平均化を連続して試みるように構成することができる。所与の分配の品質は、システムエントロピーと呼ばれるこれらの目標に優先順位を付ける多次元関数によって、計測することができる。そのような平均化は、ローカルにホストされているコンポーネントの隣接するストレージノードへの一式の全ての考え得る転送を定期的に考慮するように構成可能な各マシン／ストレージノードによって実施することができる。ストレージノードが分配を改善するであろう転送を発見すると、そのようなコンポーネント転送が実行される。さらに、同時に発生した複数の相容れない転送を防止する保護をシステムに追加することができる。コンポーネントが新しい場所に到着した後で、そのデータも古い場所から新しい場所に移動される。データ転送はバックグラウンドで実行可能であるが、これは場合によっては実行に長い時間がかかることもあるからである。
【００５３】
ストレージノードマシンの２次ストレージシステムへの／からの追加と削除の管理にもロードバランシングを使用することもできる。前述と同じエントロピー関数は、複数のマシンの追加／削除後の結果としてのコンポーネント分配の質の計測にも適用可能である。
【００５４】
典型的な２次ストレージ装置の他の重要な特徴は、スーパーノードの濃度の選択であるが、スーパーノードの濃度の選択は２次ストレージシステムの特性に対して重大な影響を有することがあるためである。第１に、スーパーノード濃度は、耐えうるノード障害の最大数を定めてもよい。たとえば、バックエンドストレージネットワークは、各スーパーノードが動作している限り、ストレージノード障害に耐えることができる。少なくともスーパーノードの複数のピアの半分と１つとが動作状態にあって合意に到達すれば、スーパーノードは動作状態を維持する。その結果、２次ストレージシステムは、各スーパーノードの複数のピアをホスティングしている複数のストレージノードの中で、たかだかスーパーノード濃度マイナス１の永久的なノードの障害があっても存続する。
【００５５】
スーパーノード濃度は、拡張性にも影響する。所与の濃度について、各スーパーノードが存続する確率は、固定している。さらに、存続の確率は、スーパーノード濃度に直接依存している。
【００５６】
最後に、スーパーノード濃度は、利用可能なデータ冗長性クラスの数に影響する。たとえば、消失符号化は、ブロックが依然として再構築可能であるときに、失われてもよいフラグメントの最大数を使用してパラメータ化されている。消失符号化が採用され、スーパーノード濃度フラグメントを作る場合、耐えられる失われたフラグメントの数は、１からスーパーノード濃度マイナス１（後者の場合、そのようなブロックのスーパーノード濃度の数だけのコピーが維持できる）の間で変化しうる。耐えられる失われたフラグメントの数のそのような選択の各々によって、様々なデータ冗長性クラスを定めることができる。前述のように、各クラスは、たとえば、消失符号化によるストレージオーバーヘッドと障害弾力性との間の、さまざまなトレードオフを示していてもよい。そのようなオーバーヘッドは、耐えられる失われたフラグメントの数の、スーパーノード濃度と耐えられる失われたフラグメントの数との差に対する比によって特徴付けることができる。たとえば、スーパーノード濃度が１２で、ブロックがたかだか３つのフラグメントを失ってもよい場合、このクラスのストレージオーバーヘッドは３対（１２−３）、つまり３３％で与えられる。
【００５７】
図６と７を参照すると、本原理の実装による複数のデータコンテナのチェーンを使用している２次ストレージシステムの典型的なデータ構成構造６００、７００を示している。保存されているデータの図示の構成６００、７００によって、信頼性、可用性、および性能の程度を高くすることができる。そのようなデータ構成構造を使用した２次ストレージシステムの実装によって、保存されているデータの可用性の高速な特定と、障害に応答して指定された冗長レベルへのデータの再構築が可能になる。指定された冗長レベルへのデータの再構築によって、有効なユーザデータを収容していない場合でもディスク全体を再構築するＲＡＩＤなどのシステムに対する顕著な利点が実現される。以下で説明するように、データブロックコンポーネントはデータ転送の前にノード間を移動するため、システムは、古いコンポーネントの位置からデータを見つけ出し、検索することができ、これは、データの再構築に比べてはるかにより効果的である。１つのストリーム内に書き込まれている複数のデータブロックは、読み取りと書き込みの性能を最大化するように互いに近くに配置すべきである。さらに、以下で説明するデータ構造の実装を採用しているシステムは、システムは任意の動作している保持ルートから到達可能なデータブロックを削除して、到達不能なデータブロックによって占められている空間を再利用するオンデマンド分散データ削除もサポートしてもよい。
【００５８】
図６は、本原理の１つの典型的な実装によってデータを分配するシステム６００のブロック図／流れ図を示している。図６に示しているように、データブロックＡ  ６０４、Ｂ  ６０６、Ｃ  ６０８、Ｄ  ６１０、Ｅ  ６１２、Ｆ  ６１４、およびＧ  ６１６を有しているデータストリーム６０２は、ＳＨＡ−１などのハッシュ関数または任意の他の適切な内容アドレス指定可能なストレージスキームを適用することができる。当業者には理解されるように、内容アドレス指定可能なストレージスキームは、データブロックの一意のアドレスを得るために、ハッシュ関数をデータブロックの内容に適用することができる。したがって、データブロックアドレスは、データブロックの内容に基づいている。
【００５９】
図５を参照しながら図６に戻ると、説明している例においては、データブロックＡ  ６０４、Ｄ  ６１０、およびＦ  ６１６のハッシュ結果はプレフィックス「０１」を有している。したがって、複数のブロックＡ  ６０４、Ｄ  ６１０、およびＦ  ６１６は、スーパーノード５０８に割り当てることができる。複数のデータブロックに対する複数のハッシュがデータストリームから計算された後、個別のデータブロックを圧縮（６１８）し、消失符号化（６２０）することができる。前述のように、データ冗長性を実装するために消失符号化を採用することができる。１つのデータブロックの異なる結果として得られた消失符号フラグメント６２２がデータブロックが割り当てられているスーパーノードの複数のピアコンポーネント５１６に分配されてもよい。たとえば、図６は、プレフィックスが０１の複数のデータブロック、つまりデータブロックＡ  ６０４、Ｄ  ６１０、およびＦ  ６１６の異なる複数の消失符号化フラグメント６２２が保存されているスーパーノード５０８の複数のピアコンポーネント０１：０、０１：１、０１：２、および０１：３を示している。
【００６０】
典型的な２次ストレージシステムの実施形態のデータ管理の基本ロジックユニットは、本明細書では「ｓｙｎｃｈｒｕｎ」と定義されており、ｓｙｎｃｈｒｕｎは書き込み処理ピアコンポーネントによって書き込まれる、所与のスーパーノードに属している多数の連続しているデータブロックである。たとえば、ｓｙｎｃｈｒｕｎ  ６２４は、該当しているスーパーノードの各コンポーネント５１６の多数の連続しているデータブロックフラグメント６２６を有している。本明細書では、各フラグメントは、データストリーム６０２に出現する複数のブロックの順番に保存されていてもよい。たとえば、ブロックＦ  ６１４の複数のフラグメントは、ブロックＤ  ６１０の複数のフラグメントの前に保存され、それに対して、ブロックＤ  ６１０はブロックＡ  ６０４の前に保存されている。時間の順序を保持することによって、データの管理が容易になり、ストレージシステムの状態の推定が可能になる。たとえば、時間の順序の保持によって、システムは特定の日付以前のデータが障害の際に再構築可能であると判断できる。
【００６１】
ここでは、ブロックの書き込みは、実質的に、そのフラグメント６２２をスーパーノード濃度の数だけ書き込むことである。したがって、各ｓｙｎｃｈｒｕｎは、ピア毎に１つのスーパーノード濃度の数のｓｙｎｃｈｒｕｎコンポーネントによって表すことができる。ｓｙｎｃｈｒｕｎコンポーネントはたとえば複数のフラグメント６２６などの複数のフラグメントの時間の順序に対応しており、フラグメントはｓｙｎｃｈｒｕｎコンポーネントが属しているスーパーノードプリフィックスによってフィルタリングされている。コンテナは、１つまたは２つ以上のｓｙｎｃｈｒｕｎコンポーネントを保存することができる。スーパーノードのｉ番目のピアについて、対応しているｓｙｎｃｈｒｕｎコンポーネントは複数のｓｙｎｃｈｒｕｎブロックのすべてのｉ番目のフラグメントを有している。ｓｙｎｃｈｒｕｎは論理構造に過ぎないが、ｓｙｎｃｈｒｕｎコンポーネントは対応しているピアに実際に存在している。
【００６２】
所与の書き込み処理ピアに対して、２次ストレージシステムは任意の所与の時間に開いているｓｙｎｃｈｒｕｎは１つだけであるように構成されていてもよい。その結果、そのようなｓｙｎｃｈｒｕｎはすべて、書き込み処理ピアによって定められた順番で、チェーン内で論理的に順番が設定できる。複数のｓｙｎｃｈｒｕｎコンポーネントは、本明細書ではｓｙｎｃｈｒｕｎコンポーネントコンテナ（ＳＣＣ）６２８と呼ばれるデータ構造内に配置することができる。各ＳＣＣは、１つまたは２つ以上のチェーン隣接ｓｙｎｃｈｒｕｎコンポーネントを有することができる。したがって、複数のＳＣＣも、ｓｙｎｃｈｒｕｎコンポーネントチェーンと同様に複数のチェーンを構成する。さらに、複数のＳＣＣが１つのピア内に含まれていてもよい。たとえば、ピア０１：０はＳＣＣ６３０、ＳＣＣ６３２、およびＳＣＣ６３４を有していてもよい。したがって、１つのピア上で順番が設定されている複数のＳＣＣは、「ピアＳＣＣチェーン」６３６と呼ばれる。さらに、複数のｓｙｎｃｈｒｕｎのチェーンは、複数のピアＳＣＣチェーンのスーパーノード濃度によって表すことができる。図７ではたとえば複数の列７２４〜７３２の位置のピアチェーンを示しており、以降でより完全に説明する。
【００６３】
複数のピアＳＣＣチェーンは、複数のｓｙｎｃｈｒｕｎコンポーネント／フラグメント６２２メタデータおよびそれらのフラグメントの数について一般的に同じ場合があるが、時には、たとえばチェーンホール（穴）が生じるノード障害が原因で異なることもある。このチェーン構成によって、データ検索や削除、グローバル重複排除、およびデータ再構築などの比較的簡単で効果的な２次ストレージシステムのデータサービスの実装が可能になる。たとえば、チェーンホールを使用して、データが使用可能かどうか（つまり、全ての対応しているブロックが再構築可能かどうか）を判断することができる。したがって、各ブロックを完全に再構築するのに使用されるフラグメントの数に等しい十分な数のピアチェーンにホールが一切無い場合、データは利用可能であると考えられる。複数の冗長なクラスが使用される場合、データの可用性を各冗長クラスについて同様に判断することができる。
【００６４】
さらに、当然、システムは様々な種類のメタデータを保存してもよい。たとえば、データブロックのメタデータは他の複数のデータブロックへの露出しているポインタを有していてもよく、複数のデータブロックは複数のポインタを備えているデータブロックの各フラグメントを使用して複製可能である。他のメタデータには、たとえば、ブロックハッシュ情報とブロック回復力情報とを有しているフラグメントメタデータがある。フラグメントメタデータは、データとは別個に保存可能であって、各フラグメントを使用して複製することができる。さらに、データコンテナは、コンテナが保存している複数のｓｙｎｃｈｒｕｎコンポーネントの範囲などの、保存しているチェーンの一部に関連しているメタデータを有していてもよい。コンテナが保持しているこのメタデータによって、システム内のデータの状態と、データ構築と転送などのデータサービスの性能とを高速に推測することができる。したがって、各コンテナは、データとメタデータの両方を有している。前述のように、メタデータは、複製することができるのに対して、ユーザによって要求されたデータの冗長レベルは、消失符号のパラメータ化によって維持することができる。したがって、スーパーノード５０８の複数のコンポーネント／ストレージノードの各々に保存されているデータの複数のコンテナの複数のチェーンは、同一のメタデータを有しているが、異なるデータを有している複数のチェーンが存在できるという点で、冗長であると考えることができる。さらに、複数のコンテナの複数のチェーンは冗長と考えることもできるが、これは、たとえば異なるチェーンにデータを保存するための消失符号化の使用によって、データ自体がある意味で冗長であるからである。
【００６５】
ここで図７を参照すると、本原理の実施形態による、データの分割、連結、および削除とストレージノードネットワーク内への複数のストレージノードの追加および／または複数のストレージノードに保存されているデータの追加に応答したストレージ空間再利用を示しているデータ構成構造７００を示している。行７０２は２つのｓｙｎｃｈｒｕｎ  Ａ  ７０４とＢ  ７０６とを示しており、両者は、ハッシュキー空間全体に対応している空のプレフィックススーパーノードに属している。ここでは、各ｓｙｎｃｈｒｕｎコンポーネントは１つのＳＣＣ内に配置されており、複数の個別のフラグメント７０８も示している。これらのｓｙｎｃｈｒｕｎのｓｙｎｃｈｒｕｎコンポーネントを備えているＳＣＣを互いに並べて配置されている複数の長方形として示している。前述のように、複数のｓｙｎｃｈｒｕｎのチェーンは、複数のピアＳＣＣチェーンのスーパーノード濃度によって表すことができる。図７の残りの部分については、そのようなピアＳＣＣチェーンを１つだけ示している。
【００６６】
本原理の実施形態によれば、各スーパーノードは、最終的にはたとえばデータのロードまたは複数の物理ストレージノードの追加などに応答して分割されることがある。たとえば、行７１０に示しているように、分割は、通常のＦＰＮ分割であっても良く、その結果が親のプレフィクスからそれぞれ０と１とによって拡張されているプレフィックスを備えているそれぞれのスーパーノードＳＣＣチェーン７１２と７１４を有している２つの新規のスーパーノードとなってもよい。スーパーノードの分割後、各スーパーノード内の各ｓｙｎｃｈｒｕｎも、半分に分割されてもよく、複数のフラグメントがそれらのハッシュプリフィックスに基づいてそれらに分配される。たとえば、行７１０は、プレフィックス０のスーパーノードの一方のチェーン７１２と、プレフィックス１のスーパーノードの他方のチェーン７１４との２つのチェーンを示している。ただし、分割の結果、ｓｙｎｃｈｒｕｎ  Ａ  ７０４とＢ  ７０６との複数のフラグメント７０８は、これら２つの独立しているチェーン７１２と７１４とに分配され、２つのチェーンは異なるスーパーノードの下にある別個のストレージノードに保存することができる。その結果、４つのｓｙｎｃｈｒｕｎ７１６、７１８、７２０、および７２２が作られるが、新規のｓｙｎｃｈｒｕｎ７１６、７１８、７２０、および７２２の各々は、それぞれ元のｓｙｎｃｈｒｕｎ７０４および７０６のほぼ半分の大きさである。
【００６７】
さらに、当然、物理ストレージノードが２次ストレージシステムに追加され、システムが複数のスーパーノードを分割することによって応答すると、システムは複数の物理ストレージノードを、図５に関して前述したように、新しいスーパーノードと古いスーパーノードの両方に割り当てるように構成することができる。たとえば、２次ストレージシステムは、複数の物理ストレージノードを全てのスーパーノードの間に均等に分配してもよい。
【００６８】
本発明の実施形態の他の典型的な特徴において、２次ストレージシステムは、限定されている数のローカルＳＣＣを保持していてもよい。たとえば、ＳＣＣの数は、図７の行７２４に示しているように、ＳＣＣの最大の大きさに到達するまで、隣接しているｓｙｎｃｈｒｕｎコンポーネントを１つのＳＣＣに統合する、つまり連結することによって、維持することができる。ローカルＳＣＣの数を制限することによって、ＳＣＣメタデータをＲＡＭに保存することが可能になり、それに対して、データサービスを提供するための動作を高速に決定することが可能になる。ＳＣＣの目標サイズは、複数のＳＣＣがメインメモリに読み込み可能なように、たとえば１００ＭＢ未満に設定可能な構成定数であってもよい。ＳＣＣ連結は、ピアチェーンが同様の形式を維持するように、全てのピア上で緩く同期していてもよい。
【００６９】
図７を引き続き参照すると、データ削除を図７の行７２６に示しており、網掛けされている複数のデータフラグメントが削除される。その後、行７３０と７３２にそれぞれ示しているように、ストレージ空間が再利用され、別個の複数のＳＣＣの残りの複数のデータフラグメントを連結することができる。削除サービスを以下でより完全に説明する。
【００７０】
図６と７とに関して説明した前述のデータ構成は、静的システム内に実装するのは比較的簡単であるが、２次ストレージシステムの動的なバックエンド内に実装するのは非常に複雑である。たとえば、ピアがロードバランシング中に別の物理ストレージに転送される場合、その複数のチェーンは、１度に１つのＳＣＣずつ、バックグラウンドで新しい位置に転送されてもよい。同様に、典型的な実施形態によれば、スーパーノードの分割後、スーパーノードの全てのＳＣＣが即座に分割されずに、２次ストレージシステムは、複数のチェーンを現在のスーパーノードの複数の位置と形状とに調整するためにバックグラウンド操作を実行してもよい。その結果、任意の所与の瞬間に、複数のチェーンは部分的に分割されていたり、部分的にピアの以前の複数の位置に存在したり、または両方の状態にあることがある。１つまたは２つ以上の物理ストレージノード障害の場合、ＳＣＣチェーンのいくつかに相当なホールが存在することがある。ピアチェーンは、システム内のスーパーノード濃度チェーン冗長性のために、同じデータを記述しているので、データ再構築のために十分な数の完全な複数のチェーンが存在しなければならない。それに応じて、チェーンの冗長性によって、転送／障害が存在している場合でも、システム内のデータを推測することができる。
【００７１】
前述のデータ構成構造に基づいて、本原理の２次ストレージシステムの実施形態は、データの回復可能性の判断、データの自動再構築、ロードバランシング、削除と空間の再利用、データの位置の探し出し、重複排除、およびその他のデータサービスを効果的に提供することができる。
【００７２】
データ再構築については、ストレージノードまたはディスクの障害時に、それらに存在している複数のＳＣＣが失われることがある。その結果、冗長レベルが採用されると、これらのＳＣＣに属している複数のフラグメントを備えている複数のデータブロックの冗長性が、これらのブロックの書き込み時にユーザによって要求される冗長レベルまでせいぜい低くされる。最悪の場合、十分な数のフラグメントが残っていない場合、所与のブロックが完全に失われることがある。ブロックの冗長性が所望のレベルであることを保証するように、２次ストレージシステムはホールを探すために複数のＳＣＣチェーンをスキャンし、たとえば失われた各ＳＣＣに対するバックグランドジョブなど消失符号化スキームに基づいてデータ再構築のスケジューリングを行ってもよい。
【００７３】
典型的な実施形態について、複数のピアＳＣＣを１つの再構築セッションで再構築することができる。たとえばＳＣＣメタデータに基づいて、データ再構築に使用される最小の数のピアＳＣＣが再構築を実行しているピアによって読み取られる。その後、再構築される１つまたは２つ以上のＳＣＣに含まれることになる失われた複数のフラグメントを得るために、消失符号化と復号化がそれらにまとめて適用される。再構築された複数のＳＣＣは、任意の分割と連結とを実施することによって、同じフォーマットを有するように構成することが可能で、それによって高速で大量の再構築が可能になる。次に、再構築された複数のＳＣＣを現在の目的の複数の位置に送信することができる。
【００７４】
２次ストレージシステムの実施形態で実施可能な他のサービスには重複排除があり、重複排除は複数のストレージノードにわたって分散化することが可能で、多くのさまざまな側面について構成することが可能である。たとえば、ファイル全体、ファイルの部分集合、固定サイズブロック、または可変サイズブロックなど、重複が検出されるレベルを設定することができる。さらに、重複が検出され、それが保存される前のオンラインや、重複がディスクに到達した後のバックグラウンドなどの重複排除が実施される時期を設定することができる。重複排除の精度も調整可能である。たとえば、書き込まれている対象の複製が存在するたびに検出するようにシステムを設定することが可能で、これは「信頼できる」と呼ぶことが可能であり、またシステムはより高速な性能が得られるように複製ファイルの存在を見積もることも可能で、これは「おおよその」と呼ぶことができる。２つの対象が同一であることを確認する方法も設定可能である。たとえば、システムは２つの対象コンテンツの信頼性の高いハッシュを比較したり、その代わりにこれらのオブジェクトのデータを直接比較するように構成することができる。さらに、検出の範囲をローカルにする、所与のノード上に存在しているデータのみに限定する、全てのノードの全てのデータが使用されるようにグローバルにするなど、検出の範囲を変更することができる。
【００７５】
好ましい実施形態では、２次ストレージシステムは可変サイズブロック、オンライン、ハッシュ確認グローバル重複排除スキームを複数のストレージノードに実装する。高速なおおよその重複排除を通常の複数のブロックに使用可能であるのに対して、同じ検索プリフィックスを備えている２つまたは３つ以上のブロックが同じ複数のブロックを指していることを確認するために信頼できる重複排除を保持ルートに使用することができる。どちらの場合も、冗長クラスが採用されている場合、書き込まれているブロックの潜在的な複製は書き込みで要求されるクラスよりも弱くない冗長クラスを有していなければならず、潜在的な古い複製が再構築可能でなければならない。ここで、より弱い冗長クラスは、より低い冗長性を指している。
【００７６】
通常のブロック書き込み時には、重複排除ファイルの検索を書き込み要求を処理しているピアおよび／または最も長く動作しているピア上で実施することができる。たとえば、ピアが動作しているときに書き込まれる２つの同じブロックがそのピアによって処理されるように、書き込みを処理するピアをブロックのハッシュに基づいて選択することができる。したがって、ピアにおいて第１のブロックの複製となる第２のブロックを容易に判断することができる。書き込み処理ピアがデータ転送またはコンポーネント回復のせいで最近作られ、ピアがまだ有するべき全てのデータを有しておらずローカルＳＣＣチェーンが不完全な場合、より複雑な状況が発生する。そのような場合、同じスーパーノード内で書き込み処理ピアとして最も長く動作しているピアについて、使用可能な複製があるかどうかが調べられる。最も長く動作しているピアのチェックは経験則による手段に過ぎないが、最も長く動作しているピアの適切なＳＣＣチェーンが完全でなくなることは起こりそうもなく、それはＳＣＣチェーンが完全ではない状態は大きな障害の後で通常発生するからである。さらに、特定のブロックについて、大きな障害の場合に、重複を排除するたった１つの機会が失われた場合でさえ、次の同一のブロックを重複排除しなければならない。
【００７７】
保持ルート上での書き込みについては、２次ストレージシステムは、同じ検索プレフィックスを備えている２つのブロックが同じ複数のブロックを指していることを確認しなければならない。そうしない場合、保持ルートは、複数のスナップショットの識別に使用できなくなる。その結果、正確で信頼性が高い重複排除スキームを保持ルートに適用しなければならない。通常のブロックへの書き込みと同様に、書き込みを処理するピアを、どのような重複であってもピア上に存在することになるようにブロックのハッシュに基づいて選択することができる。しかし、ローカルな完全なＳＣＣチェーンが書き込みを処理するピアに存在しないときには、書き込み処理ピアは、重複排除クエリーをそのスーパーノード内の他の全てのピアに送信することができる。これらのピアの各々は、重複をローカルにチェックする。否定の応答は、応答の基になるＳＣＣチェーンの複数の部分の要約の記述を有していてもよい。書き込み処理ピアは全ての応答を収集してもよい。少なくとも１つの肯定の応答があれば、重複が発見されている。そうでなく、全ての応答が否定であれば、書き込み処理ピアは、否定の応答に添付されている任意のチェーン情報を使用して完全なチェーンの構築を試みてもよい。ＳＣＣチェーン全体が構築可能な場合、新しいブロックは重複ではないと判断される。そうではない場合、大規模な障害の後に起こることがあるデータ再構築が進行中であることを示している特別なエラーステータスを伴って保持ルートの書き込みを拒否してもよい。チェーン全体を対象とすることができないときには、書き込みは後で発行されなければならない。
【００７８】
２次ストレージシステムの実施形態によって実行できる他のデータサービスには、データ削除とストレージ空間の再利用がある。前述のように、典型的な２次ストレージ装置は、内容アドレス指定可能性、分散と耐障害、および重複排除などの機能を有していてもよい。これらの機能によって、データ削除の実装において複雑な問題が発生する。内容アドレス指定可能装置の実施形態における削除は、周知の分散ガーベッジコレクションと多少似ている一方で、本明細書において以下で説明するように相当な違いがある。
【００７９】
ブロックがブロックの古い他のコピーに対して重複排除されるかどうかを判断する場合、典型的な２次ストレージシステムの実施形態は、古いブロックの削除がスケジュールされていないことを確認しなければならない。どのブロックを保持し、どれを削除するかは、分散している設定と障害の存在とに存していなければならない。たとえば、削除の判断は、断続的な障害によって一時的に失われてはならないが、これは削除がスケジュールされている複数の重複ブロックが除外される可能性があるためである。さらに、データ削除アルゴリズムの堅牢性は、データの堅牢性よりも高くなければならない。この性質は望ましいが、それは、いくつかのブロックがたとえ失われても、データ削除は失われたデータを論理的に取り除き、ユーザが明示的に動作を要求したときに、システムを修復できなければならないためである。
【００８０】
２次ストレージシステムの典型的な実施形態において構成を簡単にし、実装を管理可能にするために、削除を２つの段階に分割することが可能で、これら２つの段階は、複数のブロックが削除のためにマークされる読み取り専用段階と、削除のためにマークされた複数のブロックが再利用され、ユーザは読み取りと書き込みの両方を発行することができる読み書き段階である。読み取り専用段階を有することで、削除の実装が簡略化され、それは書き込みのブロックマーキング処理への影響が取り除かれるためである。
【００８１】
再び図７を参照すると、特定のブロックを指している複数のシステムデータブロック内のポインタの数をカウントするように構成されているブロックあたり参照カウンタを使用して削除を実装することもできる。特定の実装においては、複数の参照カウンタは書き込み時に即座に更新する必要はない。その代わりに、それらを読み取り専用段階毎に増加するように更新することが可能で、その段階の間に２次ストレージシステムは前回の読み取り専用段階以来書き込まれた全てのポインタを処理する。検出された各ポインタについて、それが指すブロックの参照カウンタが増分される。すべてのポインタが検出され、増分が完了すると、参照カウンタがゼロの全てのブロックが削除のためにマークされる。たとえば、図７に示しているように、複数のフラグメント７２８を削除のためにマークされた複数のデータブロックに含めることができる。さらに、削除のためにマーク済みのブロック（削除ルートが関連付けられているルートを含む）によって指されているブロックの参照カウンタは、減分することができる。その後、減分によって参照カウンタがゼロに等しくなっているあらゆるブロックが削除のためにマークされ、削除のために既にマークされているブロックによって指されているブロックの参照カウンタを減分することができる。マーキングと減分の処理は、あらたに削除のためにマークできるブロックが無くなるまで繰り返すことができる。この時点で、読み取り専用段階が終了してもよく、削除のためにマークされたブロックをバックグラウンドで取り除くことができる。
【００８２】
前述のような典型的な削除処理は全てのポインタだけでなく、全てのブロックのメタデータも使用する。ポインタとブロックメタデータを全てのピア上で複製すること可能で、いくつかのブロックがもはや再構築可能ではない場合でも、ピア上に少なくとも１つのブロックフラグメントが存在する限り、削除を進めることができる。
【００８３】
複数のブロックは、複数のフラグメントとして保存できるので、ブロック参照カウンタは各フラグメントについて保存することができる。したがって、所与のブロックの各フラグメントは、ブロックの参照カウンタの値が同じでなければならない。参照カウンタは読み取り専用段階に関わっている複数のピア上で別個に計算することができる。削除が開始される前に、そのような各ピアは、フラグメントメタデータとポインタとに関して完全なＳＣＣチェーンを有していなければならない。スーパーノード内の全てのピアが関わる必要はないが、何らかの最小の数のピアが読み取り専用段階を完了するように関わっていなければならない。計算された複数のカウンタは、後で、バックグラウンドで残りのピアに伝搬させてもよい。
【００８４】
カウンタ計算における冗長性によって、物理ストレージノードの障害が発生してもあらゆる削除の決定を存続されることができる。しかし、削除計算の中間結果は存続する必要はない。特定の典型的な実施形態では、任意の中間計算結果はストレージノード障害によって失われることがある。ストレージノードに障害が発生すると、読み取り専用段階にもはや関わることができないピアが多すぎる場合、計算全体が繰り返されることがある。しかし、各スーパーノード内の十分な数のピアが障害の影響を受けない場合、削除を依然として継続することができる。読み取り専用段階の終了時に、新しいカウンタ値が耐障害性を有するように設定され、全ての動作していないブロック（参照カウンタがゼロに等しいブロック）が物理ストレージからバックグラウンドで一掃される。たとえば、図７の行７３０内に図示しているように、動作していないブロックを一掃することができる。
【００８５】
ここで図８、９、および１０Ａ〜１０Ｃを参照し、継続して図２、３、５、および６を参照すると、本原理の典型的な実装による２次ストレージシステム上のデータを管理する方法８００とシステム２００、６００を図示している。当然、典型的な２次ストレージシステムの前述の機能の各々は、個別であれ、任意の組み合わせであれ、方法８００とシステム２００および６００において実装可能である。したがって、本明細書において以下で説明する方法８００およびシステム２００と６００内の特徴は典型例に過ぎず、前述の特徴は当業者によって理解されるように、本明細書で説明する教えを考慮して、方法とシステムの実装に追加することができる。
【００８６】
方法８００は、ステップ８０１において、たとえば図６に関して前述したように、ハッシュ関数を複数のデータブロックの入力ストリームに任意採用で適用するステップを有していてもよい。たとえば、ＳＨＡ−１ハッシュ関数を採用することができる。
【００８７】
任意採用で、ステップ８０２において、図６のブロック６２０に関して前述したように、複数のデータブロックを消失符号化することができる。
【００８８】
ステップ８０４で、たとえば図６に関して前述したように、複数のデータブロックは、ノードネットワーク内の複数の異なる物理ストレージノードに位置している異なるコンテナに分配して、複数のノード内の複数のデータコンテナの冗長な複数のチェーンを生成することができる。たとえば、分配するステップは、たとえばデータブロックＡ  ６０４のような複数のデータブロックの１つの複数のフラグメントが異なる複数のストレージノードに保存されるように、消失符号化された複数のフラグメント６２２を異なる複数のデータコンテナ６２８に保存するステップを有していてもよい。たとえば、異なる複数のストレージノードは、スーパーノード５０８の下にある図５と６のノード５１４ｂと５１４ｄ〜ｆに対応していてもよい。さらに、前述のように、複数のデータブロックの複数のフラグメントはストレージノードのストレージ媒体上で内容アドレス指定されていてもよい。さらに、内容アドレスの異なるプリフィックスを複数のストレージノードの異なる部分集合に関連付けてもよいことに注意すべきである。たとえば、図５と６とを参照して前述したように、ハッシュキープリフィックスを、各々が複数のストレージノードにまたがっていることもある、異なるスーパーノード５０６〜５１２に関連付けてもよい。さらに、スーパーノードの対応している複数のデータコンテナの複数のチェーンの各々が、前述のようにたとえばハッシュ値と信頼性レベル等のデータブロック情報を記述している同じメタデータを有していてもよい。さらに、メタデータは、前述のように複数のデータコンテナ内の複数のデータブロックの間の露出した複数のポインタを有していてもよい。
【００８９】
ステップ８０６で、アクティブなストレージノードのストレージノードネットワークへの追加が１つまたは２つ以上のストレージノードによって検出されてもよい。たとえば、１つまたは２つ以上のストレージノードの明示的な追加または削除が追加および／または削除を示している管理コマンドを受信することによってピアコンポーネントによって検出されてもよい。
【００９０】
ステップ８０８では、複数のコンテナの少なくとも１つのチェーンが、複数のアクティブなストレージノードの追加の検出に応答して、分割されてもよい。たとえば、図７の行７０２と７１０に関して前述したように、複数のコンテナの１つまたは２つ以上のチェーンが分割されてもよい。当然、分割するステップは、１つまたは２つ以上のデータコンテナ６２８を分割するステップおよび／または１つまたは２つ以上のデータコンテナ／ｓｙｎｃｈｒｕｎチェーン６３６を分割するステップを有していてもよい。たとえば、複数のデータコンテナのチェーンを分割するステップは、複数のコンテナのチェーンの少なくとも１つのデータコンテナを分割するステップを有していてもよい。さらに、たとえば、追加された１つまたは２つ以上のノードに応答して、所望の冗長レベルの維持のために、またはロードバランシングを実行するために、メタデータをコンテナチェーンの分割中に参照してもよい。さらに、自動分割は、たとえば図７に関して前述したように、新しい複数のスーパーノードまたは複数のストレージノードの複数の部分集合を生成するように、複数の内容アドレスの少なくとも１つのプレフィックスを拡張するステップを有していてもよいことに注意すべきである。
【００９１】
ステップ８１０において、コンテナの少なくとも１つのチェーンのデータ分割部分の少なくとも一部分は、ノード障害に対するシステム堅牢性を増大させるように、１つのストレージノードから他のストレージノードに転送されてもよい。たとえば、図７に関して前述したように、複数のＳＣＣのチェーンの複数のコンテナに保存されている複数のデータブロックフラグメントを分割して、他の複数のスーパーノードに分配してもよい。前述のように、異なる複数のスーパーノードが異なる複数のストレージノードコンポーネントを有していてもよく、そのため、１つのスーパーノードまたは複数のノードの部分集合から他のスーパーノードまたは複数のノードの部分集合への転送は、異なる複数のストレージノード間の転送を有していてもよい。前述のように、分割は、新しい複数のストレージノードの２次ストレージシステムへの追加に応答して実行されてもよい。したがって、新しい複数のスーパーノードの生成とそれらの間でのデータ分配とによって、データのストレージが分散し、１つまたは２つ以上のノード障害に対する堅牢性を実現するように、ネットワーク内の複数のストレージノードを効率的に使用することができる。異なる複数のストレージノード上の様々な冗長なデータによって、障害の際のデータ再構築が促進される。
【００９２】
ステップ８１２で、少なくとも１つのデータコンテナを他のデータコンテナに併合することができる。たとえば、図７に関して前述したように、特定の数のＳＣＣを維持するように分割後、複数のデータコンテナを有している２つのｓｙｎｃｈｒｕｎ７１６と７２０とは、同様に複数のデータコンテナを有している２つのｓｙｎｃｈｒｕｎ７１８と７２２とにそれぞれ併合することができる。さらに、併合は、たとえば図７の行７２６、７３０、および７３２に関して前述したように、削除と再利用の後に実施することもできる。
【００９３】
方法８００の任意の部分の実行中に、１つまたは２つ以上のデータサービスもステップ８１４で実行することができる。ステップ８１４を方法８００の最後に示しているが、方法８００の任意の他のステップの最中、任意の他の２つのステップの間、または任意の他のステップの後に実行することもできる。たとえば、ロードバランシングなどのデータサービスの実装を支援するように、本方法を実行することができる。図９に示しているように、データサービスの実行は、複数のデータコンテナチェーンの１つのストレージノードまたはスーパーノードコンポーネントから他のストレージノードまたはスーパーノードコンポーネントへの転送９０２を有していてもよい。時間の順序に従っている複数のピアチェーンの構成は複数のデータコンテナチェーンの転送を促進する。
【００９４】
ステップ９０４と９０８とにおいて、データ書き込みと読み出しとを実行することができる。たとえば、前述のように、書き込み中に、データのブロックを、ブロックが属しているハッシュキー空間に割り当てられているスーパーノードの複数のピアノ１つに経由させることができる。さらに、重複検出も書き込み時に実行することができる。読み出しについては、たとえば、前述のように、読み出しリクエストもブロックのハッシュキーが該当しているスーパーノードの複数のピアノ１つに経由させることができる。ブロックを読み取るステップは、ブロックメタデータを読み取るステップと、前述のように消失符号化スキームによってブロックの再構築に十分な数のフラグメントを得るように複数のフラグメント読み取り要求を他の複数のピアに転送するステップとを有することができる。
【００９５】
ステップ９０６では、複数のデータコンテナの複数のチェーンが複数のホールを有しているかどうかを決定することができる。複数のデータコンテナチェーン内の複数のホールの識別によって、たとえば、データの読み取り、データの可用性の判断、データ削除の実行、障害に応答したデータの再構築、および分散グローバル重複排除が促進される。たとえば、複数のホールの特定によって、コンテナに保存されている複数のデータフラグメントが利用不能であることが示される。その結果、ストレージサーバは、データの再構築時に、他のデータフラグメントを他のピアで探さなければならない。データの再構築は、たとえば、データの読み取りがきっかけとなってもよい。同様に、複数のホールの識別は、ユーザ定義冗長レベルがシステム上で維持されているかどうかのシステムテスト時に実行されてもよい。
【００９６】
ストレージサーバが複数のコンテナの複数のチェーンが複数のホールを有しているかどうかを判断できる一例を、スーパーノードの複数のピア上のｓｙｎｃｈｒｕｎチェーンスキャンのさまざまな時間フレームを示している図１０Ａ〜１０Ｃに示している。たとえば、図１０Ａにおいて、ストレージサーバはスーパーノード５０８に属している全てのピア上でｓｙｎｃｈｒｕｎ１００２を同時にスキャンするように構成されていてもよい。図１０Ｂでは、システムは、複数のデータブロックのストリームの時間の順序で次のｓｙｎｃｈｒｕｎ１００８をスーパーノード５０８に属している全てのピア上で同時にスキャンしてホール１００４を見つけ出すように先に移動してもよい。同様に、図１０Ｃでは、システムは、複数のデータブロックのストリームの時間の順序で次のｓｙｎｃｈｒｕｎ１０１０をスーパーノード５０８に属している全てのピア上で同時にスキャンしてホール１００６を見つけ出すように先に移動してもよい。たとえば、このようにしてノードとディスクとの障害に起因する複数のチェーンホールが検出できる。さらに、チェーンは前述のようにチェーンとデータ冗長性を使用して再構築できる。
【００９７】
図９に戻ると、前述のように、ステップ９１０でデータ可用性の判断を実行することができる。さらに、ストレージノード障害に応答したデータの再構築もステップ９１２で実行することができる。たとえば、前述のように、システムは複数のＳＣＣチェーンを複数のホールを探すようにスキャンして、データ再構築を失われた各々のＳＣＣに対するバックグラウンドジョブとしてスケジュールすることができる。さらに、再構築は前述のようにフラグメントメタデータおよび／またはコンテナメタデータを参照することによって実行することができる。
【００９８】
ステップ９１４で、データ削除を実行することができる。たとえば、データ削除は、前述のように、オンデマンドでおよび／または重複排除に関連して実行することができる。さらに、データ削除は、たとえば、参照カウンタを使用するステップと、指しているポインタのない任意のブロックを繰り返し削除するステップとを有することができる。たとえばフラグメントメタデータを参照することによって、複数のポインタを取得することができる。
【００９９】
ステップ９１６では、詳細に前述したように、分散グローバル重複排除を実行することができる。たとえば、前述のように、高速のおおよその重複排除を通常のブロックに対して実行することができるのに対して、信頼できる重複排除を保持ノードに対して実行することができる。さらに、重複排除を、データ書き込みの一部として、オンラインで実行することができる。
【０１００】
当然、図９に示している全てのサービスは任意採用であるが、好ましいシステムは図９に関して説明した全てのサービスを実行できる能力を有している。さらに、ステップ９０２と９０６とをステップ９０８〜９１６の前に実行するように示しているが、ステップ９０８〜９１６のいずれも、ステップ９０２と９０６の一方または両方を実行せずに実行することができる。
【０１０１】
さらに、図２と３に戻ると、当然、システム２００のバックエンドの複数のストレージノード上で動作している複数のストレージサーバは、図８と９を参照して前述したように任意の１つまたは２つ以上のステップを実行するように構成することができる。したがって、システム２００のバックエンドの以下の説明は、例示のみであって、当然、前述の特徴の任意の１つまたは２つ以上を本明細書に含めることができる。
【０１０２】
前述のように、システム２００のバックエンド２１２は、物理ストレージノード２１８ａ〜２１８ｆのネットワークを有していてもよい。さらに、各ストレージノードはストレージ媒体とプロセッサと有していてもよく、ストレージ媒体は他の複数のストレージノードの複数のデータコンテナの複数のチェーンに関して冗長な複数のデータコンテナのチェーン内の複数のデータブロックのフラグメントを保存するように構成されていてもよい。たとえば、図６に関して前述のように、データブロック６０４、６１０、および６１６の複数のフラグメント６２２を、他のピア０１：１〜０１：３内に保存されている複数のコンテナの複数のチェーンについて冗長な、ピア０１：０内の複数のデータコンテナ６３６のチェーン内に保存することができる。
【０１０３】
さらに、各ストレージサーバ３０２は図８に関して前述したステップ８０６、８０８、および８１０を実行するように構成されていてもよい。さらに、各ストレージサーバは、図９に関して説明した任意のデータサービスを実行するように構成されていてもよい。さらに、前述のように、複数のデータコンテナの１つまたは２つ以上のチェーンは、複数のデータコンテナの他の複数のチェーンと同じメタデータを有していてもよい。メタデータは、ストレージノード内のデータの状態を記述していてもよい。また、前述のように、ストレージサーバは、ストレージサーバに関連付けられているストレージ媒体上の複数のコンテナの少なくとも１つのチェーンを自動的に分割するために、メタデータを参照してもよい。さらに、前述のように、メタデータは、複数のデータコンテナ内の複数のデータブロック間の露出している複数のポインタを有していてもよく、ストレージサーバは複数のポインタを使用してデータ削除を実行するように構成されていてもよい。
【０１０４】
図６のステップ８０１に関して前述したように、複数のデータブロックとそれらの対応する複数のフラグメントとは、ハッシュ関数に基づいて内容アドレス指定されていてもよい。同様に、複数のハッシュキーの複数のプレフィックスは、異なる複数のスーパーノードまたは複数のストレージノードの複数の部分集合に関連付けられていてもよい。たとえば、図５に示しているように、プレフィックス「００」は部分集合ストレージノード５１４ａ〜５１４ｄに関連付けられていてもよく、プレフィックス「０１」は部分集合ストレージノード５１４ｂおよび５１４ｄ〜５１４ｆに関連付けられていてもよい等である。さらに、ステップ８０８に関連して前述したように、複数のコンテナのチェーンを自動分割するステップは、複数のプレフィックスの少なくとも１つを拡張して複数のストレージノードの少なくとも１つの追加の部分集合を生成するステップを有していてもよい。たとえば、前述のように、スーパーノードに割り当てられているプレフィクスが「０１」の場合、スーパーノードは割り当てられているプレフィックスがそれぞれ「０１０」と「０１１」である２つのスーパーノードに分割することができる。さらに、新しいスーパーノードの各々は、新しいそして異なる複数のコンポーネントまたはピアの複数の集合またはそれらに割り当てられている複数のストレージノードの部分集合を有していてもよい。さらに、ステップ８１０に関して前述したように、ストレージサーバによって開始された転送は、複数のコンテナの１つまたは２つ以上のチェーンから分割されたデータの少なくとも一部を新しく生成されたまたは追加された複数のストレージノードの部分集合に分配するステップを有していてもよい。
【０１０５】
ここで、図７と８とを参照しながら図１１を参照すると、本原理の他の典型的な実装によって２次ストレージシステム上でデータを管理する方法１１００を示している。当然、典型的な２次ストレージシステムと方法の前述の機能の各々は、個別であれ、任意の組み合わせであれ、方法１１００において実装可能である。したがって、本明細書において以下で説明する方法１１００の特徴は典型例に過ぎず、前述の特徴は当業者によって理解されるように、本明細書で説明する教えを考慮して、方法１１００に追加することができる。
【０１０６】
方法８００と同様に、方法１１００は、図８に関して前述したように、任意採用のステップ８０１と８０２を実行することによって開始されてもよい。さらに、図８を参照して前述したように、複数のデータブロックがノートネットワーク内の異なる複数のストレージノードの異なる複数のデータコンテナに分配され、複数のノード内の複数のデータコンテナの冗長な複数のチェーンを生成するステップ８０４を実行することができる。
【０１０７】
ステップ１１０６では、１つまたは２つ以上のストレージサーバがストレージノードネットワーク内のアクティブな複数のストレージノードの数の変化を検出してもよい。アクティブな複数のノードの数の変化は、少なくとも１つのストレージノードのストレージノードネットワークへの追加および／またはノードのストレージネットワークからの削除が含まれていてもよい。前述のように、たとえば、ノードの追加や削除は、追加および／または削除を示している管理コマンドを受信することによってピアコンポーネントまたはその対応しているストレージサーバによって検出されてもよい。さらに、ノード障害は、ｐｉｎｇを採用することによって、複数のピアコンポーネントまたはそれらに対応しているストレージサーバで検出可能であることに注意すべきである。たとえば、複数のピアコンポーネントは、互いにｐｉｎｇを行って数個のｐｉｎｇが失われたことを検出した後にノードで障害が発生したことを推定するように構成することができる。
【０１０８】
ステップ１１０８では、ストレージサーバは、変化の検出に応答して、ストレージノードの１つに位置している少なくとも１つのデータコンテナを他のストレージノード内に位置している他のデータコンテナに自動的に併合するように構成されていてもよい。たとえば、ノードがネットワークに追加された場合、図７の列７１０と７２４に関して前述したように、複数のデータコンテナが併合されることがある。たとえば、コンテナ７１８は、コンテナ７１６との併合の前に異なるストレージノードを起源としていてもよい。
【０１０９】
その代わりに、ノードがストレージシステムから取り除かれる場合、ステップ１１０６で複数のストレージサーバは異なる複数のストレージノードからの複数のデータコンテナを併合するように構成されてもよい。たとえば、ストレージサーバはノードが取り除かれることを示している管理コマンドを受け取ってもよい。ノードを実際に取り除く前に、複数のストレージサーバは取り除かれるノード内の複数のデータコンテナを残る複数のノード内のコンテナに併合するように構成されていてもよい。たとえば、図７の列７０２、７１０、および７２４に関連して前述した処理は、たとえばコンテナ７１８と７２０などの異なる複数のストレージノードからのコンテナをより大きな複数のｓｙｎｃｈｒｕｎチェーンに併合するように、単純に逆にすることができる。併合を複数のコンテナの管理可能性を確実にするおよび／またはシステム性能を改善するように実行することができる。その後、前述のように、再分配または再バランシングを実施することができる。さらに、たとえば図８を参照して前述したように、方法１１００の任意の点でステップ８１４を実行することができる。
【０１１０】
また、本発明の典型的な方法とシステムとはシステムにおける管理ノードの追加／削除とノードの障害／回復とを区別するように構成されていてもよいことに注意すべきである。管理ノードの追加／削除は、システム内にあるべき複数のノードの管理リストに示されていてもよい。この区別は、自動システム管理において便利である。たとえば、ノードの管理リストに従ってシステムに接続すべきではない複数の外部のまたは不正なノードの検出に、この区別を採用することができる。たとえば、外部ノードがシステムに接続しようとしたときに、ノードの管理リストを採用することによって、接続を拒否したり、外部ノードを取り除くことができる。区別は、全てのノードがアクティブなシステムが正常な状態にある時のシステムの予測される未使用時容量の計算や、正常な状態の非正常状態からの区別にも利用することもできる。区別の他の用途も考えられる。
【０１１１】
前述の典型的な方法とシステムとは、グローバル重複排除、動的拡張性、複数の冗長クラスのサポート、データの位置の探し出し、データの高速な読み取りと書き込み、ノードまたはディスク障害によるデータの再構築など２次ストレージシステム内での数個のデータサービスの効率的で効果的な提供を促進する。ネットワーク構成の変化に応答して分割、併合、および転送するように構成されている複数のデータコンテナの冗長な複数のチェーンに基づいている前述の典型的なデータ構成構造によってこれらのサービスの各々の分散２次ストレージ装置内での実装が可能になる。複数のチェーンコンテナ内の冗長性によって、データサービスの提供において耐障害性が実現される。たとえば、複数のチェーン内の複数の複製によってメタデータが保存されているため、障害時にデータが失われていてもデータ削除を進めることができる。さらに、冗長性によって、前述のように、効率的な分散データ再構築も可能になる。さらに、複数のデータコンテナ内の複数のデータブロックの保存の時間順序とコンテナメタデータとの両方によって、システムの状態の高速な推定とデータ再構築などの動作が可能になる。他のブロックを指している露出しているポインタを有しているデータブロックメタデータによって、分散耐障害データ削除の実装が可能になる。さらに、複数のチェーンコンテナ内の動的な性質によって、効果的な拡張性が実現される。たとえば、データサービスを提供するためにストレージ空間を完全に最適化し利用するように、ストレージノードネットワーク構成の変化に自動的に対応するように、複数のコンテナを分割、転送、および／または併合することができる。さらに、動的な性質によってデータの位置の容易な特定が可能になる。
【０１１２】
（説明を意図し限定を意図していない）システムと方法との好ましい実施形態を説明したが、前述の教えの下で当業者は修正や変更を行うことができることに注意しなければならない。そのため、当然、添付の請求項によって概要が示されている本発明の範囲と精神に含まれており開示している特定の実施形態において変更を行うことができる。特許法で要求される詳細と具体性を伴って本発明の態様をこのように説明したが、特許状によって請求し保護されるように望むものを添付の請求項において説明している。
【符号の説明】
【０１１３】
１００  データブロック構成
１０２、１０４、１０６  ソース頂点
１０８  削除ルート
１１０、１１２、１１４、１１６  ブロック
２０２  アプリケーション層
２０４、２１４  ＡＰＩ
２０６  フロントエンドシステム
２０８ａ〜２０８ｆ  アクセスノード
２１０  内部ネットワーク
２１２  バックエンドシステム
２１６  プロトコルドライバ
２１８ａ〜２１８ｆ  ストレージノード
３０２  ストレージサーバ
３０４、４０４  処理ユニット
３０６、４０６  ストレージ媒体
４０２  プロキシサーバ
５００  固定プレフィックスネットワーク
５０２、５０４  オーバーレイノード
５０６〜５１２  スーパーノード
５１４ａ〜５１４ｆ  ストレージノード
５１６  スーパーノードコンポーネント
６００、７００  データ構成構造
６０２  データストリーム
６０４〜６１６  データブロック
６１８  圧縮
６２０  消失符号化
６２４、７０４、７０６、７１６、７１８、７２０、７２２、７３４、７３６、１００２、１００８  ｓｙｎｃｈｒｕｎ
６２６  ピアＳＣＣチェーン
６２８、６３０、６３２、６３４  ｓｙｎｃｈｒｕｎコンポーネントコンテナ（ＳＣＣ）
６３６  データコンテナ／ｓｙｎｃｈｒｕｎチェーン
７０２、７１０、７２４、７２６、７３０、７３２  行
７０８、７２８  フラグメント
７１２、７１４  スーパーノードＳＣＣチェーン
１００４、１００６  ホール（穴）
【図１】
2010079886.tif 000003
【図２】
2010079886.tif 000004
【図３】
2010079886.tif 000005
【図４】
2010079886.tif 000006
【図５】
2010079886.tif 000007
【図６】
2010079886.tif 000008
【図７】
2010079886.tif 000009
【図８】
2010079886.tif 000010
【図９】
2010079886.tif 000011
【図１０Ａ】
2010079886.tif 000012
【図１０Ｂ】
2010079886.tif 000013
【図１０Ｃ】
2010079886.tif 000014
【図１１】
2010079886.tif 000015
【外国語明細書】
2010079886.tif 000016
2010079886.tif 000017
2010079886.tif 000018
2010079886.tif 000019
2010079886.tif 000020
2010079886.tif 000021
2010079886.tif 000022
2010079886.tif 000023
2010079886.tif 000024
2010079886.tif 000025
2010079886.tif 000026
2010079886.tif 000027
2010079886.tif 000028
2010079886.tif 000029
2010079886.tif 000030
2010079886.tif 000031
2010079886.tif 000032
2010079886.tif 000033
2010079886.tif 000034
2010079886.tif 000035
2010079886.tif 000036
2010079886.tif 000037
2010079886.tif 000038
2010079886.tif 000039
2010079886.tif 000040
2010079886.tif 000041
2010079886.tif 000042
2010079886.tif 000043
2010079886.tif 000044
2010079886.tif 000045
2010079886.tif 000046
2010079886.tif 000047
2010079886.tif 000048
2010079886.tif 000049
2010079886.tif 000050
2010079886.tif 000051
2010079886.tif 000052
2010079886.tif 000053
2010079886.tif 000054
2010079886.tif 000055
2010079886.tif 000056
2010079886.tif 000057
2010079886.tif 000058
2010079886.tif 000059
2010079886.tif 000060
2010079886.tif 000061
2010079886.tif 000062
2010079886.tif 000063
2010079886.tif 000064
2010079886.tif 000065
2010079886.tif 000066
2010079886.tif 000067
2010079886.tif 000068
2010079886.tif 000069
2010079886.tif 000070
2010079886.tif 000071
2010079886.tif 000072
2010079886.tif 000073
2010079886.tif 000074
2010079886.tif 000075
2010079886.tif 000076
2010079886.tif 000077
2010079886.tif 000078
2010079886.tif 000079
2010079886.tif 000080
2010079886.tif 000081
2010079886.tif 000082
2010079886.tif 000083
2010079886.tif 000084
2010079886.tif 000085
2010079886.tif 000086
2010079886.tif 000087
2010079886.tif 000088
2010079886.tif 000089
2010079886.tif 000090
2010079886.tif 000091
2010079886.tif 000092
2010079886.tif 000093
2010079886.tif 000094
2010079886.tif 000095
2010079886.tif 000096
2010079886.tif 000097
2010079886.tif 000098
2010079886.tif 000099
2010079886.tif 000100