(57)【要約】長い全体的にランダムに分布している記録名により大きな一組の記録を索引し、前記一組の記録についてのメンバシップ問合せに応答するのに適している索引を構成するための方法であって、前記一組の記録に新しい記録を追加し、各名前の少なくとも一部が少なくともほぼランダムになっている名前を生成するように設計されたプロセスにより、前記新しい記録に新しい記録名を割り当てること、第１のレベルの索引をチェックすることにより、前記索引内に前記新しい記録名がまだ存在しないと判定すること、前記新しい記録名よりも短い結合記録名を形成するために、前記新しい記録名に前記索引内にすでに存在する記録名情報を結合すること、前記新しい記録を表す新しい第１のレベルの索引エントリを形成するために、前記結合記録名を前記第１のレベルの索引に追加すること、前記一組の記録に第２の新しい記録を追加し、前記第２の新しい記録に、前記新しい記録名とは異なる第２の新しい記録名を割り当てること、前記第２の新しい記録名が前記第１の新しい記録名と異なるものであるかどうかを判定するために、前記第１のレベルの索引が十分な情報を含んでいないと判定すること、前記第２の新しい記録名を表し、前記第２の新しい記録名より短い前記第１のレベルの索引にエントリを追加することを含み、前記第１のレベルの索引が、前記新しい記録名が前記索引に追加されたと結論するのに十分な情報を含んではおらず、前記一組の記録内の異なる各記録が異なる記録名に割り当てられ、前記第１のレベルの索引の少なくとも一部が、記録名に基づいて配列される方法。
2008516342.tif 000002
【特許請求の範囲】
【請求項１】
長い全体的にランダムに分布している記録名により識別された大きな一組の記録を索引し、前記一組の記録についてのメンバシップ問合せに応答するのに適している索引を構成するための方法であって、
前記一組の記録に新しい記録を追加し、各名前の少なくとも一部が少なくともほぼランダムになっている名前を生成するように設計されたプロセスにより、前記新しい記録に新しい記録名を割り当てること、
第１のレベルの索引をチェックすることにより、前記索引内に前記新しい記録名がまだ存在しないと判定すること、
前記新しい記録名よりも短い結合記録名を形成するために、前記新しい記録名に前記索引内にすでに存在する記録名情報を結合すること、
前記新しい記録を表す新しい第１のレベルの索引エントリを形成するために、前記結合記録名を前記第１のレベルの索引に追加すること、
前記一組の記録に第２の新しい記録を追加し、前記第２の新しい記録に、前記新しい記録名とは異なる第２の新しい記録名を割り当てること、
前記第２の新しい記録名が前記第１の新しい記録名と異なるものであるかどうかを判定するために、前記第１のレベルの索引が十分な情報を含んでいないと判定すること、
前記第２の新しい記録名を表し、前記第２の新しい記録名より短い前記第１のレベルの索引にエントリを追加すること、
を含み、前記第１のレベルの索引が、前記新しい記録名が前記索引に追加されたと結論するのに十分な情報を含んではおらず、
前記一組の記録内の異なる各記録が異なる記録名に割り当てられ、
前記第１のレベルの索引の少なくとも一部が、記録名に基づいて配列される、方法。
【請求項２】
請求項１に記載の方法において、前記一組の記録内の異なる各記録が、前記第１のレベルの索引内に異なるエントリを有する、方法。
【請求項３】
請求項１に記載の方法において、前記新しい記録名を結合するために使用する前記プロセスが、それを前記索引内にすでに存在する記録名から区別するのに十分な前記新しい記録名から入手した情報の一部を決定することを含む、方法。
【請求項４】
請求項１に記載の方法であって、さらに、
新しいエントリを、前記完全な新しい記録名またはそれを再構成するのに十分な情報を含む第２のレベルの索引に追加すること、
最初に、問合せを受けた記録名が前記新しい第１のレベルの索引エントリにより表示されていると判定し、次に、前記問合せを受けた記録名が新しい第２のレベルの索引エントリにより表示されていると判定することにより、問合せを受けた記録名が索引内にすでに存在すると判定すること、
を含む方法。
【請求項５】
請求項４に記載の方法において、前記第１のレベルの索引が、ＲＡＭ内に格納され、前記第２のレベルの索引がディスク上に格納される、方法。
【請求項６】
請求項３に記載の方法において、前記新しい記録名から入手した情報の一部が、前記新しい記録名を表示する２進値のビットのあるサブセットを除去することにより入手される、方法。
【請求項７】
請求項１に記載の方法において、前記結合することが、２つの記録名の少なくとも一部の算術差を計算すること、または２つの記録名の少なくとも一部を含むある他の演算または有限体算術演算を計算することを含む、方法。
【請求項８】
請求項１に記載の方法において、前記新しい記録名を割り当てる前記プロセスが、疑似乱数を生成することか、または一意であることが分かっている記録識別情報のある組合せの暗号ハッシュを計算することを含む、方法。
【請求項９】
請求項１に記載の方法において、前記索引の一部が、前記新しい記録が追加された時間内に記録名が前記索引に追加された一組の記録を表し、前記新しい記録に関する追加情報、および前記時間がＲＡＭ内にキャッシュされる間に追加された他の記録の情報を入手するために、前記一部が一組の単位として検索される、方法。
【請求項１０】
請求項１に記載の方法において、記録または索引情報がディスク上のシーケンシャルなログ構造内に格納され、前記シーケンシャルなログ構造のセグメントを含む一組のピースのビット毎のＸＯＲを記録する余分な情報が、ディスク上の読み出すことができないセクタを再構成することができるように、ディスクに書き込まれる、方法。
【請求項１１】
請求項１に記載の方法において、可能な記録名のスペースが、一組のばらばらのサブスペースに分割され、その各サブスペースが、前記索引の複数の例の１つまたは複数に関連する、方法。
【請求項１２】
請求項１１に記載の方法において、前記同じサブスペースに関連する異なる索引に、前記記録名の一部に基づいて異なる役割が割り当てられる、方法。
【請求項１３】
請求項１に記載の方法において、前記新しい記録が内容の１つのブロックであり、前記新しい記録名が内容の前記ブロックの暗号ハッシュであり、内容の前記ブロックの反復送信および反復格納を避けるために前記索引に対して問合せが行われる、方法。
【請求項１４】
請求項１に記載の方法において、前記新しい記録名が前記索引に２回目が追加され、前記新しい記録名に関連する参照カウントが、前記新しい記録が２回追加されたことを示す、方法。
【請求項１５】
請求項１に記載の方法において、注釈が、前記新しい記録に関連する情報、または追加情報を発見することができる表示を含む前記第１のレベルの索引内の前記新しいエントリに取り付けられる、方法。
【請求項１６】
請求項１５に記載の方法において、前記新しいエントリに取り付けられている前記注釈内に格納されている情報が、後で他の場所に表示され、前記第１のレベルの索引内の前記エントリから除去される、方法。
【請求項１７】
請求項１に記載の方法において、前記索引の少なくとも一部が、記録が前記索引に追加された時点に基づいて組織される、方法。
【請求項１８】
請求項３に記載の方法において、前記索引内にすでに存在する記録名からそれを区別するのに十分な前記新しい記録名から入手した情報の前記一部が、前記第１のレベルの索引内に表示される、方法。
【請求項１９】
請求項１に記載の方法において、前記索引内に表示された前記記録名の長さの合計が、前記第１のレベルの索引内の前記エントリの長さの合計より長い、方法。
【請求項２０】
請求項１に記載の方法において、前記第１のレベルの索引が、すべての可能な記録名間の一定のおよび所定の順序に基づいてばらばらのセグメントに分割される、方法。
【請求項２１】
請求項１に記載の方法において、記録または索引情報がディスク上のシーケンシャルなログ構造内に格納され、入手プログラムが、ディスク上の他の場所にこのログ構造のセグメントをコピーし、前記情報のあるものを除去し、再使用のために前記セグメントを解放する、方法。
【請求項２２】
請求項２１に記載の方法において、前記新しい記録に関連する情報が前記セグメントに内蔵され、前記新しい記録に関連する参照カウントが、ゼロにデクリメントされ、前記入手プログラムが、再使用のために前記セグメントを解放する前に、前記新しい記録に関連する前記情報をコピーしない、方法。
【請求項２３】
請求項１に記載の方法において、記録または索引情報がディスク上のシーケンシャルなログ構造内に格納され、このログ構造のバイトのある範囲が、ある時間内に変更することができないものとしてマークが付けられ、この変更することができない状態が、データ・ストアの基礎をなす記憶リソースにより強制される、方法。
【請求項２４】
請求項１に記載の方法において、前記索引がその設計容量を超えて充填されない限りは、前記第１のレベルの索引だけをチェックして、ランダムに選択した記録名が前記索引内に存在しないと判定することの可能性が９８％以上である、方法。
【請求項２５】
請求項２４に記載の方法において、前記索引の容量が、使用できる記憶スペースだけにより制限される、方法。
【請求項２６】
請求項１に記載の方法において、ある時間内に記録名が前記索引に追加された一組の記録が、記憶デバイスのある局所化した領域内にすべて格納され、前記一組の記録を表す前記索引の一部が前記一組の記録と一緒に格納される、方法。
【請求項２７】
請求項１に記載の方法において、前記新しい第１のレベルの索引エントリがディスクに書き込まれ、ＲＡＭから除去され、問合せを受けた記録名が前記索引内にすでに存在すると判定することが、ディスク上の前記新しい第１のレベルの索引エントリにアクセスすることを含む、方法。
【請求項２８】
請求項１５に記載の方法において、前記新しいエントリに取り付けられている前記注釈内の情報が、ディスク上に表示され、前記注釈から除去される、方法。
【請求項２９】
請求項１に記載の方法において、前記新しい第１のレベルの索引エントリが、ディスク上のデータの位置に関する情報を含んでいない、方法。
【請求項３０】
請求項１に記載の方法において、前記第１のレベルの索引エントリが、前記エントリが記録名情報以外の情報を含んでいるのかどうかについての表示を含む、方法。
【請求項３１】
請求項１に記載の方法において、コピー・プロセスが、情報を第１のレベルの索引エントリからディスクにコピーし、前記第１のレベルの索引から前記情報を除去する、方法。
【請求項３２】
請求項１に記載の方法において、注釈が、近似的なディスク位置を含む前記第１のレベルの索引内の前記新しいエントリに取り付けられる、方法。
【請求項３３】
請求項１に記載の方法において、注釈が、前記新しい記録に関する近似的なディスク位置を含むディスク上に格納している第２のレベルの索引内の新しいエントリに取り付けられる、方法。
【請求項３４】
請求項１４に記載の方法において、複数の参照カウントが前記新しい記録名に関連していて、前記複数の参照カウントの合計が、前記記録が前記索引に追加された全回数を反映している、方法。
【請求項３５】
請求項１４に記載の方法において、前記新しい記録名に関連する前記参照カウントが、ディスク上の参照カウント構成要素と、前記第１のレベルの索引内の参照カウント構成要素とを含み、前記新しい記録に属する参照カウント構成要素の合計が、前記新しい記録名が前記索引に追加された回数を反映している、方法。
【請求項３６】
請求項１に記載の方法において、入手装置プログラムが記録または索引をディスク上の古い位置からディスク上の新しい位置にコピーし、前記コピーからある情報を除去し、前記入手装置プログラムが、少なくとも前記除去したデータを分からなくし、読み出せなくするために、前記古い位置にデータのパターンを上書きする、方法。
【請求項３７】
請求項１に記載の方法において、入手装置プログラムが、記録または索引データをソース記憶デバイス上のソース位置から宛先記憶デバイス上の宛先位置にコピーし、前記コピーからある情報を除去し、前記ソース位置に自由スペースのマークを付け、宛先記憶デバイスの選択が前記コピーしたデータが次にアクセスまたは変更される時間の予測に基づいて行われる、方法。
【請求項３８】
請求項２０に記載の方法において、前記新しい記録名に関連する前記第１のレベルの索引のセグメントが、一定のサイズおよび位置を有する、方法。
【請求項３９】
請求項２０に記載の方法において、前記新しい記録名に関連する前記第１のレベルの索引のセグメントが、可変のサイズおよび位置を有する、方法。
【請求項４０】
請求項２０に記載の方法において、前記第１のレベルの索引の複数のセグメントが、アレイ構造内に格納され、前記アレイ構造内のある位置へのポインタが、前記新しい記録名に関連するセグメントの頭を指定する、方法。
【請求項４１】
長い全体的にランダムに分布している記録名により識別された大きな一組の記録を索引し、前記一組の記録についてのメンバシップ問合せに応答するのに適している索引を構成するための方法であって、
前記一組の記録に新しい記録を追加し、各名前の少なくとも一部が少なくともほぼランダムになっている名前を生成するように設計されたプロセスにより、前記新しい記録に新しい記録名を割り当てること、
すでに前記索引に追加された記録の完全な記録名を再構成するのに十分な情報を含んでいない第１のレベルの索引をチェックすることにより、前記索引内に前記新しい記録名が存在しないと判定すること、
前記新しい記録名より短いが、すでに前記索引内に含まれている記録名からそれを区別するのに十分な新しい省略名を形成するために前記新しい記録名を短縮すること、
前記新しい記録を表す新しい第１のレベルの索引エントリを形成するために、前記短縮記録名の表示を前記第１のレベルの索引に追加すること、
前記一組の記録に第２の新しい記録を追加し、前記第２の新しい記録に、前記新しい記録名とは異なる第２の新しい記録名を割り当てること、
第２の新しい記録名が前記第１の新しい記録名と異なるものであるかどうかを判定するために、前記第１のレベルの索引が十分な情報を含んでいないと判定すること、
前記第２の新しい記録名を表し、前記第２の新しい記録名より短い前記第１のレベルの索引にエントリを追加すること、
を含み、前記一組の記録内の異なる各記録には異なる記録名が割り当てられ、
前記第１のレベルの索引が、短縮した記録名に基づいて配列され、
前記第１のレベルの索引のセグメントが、その中に含まれる前記短縮した記録名の長さの合計より短いコンパクトな形で格納される、方法。
【請求項４２】
請求項４１に記載の方法であって、さらに、
新しいエントリを、前記完全な新しい記録名またはそれを再構成するのに十分な情報を含む第２のレベルの索引に追加すること、
最初に、問合せを受けた記録名が新しい第１のレベルの索引エントリにより表示されていると判定し、次に問合せを受けた記録名が新しい第２のレベルの索引エントリにより表示されていると判定することにより、問合せを受けた記録名が索引内にすでに存在すると判定すること、
を含み、前記一組の記録内の異なる各記録が、前記第１のレベルの索引内に異なるエントリを有する、方法。
【発明の詳細な説明】
【技術分野】
【０００１】
本発明は、コンピュータ用の記憶システムに関し、特に、データ・オブジェクトの大きな未構造化収集物を格納するように設計されたシステムに関する。
【背景技術】
【０００２】
（関連出願への相互参照）
本出願は、２００４年１０月６日付けの米国仮特許出願第６０／１６，６５３号の優先権を主張する。
【０００３】
現代のファイル・システムの性能は、このファイル・システムが格納するファイル・セットの構造についての仮定に依存する。ファイル・システムは、ランダムに選択した名前またはランダムに選択したパス名を含むファイルの大きな組を格納するのにはあまり適していない。オブジェクト記憶システムは、ファイル・システムに類似しているが、階層的ディレクトリ構造を含んでいない。オブジェクトは、本質的にランダムな方法で命名することができる。膨大な数のランダムに命名したオブジェクトを格納するために、通常のファイル・システムをオブジェクト記憶システムとして使用した場合には、性能が非常に悪くなる。
【０００４】
一組のオブジェクト名が大きく、名前自身が大きい場合には、名前の完全なリストはランダム・アクセス・メモリに入らない。簡単な別の方法は、例えば、ファイルおよび記憶装置技術についての会議の議事録（２００２年）記載のＳｅａｎ  ＱｕｉｎｌａｎおよびＳｅａｎ  Ｄｏｒｗａｒｄの「Ｖｅｎｔｉ：アーカイブ・ストレージへの新しいアプローチ」（Ｖｅｎｔｉ：ａ  ｎｅｗ  ａｐｐｒｏａｃｈ  ｔｏ  ａｒｃｈｉｖａｌ  ｓｔｏｒａｇｅ）に記載されているＶｅｎｔｉ記憶システムで行われているように、ディスク上でハッシュ・テーブルを実施するという方法である。このアプローチの場合には、ディスク上のオブジェクト自身の位置へのポインタを入手するために、本質的にランダムに選択したディスク位置に少なくとも１回アクセスする必要がある。
【０００５】
ある種のオブジェクト記憶システムは、ブロックを命名するためにデータのブロックの暗号ハッシュを使用する。暗号ハッシュは、任意のサイズの入力から（メッセージ・ダイジェストまたは指紋とも呼ばれる）一定の幅の疑似乱数を決定論的に計算する機能である。例えば、ＳＨＡ−２５６暗号ハッシング・アルゴリズムの出力の幅は２５６ビットである。（国立標準技術研究所、ＮＩＳＴ  ＦＩＰＳ  ＰＵＢ  １８０−２、「セキュア・ハッシュ規格」、米国商務省、２００２年８月参照）。
【０００６】
Ｖｅｎｔｉ記憶システムは、ブロックを命名するためにデータのブロックの暗号ハッシュを使用するオブジェクト記憶システムの一例である。Ｖｅｎｔｉ記憶システムにおいては、同じオブジェクト名を有する同じブロックのコピーをだぶって格納するのを避けることにより、記憶スペースを節約している。Ｍａｒｇｏｌｕｓ他の「データにネットワーク・ストレージを促進するためのデータリポジトリおよび方法」（Ａ  Ｄａｔａ  Ｒｅｐｏｓｉｔｏｒｙ  ａｎｄ  Ｍｅｔｈｏｄ  ｆｏｒ  Ｐｒｏｍｏｔｉｎｇ  Ｎｅｔｗｏｒｋ  Ｓｔｏｒａｇｅ  ｏｆ  Ｄａｔａ）という名称の２００２年３月２８日付けの米国特許出願第２００２／００３８２９６  Ａ１号に、ブロックを命名するために暗号ハッシュを使用する記憶システムのもう１つの例が記載されている。この第２の例は、記憶システム内にこの名前がすでに存在しているのかどうかについての問合せに応答し、存在していない場合には、そのブロックだけを送信することにより、データのハッシュ命名したブロックを格納する際に、帯域幅を節約することができるようにするネットワーク・プロトコルをサポートする。この種のプロトコルをうまくサポートするには、非常に大きな一組のオブジェクから１つのオブジェクトが存在するのかしないのかについての問合せに、効率的にまた迅速に応答することができる記憶システムが必要になる。
【０００７】
これが一組のメンバシップを検出する際の問題である。この問題に対する最も初期の最も重要な貢献の１つは、１９７０年７月付けのＡＣＭの通信掲載のＢｕｒｔｏｎ  Ｈ．Ｂｌｏｏｍの「許容できるエラーを含むハッシュ・コード化の際のスペース／時間の折り合い」（Ｓｐａｃｅ／Ｔｉｍｅ  Ｔｒａｄｅｏｆｆｓ  ｉｎ  Ｈａｓｈ  Ｃｏｄｉｎｇ  ｗｉｔｈ  Ａｌｌｏｗａｂｌｅ  Ｅｒｒｏｒｓ）からのものである。彼は、後で他の何らかの機構により解かなければならない、少量の偽の肯定的応答を許容することにより、この問題を簡単なものにすることができることを観察した。彼のハッシング技術は、２−ｒの偽の肯定的な量を入手するために、表示した一組の要素当たり約ｒ（ｌｏｇ２ｅ）ビットの記憶装置を必要とする。この記憶装置要件は、その一組内の要素の数だけに依存し、要素のサイズには依存しないことに留意されたい。（以後ブルーム・フィルタと呼ぶ）ブルームの技術は、現在広く使用されている。しかし、この技術は、データを索引し、それを発見するための機構は供給しないで、それが存在するかどうかを試験するだけである。
【０００８】
テキストの索引および探索の領域内においては、テキスト記録の大きな収集物に対する索引を効率的に格納するという問題が研究されてきた。使用された１つの技術は、例えば、Ｗｉｔｔｅｎ、ＭｏｆｆａｔおよびＢｅｌｌの著作内に掲載されているＭｏｒｇａｎ  Ｋａｕｆｍａｎｎの「ギガバイトの管理」（Ｍａｎａｇｉｎｇ  Ｇｉｇａｂｙｔｅｓ）（１９９９年）に記載されている逆ファイル索引がある。この技術は、索引内の記録番号をソートし、記録番号のリスト内の差だけを表示することを含む。しかし、この技術は、長いハッシュをベースとする名前の場合のように、記録番号の疎スペースを含む索引内のスペースの有意な部分を節約しない。
【発明の開示】
【発明が解決しようとする課題】
【０００９】
ランダムに命名したオブジェクトを索引するという問題の他に、効率的にアクセスしまた修正するために、ディスク上のその記憶装置を組織化するという問題もある。Ｖｅｎｔｉ記憶システムは、追加ログ構造を使用し、ディスク上で格納している項目を変更したり、削除したりまたは再配置したりはしない。Ｖｅｎｔｉは、アーカイブ・ストレージ用に設計されたものであるが、法の下である期間保持しなければならないが、その後で削除することができる重要なデータをアーカイブする際に、削除機能を持たないことはかなり大きな欠点である。
【課題を解決するための手段】
【００１０】
本発明は、通常、長い全体的にランダムに分布している記録名により識別された大きな一組の記録を索引するのに適している索引を形成し、上記一組の記録についてのメンバシップ問合せに応答するための方法を特徴とする。この方法は、上記一組の記録に新しい記録を追加し、各名前の少なくとも一部が少なくともほぼランダムになっている名前を生成するように設計されているプロセスにより、新しい記録に新しい記録名を割り当てること、第１のレベルの索引をチェックすることにより、索引内にこの新しい記録名がまだ存在しないと判定すること、新しい記録名よりも短い結合記録名を形成するために、索引内にすでに存在する記録名情報に新しい記録名を結合すること、新しい記録を表示する新しい第１のレベルの索引エントリを形成するために、第１のレベルの索引に結合記録名を追加すること、上記一組の記録に第２の新しい記録を追加し、第２の新しい記録に、新しい記録名とは異なる第２の新しい記録名を割り当てること、第２の新しい記録名が第１の新しい記録名と異なるものであるかどうかを判定するために、第１のレベルの索引が十分な情報を含んでいないと判定すること、第２の新しい記録名を表示し、第２の新しい記録名より短い第１のレベルの索引にエントリを追加することを含み、第１のレベルの索引は、新しい記録名が索引に追加されたと結論するのに十分な情報を含んではおらず、上記一組の記録内の異なる各記録に異なる記録名が割り当てられ、第１のレベルの索引の少なくとも一部が、記録名に基づいて配列される。
【００１１】
好ましい実施態様の場合には、下記の機能のうちの１つまたは複数を含むことができる。一組の記録内の異なる各記録は、第１のレベルの索引内に異なるエントリを有することができる。新しい記録名を結合するために使用するプロセスは、索引内にすでに含まれている記録名からそれを区別するのに十分な、新しい記録名から入手した情報の一部を決定することを含むことができる。本発明は、さらに、新しいエントリを、完全な新しい記録名またはそれを再構成するのに十分な情報を含む第２のレベルの索引に追加すること、最初に、問合せを受けた記録名が新しい第１のレベルの索引エントリにより表示されていると判定し、次に、問合せを受けた記録名が新しい第２のレベルの索引エントリにより表示されていると判定することにより、問合せを受けた記録名が索引内にすでに存在していると判定することを含むことができる。第１のレベルの索引は、ＲＡＭ内に格納することができ、第２のレベルの索引はディスク上に格納することができる。新しい記録名から入手した情報の一部は、新しい記録名を表す２進値のビットのあるサブセットを除去することにより入手することができる。結合することは、２つの記録名の少なくとも一部の算術差を計算すること、または２つの記録名の少なくとも一部を含む、何か他の算術演算または有限体算術演算を計算することを含むことができる。新しい記録名を割り当てるプロセスは、疑似乱数を生成すること、または記録自身の少なくとも一部の暗号ハッシュを計算すること、または一意であることが分かっている記録識別情報のある組合せの暗号ハッシュを計算することを含むことができる。索引の一部は、新しい記録を追加した時間を含むある時間内に、索引に記録名が追加された一組の記録を表すことができ、この一部は、新しい記録についての追加情報を入手するために、１つの単位として検索することができ、上記時間内に追加した他の記録についての情報はＲＡＭ内にキャッシュすることができる。記録または索引情報は、ディスク上のシーケンシャルなログ構造内に格納することができ、シーケンシャルなログ構造のセグメントを含む一組の部材のビット毎のＸＯＲを記録する余分な情報を、読むことができないセクタをディスク上で再構成することができるように、ディスクに書き込むことができる。可能な記録名のスペースは、一組のばらばらのサブスペースに分割することができ、各サブスペースは、索引の複数のインスタンスのうちの１つまたは複数と関連づけることができる。同じサブスペースに関連する異なる索引には、記録名の一部に基づいて異なる役割を割り当てることができる。新しい記録は、内容のブロックであってもよいし、新しい記録名は、内容のブロックの暗号ハッシュであってもよいし、内容のブロックを反復して送信したり、反復して格納するのを避けるために、索引に対して問合せを行うこともできる。新しい記録名は２回索引に追加することができ、新しい記録名に関連する参照カウントは、新しい記録が２回追加されたことを示すことができる。注釈を、新しい記録に関連する情報または追加情報を発見することができる場所の表示を含む第１のレベルの索引内の新しいエントリに取り付けることもできる。新しいエントリに取り付けられた注釈内に格納している情報は、後で他の場所に表示することもできるし、第１のレベルの索引内のエントリから除去することもできる。索引の少なくとも一部は、記録が索引に追加された時点に基づいて組織化することができる。それを索引内にすでに含まれている記録名から区別するのに十分な新しい記録名から入手した情報の一部だけを、第１のレベルの索引内に表示することができる。索引内に含まれている記録名の長さの合計は、第１のレベルの索引内のエントリの長さの合計よりも長くてもよい。第１のレベルの索引は、すべての可能な記録名間の一定のおよび所定の順序に基づいてばらばらのセグメントに分割することができる。記録または索引情報は、ディスク上のシーケンシャルなログ構造内に格納することができ、入手装置プログラム（ｒｅａｐｅｒ  ｐｒｏｇｒａｍ）は、情報のうちのあるものを除去し、セグメントを再使用できるように解放して、ディスク上の他の場所にこのログ構造のセグメントをコピーすることができる。新しい記録に関連する情報は、セグメント内に収容することができ、新しい記録に関連する参照カウントはゼロに低減することができ、入手装置プログラムは、セグメントを再使用のために解放する前に、新しい記録に関連する情報をコピーすることはできない。記録または索引情報は、ディスク上のシーケンシャルなログ構造内に格納することができ、このログ構造内のバイトの範囲を、ある時間の間変えることができないものとしてマークすることができる。この変えることができない状態は、データ・ストアの基礎をなす記憶リソースにより強制される。索引がその設計容量を超えて書き込まれない限りは、第１のレベルの索引だけをチェックしてランダムに選択した記録名が索引内に含まれていないと判定することができる可能性は９８％以上である。索引の容量は、使用することができる記憶スペースによってだけ制限することができる。ある時間の間の記録名が索引に追加された一組の記録は、すべて記憶デバイスの局所化した領域内に格納することができ、一組の記録を表す索引の一部はこの一組内に格納することができる。新しい第１のレベルの索引エントリはディスクに書き込むことができ、ＲＡＭから削除することができ、問合せを受けた記録名が索引内にすでに含まれていると判定することは、ディスク上の新しい第１のレベルの索引エントリにアクセスすることを含むことができる。新しいエントリに取り付けられている注釈内の情報は、ディスク上に表示することができ、注釈から除去することができる。新しい第１のレベルの索引エントリは、ディスク上のデータの位置に関する情報を含むことはできない。第１のレベルの索引エントリは、エントリが記録名情報以外の情報を含んでいるかどうかについての表示を含むことができる。コピー・プロセスは、第１のレベルの索引エントリからディスクに情報をコピーし、第１のレベルの索引から情報を除去する索引に適用することができる。注釈は、近似的なディスクの位置を含む第１のレベルの索引内の新しいエントリに取り付けることができる。注釈は、新しい記録に関連する近似的なディスクの位置を含むディスク上に格納している第２のレベルの索引内の新しいエントリに取り付���ることができる。複数の参照カウントは、新しい記録名に関連することができ、この場合、複数の参照カウントの合計は、記録が索引に追加された全回数を反映している。新しい記録名に関連する参照カウントは、ディスク上に参照カウント構成要素を有することができ、第１のレベルの索引内に参照カウント構成要素を有することができ、新しい記録に属する参照カウント構成要素の合計は、新しい記録名が索引に追加された回数を反映することができる。入手装置プログラムは、ディスク上の古い位置からディスク上の新しい位置に記録または索引データをコピーし、コピーからある情報を削除することができ、入手装置プログラムは、少なくとも削除したデータを分からなくし、読めなくするために、古い位置にデータのパターンを上書きすることができる。入手装置プログラムは、ソース記憶デバイス上のソース位置から宛先記憶デバイス上の宛先位置に記録または索引データをコピーし、コピーからある情報を除去し、ソース位置に自由スペースのマークを付けることができる。この場合、宛先記憶デバイスの選択は、コピーしたデータが次にアクセスまたは変更される時点の予測に基づいて行うことができる。新しい記録名に関連する第１のレベルの索引のセグメントは、一定のサイズおよび位置を有することができる。新しい記録名に関連する第１のレベルの索引のセグメントは、可変サイズまたは位置を有することができる。第１のレベルの索引の複数のセグメントは、アレイ構造内に格納することができ、アレイ構造内のある位置に対するポインタは、新しい記録名に関連するセグメントのスタートを指定することができる。
【００１２】
他の態様においては、本発明は、長い全体的にランダムに分布している記録名により識別された大きな一組の記録を索引するのに適している索引を形成し、上記セットについてのメンバシップ問合せに応答するための方法を特徴とする。この方法は、上記組に新しい記録を追加し、各名前の少なくとも一部が少なくともほぼランダムになっている名前を生成するように設計されたプロセスにより新しい記録に新しい記録名を割り当てること、すでに索引に追加された記録の完全な記録名を再構成するのに十分な情報を含んでいない第１のレベルの索引をチェックすることにより、索引内にこの新しい記録名が存在しないと判定すること、新しい記録名より短いが、すでに索引内に含まれている記録名からそれを区別するのに十分な新しい省略名を形成するために新しい記録名を短縮すること、新しい記録を表示する新しい第１のレベルの索引エントリを形成するために、短縮記録名の表示を第１のレベルの索引に追加すること、一組の記録に第２の新しい記録を追加し、第２の新しい記録に新しい記録名とは異なる第２の新しい記録名を割り当てること、第１のレベルの索引が、第２の新しい記録名が第１の新しい記録名と異なっているのかどうかを判定するための十分な情報を含んでいないと判定すること、あるエントリを、第２の新しい記録名を表示し、第２の新しい記録名より短い第１のレベルの索引に追加することを含む。その場合、上記組内の各異なる記録には異なる記録名が割り当てられ、その場合、第１のレベルの索引が短縮した記録名に基づいて配列され、第１のレベルの索引のセグメントがその中に含まれる短縮した記録名の長さの合計より短いコンパクトな形内に格納される。
【００１３】
好ましい実施態様の場合には、下記の特徴のうちの１つまたは複数を含むことができる。本発明は、さらに、新しいエントリを、完全な新しい記録名またはそれを再構成するのに十分な情報を含む第２のレベルの索引に追加すること、最初に、問合せを受けた記録名が新しい第１のレベルの索引エントリにより表示されていると判定し、次に、問合せを受けた記録名が新しい第２のレベルの索引エントリにより表示されていると判定することにより、問合せを受けた記録名が索引内にすでに含まれていると判定することを含むことができる。この場合、その組内の異なる各記録は、第１のレベルの索引内に異なるエントリを有する。
【００１４】
本発明の他の特徴および利点は、図面、詳細な説明および特許請求の範囲を読めば理解することができるだろう。
【発明を実施するための最良の形態】
【００１５】
本発明は、本明細書には記載しきれない種々様々な方法で実施することができる。現時点で好適ないくつかの可能な実施態様について以下に説明する。しかし、これらは本発明の実施態様の説明であって、本発明そのものの説明ではない。本発明は、この節に記載する詳細な実施態様に限定されるものではなく、特許請求の範囲内に広義に記述してある。
【００１６】
始めに
この説明においては、ブロック名という用語は、任意に割り当てることができる内容のブロックの名前、またはブロック内容の暗号ハッシュに基づく名前をいつでも意味する。
【００１７】
すべてのブロック名が、ブロック内容（例えば、ＳＨＡ−２５６）の暗号ハッシュに基づいている場合には、ブロック名は一意のものありランダムに分布していることが統計的に保証される。また、すべてのブロック名が内容のブロックに関連するある一意の識別子のハッシュに基づいている場合には、この同じ保証を行うことができる。例えば、ファイル・システム用の一意の識別子と一緒のファイルパス名。両方のタイプのブロック名を使用する場合には、ハッシュしたデータが２つのタイプの名前を構成する際に決して同じにならないように、ハッシュするデータ（内容または識別子）にブロック・タイプをプリペンドすることができる。内容をベースとする名前のブロック・タイプが一意の識別子をベースとする名前のブロック・タイプと異なっている限りは、２つのタイプの一対の名前が偶然一致（衝突）する可能性は、１つのタイプまたは他のタイプの一対の名前の場合程度である。ブロック名は、本明細書に定義するように、一意のブロック識別子であることが統計的に保証される。
【００１８】
米国特許出願第２００２／００３８２９６  Ａ１号および関連する出願に記載されているデータ・リポジトリは、それぞれにブロック名アドレス・スペースの一部が割り当てられる記憶装置サーバの分散集合体として実施することができる。各記憶装置サーバには、ブロック名値の一組の範囲が割り当てられる。各記憶装置サーバ内には、それぞれが物理的ディスク記憶装置デバイスに関連する１つまたは複数のデータ・ストアが、最終的に、データの多数の疑似ランダムに命名したブロックを格納し、索引する。
【００１９】
データ・ストアの索引
データ・リポジトリの最初の原型は、ブロック名を通常のＬｉｎｕｘ  ｅｘｔ２ファイル・システム内に埋め込まれるデータ・ストアを使用する。ブロック名およびパス名間のマッピングを調整した後でも、データ・ストア内の名前を付けたブロックの数が数百万になると、格納している各ブロックにアクセスするには、平均して数十回のディスク探索が行われる。所与のブロック名がすでに使用されているのかどうかを単に問合せる問題は同様に非効率的である。内容の名前のブロックの帯域幅および記憶装置の節減はこの問合せに依存している。
【００２０】
簡単で高速な索引スキームを実施するための周知の他の方法は、すべての索引情報をＲＡＭ内に保持する。２５６ビット・ハッシュをベースとするブロック名があり、記憶装置サーバ当たり無数の名前が付いているブロックを格納し、索引することが予想される場合には、最初このことは実行不可能のように思われる。図１は、これを実行可能にする機構を示す。この機構は、高品質の大きな一組の疑似乱数の予測可能な性質を利用する。問題を簡単にするために、残りのビットがランダムであると仮定することができるようにする目的で、データ・ストアにブロック名の範囲を割り当てるために、ブロック名の最下位のビットのある数をベースとするアドレス範囲を使用するものと仮定する。
【００２１】
図１に示すように、索引はソートした順序に維持される。索引するＮ数の最大値（例えば、数億）、およびサイズＬの名前値（例えば、２２５６）の範囲の場合には、ソートしたリスト内の隣接する値間の平均距離はＬ／Ｎである。このソートしたリスト内の隣接する値間の差の分布は指数的である。この距離が平均のｘ倍以上になる可能性は、大きなＮの制限内でｅｘｐ（−ｘ）である。このことは、平均距離が１／Ｎである場合のリスト内の値を２進分数であるとみなし、ｘ／Ｎより大きい差の確率が（１−ｘ／Ｎ）Ｎであることを観察することにより理解することができるだろう。
【００２２】
それ故、例えば、ソートしたリスト内の２つの隣接する値間の距離が、平均の４倍になる可能性は、約１．８％である。このことは、差の第１の（ｌｏｇ２Ｎ−２）ビットがすべてゼロになる可能性は、９８％以上であることを意味する。隣接する値の差（デルタ）が、ソートしたリスト内のもとの値の正しい位置に格納される場合には、同じ情報が表示されるが、ほとんどすべての場合、差の第１の（ｌｏｇ２Ｎ−２）ビットは表示する必要がない。しかし、このことは、それ自身有意なスペースの節約にならない。何故ならＮはＬより遥かに小さいからである。
【００２３】
図１に示すように、この実施態様の場合には、ソートしたリスト内のブロック名は、デルタを計算する前に切り捨てられる。（Ｌより小さい）２つの値Ｍのベキが選択され、各ブロック名に対して第１のｌｏｇ２Ｍビット以外のすべてが除去される（すなわち、値の範囲が小さくなって、ＬにではなくＭになる）。所与の切り捨てたブロック名が他のある切り捨てたブロック名と衝突（すなわち、一致）する確率は、Ｎ／Ｍより小さい（衝突するＭからのＮの選択より小さくなる）。このことは、１つの全ブロック名と一意に関連しない切り捨てたブロック名の一部は、Ｎ／２Ｍより小さいことを意味する（何故なら、両方の衝突する名前が１つの名前になるからである）。
【００２４】
それ故、例えば、Ｍ＝３２Ｎである場合には、衝突を表示する切り捨てた値の一部は約１．６％であり、切り捨てた値は、ｌｏｇ２Ｎより５ビット長いだけである。大きなデルタおよび小さなデルタのありそうもないことについてのこれら２つの観察を総合すると（図２参照）、各ブロック名の一意の最初のセグメントを表示するために、７ビットの差より大きいものを格納しなければならない確率は約３．４％であり、第１の（ｌｏｇ２Ｎ−２）ビットのどれかを表示する必要がある可能性は１．８％、（ｌｏｇ２Ｎ＋５）を超えるビットのうちのどれかを表示しなければならない可能性は１．６％であることが分かる。これら３．４％の場合内に少量の余分な情報を内蔵させることにより、ブロック名当たり１バイトより小さい平均を使用する各ブロック名の一意の最初のセグメントを表示することができる。これによりＳＨＡ−２５６をベースとするブロック名に対する３２の要因のスペースが少なくなる。
【００２５】
ブロック名当たりに必要なスペースの大きさは、もとのブロック名のサイズにも、索引内の名前の数にも依存しない。ブロック名の切捨て位置（すなわち、Ｍの値）はＮの値に依存し、データが格納するエントリの最大数は、索引するように設計されている。しかし、この数はいつでも知る必要がある。何故なら、索引に対する最大メモリ要件は、索引しているブロックの最大数に比例するからである。
【００２６】
索引の問合せ
提案のスキームの場合には、ほとんどすべてのブロック名に対して、名前の最初のｌｏｇ２Ｍビットだけが索引リスト内に表示される。このことは、索引がＮ個のエントリのその最大の大きさである場合には、ランダムに選択した名前が索引リスト内の現在のエントリと衝突する可能性は、約Ｎ／Ｍであることを意味する。これは、索引リスト内の一致する問合せを受けた名前は、全ブロック名のリスト内には実際には存在しない可能性である。これは、メンバシップ試験装置としての索引リストの偽の正の割合である。Ｍ＝３２Ｎである場合には、これは約３％である。Ｍ＝６４Ｎ（ビットがもう１つ多い）の場合には、これは約１．６％である。索引リストが、問合せた項目が全リスト内に含まれていないと間違って表示する可能性はない。
【００２７】
これは、２−ｒの偽の正の割合を達成するために索引した項目当たりｒｌｏｇ２ｅビットを必要とする発明の背景のところで説明したブルーム・フィルタ技術にうまく対応する。索引リスト技術は、項目当たりｒ＋３ビットより少ないビットを使用し、ブルーム・フィルタとは異なり索引した各項目に対して個々のエントリを含む全索引を供給する。
【００２８】
問合せを行った名前がリスト内のエントリを含むｌｏｇ２Ｍビットと一致する場合には、その名前がすべてｌｏｇ２Ｌビットと一致することを確認するために、もっと決定的な情報にアクセスしなければならない。このもっと決定的な情報はディスク上に維持することができ、索引の第２のレベルとなる。索引の第２のレベルは、例えば、単にディスク上の完全なハッシュ・テーブルであってもよい。すべての曖昧さを解消するには、ディスク上の第２のレベル索引に１回アクセスするだけで十分である。ＲＡＭ内の第１のレベル索引は、問合せを受けた名前が第１のレベルの索引エントリと一致するが、実際には索引内に含まれていないことを発見する確率が低くなるように構成される。良い近似を行うために、（ＲＡＭ）内の第１のレベル索引は、ディスクにアクセスしないでどの名前が存在しないのかを示す。存在する名前に関する問合せの場合には、ディスクに１回アクセスするだけでよい。このアプローチの場合には、すでに格納しているブロックを送信するのを避けることにより帯域幅を節約するために、記憶システム内の内容名のブロックを収容する場合に、記憶装置クライアントはいつでも問合せを行うことができる。また、これにより、前に格納した内容名のブロックを再度収容する場合に記憶スペースを効率的に共有することができる。
【００２９】
索引へのエントリの追加
データ・ストアに新しい名前が付いているブロックを書き込む場合には、データ・ストア内にその名前がすでに存在するかどうかをチェックするために、索引に対して問合せが行われる。この問合せの間に、すべての衝突しているエントリのブロック名が検索される。衝突している場合には、古いエントリおよび新しいエントリ両方の追加ビットが、第１のレベルの索引に追加され、その結果、両方のエントリは、全ブロック名の一意の最初のセグメントを表示する。
【００３０】
名前が付いているブロックの検索
各名前が付いているブロックは、第１のレベルの索引内に個々のエントリを有しているので、各エントリに簡単にディスク上のブロックの位置を付けることができる。このことは各エントリに数バイトを追加することになるが、１回ディスクにアクセスするだけで、名前が付いているブロックをいつでも検索することができる。このディスク・アクセスは、ブロック、およびそれが問合せを行っているブロックであるかどうかを判定するためにテストされる全ブロック名（またはそれを再構成するのに十分な情報）の両方を検索する。別の方法としては、衝突の場合の曖昧さを解消するために使用する第２のレベルの索引は、ディスク上の簡単なハッシュ・テーブルであってもよいし、すべての検索は、全ブロック名およびブロック位置の両方を発見するためのこのテーブルへのアクセス、その後での名前が付いているブロック自身の検索を含むことができる。この第２のアプローチは、第１のレベルの索引エントリへデータを追加しないが、ブロックを検索するために２回のディスク・アクセスをいつでも行う。各第１のレベルの索引エントリに短い注釈を追加する中間スキームが現在よく使用されている。この中間スキームは、名前が付いているブロックの書込み順のパターンが、検索順にうまく反映されている場合には、（ブロック位置が第１のレベルの索引内に置かれる）全注釈スキームも実行する。また、索引しているデータ・ブロックに近く、ほぼ同時に書き込まれる第２のレベルの索引情報のセグメントを格納することにより、データ・ブロックの格納および検索の両方をより効率的に行うことができる。
【００３１】
データ・ストア
本明細書に開示するデータ・ストアは、始めにのところで概略説明したアプローチのある可能な実施態様に過ぎない。他の実施態様の節内でいくつかの可能な別の方法および強化について説明する。また、本発明が使用する索引技術は広く適用することができる。
【００３２】
図３は、通常ＲＡＭが内蔵している第１のレベルの索引の構造を示す。第１のレベルの索引は、セグメントに分割される。この場合、各セグメントはブロック名アドレス・スペースの一部に対応する。この図の場合には、このことはブロック名の最初の部分をセグメント番号として使用することにより行われる。好ましい実施態様の場合には、個々の一定の大きさのアレイ構造は、各セグメントに関連する。最初に、少数のセグメントが割り当てられ、セグメントが満杯になるといつでもそのアドレス範囲が半分に切断され、その内容の一部は範囲の他の半分を担当する新しく割り当てられたセグメントに移動する。対応するセグメント・アレイを識別するために必要なブロック名の最初のビットの数は、変えることができる。
【００３３】
第１のレベルの索引の各セグメントは、表示される切り捨てたブロック名により決まるソートした順序内に維持されているエントリのリストを含む。エントリは２つの部分、すなわち、あるエントリと前のエントリとの間の差を記録するデルタ値と、索引エントリに対応する名前が付いているブロックに関する情報を記録する注釈を有する。各索引エントリは、１つのブロックに対応し、各ブロックは１つの索引エントリを有する。
【００３４】
デルタのコード化
図４は、好ましい実施態様で使用するバイト指向索引エントリ・フォーマットである。このフォーマットは、１バイトのデルタ値および２バイトの注釈を使用する。デルタの溢れ（２８−１のデルタにより表示する大きすぎる差）がある場合には、情報の余分な２つのバイトが追加される。これにより、８の余分な（高次）ビットを含む切り捨てた値を表示することができる。（２１６−１のデルタにより表示されるように）これで十分でない場合には、もっと多くのバイトが追加される等する。このコード化は、索引が最大の大きさである場合には、平均、エントリ当たり約０．３個の余分なビットを使用する。
【００３５】
衝突（デルタがゼロの場合）は、一対の衝突ブロック名のうちの１つの全表示を含む補助テーブルを使用することにより最も簡単に処理される。このアプローチは、索引が最大の大きさである場合には、平均、エントリ当たり約１．９個の余分なビットを必要とする。補助テーブルは、いつでも任意の索引参照の場合最初にチェックされる。
【００３６】
好ましい実施態様の場合には、衝突を処理するためにもっとコンパクトな表示が使用される。衝突エントリを明確にするために、いくつかの余分なビットが、第１のレベルの索引内のエントリに追加される。図５はこのアプローチを示す。衝突記録の始まりを表示するために０のデルタが使用される。この後に衝突したｌｏｇ２Ｍビットの切り捨てた値をコード化するデルタが続く。次に、衝突するブロック名のための個々のエントリが続くが、各エントリは、切捨ておよび通常のエントリ注釈のもとの位置を越えた次のいくつかのビットを含む。最後の衝突エントリにフラッグが立てられ、その後のエントリは通常のエントリである。この場合、先行するデルタに関連するデルタを含む。２つ以上の次のビット値が同じである場合には、衝突記録の追加のレベルが定義されるが（図示せず）、共通のステムを超える異なる連続が再度コード化される。このコード化が使用する余分なビットの平均数は、索引が最大の大きさである場合、エントリ当たり約０．１２５ビットである。
【００３７】
注釈のコード化
図４は、索引の注釈、すなわち、索引エントリに対応する名前が付いているブロックに関する情報をコード化するためのバイト指向フォーマットである。好ましい実施態様の場合には、第１のレベルの索引エントリは、いつでも数バイトの長さの整数である。もちろん、この制限は便宜上のものである。
【００３８】
図４の索引フォーマットの場合には、大部分の索引エントリの長さは３バイトである。このフォーマットは、索引付きブロックを含むディスク上の第２のレベルの索引の最高８Ｋセグメントのうちの１つと関連する年代番号の１３ビットを含む。各セグメントは、年代索引と呼ばれ、それが索引する名前が付いているブロック付近のディスク上のある位置に格納される。年代索引は、図６のフォーマットを含むエントリのリストからなる（全ブロック名、ブロック・タイプ、およびディスク上のブロックの相対的位置）。
【００３９】
注釈は、また「参照カウント」および（図７のようにコード化された）「リース」を追跡するために使用する３ビットを含む。内容名が付いているブロックは、もっと大きなオブジェクトの構成要素として共有することができる。データ・ストアは、所与のブロックを参照するすべてのもっと大きなオブジェクトが削除されたかどうかをチェックするために、参照カウントを継続的に追跡するので、共有ブロック自身を削除することができる。データ・ストアのクライアントは、内容名のブロックに関連する参照カウントを増減する時間をデータ・ストアにはっきりと通知する。大部分の内容名のブロックは、０または１の参照カウントを有する。何故なら、大部分のブロックは共有されていないからである。参照カウントがもっと大きい場合には、この情報を表示することができるように、索引エントリの注釈に余分のビットが追加される。
【００４０】
リースは、任意のもっと大きな構造内にまだ内蔵されていない、それ故ゼロの参照カウントを有する内容名のブロックのために役に立つ。リースは、使用されていないために削除の対象になる前に、新しく収容したブロックが少なくとも２４時間保持されることを保証するために使用される。内容名のブロックを収容する場合には、新しいリースが与えられる。２４時間毎に、背景プロセスは、すべての新しいリースを古いリースに変え、すべての古いリースを非リースに変える。リースおよびゼロの参照カウントを含んでいない内容名のブロックは、データ・ストアにより削除することができ、そのスペースは再生される。
【００４１】
オンディスク・フォーマット
図８は、データ・ストアが使用する論理的ディスク・フォーマットである。このフォーマットは、記憶装置内のデータのランダムに命名したブロックの索引および検索を容易にするために設計される。
【００４２】
現代のファイル・システムの場合には、おなじディレクトリ内に格納している項目は、異なるディレクトリ内のファイルよりも一緒にアクセスされる可能性が高いという事実を利用している。これにより、ファイル・システムは、最近アクセスしたファイルに関するディレクトリ情報をキャッシュすることによりディスクへのアクセスを最適化することができ、それ故、格納しているデータの位置を発見するのに必要なディスク活動の量が低減する。
【００４３】
データのランダムに命名したブロックを含むデータ・ストアにおいては、どのブロックが一緒にアクセスされる可能性が高いのかについてのヒントを供給するために使用することができるディレクトリ構造が存在しない。別のヒントは、一時的な位置を使用することができる。ほぼ同時に書き込まれるデータのブロックは、ほぼ同時に読み出される可能性が高い。
【００４４】
このことは、データ・ストア用のオンディスク・フォーマットは、追加ログの構造を有していなければならないことを示唆している。新しい情報は、前に書き込まれた最新情報の直後に書き込まれる。情報索引のためのセグメントは、間隔を置いてこのログ内に挿入される。この構造を使用することにより、高速で書込みを行うことができる。何故なら、すべてのデータが同じ位置に書き込まれるからである（それ故、ディスク探索を行わないですむからである）。この構造は、ディスク上に相互に接近してほぼ同じ時間に書き込まれたデータを維持する。また、この構造は、ほぼ同時に書き込まれた情報を索引するための自然な方法を供給する。回収を容易にするために取り付けられている余分な情報を含むジャーナル・フレームとしてすべてのデータを書き込むことにより、またオンディスク・ログの構造を一定なものにすることにより、システムを故障からもっと容易に、もっと高い信頼性で回復することができる。
【００４５】
図８は、データ・ストアの好ましい実施態様が使用するディスク構造である。情報を索引するセグメントは、図の場合はそれぞれ６４ＭＢであるディスク上の予測できる一定の間隔を有する位置からスタートする。これにより、任意の格納している情報の助けを借りなくても、いつでも索引を発見することができる。１つの索引セグメントの終わりから次の索引セグメントの始まりまでのスペースは、名前が付いているデータのブロックおよび他の永続性の情報を格納するために使用される。そこに格納しているデータはすべてある時間内に書き込まれたものであるという事実を反映するために、記憶スペースのセグメントは年代と呼ばれ、索引セグメントは年代索引と呼ばれる。
【００４６】
年代索引は、すでに説明した第２のレベルの索引のセグメントである。これらの年代索引は、ファイル・システム内でディレクトリが行う役割と類似の役割を行う。ある年代からある名前が付いているブロックがアクセスされると、その年代索引がチェックされ、キャッシュされる。その索引がＲＡＭ内に残っている場合に同じ年代から他の名前が付いているブロックが読み出されると、キャッシュした年代索引からディスク上のそのすべての位置を知ることができるので、これらブロックすべては、名前が付いているブロック当たり１回のディスク・アクセスで読み出される。１つの年代内のブロックは相互に接近しているので、それらの任意のサブセットには迅速にほとんど捜索を行わないでアクセスすることができる。
【００４７】
ハード・ディスクまたはＲＡＩＤアレイに対応するデータ・ストアを有することには１つの利点がある。何故なら、書込み動作を行うことができるディスクまたはアレイ当たりせいぜい１つの前部境界しかないからである。注釈内の年代索引数は一定の大きさなので、記憶デバイスの容量が大きくなると、年代数をコード化するために使用するビットに数または年代の大きさも大きくしなければならない。
【００４８】
ジャーナル・フレーム
クラッシュからの回復を容易にするために、ディスクに書き込まれている各項目は、ジャーナル・フレーム内に入っている。図９は、好ましい実施態様で使用しているジャーナル・フレーム構造の一例である。ジャーナル・フレームは、各フレームのスタートをマークするために使用する一定の値からスタートする。ディスクがフォーマットされる度にそれをマークするために異なる疑似乱数の値が選択される。格納している記録のスタートを示すのを助けるこのような一定の値は、「マジック番号」と呼ばれる場合がある。この後には、すべてのフレームが同じ年代に属することを確認する仮想年代数が続く（仮想年代数は、実際の年代数より多くの他のビットを有する）。この後に、どのジャーナル・フレームも喪失していないことの保証を容易にするシーケンス数、どのタイプの情報がジャーナルされたのかを反映するフレーム・タイプが続き、その後に現在保護されている情報のペイロードの長さ（名前が付いているブロックの長さは可変であり、最高６４ＫＢである）が続き、その後にペイロード自身が続く。ジャーナル・フレームの最後には３２ビットのチェックサムが位置していて、データのエラーを容易に検出することができる。
【００４９】
ペイロードが内容名のブロックである場合には、ペイロードは、（第１のレベルの索引内のエントリ注釈から入手した）それが最後に書き込まれた時点でのブロックに対する参照カウントのような追加情報を含む。ログにシーケンシャルに書き込まれるので、可変長である場合でも、ジャーナル・フレームの間のディスク上にスペースを残しておく必要は全然ない。唯一の例外はある年代の終わりの部分である。その場合、あるスペースが未使用のままになるので、（現在の年代に対する年代索引である）次の年代の第１のジャーナル・フレームはいつでも６４ＭＢの境界のところからスタートする。
【００５０】
クラッシュ回復シナリオの場合には、年代索引は冗長のものになっている。何故なら、これら年代索引は、他のジャーナル・フレームから再生することができるからである。ＲＡＭ内に格納している第１のレベルの索引も冗長なものである。何故なら、この索引はジャーナル内の情報から再生することができるからである。
【００５１】
入手装置
情報がディスクの追加ログの頭に不明確に追加された場合には、最終的にディスクは満杯になる。入手装置（ｒｅａｐｅｒ）は、背景タスクとして稼働し、ディスク上の解放できるスペースを再生し、保持データをコンパクトにするプログラムである。
【００５２】
入手装置は、ディスクを円形のバッファとして処理する。この場合、ディスク上の最高のアドレスは最低のアドレスに隣接している。ジャーナルが使用するスペースの少なくとも１％が、（オブジェクトが削除されたために）解放できる場合にはいつでも、（同様に何か他の状況の下で）入手装置は稼働する。
【００５３】
入手装置は、まだ処理されていない最も古い年代のところからスタートし、その年代内のすべてのジャーナル・フレームをチェックする。入手装置は、各ジャーナル・フレームのチェックサムを確認し、不良のフレームを発見した場合には、回復手順をスタートする。依然として関連を有するすべてのペイロードは頭のところの新しいジャーナル・フレームにコピーされ、第１のレベルの索引内の対応する年代数は、新しい位置をポイントするように更新される。依然として関連を有さないすべてのペイロードは排除される。第１のレベルの索引によりポイントされていない名前が付いているブロックを含んでいるフレームを発見した場合には、もはや関連を有するものとは見なされず、除去される。これが名前が付いているブロックの修正方法である。頭のところのその年代に置換ブロックが書き込まれ、その第１のレベルの索引エントリが新しい位置をポイントする。入手装置は、古いバージョンを横切る時のこの古いバージョンを一掃する。年代が入手されるそのスペースは、利用できる自由なスペースに追加される。
【００５４】
図１０は、入手装置の参照カウントによる処理方法を示す。「前に位置する」図面の場合には、ブロックＡは、内容名のブロックであり、ジャーナルの最も古い部分の近くに位置する。ブロックＡが書き込まれたので、その参照カウントは２回変更され、これらの変更を記録するために、ジャーナル・フレームがディスクに書き込まれている。（ＲＡＭ内の）第１のレベルの索引内の参照カウントは、これらの増減要求を受信した場合に更新され、現在の参照カウントになっている。
【００５５】
入手装置は、新しいジャーナル・フレーム内の現在の参照カウントを含むブロックＡを、頭のところの年代にコピーする。ブロックＡの古いコピーは、それを含む年代が入手するのを終了するや否やディスク上の自由スペースに追加することができる。入手される前に起こったブロックＡの参照カウント内の変更の記録は、関連性を持たず、ブロックＡの新しいコピーと一緒に記録した参照カウントは、更新され、クラッシュが起こった場合、第１のレベルの索引を再構成するために使用することができる。入手装置がそれらを含む年代を処理すると、図の２つの参照カウントのジャーナル・フレームが除去され、その時点でそのスペースが解放される。
【００５６】
多重データ・ストア
すでに説明したように、データ・リポジトリは、それぞれが多数のデータ・ストアを備える多数の記憶装置サーバを備えることができる。ブロック名の最下位ビットのうちのいくつかは、異なるデータ・ストアに割り当てられたアドレス範囲を指定するために使用することができる。この目的のためのアドレス範囲を使用すると、スケーラブルな方法でデータ・ストア間に索引問題を分散することができるという利点がある。
【００５７】
ブロック名はランダムに分布しているので、各データ・ストアに割り当てられた全記憶容量の一部は、それに割り当てられた全アドレス範囲の全量に非常に密接に比例する。同じアドレス範囲を、障害の許容範囲（例えば、写し）スキームの一部として複数のデータ・ストアに割り当てることができる。
【００５８】
図１１は、一組の４つのデータ・ストアへのアドレス範囲の割当ての一例である。この図においては、データ・ストアへのアドレス範囲の割当てに関連する名前ビットだけを示す。この例の場合、すべてのデータの２倍のコピーを行うシステム内でのように、２つのデータ・ストアに各アドレス範囲が割り当てられることに留意されたい。同様に、図１２は、８つのデータ・ストアへのアドレス範囲の割当てを示す。
【００５９】
図１３は、第１の列に焦点を当てている図１２の詳細図である。この図の場合には、４つのデータ・ストアにアドレス範囲が割り当てられる。この場合、第１の関連する名前ビットは両方ともゼロである。このような場合、場合によっては、それぞれが異なる役割を行う、ある範囲に割り当てられるデータ・ストアを区別する必要がある場合がある。このことは一定の順序で行うことができるが、ある役割がより多くの計算上のネットワークまたは記憶装置負荷である場合には（例えば、ある記憶装置が主要なコピー源であり、いくつかのブロック・タイプが１回だけコピーされる）、余分の負荷がいつでも同じ記憶装置に課せられるという欠点がある。
【００６０】
図１３は、公平な方法でデータ・ストア役割番号を割り当てる方法である。最初に、各アドレス範囲内の記憶装置に一定の順番が割り当てられ、その後でどのデータ・ストアが役割番号０を演じるのかを（本質的にランダムに）選択するために、ブロック名の未使用の低次の部分を使用する。次に、他の役割が周期的に割り当てられる。
【００６１】
読取りエラーの許容
ハード・ディスクは、ディスク・セクタがハードウェアの問題を許容し、データを正しく読み出すことができるように、ディスク・セクタのレベルで冗長コード化を使用する。データ記憶が使用することができるスペースからディスク基板上に冗長な情報を追加すると、ディスク・メーカは、必要なだけのエラー修正情報だけを追加する。通常の現在のディスクは、１０１４ビットを読み出す度に１回程度、ディスク上の１つのセクタを読み出すことができないと指定している。
【００６２】
上記入手機構は、データを連続的にコピーし、書き換える。これにより潜在的なエラーが蓄積するのが防止されるが、ディスク上のデータが何回も読み出されることになる。２５，５００ＧＢのディスクがそれぞれ完全に１回読み出されると、最高１０１４ビットが追加される。連続的に入手される多くの大型のディスクを含む記憶システムの場合には、１０１４ビットの読取り中に１つの読み出すことができないセクタがあると故障が頻繁に起こる。
【００６３】
ＲＡＩＤシステムの場合には、Ｄ個のディスクのグループが結合され、ディスクのＤ−１上の対応するセクタに対するパリティ情報（すなわち、すべての対応するビットの合計モジューロ２）が、Ｄ番目のディスクの対応するセクタ上に記録される。１つのディスク上で１つの読取りエラーが発生すると、他のディスク上の情報からその読み出すことができないセクタを再構成することができる。
【００６４】
本発明のオンディスク・ジャーナル内の読み出すことができないセクタを処理するために類似の技術を使用することができる。図１４は、その技術を示す。この図の場合、各年代は、Ｅ＋１の同じ大きさのチャンクに分配される。Ｅチャンクはデータを含み、１つのチャンクはパリティ情報を含む。パリティ・チャンクＣＥの各ビットは、すべてのデータ・チャンクＣｉの対応するビットの合計モジューロ２（ＸＯＲ）である。あるチャンクが読み出すことができないデータを含んでいる場合には、それらを一緒にＸＯＲすることにより、その年代の他のチャンクから、そのチャンクを再構成することができる。
【００６５】
読み出すことができないセクタがランダムに発生したと仮定した場合、同じ年代内で２つの不良セクタが発生する可能性は非常に小さい。１つの年代が６４ＭＢであり、１０１４ビットの読取り中に読み出すことができないセクタが１回発生した場合には、すでに１つの読み出すことができないセクタを含んでいる年代内で第２の読み出すことができないセクタと遭遇する可能性は約４０，０００回に１回である。それ故、１００万個の５００ＧＢディスクを完全に読み出して始めて、同じ年代内で２つの読み出すことができないセクタに遭遇することになる。
【００６６】
ある空間的な相関関係がある場合には、他の不良セクタに直接隣接する不良セクタが存在する可能性が高い。これにはチャンクの大きさを小さくすることにより対応することができる。ある年代内の１つ程度のチャンクが１つのエラーを含んでいる限りは、エラーを回復することができる。実際には、そのエラーを含んでいるバイトのシーケンスが（２つのチャンクに跨っていても）１つのチャンクより短い場合には、依然としてそのエラーを回復することができる。図１５はそれを示す。この図は、その最後のものが最初の３つのビット毎のＸＯＲである、丁度４つのチャンクを含むある年代の一例である。Ｂ０およびＡ１を含む陰を付けた領域が読み出すことができない領域である場合には、これを回復することができる。Ｂ０は、他の３つのチャンク（すなわち、Ｂ１、Ｂ２およびＢ３）の対応する領域を一緒にＸＯＲすることにより回復することができ、一方、Ａ１は、Ａ０、Ａ２およびＡ３を一緒にＸＯＲすることにより類似の方法で回復することができる。
【００６７】
エラーを含む領域がチャンクの一部に局所化することができる場合には、この技術を直接適用することができる。好ましい実施態様の場合には、チャンクの大きさはオペレーティング・システムのバッファのサイズに関連し、全チャンクへのオペレーティング・システムによってだけエラーが局所化される。この場合、読み出すことができないセクタ（図１５のＢ０およびＡ１）を含む領域を、ジャーナル・フレーム内のチェックサムにより依然として識別することができる（図９参照）。読み出すことができないセクタを含んでいる２つの隣接するチャンクを識別した場合には、２つのチャンクに跨っているチャンク・サイズの領域の可能な各整合が順次仮定され、この仮定に基づいてデータが仮修正される。すべてのジャーナル・フレーム内で正しいチェックサムを生成する第１の整合が、決定修正として使用される。
【００６８】
ディスク・トラックを横切る局所化した相関関係を処理するために、この技術を拡張することができる。図１６は、トラックとセクタとを示すディスクの略図である。ディスク上のトラックは、読み／書きヘッドを半径方向に移動しないで（すなわち、シーク動作を行わないで）アクセスすることができるすべてのデータからなる。ディスク上のデータのトラックが隣接している場合には、異なるトラック上に位置しているが、半径方向に相互に隣接しているセクタが、相関関係のある故障を有している場合がある。
【００６９】
このことは、年代サイズを任意の１つのトラックの記憶容量より小さくすることにより処理することができるので、各年代内のパリティ情報を、セクタ・エラーを別々に処理するために使用することができる。これにより不便な小さい年代ができた場合には、それを別の方法により、年代をそれぞれが任意の１つのトラックより小さいセクタに分割することにより処理することができる。図１７はこのアプローチを示す。交互に位置するＡにおいて、各セクションはデータのブロックおよびパリティ・ブロックを含む。好適な交互に位置するＢにおいては、パリティ・ブロックはすべて最後のセクションに置かれるので、本質的には図１４のもとのスキームのように見えるが、追加構造を有する年代の終わりにパリティ情報が位置する。
【００７０】
他の実施態様
ディスク上の第１のレベルの索引：ブロック位置への非常に低速で偽陽性および直接ポインタを含むオンディスクの第１のレベルの索引は、ディスク上の全ハッシュ・テーブルへの非常にコンパクトな代案として機能することができ、ほとんど常に１つのディスク・アクセスを含むブロック名へのポインタを供給する。索引エントリをキャッシュするためにあるメモリ内スキームをオンディスク第１のレベルの索引と一緒に使用する場合には、メモリ内のキャッシュに対して行った更新をオンディスク索引に併合する際に、オンディスク索引がコンパクトであることが貴重になる。全オンディスク構造を超えた更新のために読取りおよび書込みを行う必要があるデータの量は、大きな要因により低減される。
【００７１】
ハッシュ・バケットを使用する第１のレベルの索引：必要な時にだけ、スペースを割り当てること、満杯になった場合にはいつでも索引の一定のサイズのセグメントを２つの新しい一定のサイズのセグメントに分割することを含む好ましい実施態様の第１のレベルの索引のための構造について説明する。多くの他の構造も使用することができる。例えば、それぞれが索引のセグメントを含む、一定のサイズのハッシュ・バケットは簡単な他の構造である。このアプローチは、索引に対する全スペースを予備割当てすることを含む。ハッシュ・バケットの充填の際の統計的変動を考慮に入れる目的で、所望の平均充填を収容するために、各ハッシュ・バケットに余分なスペースの少ない一部を割り当てる必要がある。
【００７２】
ランドマークを含むアレイを使用する第１のレベルの索引：第１のレベルの索引のための論理的に可能なもう１つの別の構造は、１つの長いアレイ、１つのセグメントだけを含む第１のレベルの索引である。この速度は非常に遅い。何故なら、デルタがいつでもスタートから横断しなければならないからである。しかし、可能な名前の範囲内に一定間隔で一組のランドマーク・エントリを挿入し、これらランドマーク・エントリの位置を追跡する外部ポインタを維持することにより、これをスピードアップすることができる。索引がサポートする最大数のエントリのためのサイズのアレイ内部にランドマーク・エントリが最初等間隔で位置している場合には、これはハッシュ・バケット・アプローチに非常によく似ているが、異なるハッシュ・バケットの充填の際の統計的変動を許容するために、余分なスペースを割り当てる必要がないという利点がある。バケットが溢れた場合には、（ランドマークを含む）その後のエントリを、余裕を作るために１ビット下方に移動することができる。そうすることにより（充填の際に同時にもっと大きな統計的変動の場合）遥かに小さなハッシュ・バケットを使用することができるので、各参照のための（デルタのリストを横切る）線形探索の量が低減する。
【００７３】
スペース使用統計の累積：使用中の（すなわち、解放することができない）スペースおよび共有記憶装置の量に関するデータ・ストアの統計を蓄積できることは興味のあることである。このような蓄積は、ゼロでない参照カウントを含むブロックが占拠するスペースの現在の全量、および参照したバイトの個々の全数（すなわち、ブロック・サイズに参照カウントを掛けたものの合計）を維持することにより行うことができる。対応するブロックのサイズが分かっている限り、参照カウントを増減する場合にこれらの全量を更新することができる。これらの情報へのアクセスをもっと効率的にするために、ブロック・サイズのコピーを、図６の年代索引エントリに追加することができる。
【００７４】
参照カウント・デルタ：ブロックを最後に入手した場合に、現在の参照カウントがブロックと一緒に記録される。この値に関連する変更だけを第１のレベルの索引内に記録する必要があり、ブロックが入手され、その参照カウントがディスク上に記録される度に、第１のレベルの索引内に記録した値は、ゼロにリセットすることができる。この場合、あるブロックに対する全参照カウントは、ブロックと一緒に格納した基線値および第１のレベルの索引内に格納した参照カウント・デルタの合計である。最後に入手した時から変化していない参照カウントを含むすべてのブロックは、第１のレベルの索引内にゼロの参照カウント・デルタを有する。スペース使用統計の入手および蓄積を効率的に行うために、ブロックと一緒に記録した参照カウントの基線値のコピーを図６の年代索引エントリに追加することができる。
【００７５】
ブロック当たりの多重参照カウント：複数のソース（例えば、物理的位置、管理領域またはファイル・システム）からのデータがデータ・ストア内に収容された場合には、正しい参照カウントを有するもう１つのデータ・ストアにコピーするために、後で特定のソースからデータを効率的に分離することができることが望ましい場合がある。例えば、複数のデータ・リポジトリからのデータが、１つのデータ・リポジトリにコピーされ、ソース・リポジトリのうちの１つのところのいくつかのデータ・ストアの喪失により、ある一組のアドレス範囲内のそのソースに属するすべてのブロックを回復しなければならないデータ回復シナリオの際に、このようなニーズが発生する場合がある。ソースにより効率的な分離を行うことができるように、別々の参照カウントをそれを参照する定義した各データ・ソースに対する各ブロックと一緒に格納することができる。参照カウント・デルタだけを第１のレベルの索引内に格納した場合には、それらが入手された最後の時点から参照されなかったブロックは、すべてゼロのデルタを有し、この状態をデフォルト状態として第１のレベルの索引内で効率的にコード化することができる。所与のデータ・ブロックに関連するソースの識別子のリストは、そのブロックと一緒に格納することができ、そのブロックの第１のレベルの索引エントリ内の参照カウント・デルタは、効率的なコード化を行うためにリスト内の序数を参照することができる。ソースが最初にデータ・ブロックを参照した場合には、第１のレベルの索引エントリ内の参照カウント・デルタにラベルを付けるために、ソース識別子を直接使用することができる。効率化のために、あるブロックに関連するソースのリストのコピー、および（ブロックを最後に入手した時点からの）対応する参照カウントを、図６の年代索引エントリに追加することができる。
【００７６】
デフォルト値を有する第１のレベルの索引：図１８は、第１のレベルの索引のためのもう１つのバイト指向エントリ・フォーマットの３つの例を示す。図４は、好ましい実施態様で使用するフォーマットを示す。もう１つのフォーマットＡは、図４のフォーマットよりも年代番号に対して多くのビットを使用し、他の情報のために１つのビットだけを予約する。名前が付いているブロックに関連している場合がある１つ置きの情報にはデフォルト値が割り当てられ、特定のエントリに関連するすべての情報がそのデフォルト値を有している場合には、他の情報をはっきりと表示する必要はない。例えば、図４のフォーマットの場合のように、通常、大部分のブロックは最近収容されず、そのためリースを持たず、そのためリース情報用の大部分のエントリ内にビットを予約する必要がない。すべての余分な情報がそのデフォルト値を有している場合には、フォーマットＡエントリの長さは３バイトである。
【００７７】
第２のレベルの索引へのポインタを持たない第１のレベルの索引：図１８は、第２の他のエントリ・フォーマットＢを示す。このフォーマットは、フォーマットＡよりも衝突抵抗のためのビットの数が１つ少なく、同じ余分な情報フラッグおよびデフォルト協定を使用する。このフォーマットの場合には、第２のレベルの索引に関する情報は、第１のレベルの索引内には格納されないので、第１のレベルの索引のサイズが最小になる。このフォーマットを使用する第１のレベルの索引は、依然として新しいブロック名を効率的に識別し、年代索引情報のキャッシュは、現在のブロック名を効率的に識別するのに十分である。新しいブロックの位置を記録する情報は、（恐らく注釈として）メモリ内にキャッシュされるので、（年代索引から分離した）オンディスクの第２のレベルの索引への更新を一括することができる。
【００７８】
近似的なディスク位置を含む第１のレベルの索引：第３の別のエントリ・フォーマットＣは、この節内ですでに説明したタイプのオンディスク第１のレベルの索引内で役に立つ。この別のフォーマットの場合には、注釈は、名前が付いているブロックの全ディスク位置を含む。この場合、約２倍の長さのデルタを生成し、衝突保護のための７のビットをさらに追加するので、（不必要なディスク読取りとなる）偽の正の一致の可能性は２−１３である。名前が付いているブロックの頭を含む６４ＫＢのチャンクをポインティングするだけで、位置情報から２バイトがセーブされる。（最大の長さが６４ＫＢである）全ブロックを確実に読み出すために、すべての読取りの長さは１３０ＫＢである。ある余分な情報は、その頭を示す一定の値（マジック番号）を走査するだけで、領域読取り内の第１のジャーナル・フレームを発見できない希なケース内の注釈に内蔵されている。
【００７９】
非バイト整合エントリを含む第１のレベルの索引：もちろん、非バイト指向エントリ・フォーマットも使用することができる。可変長Ｇｏｌｏｍｂコードは、ここで説明し、いくつかのタイプの幾何学的に分布しているデルタを格納するために正確に設計されていて、必要なビットの正確な数を含む表示注釈はメモリの使用を若干低減することができる。（別の問題である）衝突を処理するためのオーバーヘッドを無視すると、このコンテキストにおけるコードの理論的制限は、各デルタ（但し、ｒ＝ｌｏｇ２（Ｍ／Ｎ））を表示するための（ｒ＋ｌｏｇ２ｅ）ビットの平均であり、Ｇｏｌｏｍｂコードは、この制限に非常に近くなる。好ましい実施態様で使用するコード化は、理論的最小値より１ビット少なく、デルタ当たり約（γ＋２．３）ビットを使用する。
【００８０】
より多いまたはより少ない圧縮を含む第１のレベルの索引：第１のレベルの索引内で使用する圧縮の量は、サイズ対速度および簡単さ間の実際の折り合いである。例えば、非バイト整合エントリを使用すれば、さらに複雑にはなるがスペースをさらに節約することができる。非常に簡単な実施態様は、隣接するソートした名前の間の差が一定のサイズのデルタ表示に対して余りに大きいか、余りに小さいすべての場合に対して別々のハッシュ・テーブルを使用することもできるし、またはそのような場合、デルタのリスト内にすべての名前を直接埋め込むことができる。新しい名前がその切り捨て点までの第１のレベルの索引内の現在の名前と一致する場合には、新しい名前が第１のレベルの索引内でせいぜい１つの現在の名前と衝突する恐れがある特性を保存するために、実際には、名前のうちの１つだけを追加の解像度と一緒に第１のレベルの索引内に表示するだけでよい。もう１つの簡単な他の実施態様は、デルタではなく、第１のレベルの索引内の切り捨てた名前を使用し、切り捨てた各名前を一意の最初のセグメントにし、実際に能動的にアクセスされていない場合に、そのサイズを小さくするために、第１のレベルの索引のセグメントに適用される別々の圧縮プロセスに依存する。
【００８１】
索引内への他のタイプの情報の内蔵：いくつかのタイプの情報を、第１のレベルの索引エントリの注釈内に内蔵させるのに役に立つものとして説明してきた。リース、参照カウント、ディスク上のブロックの位置、および追加索引情報のディスク上の位置である。個々の名前が付いているブロックに関連する他の情報をはっきりと取り付けることができる完全なコンパクトな索引構造の存在は多くの他の用途を有する。固定情報、ある場所にコピーしなければならないまたは移動しなければならないブロックに対する一時的なマーカ、キャッシュされる全ブロック名、キャッシュされるディスク位置、キャッシュされるオブジェクトメタデータ、年齢または活動情報、他の位置情報（どのディスク、どのテープ等）、セキュリティまたは許可情報、および時間関連の情報のような、索引エントリに取り付けることができる他の情報も含む。ほとんどすべてのブロックが、それを許可するオプションとしての情報に対してそのデフォルト値を有している限りは、索引のサイズは目で見てわかるほどには増大しない。さらに、上記の参照カウント・デルタおよびスペース使用の例のところで説明したように、第１のレベルの索引エントリに最初に取り付けられる情報は、ブロックが入手された場合、第２のレベルの索引エントリに移動することができる。
【００８２】
入手中のデータのシュレッディングまたは移動：入手装置は、ある種のタイプのブロックを削除している時に、特種な処理を行うことができる。例えば、政府の規制要件のためにある期間保持したブロックは、最終的に削除する場合、特種なシュレッディング（ランダムなデータによる多重上書き）を必要とする場合がある。またシュレッディングは、ノルマであってもよい。また入手装置は、データ移動に関与することもでき、最近アクセスされていない（そのためすぐにアクセスが行われるとは思われない）データ、または長期間保持しなければならない（そのためすぐには変化しない）データを、オフにすることができるディスクまたはオフライン媒体に移動する。この場合、少なくとも第１のレベルの索引情報は、依然としてアクセスすることができる媒体上に保持する必要がある。もっと一般的に言うと、データは、次にデータが必要になる時間または次に変更しなければならない時間の予測に基づいて適当な目標（記憶デバイスまたは記憶デバイスの一部）に移動することができる。ある期間変化してはならないデータは、記憶リソースにより保持期間制限が強制される記憶リソース上に統合することもできる。
【００８３】
バイト範囲の保持リース：（例えば、記憶エリア・ネットワーク内で起こるように）、記憶リソースへのアクセスが２つ以上のデータ・ストアにより共有される場合には、共有記憶リソースに、あるデータ・ストアが、他のデータ・ストアが書き込んだジャーナル・フレームを修正しないようにさせることが望ましい。また、データ・ストアのソフトウェア内のソフトウェア・バグが、完全に書き込まれ、それ以上修正できないようになっているジャーナル・フレームをダメにできないようにすることが望ましい。これら両方の目標は、バイト範囲の保持リースにより達成することができる。保持リースは、格納位置のある範囲を読み出すことができるが、短縮することができないある指定の期間の間（最初にそこにデータを書き込んだデータ・ストア・プロセスを含む）いかなるプロセスによっても修正できないことを指定する。バイトの範囲は、あるプロセスによるアクセスのために予約させず、プロセでないものによるアクセスに対して予約される。ジャーナルの一部である範囲に対するリースは周期的に更新されるので、ジャーナルは依然として修正することはできない。入手され、自由スペース・ストップに追加されたジャーナル・フレームは、その更新されたリースを有し、これらリースは最終的に期限切れになり、スペースは再使用のために使用できるようになる。保持リースは、通常のハードウェアの再ブートおよびリセットがあっても継続する。典型的なデータ・ストアの使用シナリオの場合には、リースは、解放されなかったジャーナル・フレーム上のリースが時間切れになるのに十分長い期間の間、システムの保守が更新を妨害する恐れがない十分長い数日または数週間持続する。図１９は、保持リースの使用例を示す。領域Ａは、前はジャーナルの一部だったものであるが、現在は、リースがまだ時間切れになっていない自由スペースである。領域Ｂは、完全に書き込まれ、もう修正できない年代である。領域Ｃは、ある特定のデータ・ストア・プロセスにより排他的に書き込むことができるスペースである。領域Ｄは、任意のプロセスにより読取りまたは書込みを行うことができる自由スペースである。この例の場合、保持リースは、個々のジャーナル・フレーム中ではなく、全年代中スタートされ、延長され、解放される。
【００８４】
ブロックの統一アドレス指定：説明を分かり易くするために、多重データ・ストア・システムにおいては、異なるデータ・ストア間でブロックを分配するために使用するブロック名から入手したビットは、第１のレベルの索引のセグメント間でデータを分配するために使用するビットとは異なるものであると仮定する。このように仮定することにより、本発明のランダムさはもっと簡単になるが、このことは第１のレベルの索引内に格納している切り捨てた名前は、データ・ストア間分配のために使用したアドレス範囲に関する情報を含んでいなかったことを意味する。この仮定が成立しないで、各ブロック名の最初の部分が両方のタイプの分配に使用された場合には、変化する主要なことは、特定のデータ・ストアが保持するブロック名は、もっと小さな全領域と結合され、切り捨てた名前もそのように結合される。各領域内においては、名前は依然としてランダムに分配される。これにより、ブロック名を切り捨てる適切な点が変化する。何故なら、平均分離は使用できる全領域、および索引および格納中のブロックの最大数に依存するからである。データ・ストアへの範囲の割当てが時間ともに変化するが、データ・ストアが索引することができる名前が付いているブロックの全数が変化しない場合には、エントリ間の平均分離（それ故、第１のレベルの索引内でエントリを形成するために、ブロック名の切り捨てなければならない点）が変化する。これにより幾分複雑になる。異なる位置で切り捨てたエントリを含む第１のレベルの索引の再生は、入手装置により、増分的に最善の方法で行うことができる。何故なら、通常、全ブロック名を、ディスクから再度読み出さなければならないからである。
【００８５】
ランダムさおよびブロック名：ブロック名は、ほぼランダムなものであればよいし（高エントロピー確率分布を特徴とするものであってもよいし）、またはブロック名の一部だけがほぼランダムなものであればよい。ソートした名前の長いリスト内には、隣接する名前間の差を合理的に予測することができる十分なランダムさが存在する。そのような場合には、通常、差をコンパクトにするのに十分な小さい値により表示することができるように、名前のどこで切り捨てればよいのかを知ることができるが、ほとんどゼロになることはなく（それ故、名前をはっきり表示するために追加情報を必要とする場合はほとんどない。）もちろん、索引用に使用するには十分にランダムである一部を入手するために、ブロック名をランダムにまたは疑似ランダムに生成する必要はない。例えば、生成された場合に、ブロックが長いタイムスタンプにより命名された場合には、タイムスタンプの最下位部分を全くランダムなものにすることができる。
【００８６】
他の機能の変化：説明を分かり易くするために、好ましい実施態様を非常に特異的に説明してきたが、多くの機能を変更することができる。例えば、異なる暗号ハッシュ機能を使用することもできるし、ディスクは、仮想ディスク（例えば、記憶エリア・ネットワーク内）であってもよいし、他のタイプの媒体であってもよい。すべての記憶をＲＡＭ内に入れることもできる。オンディスク構造は、年代のサイズおよび構造が異なる年代索引の構造および設置が異なる、または他のタイプの第２のレベルの索引のために年代索引（それ故、年代）を含んでいない非常に異なるものであってもよいし、もっと直接的なブロック位置情報をＲＡＭ内に入れることもできる。追加ログ構造は、変化しなかった情報のコピーが少なくてすむように、ディスク・データのセグメントへのポインタをもっと使用するもっと精巧なものであってもよい。ログ構造を、一時的な位置またはある他の方法で使用する一時的な位置からなる使用を行わないで、ある他の構造のために放棄することができる。同じ（または緊密に結合している）物理ハードウェア上で複数のデータ・ストア・インスタンスが稼働している場合には、これらのデータ・ストアはいくつかのリソースを共有することができる。例えば、その中のいくつかは、１つの共通の第１のレベルの索引を共有することができる。あるデータ・ストアは、２組以上の記憶リソースを管理することができ、名前が付いているブロックを異なるリソースに割り当て、格納および移動ポリシー、アクセス・パターンおよび数、利用度またはリソースの性質の変化に基づいてその間でデータを移動する。
【００８７】
他のタイプの索引：参照は、ブロックおよびブロック名全体を通して行われるが、ブロックは、索引することができる関連する記録名を含む、可能な記録タイプの単にあるものにしか過ぎない。本明細書に記載する索引技術は、他のコンテキストにも適用することができる。例えば、（衝突の処理を含むまたは含まない）圧縮した第１のレベルの索引は、ブルーム・フィルタが現在使用されている、特にコンパクトな表示が重要な場所で役に立つ場合がある（例えば、ネットワークを横切るウェブ・キャッシュに関する情報の共有）。また、第１のレベルの索引は、一定の組のランダムに命名したレコードのためのコンパクトな索引を提供するためにそれ自身使用することができる。
【００８８】
上記説明は、本発明のいくつかの可能な実施態様を説明するためのものであることを理解されたい。これらの実施態様および非常に多くの他の実施態様も添付の特許請求の範囲に含まれる。
【図面の簡単な説明】
【００８９】
【図１】疎セットのランダムに分布している記録番号を索引のリストにコード化する際に使用する変換を示す図。
【図２】索引リスト内で使用するためにブロック名の切捨ての一例を示す図。
【図３】索引セグメントに分割した第１のレベルの索引を示す図。
【図４】第１のレベルの索引のバイト指向エントリ・フォーマットを示す図。
【図５】切り捨てた際に異なるブロック名が一致する（衝突する）場合に使用する索引エントリ用のフォーマット。
【図６】第２のレベルの索引（年代索引）のセグメントの索引エントリ用のフォーマット。
【図７】第１のレベルの索引エントリに取り付けられている注釈内のリースおよび参照カウント情報のコード化を示す図。
【図８】ジャーナル・フレームの付属ログとして組織化されているディスク記憶フォーマット。
【図９】ディスク・ジャーナル・フレーム構造。
【図１０】記憶装置の共有ブロックに関連して、スペースを解放し、ディスク上で記憶装置をコンパクトにする（入手する）プロセス。
【図１１】（この例の場合には、４である）複数のデータ・ストアへのある名前ビットに基づくブロック名のある範囲の割当て方法を示す図。
【図１２】（この例の場合には、８である）複数のデータ・ストアへのブロック名のある範囲の割当て方法を示す図。
【図１３】所与のアドレス範囲に割り当てられたデータ・ストアのブロック名の他の部分に基づく配列方法を示す図。
【図１４】ディスク読取りエラーから回復することができるようにする年代へのパリティ情報の追加を示す図。
【図１５】エラーが２つの隣接する年代のチャンクに重複している領域を含む場合の読取りエラーの回復を示す図。
【図１６】ディスク上で半径方向に隣接する２つのセクタ。
【図１７】半径方向に隣接するセクタ上のエラーが相関する場合の、読取りエラー回復のためのパリティ情報を組織化するための２つの他の方法を示す図。
【図１８】第１のレベルの索引内のエントリ用の３つの他のバイト指向フォーマット。
【図１９】データ・ストア・ジャーナルを修正できないようにするためのバイト範囲保持リースの使用を示す図。
【図１】
2008516342.tif 000003
【図２】
2008516342.tif 000004
【図３】
2008516342.tif 000005
【図４】
2008516342.tif 000006
【図５】
2008516342.tif 000007
【図６】
2008516342.tif 000008
【図７】
2008516342.tif 000009
【図８】
2008516342.tif 000010
【図９】
2008516342.tif 000011
【図１０】
2008516342.tif 000012
【図１１】
2008516342.tif 000013
【図１２】
2008516342.tif 000014
【図１３】
2008516342.tif 000015
【図１４】
2008516342.tif 000016
【図１５】
2008516342.tif 000017
【図１６】
2008516342.tif 000018
【図１７】
2008516342.tif 000019
【図１８】
2008516342.tif 000020
【図１９】
2008516342.tif 000021
【手続補正書】
【提出日】平成19年9月28日(2007.9.28)
【手続補正１】
【補正対象書類名】特許請求の範囲
【補正対象項目名】全文
【補正方法】変更
【補正の内容】
【特許請求の範囲】
【請求項１】
長い全体的にランダムに分布している記録名により識別された大きな一組の記録を索引し、前記一組の記録についてのメンバシップ問合せに応答するのに適している索引を構成するための方法であって、
前記一組の記録に新しい記録を追加し、各名前の少なくとも一部が少なくともほぼランダムになっている名前を生成するように設計されたプロセスにより、前記新しい記録に新しい記録名を割り当てること、
第１のレベルの索引をチェックすることにより、前記索引内に前記新しい記録名がまだ存在しないと判定すること、
前記新しい記録名よりも短い結合記録名を形成するために、前記新しい記録名に前記索引内にすでに存在する記録名情報を結合すること、
前記新しい記録を表す新しい第１のレベルの索引エントリを形成するために、前記結合記録名を前記第１のレベルの索引に追加すること、
前記一組の記録に第２の新しい記録を追加し、前記第２の新しい記録に、前記新しい記録名とは異なる第２の新しい記録名を割り当てること、
前記第２の新しい記録名が前記第１の新しい記録名と異なるものであるかどうかを判定するために、前記第１のレベルの索引が十分な情報を含んでいないと判定すること、
前記第２の新しい記録名を表し、前記第２の新しい記録名より短い前記第１のレベルの索引にエントリを追加すること、
を含み、前記第１のレベルの索引が、前記新しい記録名が前記索引に追加されたと結論するのに十分な情報を含んではおらず、
前記一組の記録内の異なる各記録が異なる記録名に割り当てられ、
前記第１のレベルの索引の少なくとも一部が、記録名に基づいて配列される、方法。
【請求項２】
請求項１に記載の方法において、前記一組の記録内の異なる各記録が、前記第１のレベルの索引内に異なるエントリを有する、方法。
【請求項３】
請求項１に記載の方法において、前記新しい記録名を結合するために使用する前記プロセスが、それを前記索引内にすでに存在する記録名から区別するのに十分な前記新しい記録名から入手した情報の一部を決定することを含む、方法。
【請求項４】
請求項１に記載の方法であって、さらに、
新しいエントリを、前記完全な新しい記録名またはそれを再構成するのに十分な情報を含む第２のレベルの索引に追加すること、
最初に、問合せを受けた記録名が前記新しい第１のレベルの索引エントリにより表示されていると判定し、次に、前記問合せを受けた記録名が新しい第２のレベルの索引エントリにより表示されていると判定することにより、問合せを受けた記録名が索引内にすでに存在すると判定すること、
を含む方法。
【請求項５】
請求項４に記載の方法において、前記第１のレベルの索引が、ＲＡＭ内に格納され、前記第２のレベルの索引がディスク上に格納される、方法。
【請求項６】
請求項３に記載の方法において、前記新しい記録名から入手した情報の一部が、前記新しい記録名を表示する２進値のビットのあるサブセットを除去することにより入手される、方法。
【請求項７】
請求項１に記載の方法において、前記結合することが、２つの記録名の少なくとも一部の算術差を計算すること、または２つの記録名の少なくとも一部を含むある他の演算または有限体算術演算を計算することを含む、方法。
【請求項８】
請求項１に記載の方法において、前記新しい記録名を割り当てる前記プロセスが、疑似乱数を生成することか、または一意であることが分かっている記録識別情報のある組合せの暗号ハッシュを計算することを含む、方法。
【請求項９】
請求項１に記載の方法において、前記索引の一部が、前記新しい記録が追加された時間内に記録名が前記索引に追加された一組の記録を表し、前記新しい記録に関する追加情報、および前記時間がＲＡＭ内にキャッシュされる間に追加された他の記録の情報を入手するために、前記一部が一組の単位として検索される、方法。
【請求項１０】
請求項１に記載の方法において、記録または索引情報がディスク上のシーケンシャルなログ構造内に格納され、前記シーケンシャルなログ構造のセグメントを含む一組のピースのビット毎のＸＯＲを記録する余分な情報が、ディスク上の読み出すことができないセクタを再構成することができるように、ディスクに書き込まれる、方法。
【請求項１１】
請求項１に記載の方法において、可能な記録名のスペースが、一組のばらばらのサブスペースに分割され、その各サブスペースが、前記索引の複数の例の１つまたは複数に関連する、方法。
【請求項１２】
請求項１１に記載の方法において、前記同じサブスペースに関連する異なる索引に、前記記録名の一部に基づいて異なる役割が割り当てられる、方法。
【請求項１３】
請求項１に記載の方法において、前記新しい記録が内容の１つのブロックであり、前記新しい記録名が内容の前記ブロックの暗号ハッシュであり、内容の前記ブロックの反復送信および反復格納を避けるために前記索引に対して問合せが行われる、方法。
【請求項１４】
請求項１に記載の方法において、前記新しい記録名が前記索引に２回目が追加され、前記新しい記録名に関連する参照カウントが、前記新しい記録が２回追加されたことを示す、方法。
【請求項１５】
請求項１に記載の方法において、注釈が、前記新しい記録に関連する情報、または追加情報を発見することができる表示を含む前記第１のレベルの索引内の前記新しいエントリに取り付けられる、方法。
【請求項１６】
請求項１５に記載の方法において、前記新しいエントリに取り付けられている前記注釈内に格納されている情報が、後で他の場所に表示され、前記第１のレベルの索引内の前記エントリから除去される、方法。
【請求項１７】
請求項１に記載の方法において、前記索引の少なくとも一部が、記録が前記索引に追加された時点に基づいて組織される、方法。
【請求項１８】
請求項３に記載の方法において、前記索引内にすでに存在する記録名からそれを区別するのに十分な前記新しい記録名から入手した情報の前記一部が、前記第１のレベルの索引内に表示される、方法。
【請求項１９】
請求項１に記載の方法において、前記索引内に表示された前記記録名の長さの合計が、前記第１のレベルの索引内の前記エントリの長さの合計より長い、方法。
【請求項２０】
請求項１に記載の方法において、前記第１のレベルの索引が、すべての可能な記録名間の一定のおよび所定の順序に基づいてばらばらのセグメントに分割される、方法。
【請求項２１】
請求項１に記載の方法において、記録または索引情報がディスク上のシーケンシャルなログ構造内に格納され、入手プログラムが、ディスク上の他の場所にこのログ構造のセグメントをコピーし、前記情報のあるものを除去し、再使用のために前記セグメントを解放する、方法。
【請求項２２】
請求項２１に記載の方法において、前記新しい記録に関連する情報が前記セグメントに内蔵され、前記新しい記録に関連する参照カウントが、ゼロにデクリメントされ、前記入手プログラムが、再使用のために前記セグメントを解放する前に、前記新しい記録に関連する前記情報をコピーしない、方法。
【請求項２３】
請求項１に記載の方法において、記録または索引情報がディスク上のシーケンシャルなログ構造内に格納され、このログ構造のバイトのある範囲が、ある時間内に変更することができないものとしてマークが付けられ、この変更することができない状態が、データ・ストアの基礎をなす記憶リソースにより強制される、方法。
【請求項２４】
請求項１に記載の方法において、前記索引がその設計容量を超えて充填されない限りは、前記第１のレベルの索引だけをチェックして、ランダムに選択した記録名が前記索引内に存在しないと判定することの可能性が９８％以上である、方法。
【請求項２５】
請求項２４に記載の方法において、前記索引の容量が、使用できる記憶スペースだけにより制限される、方法。
【請求項２６】
請求項１に記載の方法において、ある時間内に記録名が前記索引に追加された一組の記録が、記憶デバイスのある局所化した領域内にすべて格納され、前記一組の記録を表す前記索引の一部が前記一組の記録と一緒に格納される、方法。
【請求項２７】
請求項１に記載の方法において、前記新しい第１のレベルの索引エントリがディスクに書き込まれ、ＲＡＭから除去され、問合せを受けた記録名が前記索引内にすでに存在すると判定することが、ディスク上の前記新しい第１のレベルの索引エントリにアクセスすることを含む、方法。
【請求項２８】
請求項１５に記載の方法において、前記新しいエントリに取り付けられている前記注釈内の情報が、ディスク上に表示され、前記注釈から除去される、方法。
【請求項２９】
請求項１に記載の方法において、前記新しい第１のレベルの索引エントリが、ディスク上のデータの位置に関する情報を含んでいない、方法。
【請求項３０】
請求項１に記載の方法において、前記第１のレベルの索引エントリが、前記エントリが記録名情報以外の情報を含んでいるのかどうかについての表示を含む、方法。
【請求項３１】
請求項１に記載の方法において、コピー・プロセスが、情報を第１のレベルの索引エントリからディスクにコピーし、前記第１のレベルの索引から前記情報を除去する、方法。
【請求項３２】
請求項１に記載の方法において、注釈が、近似的なディスク位置を含む前記第１のレベルの索引内の前記新しいエントリに取り付けられる、方法。
【請求項３３】
請求項１に記載の方法において、注釈が、前記新しい記録に関する近似的なディスク位置を含むディスク上に格納している第２のレベルの索引内の新しいエントリに取り付けられる、方法。
【請求項３４】
請求項１４に記載の方法において、複数の参照カウントが前記新しい記録名に関連していて、前記複数の参照カウントの合計が、前記記録が前記索引に追加された全回数を反映している、方法。
【請求項３５】
請求項１４に記載の方法において、前記新しい記録名に関連する前記参照カウントが、ディスク上の参照カウント構成要素と、前記第１のレベルの索引内の参照カウント構成要素とを含み、前記新しい記録に属する参照カウント構成要素の合計が、前記新しい記録名が前記索引に追加された回数を反映している、方法。
【請求項３６】
請求項１に記載の方法において、入手装置プログラムが記録または索引をディスク上の古い位置からディスク上の新しい位置にコピーし、前記コピーからある情報を除去し、前記入手装置プログラムが、少なくとも前記除去したデータを分からなくし、読み出せなくするために、前記古い位置にデータのパターンを上書きする、方法。
【請求項３７】
請求項１に記載の方法において、入手装置プログラムが、記録または索引データをソース記憶デバイス上のソース位置から宛先記憶デバイス上の宛先位置にコピーし、前記コピーからある情報を除去し、前記ソース位置に自由スペースのマークを付け、宛先記憶デバイスの選択が前記コピーしたデータが次にアクセスまたは変更される時間の予測に基づいて行われる、方法。
【請求項３８】
請求項２０に記載の方法において、前記新しい記録名に関連する前記第１のレベルの索引のセグメントが、一定のサイズおよび位置を有する、方法。
【請求項３９】
請求項２０に記載の方法において、前記新しい記録名に関連する前記第１のレベルの索引のセグメントが、可変のサイズおよび位置を有する、方法。
【請求項４０】
請求項２０に記載の方法において、前記第１のレベルの索引の複数のセグメントが、アレイ構造内に格納され、前記アレイ構造内のある位置へのポインタが、前記新しい記録名に関連するセグメントの頭を指定する、方法。
【請求項４１】
請求項１に記載の方法において、前記結合することは、前記索引内にすでに存在する記録名情報を省略することを含む、方法。
【国際調査報告】
2008516342.tif 000022
2008516342.tif 000023
2008516342.tif 000024