(57)【要約】      （修正有）【課題】バージョン化された階層型データ構造を維持し得る分散型データストアのシステム、方法及びコンピュータ可読記憶媒体を提供する。【解決手段】システムにおいて、階層型データ構造の異なるバージョン１３０は、階層型データ構造１３２ａ〜ｃのトランザクションログと一貫して維持される。階層型データストアによりアクセス要求１１２が受信されると、アクセス要求を処理するために階層型データ構造のバージョン１３０が識別される。スナップショット分離を伴うアクセス要求では、識別されたバージョン単体がアクセス要求を一貫して処理するのに十分な場合がある。直列化可能分離など、より高い分離要件を伴うアクセス要求では、アクセス要求に基づくトランザクションはトランザクションログに送信されてよく、これによって、結果的にコミットされたトランザクションになるアクセス要求が許可され、競合トランザクションになるアクセス要求は拒否される。【選択図】図１
2020091902.tif 000002
【特許請求の範囲】
【請求項１】
プロセッサ及びメモリを備える複数のストレージノードであって、階層型データ構造のそれぞれのバージョンを前記階層型データ構造のトランザクションログに一貫した状態で記憶する、前記複数のストレージノードと、
前記階層型データ構造のトランザクションログを維持するトランザクションログストアとを備えるシステムであって、前記ストレージノードのそれぞれは、
前記階層型データ構造の一部として記憶される指定データの読み取り要求をクライアントから受信し、前記読み取り要求は、前記階層型データ構造の前記それぞれのバージョンの異なるバージョンに相当する複数の分離または一貫性レベルの一つを特定し、
前記ストレージノードに維持される前記階層型データ構造の前記それぞれのバージョンのうちの１つを前記読み取り要求の処理のために識別し、
前記特定された複数の分離または一貫性レベルの一つは、直列化された分離を指定することを決定し、
前記特定された複数の分離または一貫性レベルの一つが、直列化された分離を指定することの決定に応答して、前記トランザクションログから受信した競合検証指示に基づいて、前記識別されたバージョンに含まれる前記指定データを記憶する前記ストレージノードにおける１つ以上の位置にアクセスして、前記指定データを取得し、
前記識別されたバージョンに含まれる前記指定データを前記クライアントに戻す
ように構成される、システム。
【請求項２】
前記ストレージノードのそれぞれはさらに、
前記階層型データ構造に送られる書き込み要求を他のクライアントから受信し、
前記ストレージノードに維持される前記階層型データ構造の前記それぞれのバージョンのうちの１つを前記書き込み要求の処理のために識別し、
前記ストレージノードにおける前記階層型データ構造の前記識別されたバージョンに関する前記書き込み要求を実行し、
前記書き込み要求を基に、前記階層型データ構造の前記トランザクションログストアにトランザクションを送信し、前記トランザクションは前記階層型データ構造の前記識別されたバージョンを示し、
前記トランザクションが前記階層型データ構造の前記トランザクションログにコミットされているという指示を前記トランザクションログストアから受信することに応じて、前記書き込み要求の確認応答を前記他のクライアントに送信するように構成される、請求項１に記載のシステム。
【請求項３】
前記ストレージノードの前記それぞれはさらに、
前記トランザクションログストアから前記トランザクションを取得し、
前記ストレージノードに維持される前記階層型データ構造の現在のバージョンに前記トランザクションを適用し、
前記ストレージノードに維持される前記階層型データ構造の過去のバージョンデータを更新し、前記トランザクションの結果として前記階層型データ構造に適用された変更を表すように構成される、請求項２に記載のシステム。
【請求項４】
前記システムはネットワークベースディレクトリサービスであって、前記クライアントは前記ネットワークベースディレクトリサービスのクライアントであり、前記ストレージノードは前記ネットワークベースディレクトリサービスの１つ以上の他のクライアントの代わりに１つ以上の他の階層型データ構造を記憶するマルチテナントであり、前記階層型データ構造の前記識別されたバージョンは前記ストレージノードの前記メモリに維持される、請求項１に記載のシステム。
【請求項５】
１つ以上のコンピューティングデバイスによって、
分散型データストアの一部として維持される階層型データ構造に送られるアクセス要求をクライアントから受信することと、
前記アクセス要求は、前記階層型データ構造の複数のバージョンの異なるバージョンに相当する複数の分離または一貫性レベルの一つを特定し、
前記アクセス要求を処理するために前記階層型データ構造の前記複数のバージョンのうちの１つを識別することであって、前記階層型データ構造の前記複数のバージョンは、前記階層型データ構造にコミットされた変更を表す前記階層型データ構造のトランザクションログと一貫性した状態で前記分散型データストアに維持される、前記識別することと、
前記特定された複数の分離または一貫性レベルの一つは、直列化された分離を指定することを決定し、
前記特定された複数の分離または一貫性レベルの一つが、直列化された分離を指定することの決定に応答して、前記トランザクションログから受信した競合検証指示に基づいて、前記階層型データ構造の前記識別されたバージョンを利用する前記アクセス要求を処理することと
を実行することを備える、方法。
【請求項６】
前記受信、前記識別及び前記アクセス要求の前記処理は前記分散型データストアの前記階層型データ構造のバージョンを記憶する複数のストレージノードのうちの１つによって実行され、
前記方法はさらに、
前記アクセス要求を受信する前に、
前記複数のストレージノードの１つのストレージノードによって、前記トランザクションログから１つ以上のトランザクションを読み取ることであって、前記トランザクションログへの前記１つ以上のトランザクションは前記複数のストレージノードのうちの異なる１つによって前記トランザクションログに送信される、前記読み取ることと、
前記複数のストレージノードの１つのストレージノードによって、前記１つのストレージノードに維持される前記階層型データ構造の現在のバージョンに前記１つ以上のトランザクションを適用することとを備え、
前記階層型データ構造の前記識別されたバージョンは前記１つ以上のトランザクションを含む、請求項５に記載の方法。
【請求項７】
前記方法はさらに、前記アクセス要求を基に、前記階層型データ構造の前記トランザクションログにトランザクションを送信することであって、前記トランザクションは前記階層型データ構造の前記識別されたバージョンを示し、
前記アクセス要求の処理は、前記トランザクションが前記階層型データ構造に対して前記トランザクションログからコミットされるという指示を受信することに応じて実行され、
前記アクセス要求の処理は、前記アクセス要求の確認応答を前記クライアントに送信することを備える、請求項５に記載の方法。
【請求項８】
前記アクセス要求は前記階層型データ構造の異なるそれぞれのノードに関して実行される複数の動作の実行を指示し、前記トランザクションログに送信される前記トランザクションは前記複数の動作を含み、前記トランザクションがコミットされるという前記指示は、前記複数の動作がコミットされることを示す、請求項７に記載の方法。
【請求項９】
前記受信、前記識別及び前記アクセス要求の前記処理は前記分散型データストアの前記階層型データ構造のバージョンを記憶する複数のストレージノードのうちの１つのストレージノードによって実行され、
前記アクセス要求は、読み取り要求であって、
前記アクセス要求の処理は、前記１つのストレージノードから、前記読み取り要求の処理及びページネーショントークンのために生成された結果の一部を前記クライアントに送信することを備え、前記ページネーショントークンは、前記クライアントに送信される残りの結果を示し、
前記方法はさらに、
前記ストレージノードのうちの異なる１つにおいて、他の読み取り要求を前記クライアントから受信することであって、前記他の読み取り要求は、前記ページネーショントークンを含む、前記受信することと、
前記異なるストレージノードにおいて前記他の読み取り要求を受信することに応じて、前記ページネーショントークンに示される通り、前記他の読み取り要求の残りの結果のうちの追加の結果を前記クライアントに送信することとを備える、請求項５に記載の方法。
【請求項１０】
前記方法はさらに、
前記分散型データストアの一部として維持される階層型データ構造に送られる第２のアクセス要求をクライアントから受信することを備え、
前記第２のアクセス要求は、前記階層型データ構造の複数のバージョンの異なるバージョンに相当する前記複数の分離または一貫性レベルの一つを特定し、
前記特定された複数の分離または一貫性レベルの一つが、スナップショット分離を指定することの決定に応答して、前記第２のアクセス要求がスナップショット分離に従って処理されることを決定することを備え、
前記第２のアクセス要求は、前記第２のアクセス要求がスナップショット分離に従って処理されることを決定することに応じて処理される、
請求項５に記載の方法。
【請求項１１】
前記受信、前記識別及び前記アクセス要求の前記処理は前記分散型データストアの前記階層型データ構造のバージョンを記憶する複数のストレージノードのうちの１つのストレージノードによって実行され、
前記アクセス要求はトランザクション及び１つ以上の動作の開始を示し、
前記アクセス要求の処理は、前記１つのストレージノードから、前記１つ以上の動作の実行及びトランザクション状態トークンを前記クライアントに送信することを備え、前記トランザクション状態トークンは前記１つ以上の動作の結果として前記階層型データ構造の前記識別されたバージョンに適応される変更を示し、
前記方法はさらに、
前記ストレージノードのうちの異なる１つにおいて、前記トランザクションの一部として前記クライアントから実行される１つ以上の追加の動作を含む他のアクセス要求を受信することであって、前記他のアクセス要求は前記トランザクション状態トークンを含み、前記他のアクセス要求は前記トランザクションがコミットされることを示す、前記受信することと、
前記異なるストレージノードにおいて、前記他のアクセス要求を受信することに応じて、
前記トランザクション状態トークンで示される前記変更に従って、前記異なるストレージノードにおいて、前記階層型データ構造の前記識別されたバージョンを変更することと、
前記階層型データ構造の前記変更されたバージョンに関する前記１つ以上の追加の動作を実行することと、
前記トランザクションを前記階層型データ構造の前記トランザクションログに送信することと、
前記トランザクションが前記階層型データ構造に対して前記トランザクションログからコミットされるという指示を受信することと、
前記トランザクションが前記トランザクションログからコミットされるという前記指示を受信することに応じて、前記アクセス要求の確認応答を前記クライアントに送信することとを備える、請求項５に記載の方法。
【請求項１２】
１つ以上のコンピューティングデバイスによって実行されると、前記１つ以上のコンピューティングデバイスに、
階層型データ構造にコミットされた変更を表す前記階層型データ構造のトランザクションログと一貫性した状態で、分散型データストアの複数のストレージノードにおいて、前記階層型データ構造のそれぞれのバージョンを維持することと、
前記ストレージノードのうちの１つのストレージノードにおいて、前記階層型データ構造に送られるアクセス要求を受信することと、
前記アクセス要求は、前記階層型データ構造の複数のバージョンの異なるバージョンに相当する複数の分離または一貫性レベルの一つを特定し、
前記１つのストレージノードに維持される前記階層型データ構造の前記それぞれのバージョンのうちの１つを前記アクセス要求の処理のために識別することと、
前記特定された複数の分離または一貫性レベルの一つは、直列化された分離を指定することを決定し、
前記特定された複数の分離または一貫性レベルの一つが、直列化された分離を指定することの決定に応答して、前記トランザクションログから受信した競合検証指示に基づいて、前記階層型データ構造の前記識別されたバージョンを利用する前記アクセス要求を処理することと
を実施させるプログラム命令を記憶する、非一時的なコンピュータ可読記憶媒体。
【請求項１３】
前記プログラム命令は、前記１つ以上のコンピューティングデバイスに、さらに、
前記アクセス要求を基に、前記ストレージノードから、前記階層型データ構造の前記トランザクションログにトランザクションを送信することを実施させ、前記トランザクションは前記階層型データ構造の前記識別されたバージョンを示す、前記送信することと、
前記アクセス要求の処理は、前記トランザクションが前記階層型データ構造に対して前記トランザクションログからコミットされるという指示を受信することに応じて実行され、
前記アクセス要求の処理では、前記プログラム命令は前記１つ以上のコンピューティングデバイスに前記アクセス要求の確認応答を送信させる、請求項１２に記載の非一時的なコンピュータ可読記憶媒体。
【請求項１４】
前記プログラム命令は前記１つ以上のコンピューティングデバイスに、さらに、
前記複数のストレージノードにおいてトランザクションをそれぞれ取得することと、
前記ストレージノードに維持される前記階層型データ構造のそれぞれの現在のバージョンに前記トランザクションを適用することと、
前記ストレージノードに維持される前記階層型データ構造のそれぞれの過去のバージョンデータを更新し、前記トランザクションの結果として前記階層型データ構造に適用された変更を表すことと
を実施させる、請求項１２に記載の非一時的なコンピュータ可読記憶媒体。
【請求項１５】
前記アクセス要求は、前記階層型データ構造の予期される条件を備え、
前記プログラム命令は、前記１つ以上のコンピューティングデバイスに、さらに、前記階層型データ構造の前記識別されたバージョンに関して前記予期される条件を査定し、前記予期された条件が満たされていることを判定することを実施させ、
トランザクションを前記トランザクションログに送信することは、前記予期された条件が満たされていると判定することに応じて実行され、満たされていないと判定される予期される条件を含むアクセス要求は拒否される、請求項１２に記載の非一時的なコンピュータ可読記憶媒体。
【発明の詳細な説明】
【背景技術】
【０００１】
階層型ストレージシステムは、効率的に及び信頼性永続データのために、多数の異なるストレージスキームを実装している。分散型システムアーキテクチャ上に実装されるストレージスキームは、ストレージシステムクライアントアプリケーションがデータストレージシステムに存続するデータの可用性を高める必要がある場合に配備されることが多い。データを利用可能にする一般的な解決策には、データの１つ以上のバージョンまたは複製を複数のストレージノード上に記憶することが含まれる。しかしながら、バージョンまたは複製の数が増えると、複雑性及び階層型データの一貫した表示を生成するための運用コストが増加する。例えば、同期プロトコルは、単一の構成要素が、書き込みまたは階層型データに対する他の変更などの動作を処理できるようになることを必要とし得る。そのような同期プロトコルは、単一の構成要素に負荷をかけ過ぎる可能性があるため、クライアント要求に応答する分散型システムの可用性を低下させる。ゆえに、可用性を犠牲にすることなく階層型データの一貫性のあるバージョンを提供する整合性メカニズムが非常に望ましい。
【図面の簡単な説明】
【０００２】
【図１】いくつかの実施形態による、バージョン化された階層型データ構造を提供する階層型データストアを例示する論理ブロック図である。
【図２】いくつかの実施形態による、バージョン化された階層型データ構造を提供する階層型データストアを含むディレクトリストレージサービスを実装するプロバイダネットワークを例示するブロック図である。
【図３】いくつかの実施形態による、階層型ストレージノードを例示するブロック図である。
【図４Ａ】いくつかの実施形態による、バージョン化された階層型データ構造を提供する階層型データストアのデータモデルを例示するブロック図である。
【図４Ｂ】いくつかの実施形態による、階層型データ構造のデータモデルの記憶形式を例示するテーブル例である。
【図４Ｃ】いくつかの実施形態による、階層型データ構造のデータモデルの記憶形式を例示するテーブル例である。
【図５】いくつかの実施形態による、バージョン化された階層型データ構造に一貫性のあるストレージを提供するための個別のトランザクションログストアの使用を例示するブロック図である。
【図６】いくつかの実施形態による、トランザクションログストレージを利用した直列化可能分離によるアクセス要求の処理を例示するシーケンス図である。
【図７】いくつかの実施形態による、ストレージノードに維持された階層型データ構造のバージョンを利用したスナップショット分離によるアクセス要求の処理を例示するシーケンス図である。
【図８】いくつかの実施形態による、トランザクションログストレージを利用した直列化可能分離による条件付きのアクセス要求の処理を例示するシーケンス図である。
【図９】いくつかの実施形態による、トランザクションログストレージを利用した直列化可能分離によるバッチアクセス要求の処理を例示するシーケンス図である。
【図１０】いくつかの実施形態による、トランザクションログストレージ及びトランザクション状態トークンを利用した直列化可能分離によるクライアント固有のトランザクション要求の処理を例示するシーケンス図である。
【図１１】いくつかの実施形態による、ページネーショントークンを利用してページネーションされた結果配信によるアクセス要求の処理を例示するシーケンス図である。
【図１２】いくつかの実施形態による、サービスアクセス要求に対してバージョン化された階層型データ構造を実装する方法及び技法を例示する高レベルフローチャートである。
【図１３】いくつかの実施形態による、階層型データ構造のトランザクションログと一貫性のあるストレージノードにおいて階層型データ構造の維持バージョンを実装する方法及び技法を例示する高レベルフローチャートである。
【図１４】様々な実施形態による、コンピュータシステム例である。
【０００３】
実施形態は、いくつかの実施形態及び例示的な図面について一例として本明細書に説明されているが、当業者は実施形態が説明されている実施形態または図面に制限されないことを認識する。図面及び図面に対する詳細な説明は、開示されている特定の形式に実施形態を制限することを目的とするのではなく、逆に、添付の特許請求の範囲によって定められる趣旨及び範囲内のすべての修正形態、同等物及び変更形態を対象とすることを目的とすることが理解されるべきである。本明細書に使用される見出しは編成のみを目的とし、明細書または特許請求の範囲を制限するために使用されることを意図していない。本出願を通して使用されるように、単語「してよい」は、強制の意味（つまり、しなければならないを意味する）よりむしろ、許可の意味（つまり、する可能性を有することを意味する）で使用される。単語「含む（ｉｎｃｌｕｄｅ）」、「含んだ（ｉｎｃｌｕｄｉｎｇ）」及び「含む（ｉｎｃｌｕｄｅｓ）」はオープンエンド関係を示し、したがって、含むことを意味するが、これに限定されるものではない。同様に、単語「有する（ｈａｖｅ）」、「有している（ｈａｖｉｎｇ）」及び「有する（ｈａｓ）」もオープンエンド関係を示し、したがって、有することを意味するが、これに限定されるものではない。本明細書で使用される用語「第１の」、「第２の」、「第３の」等は、それらの後に来る名詞に対するラベルとして使用され、係る順序付けが明示的に示されない限り、いかなるタイプの順序付け（例えば、空間的、時間的、論理的等）も暗示しない。
【０００４】
様々な構成要素は、１つまたは複数のタスクを実行する「ように構成される」として記述されてよい。係る文脈では、「ように構成される」は、動作中に１つまたは複数のタスクを実行する「構造を有する」を概して意味する大まかな記述である。したがって、構成要素は、構成要素が現在そのタスクを実行していなくてもタスクを実行するように構成できる（例えば、コンピュータシステムは、動作が現在実行されていなくても動作を実行するように構成されてよい）。いくつかの文脈では、「ように構成される」は、動作中に１つまたは複数のタスクを実行する「回路を有する」を概して意味する構造の大まかな記述であってよい。したがって、構成要素は、構成要素が現在起動していなくてタスクを実行するように構成できる。一般的に、「ように構成される」に対応する構造を形成する回路はハードウェア回路を含んでよい。
【０００５】
様々な構成要素は、説明での便宜上、１つまたは複数のタスクを実行するとして記述されてよい。係る説明は、フレーズ「ように構成される」を含んでいるとして解釈されるべきである。１つまたは複数のタスクを実行するように構成される構成要素を記述することは、その構成要素に対して米国特許法第１１２条（ｆ）の解釈を行使することを明白に目的としていない。
【０００６】
「に基づいて」。本明細書に使用されるように、この用語は、決定に影響を及ぼす１つまたは複数の要因を説明するために使用される。この用語は、決定に影響を及ぼすことがある追加の要因を除外しない。すなわち、決定は、それらの要因のみに基づいてよい、または少なくとも部分的にそれらの要因に基づいてよい。フレーズ「Ｂに基づいてＡを決定する」を考える。ＢがＡの決定に影響を及ぼす要因であり得る一方、係るフレーズは、Ａの決定がＣにも基づいていることを除外しない。他の例では、ＡはＢだけに基づいて決定されてよい。
【０００７】
本開示の範囲は、本明細書に（明示的または暗示的のどちらかで）開示される任意の特徴または特徴の組み合わせまたはその任意の一般化を、それが本明細書で扱われる課題のいずれかまたはすべてを軽減するか否かに関わらず含む。したがって、特徴の係る任意の組み合わせに対して、本出願（または本出願に対する優先権を主張する出願）の手続き処理中に新しい特許請求の範囲が策定されることがある。特に、添付の特許請求の範囲に関して、従属請求項からの特徴は独立請求項の特徴と組み合わされてよく、それぞれの独立請求項からの特徴は任意の適切な方法で、及び単に添付の特許請求の範囲に列挙される特定の組み合わせとは異なるように組み合されてよい。
【発明を実施するための形態】
【０００８】
分散型データストアのバージョン化された階層型データ構造の様々な実施形態を本明細書において説明する。通常、ディレクトリデータストアなどの階層型データストアは、階層型データ構造（例えば、ツリー、グラフまたは他の階層ベースのデータ構造）の一貫性のある現在のバージョンへのアクセスを制限する。これにより、階層型データストアは、同時アクセス要求であっても一貫性を提供することができる。係る実装は、類似の一貫性及び分離レベルを提供しつつ、すべてのアクセス要求が類似の処理パスを利用して実行されることを強制し、これによって、階層型データ構造にアクセスするときに必ずしも速度または他の性能への配慮を犠牲にしてまで一貫性または分離を望むわけではないクライアントへの柔軟性が低下する。バージョン化された階層型データ構造を提供することにより、複数のタイプの整合性モデルを実装することができ、これによって、様々な要求は所望の分離及び／または一貫性レベルを指定することができ、ゆえに、階層型データ構造へのアクセスに関して要求の実行を制御することができる。
【０００９】
図１は、いくつかの実施形態による、バージョン化された階層型データ構造を提供する階層型データストアを例示する論理ブロック図である。階層型データストア１２０は、階層型データ構造１３２の複数のバージョンを経時的に提供してよく、これによって、アクセス要求１１２を処理するときに様々な種類の一貫性及び分離レベルが実装されてよい。例えば、階層型データ構造のバージョン１３２ａ、１３２ｂ及び１３２ｃなどの各バージョンを維持してよく、これによって、過去のクエリ（またはデータが古くなっている可能性が高いかどうかを考慮しないクエリ）が、（例えば、メモリの階層型データ構造を維持するストレージノードにおいて）迅速に利用可能な階層型データ構造のバージョンを利用することができる。階層型データ構造の厳格に一貫したバージョンを望むかまたは必要とする他のアクセス要求１１２は、後述する楽観的並行性を利用してトランザクションログに関する要求を審査するなど、アクセス要求のために直列化可能分離を提供する動作を呼び出すことができる。アクセス要求１１２はまた、パスベースの走査を呼び出して、階層データ構造１３２の一部として記憶された様々な情報を決定してよい。
【００１０】
図１は、バージョン化された階層型データ構造を提供する階層型データストアの論理図として提供され、分散型データストアを実装する構成要素、モジュールまたはデバイスの物理的構成、サイズまたは数に関して限定することを意図するものではないことに留意されたい。
【００１１】
本明細書では、様々な実施形態による、ディレクトリストレージサービスとしての分散型データストアの例を最初に説明する。ディレクトリストレージサービスの例は、様々な実施形態において、多数の異なるクライアントのために階層型データ構造を記憶してよい。ネットワークベースデータベースサービスの例の説明には、ネットワークベースディレクトリストレージサービスの例の様々な態様が、ディレクトリストレージサービスとクライアントとの間の様々な相互作用と共に含まれる。次に、本明細書は、分散型データストアのバージョン化された階層型データ構造のための方法の様々な実施形態のフローチャートを説明する。次に、本明細書は、開示された技法を実施し得るシステムの例を説明する
。本明細書を通じて様々な例を提供する。
【００１２】
図２は、いくつかの実施形態による、バージョン化された階層型データ構造を提供する階層型データストアを実装するディレクトリストレージサービスを実装するプロバイダネットワークを例示するブロック図である。プロバイダネットワーク２００は企業または公的組織などのエンティティによって設定され、インターネット及び／または他のネットワークを介してクライアント２１０にアクセス可能な１つ以上のサービス（様々なタイプのクラウドベースのコンピューティングまたはストレージなど）を提供してよい。プロバイダネットワーク２００は、物理的な及び／または仮想化されたコンピュータサーバ、ストレージデバイス、ネットワーク機器等の集合（例えば、図１４に関して後述するコンピューティングシステム２０００）など、プロバイダネットワーク２００によって提供されるインフラストラクチャ及びサービスを実装及び配信するために必要な様々なリソースプールをホストする多数のデータセンタを含んでよい。いくつかの実施形態では、プロバイダネットワーク２００は、記述されたディレクトリストレージサービス２２０を実装してよく、オブジェクトストレージサービス、ブロックベースストレージサービス、データウェアハウスストレージサービス、アーカイブストレージサービス２７０などの仮想計算サービス及びストレージサービス及び／または（様々な他のタイプの記憶、処理、分析、通信、イベント処理、視覚化及びセキュリティサービスを含み得る）任意の他のタイプのネットワークベースサービス２８０など、他のコンピューティングリソースまたはサービスを提供してよい。クライアント２１０は、プロバイダネットワーク２００によって提供されるこれらの様々なサービスにネットワーク２６０を介してアクセスしてよい。同様に、ネットワークベースサービスは、それ自体が互いとの通信及び／または互いを利用して、異なるサービスを提供してよい。例えば、他のサービス２８０（複数可）のうちの様々なサービスは、ディレクトリストレージサービス２２０に記憶された階層型データ構造を記憶し、アクセスし、及び／または階層型データ構造に依存してよい。
【００１３】
様々な実施形態において、図２に例示される構成要素は、コンピュータハードウェア（例えば、マイクロプロセッサまたはコンピュータシステム）によって直接的または間接的に実行可能な命令として、あるいはこれらの技法の組み合わせを使用して、コンピュータハードウェア内に直接的に実装されてよい。例えば、図２の構成要素は、多数のコンピューティングノード（または単にノード）を含むシステムによって実装されてよく、その各々は、図１４に例示して後述するコンピュータシステムの実施形態に類似してよい。様々な実施形態では、所与のサービスシステム構成要素（例えば、データベースサービスの構成要素またはストレージサービスの構成要素）の機能性は、特定のノードによって実装されてもよく、またはいくつかのノードにわたって分散されてもよい。いくつかの実施形態では、所与のノードは、２つ以上のサービスシステム構成要素（例えば、２つ以上のデータベースサービスシステム構成要素）の機能性を実装してよい。
【００１４】
ディレクトリストレージサービス２２０は、階層型ストレージノード２４０（複数可）のうちの様々なノードに（シングルテナントまたはマルチテナント方式で）記憶された、図４Ａに関して後述するディレクトリ構造などの階層型データ構造を記憶、管理及び維持してよい。ディレクトリストレージサービス２２０のクライアントは、トランザクションのセマンティクスを有する階層型データ構造の任意のサブセットまたは部分に作動してもよく、及び／または階層型データ構造のパスベース走査を実行してもよい。係る機能によって、クライアントは多数の方法で階層型データ構造にアクセスすることができる。例えば、クライアントは、トランザクションのアクセス要求を利用して、階層型ディレクトリ構造の異なる部分（例えば、ノード）に影響を及ぼす複数の動作（例えば、トランザクション内の動作の更新結果が分離しており、一貫性があり、アトミックであり、永続的に記憶されているという要件を課しながら、階層型ディレクトリ構造の部分を読み取り、ノードを追加し、ノードの属性の一部をインデックス化する）を実行してよい。
【００１５】
様々な実施形態では、ディレクトリストレージサービス２２０は、内部または外部クライアントから適切な階層型ストレージノード２４０（複数可）にアクセス要求を送るルーティング層２３２を実装してよい。例えば、ルーティング層２３２は、階層型ストレージホスト２４０（複数可）上で階層型データ構造の位置を識別するマッピング情報を維持する多くのルーティングノードを実装してよい。アクセス要求が受信されると、ルーティング層ノードは、次に、アクセス要求で識別された階層型データ構造をホストする階層型ストレージノード（複数可）のうちのどれにアクセス要求を送信するかを決定してよい。後述の図５に例示するように、複製グループの一部として複数の異なる階層型ストレージノード２４０にわたって階層型データ構造を複製し得るシナリオを考察する。ルーティング２３２は、様々なクライアントからの要求を複製グループ内の様々な階層型ストレージノードに送るために、様々なロードバランシングスキームを実装してよく、これによって、単一の階層型ストレージノードに負荷がかかり過ぎないようにする。さらに、階層型ストレージノード２４０は、クライアントによって送信された様々なアクセス要求全体の状態を維持するためにトークンを利用してよく、これによって、様々な階層型ストレージノード２４０（複数可）はクライアントからの各要求を処理してよく、（スティッキーセッションは、図１０及び図１１に関して後述するトークン状態管理技法によって防止され得るため）ルーティング２３２はどの階層型ストレージノードがどのクライアントと通信しているか追跡する必要はない。
【００１６】
制御プレーン２３４は、階層型ストレージノード２４０（複数可）上での新しい階層型データ構造の作成及び配置の指示、ストレージスケーリング、熱管理、ノード修復及び／または置換など、階層型ストレージノード２４０（複数可）及び階層型データ構造のストレージを提供するディレクトリストレージサービス２２０の他の構成要素を管理するための様々な制御機能を実装してよい。例えば、様々な配置スキームは、階層型ストレージノード（複数可）を識別して階層型データ構造のバージョンを記憶するための一貫性のあるハッシング（例えば、個々の階層型データ構造の識別子のハッシングに基づく）または複製セットを形成する多数の階層型ストレージノード２４０（複数可）に階層型データ構造をランダムにマッピングするなどの技法を利用してよい。熱管理を提供するために、例えば、制御プレーン２３４は、各ホストによって発行された階層型ストレージホスト２４０（複数可）の基準を収集してよい。各ホストは、メモリ使用率、ＣＰＵ使用率、ディスク使用率及び要求率容量など、性能特性の様々な閾値を有することがある。階層型ストレージノードが閾値（または複数の閾値）を超える基準を報告する場合、制御プレーン２３４は、１つ以上の階層型データ構造を異なる階層型ストレージノードに移行するよう指示してよい。同様に、制御プレーン２３４は、特定の階層型ストレージノードが階層型データ構造の特定の複製グループに送られたアクセス要求に対応できないことを検出してよく、追加の階層型ストレージノード（複数可）を提供して複製グループを水平にスケーリングし、アクセス要求を良好に満たしてよい。
【００１７】
階層型ストレージノード２４０（複数可）は、ディレクトリストレージサービス２２０の階層型ストレージノードへのアクセスを維持し、処理してよい。図３は、いくつかの実施形態による、階層型ストレージノードを例示するブロック図である。階層型ストレージノード３００は、アクセス要求を処理し適切な命令または要求を、ストレージエンジン３４０、トランザクションログインタフェース３５０またはアーカイブインタフェース３６０などの他の構成要素に伝えるために、要求ハンドラ３１０を実装してよい。例えば、アクセス要求ハンドラ３１０は、図６〜図１１に関して後述するインタフェース６００のようなアプリケーションプログラミングインターフェース（ＡＰＩ）など、プログラムインターフェースに従ってフォーマットされた様々な要求を解読してよい。アクセス要求には、前述の図に記載された要求のうちの様々な要求ならびに他のタイプの要求（以下の図６〜図１１に記載された要求または動作を含むまたは組み込み得る）を含んでよく、これに
は、例えば、階層型データ構造のノードの作成、更新、接続、切り離し、削除及び照会などの様々なアクセス要求、階層型データ構造ノード属性に対するローカルインデックスの定義、作成、発見及び照会のアクセス要求（厳密な一貫性があり、階層型データ構造の一部、または階層型データ構造とは別のものとして維持される）が含まれる。
【００１８】
様々な実施形態では、ストレージエンジン３４０は、現在の階層型データ構造ストア３２０及び過去の階層型データ構造ストア３３０に記憶されているため、データの構造または形式と対話するように構成されたストレージエンジン（たとえば、キーバリュー型ストレージ形式で維持されたデータのキーバリューストレージエンジン、リレーショナルストレージ形式で維持されたデータのリレーショナルデータストレージエンジンなど）であってよく、これらは、図４Ａに関して後述するモデルに従って維持されてよい。いくつかの実施形態では、現在の階層型データ構造ストア３２０は、磁気ディスクまたはソリッドステートドライブを含む過去の階層型データ構造ストア３３０を記憶するために永続的なブロックベースのストレージデバイスを利用するだけでなく、ランダムアクセスメモリデバイス（ＲＡＭ）などのメモリまたは他の高速アクセスストレージデバイスに部分的にまたは完全に実装されてよい。いくつかの実施形態では、キャッシング技法を実装してよく、これによって、現在の階層型データ構造の頻繁にアクセスされる部分などの頻繁にアクセスされるデータ部分がメモリ構成要素に維持され、他の部分が永続的なブロックベースのストレージ構成要素で維持される。階層型ストレージノード３００は、階層型データ構造のマルチテナントストレージを作動してよく、これによって、様々なクライアント、アカウント、カスタマ等の代わりに維持される様々な階層型データ構造が現在の階層型データ構造ストア３２０及び現在の階層型データ構造ストア３３０に維持されてよい。例えば、階層型ストレージノード３００は、階層型ストレージノード３００に記憶された異なる階層型データ構造に対して異なる階層型ストレージノードを有する異なる複製グループに参加してよい。
【００１９】
トランザクションログインタフェース３５０は、図５〜図１１に関して後述する様々な技法に従って、階層型データ構造のトランザクションログストレージ２５０に記憶された階層型データ構造に対応するログに関して対話する（例えば、トランザクションを検証する）機能を提供してよい。同様に、アーカイブインタフェース３６０は、アーカイブされたトランザクションまたはスナップショットを検索して、階層型データ構造への履歴変更のアクセス要求、履歴照会または過去の階層型データ構造ストアに維持されているものより古い階層型データ構造のバージョンを必要とする他のアクセス要求を処理するように実装されてよい。
【００２０】
図２に戻ると、トランザクションログストレージ２５０は、フォールトトレラントで高性能な耐久性のあるログ発行サービスを提供してよい。トランザクションログストレージ２５０は、データベース、キーバリューストア及びロックマネージャなどの厳密に一貫性のある分散型アプリケーションを基盤とするコミットログとして、及び図２に例示する階層型データストレージを提供するディレクトリストレージサービス２２０として使用されてよい。トランザクションログストレージ２５０は、重複排除、シーケンシング及び読み取り書き込み競合検出などの機能を可能にするために、コミットされた記録間の厳密な一貫性保証及びサポート制約を提供してよい。例えば、以下の図５、図６、図８、図９及び図１１に例示される様々な要求において、トランザクションログストレージ２５０は、提案されたトランザクションが他のコミットされたトランザクションと競合するかどうかを調べることによって、階層型データ構造への変更（例えば、書き込み要求及び他の変更）をコミットするかどうかを決定してよい。係る機能は、階層型データ構造に対して、きめ細かいロックモデルを提供してよい（例えば、トランザクション間の競合によって影響を受ける階層型データ構造の部分のみがロックされ得る）。トランザクションログストレージは、各階層型データ構造の個別のログまたは一連のログ記録を維持し、状態階層型デー
タ構造への変更の経時的に信頼できる定義として機能する。トランザクションは、個々の時点における階層型データ構造の状態を参照するために単調に増加し得るトランザクションシーケンス番号に従って順序付けられてよい。いくつかの実施形態では、トランザクションログストレージ２５０は、ディレクトリストレージサービス２２０の外部のプロバイダネットワーク２５０の一部として実装される別個のネットワークベースストレージサービスであってもよいことに留意されたい。
【００２１】
アーカイブ管理２３６は、トランザクションログストレージ２５０のそれぞれのトランザクションログに記憶された様々な階層型データ構造のために記憶されたトランザクションを利用して、アーカイブストレージサービス２７０の異なる時点で階層型データ構造のスナップショットを生成して記憶してよい。例えば、アーカイブ管理は、階層型データ構造のスナップショットをキャプチャする必要がある時期を決定し、アーカイブストレージサービス２７０の適切なストレージ位置を提供し、アーカイブワーカノード（図示せず）に、読み取り、書き込み及び他の動作を実行してアーカイブストレージサービス２７０にスナップショットを生成して配置するように指示してよい。同様に、アーカイブ管理２３６は、個々のログ記録／トランザクション及び／またはログ記録及びトランザクションのグループのコピー及び記憶を、アーカイブストレージサービス２７０の階層型データ構造のためのアーカイブされたトランザクションログの一部として記憶するよう指示してよい。
【００２２】
一般的に、クライアント２１０は、ディレクトリサービスに対する要求（例えば、ディレクトリストレージサービス２２０に記憶される階層型データ構造を作成または変更する要求など）を含むネットワークベースサービス要求を、ネットワーク２６０を介してプロバイダネットワーク２００に送信するように構成可能な任意のタイプのクライアントを含んでよい。例えば、所与のクライアント２１０は、ウェブブラウザの適切なバージョンを含んでよく、またはウェブブラウザによって提供される実行環境への拡張として、もしくは実行環境内で実行するように構成されたプラグインモジュールもしくは他のタイプのコードモジュールを含んでよい。代替的には、クライアント２１０は、データベースアプリケーション（またはそのユーザインターフェース）、メディアアプリケーション、オフィスアプリケーションまたは永続的なストレージリソースを利用して１つ以上の階層型データ構造の記憶及び／またはアクセスを行い、組織管理、ＩＤ管理または権限／認証管理などの技法を行い得る任意の他のアプリケーションなどのアプリケーションを含んでよい。いくつかの実施形態では、係るアプリケーションは、すべてのタイプのネットワークベースデータの完全なブラウザサポートを実装する必要なく、ネットワークベースサービス要求を生成及び処理するための十分なプロトコルサポート（例えば、ハイパーテキストトランスファプロトコル（ＨＴＴＰ）の適切なバージョン用）を含んでよい。すなわち、クライアント２１０は、ネットワークベースサービスプラットフォーム２００と直接的に相互作用するように構成されるアプリケーションであってよい。いくつかの実施形態では、クライアント２１０は、リプリゼンテーショナル・ステート・トランスファ（ＲＥＳＴ）形式のネットワークベースサービスアーキテクチャ、ドキュメントベースもしくはメッセージベースのネットワークベースサービスアーキテクチャまたは別の適切なネットワークベースサービスアーキテクチャに従って、ネットワークベースサービス要求を生成するように構成されてよい。
【００２３】
いくつかの実施形態では、クライアント２１０は、ネットワークベースサービスへのアクセスを、それらのアプリケーションに対して透過的な方法で他のアプリケーションに提供するように構成されてよい。例えば、クライアント２１０は、オペレーティングシステムまたはファイルシステムと統合して、本明細書で説明するストレージモデルの適切な変形に従ってストレージを提供するように構成されてよい。しかしながら、オペレーティングシステムまたはファイルシステムは、ファイル、ディレクトリ及び／またはフォルダの
従来のファイルシステム階層など、異なるストレージインターフェースをアプリケーションに提示してよい。係る実施形態では、ストレージシステムサービスモデルを利用するためにアプリケーションを変更する必要はない。代わりに、プロバイダネットワーク２００へのインタフェースの詳細は、オペレーティングシステム環境内で実行するアプリケーションに代わって、クライアント２１０及びオペレーティングシステムまたはファイルシステムによって調整されてよい。
【００２４】
クライアント２１０は、ネットワークベースサービス要求（例えば、ディレクトリストレージサービス２２０の階層型データ構造に送られるアクセス要求）を、ネットワーク２６０を介してネットワークベースサービスプラットフォーム２００に伝達し、ネットワーク２６０を介してネットワークベースサービスプラットフォーム２００から応答を受信してよい。様々な実施形態では、クライアント２１０とプラットフォーム２００との間にネットワークベースの通信を確立するために必要なネットワーキングハードウェアとプロトコルとの任意の適切な組み合わせを含んでよい。例えば、ネットワーク２６０は、一般的に、インターネットを集合的に実装する様々な電気通信ネットワーク及びサービスプロバイダを含んでよい。ネットワーク２６０はさらに、ローカルエリアネットワーク（ＬＡＮ）またはワイドエリアネットワーク（ＷＡＮ）などの私設ネットワークならびに公衆または私設の無線ネットワークを含んでよい。例えば、所与のクライアント２１０とネットワークベースサービスプラットフォーム２００の両方を、それ自体の内部ネットワークを有する企業内でそれぞれプロビジョニングしてよい。係る実施形態では、ネットワーク２６０は、所与のクライアント２１０とインターネットの間、ならびにインターネットとネットワークベースサービスプラットフォーム２００との間のネットワークリンクを確立するのに必要なハードウェア（例えば、モデム、ルータ、スイッチ、ロードバランサ、プロキシサーバなど）及びソフトウェア（例えば、プロトコルスタック、会計ソフトウェア、ファイアウォール／セキュリティソフトウェアなど）を含み得る。なお、いくつかの実施形態では、クライアント２１０は、公衆のインターネットではなく私設のネットワークを使用して、ネットワークベースサービスプラットフォーム２００と通信してよい。
【００２５】
様々なタイプの階層型データ構造が記憶され、管理され及びまたは様々な方法で表されてよい。図４Ａは、いくつかの実施形態による、バージョン化された階層型データ構造を提供する階層型データストアのデータモデルの一例を例示するブロック図である。ノードは、ディレクトリ構造４１０ａまたは４１０ｎなどの階層型データ構造の基本要素であってよく、図４Ａに図示されるグラフにおいて円または四角形で表されてよい（例えば、ノード４００、４０１、４０２、４０３、４０４、４０５、４０６、４０７及び４２１）。ノードには、グローバル一意識別子（ＧＵＩＤ）、０以上の属性（キー、値のペア）及び０以上の他のノードへのリンクがあり得る。いくつかの実施形態では、ディレクトリは、ディレクトリまたはリソースのいずれかの他のノードへの０以上の子リンクを有する１つのタイプのノードであってよい。ディレクトリノードは、０または１つの親ディレクトリノードを有してよく、これは、いくつかの実施形態では、ディレクトリノード及びインクがツリー構造を定義することを意味する。図４Ａでは、ノード４０１はディレクトリノードの例である。ノード４００は、論理ルートの複数のディレクトリ構造４１０であり、ディレクトリストレージサービス２２０のクライアントには不可視となり得るノードであってよい。リソースノード（リソースノード４０４、４０５、４０６及び４０７などの四角形で表される）は、ディレクトリ構造４１０のリーフノードであってよい。リソースノードは、一意の外部ＩＤ（例えば、クライアント固有）及びクライアント定義済み属性を有してよい。リソースノードは２つ以上の親ノードを有することができる（有向非巡回グラフ（ＤＡＧ）として構成されるいくつかの階層型データ構造が可能となる）。図４のノード４０５は、リソースノードの一例であり、２つの親（ノード４０２及び４０３）を有する。
【００２６】
いくつかの実施形態では、複数のタイプのリソースノードを実装してよい。例えば、いくつかの実施形態では、ポリシーノードは、ポリシータイプ及びポリシードキュメント（例えば、適用可能なノードに適用されるポリシーを記述する）の２つのユーザ定義属性を有するリソースノードのタイプであってよい。例えば、図４Ａのリソースノード４０６は、ポリシーリソースノードの一例であってよい。別のタイプのリソースノードは、インデックスリソースノードであってよい。例えば、インデックスリソースノードは、インデックスノードが接続されているディレクトリノードの子ノード及び他の子孫ノード内のノードの様々な属性値に対するインデックスである。例えば、リソースノード４０７がインデックスノードである場合、インデックスノード４０７は、子ノード４０２及び４０３ならびに子孫ノード４０４、４０５及び４０６の属性のインデックスノードを提供してよい。
【００２７】
いくつかの実施形態では、リンクは、２つのノード間の関係を定義する２つのノード間の有向エッジであってよい。クライアントに可視化されたリンクタイプ及び内部動作の実装のための別のリンクタイプなど、多数のタイプのリンクが存在してよい。いくつかの実施形態では、子リンクタイプは、それが接続するノード間に親子関係を作成してよい。例えば、子リンク「ｂｂ」は、ノード４０１とノード４０３を接続する。子リンクは、ディレクトリ構造４１０の階層を定義してよい。子リンクは、リンクが指すノードのパスを定義するために命名されてよい。別のタイプのクライアントに可視化されたリンクは、アタッチメントリンクであってよい。アタッチメントリンクは、ポリシーリソースノードまたはインデックスリソースノードなどのリソースノードを、別のリソースノードまたはディレクトリノードに適用してよい。アタッチメントリンクは、ディレクトリ構造４１０の階層型構造を定義することはできない。例えば、アタッチメントリンク「ｘｘ」は、ポリシーリソースノード４０６に記憶されたポリシー属性をディレクトリノード４０２に適用する。ノードは、複数のアタッチメントを有することができる。いくつかの実施形態では、任意の所与のポリシータイプの１つのポリシーリソースノードしか同じノードに接続することができないという制約など、いくつかのアタッチメント制約が課されてよい。クライアントに可視化されていないタイプのリンクまたはインプライドリンクタイプも、いくつかの実施形態では、リバースリンクに実装されてよい。リバースリンクは、リソースノード検索（例えば、ポリシー検索）のような一般的な動作にディレクトリ構造４１０の走査を最適化するために使用されてよい。ディレクトリストレージサービス２２０は、子リンク及びアタッチメントリンクの反対方向のリバースリンクを維持してよい。
【００２８】
様々な実施形態では、ディレクトリ構造４１０のノードは、「／」でラベル付けされたリンクで始まり、パス区切り「／」で区切られた子リンクが後続し、目的のノードに到達するまで続く、論理ルートノード４００から始まるノードへの到達方法を記述するパス名によって識別され、発見することができる。例えば、ノード４０５は、パス「／ｄｉｒｅｃｔｏｒｙＡ／ａａ／ｄｄ」を使用して識別することができる。いくつかのノードが複数のディレクトリノードの子である場合もあるため、複数のパスを識別してよい。例えば、次のパス「／ｄｉｒｅｃｔｏｒｙＡ／ｂｂ／ｅｅ」を使用してノード４０５を識別することもできる。ディレクトリ構造４１０はノードの集合であってよく、ノードの境界は集合内のそれらのノードの階層（例えば、ノード間のリンクによって作成されるツリーまたはＤＡＧなど、結果として得られる階層型データ構造）によって定義される。このように、ディレクトリ構造４１０は、個別の、独立した、または部分的に独立した組織を表してよい。
【００２９】
例示されたディレクトリ構造を現在の階層型データ構造ストア３２０及び過去の階層型データ構造ストア３３０に記憶するために、記述されたノード、リンク属性などは、いくつかの実施形態では、リソース・ディスクリプション・フレームワーク（ＲＤＦ）データの後にモデル化されてよい。階層型データ構造の複数のバージョンを維持するために、バージョニング情報をさらに含めて、データの経時的な変化を表現してよい。ＲＤＦデータ
は（主語、述語、目的語）タプルとして構造化してよい。追加のバージョニング情報を含めると、この構造は（主語、述語、目的語、バージョン、以前のバージョン）になってよい。ＲＤＦに基づいた階層型データ構造を表現するために、複数のタイプのＲＤＦ述語が存在してよい。いくつかの実施形態では、ＲＤＦ述語の１つのタイプは、階層型データ構造のリンクを表してよく、別のタイプのＲＤＦ述語は、階層型データ構造の属性を表してよい。異なるタイプの予測は、階層型データ構造を異なる方法で表してよい。リンク述語は２つのノードの間にあってよく、属性述語はノードと値との間にあってよい。単一ノードは同じタイプの複数の述語に関係する可能性があるが、値が異なるため、述語は共通の接頭語で始まり、いくつかの追加のタイプまたは検索に役立つ命名情報で終了し得る。例えば、階層型データ構造に対するすべての変更はトランザクションログストレージ２５０によって提供されるトランザクション解決プロセスを利用してよく、トランザクションログストレージ２５０によって順序付けられた論理タイムスタンプが割り当てられてよいため、述語のタプルのバージョンエントリは、リンクまたは属性が作成された時点の論理タイムスタンプ（例えば、トランザクションシーケンス番号）であってよい。
【００３０】
図３に示す通り、階層型ストレージノードは、階層型データ構造の現在のバージョン及び階層型データ構造の過去のバージョンを維持してよい。少なくともいくつかの実施形態では、例えば、図４Ｂの現在のバージョンのテーブル４５０など、現在のバージョンのデータを記憶するテーブル、及び図４Ｃの以前のバージョンのテーブル４６０など、以前のバージョンの変更不可能な記録を記憶する別のテーブルなど、各階層型データ構造に対してそれぞれ異なるテーブルが維持されてよい。図４Ａのディレクトリ構造４１０ａの例を使用すると、テーブル４５０及びテーブル４６０は、現在及び以前のバージョンのテーブルの内容を表示してよい。ＧＵＩＤ値の代わりに、テーブルは可読性のためにＧＵＩＤ＿４０１、ＧＵＩＤ＿４０２などを表示する。述語名は文字列として表示されるが、ストア内の実際の表現は文字列表現よりもコンパクトなバイナリ表現を使用してよい。現在のバージョンのテーブル４５０は、テーブル内の各行の最新バージョンのデータを記憶してよく、以前のバージョンの列の値は、この行の以前の値を見つけるために、以前のバージョンのテーブル４６０へのインデックスを提供してよい。以前のバージョンのテーブル４６０では現在のバージョンを述語に付け加えてよく、これを基にフィルタリングすることができる。以前のバージョンのテーブル４６０の以前のバージョンの列は、ストレージエンジンが古いバージョンを見つけ、さらに論理時間に戻り、特定の時点で階層型データ構造を作動させるアクセス要求などの様々なアクセス要求を行うことを可能にしてよい。テーブル４５０及び４６０の構造はリレーショナルテーブルとして示されているが、係る図示は限定的ではないことに留意されたい。例えば、上述の通り、現在のバージョンの階層型データ構造ストア３２０及び過去の階層型データ構造ストア３３０は、非リレーショナルであるキーバリューストアであってよく、キーは主語及び述語の値の連結によって形成され、値は例示された残りの列の値の連結によって形成されてよい。例えば、テーブル４５０の第１行は、以下の＜ＧＵＩＤ＿４０１＋ｌｉｎｋ．ｃｈｉｌｄ．ａａ、ＧＵＩＤ＿４０２＋Ｖｅｒ＿１＋Ｎｕｌｌ＞のように、＜キー、値＞のペアとして論理的に表されてよい。
【００３１】
様々な実施形態では、テーブル４５０及び４６０の一方または両方にアクセスして、様々な動作を実行してよい。例えば、アクセス要求は、クエリ「ＩＤがＧＵＩＤ＿４０１であるノードの全ての子ノードを検索する（ｓｅｌｅｃｔ  ＧＵＩＤ＿４０１．ｃｈｉｌｄ．*ｆｒｏｍ  ＣｕｒｒｅｎｔＶｅｒｓｉｏｎ）」またはクエリ「ＩＤがＧＵＩＤ＿４０
５であるリソースノードのすべてのポリシーをルートまですべてのパスに沿って検索する」などのクエリを指定してよい。係るクエリを処理するために、親リンクに沿って最初の深さ走査を実行してよい。ルートまでパスに沿った各ノードにおいて、以下の内部クエリを実行してよい。内部クエリ１：「ノードにポリシーがあるかどうかを検索する：ｓｅｌｅｃｔ  ＧＵＩＤ＿４０５．ｌｉｎｋ．ＨａｓＰｏｌｉｃｙ．*ｆｒｏｍ  Ｃｕｒｒｅｎ
ｔＶｅｒｓｉｏｎ」、内部クエリ２：「ノードに内部クエリ１で返されたポリシーがある場合、リンクからの値を使用して、ポリシーノードからポリシードキュメントの値を取得する：ｓｅｌｅｃｔ  ＧＵＩＤ＿４０６．ｌｉｎｋ．ＰｏｌｉｃｙＤｏｃ  ｆｒｏｍ  ＣｕｒｒｅｎｔＶｅｒｓｉｏｎ」、内部クエリ３：「現在のノードのすべての親を検索し、ディレクトリ構造のルートに到達するまで、親ノードごとに内部クエリ１〜３を実行する」。これまでの例は、形式、構造、構文またはテーブル４５０及びテーブル４６０に関してクエリが表現または処理され得る他の方法に限定される意図はないことに留意されたい。
【００３２】
図５は、いくつかの実施形態による、バージョン化された階層型データ構造に一貫性のあるストレージを提供するための個別のトランザクションログストアの使用を例示するブロック図である。クライアント５１０ａ、５１０ｂ及び５１０ｃなどの複数のクライアントは、様々な書き込み要求５１２ａ、５１２ｂ、５１２ｃなど、階層型データ構造への様々なアクセス要求を同時に実行してよい。少なくともいくつかの実施形態では、複製グループ５２０は、クライアント５１０からの様々なアクセス要求を処理するために利用可能な階層型データ構造のバージョンを維持する階層型ストレージノード５２２ａ、５２２ｂ、５２２ｃなど、複数のストレージノードを含んでよい。例えば、クライアント５１０は、ルーティングスキーマに従って、異なる書き込み要求５１２を階層型ストレージノード５２２に送信してよく、ルーティングスキーマは、ロードバランシングスキームに従って、各クライアントからのアクセス要求を複製グループ５２０の異なるストレージノードに送ってよい。要求を受信すると、各階層型ストレージノード５２２はストレージノードにおいて階層型データ構造の現在のバージョンに様々な動作を実行してよく、その後、ディレクトリ構造ログ５３０にコミットメントするためにトランザクションログストレージ２１０への書き込み５２４を行い、これには、書き込み要求の実行によって影響されるか、またはアクセスされるデータ、書き込み要求自体及びストレージノード５２２での階層型データ構造の現在のバージョンの時点を識別する他の指標のトランザクションシーケンス番号など、様々な情報が含まれる。コミットメント５２６または競合の指示は、それぞれのストレージノード５２２に提供されてよい。コミットされる書き込みでは、（図１３に関して後述の通り）ディレクトリ構造ログが読み取られ、コミットされた書き込みがストレージノード５２２に維持されている階層型データ構造のそれぞれのバージョンに適用５３２されてよい。
【００３３】
いくつかの実施形態では、アーカイブ管理２３６は、ディレクトリ構造ログ５３０をさらに読み取って、アーカイブトランザクションまたはスナップショットとしての送信用に書き込み５３４を取得してよい。アーカイブ管理２３６は、その後、アーカイブストレージサービス２７０のアーカイブログ５４０を周期的または非周期的に更新し５４２、アーカイブスナップショット５５０の一部として維持される新しいスナップショット５５２を生成し送信してよい。このように、階層型データ構造は、例えば、スナップショットをストレージノードにロードし、アーカイブログ５４０からトランザクションを適用して特定のトランザクションシーケンス番号に到達することによって、任意の時点で再作成することができ、これによって、ストレージ番号での階層型データ構造のバージョンは特定の時点と一貫性を有する。
【００３４】
図６は、いくつかの実施形態による、トランザクションログストレージを利用した直列化可能分離によるアクセス要求の処理を例示するシーケンス図である。図７〜図１１で説明する階層型ストレージノード６２０及び他のストレージノードは、インタフェース６００を実装してクライアントからの要求を処理してよい。様々な実施形態では、インタフェース６００は、コマンドライン、グラフィカルユーザインタフェースまたはクライアント６１０における他のインタフェース制御／生成構成要素によって呼び出され得るプログラムインタフェース（ＡＰＩ）であってよい。直列化可能アクセス要求６３０は、階層型デ
ータストアのデータを変更するアクセス要求などの要求であってよく、または階層型データ構造のために分散データストア全体にわたって一貫したバージョンからデータを読み取る要求が実行される。要求６３０は、実行する特定の動作（例えば、読み取りまたは書き込み動作）を含んでよい。一旦受信すると、階層型ストレージノード６２０は階層型データ構造の識別されたバージョン（例えば、現在のバージョン）にアクセスし、動作を実行するために階層型データ構造に行う正確な変更を決定してよく、これには、読み取られたか、または変更されたノード、リンク、属性など、アクセス（読み取り）及び／または影響を受けた（書き込み）データが含まれる。階層型ストレージノード６２０はその後、競合検証要求６４０を作成して審査のためにトランザクションログストレージ２５０に送信し、競合検証要求６４０には、アクセスされた／影響を受けたデータ、指定の動作及び階層型ストレージノード６２０において最後に適用された階層型データ構造のトランザクション番号が含まれる。
【００３５】
トランザクションログストレージ２５０は、競合分析を実行して、競合検証要求６４０の予定トランザクションが、トランザクションログのコミットされたトランザクションと競合することなく実行され得るかどうかを判定してよい。競合トランザクションは、トランザクションの完了及びコミットメント（例えば、楽観的並行性）の前に、トランザクションの推定状態（例えば、トランザクションを実行するために読み取られ、使用されるデータ）が別のトランザクションによって変更されるときに起こり得る。競合検証指示６５０は、トランザクションがコミットされた（または競合していたため拒否された）かどうかを示すために、トランザクションログストレージ２１０によって階層型ストレージノード６２０に提供されてよい。階層型ストレージノード６２０は、コミットの肯定応答（及びトランザクションのトランザクションシーケンス番号を示すトランザクション番号トークン）または要求６６０の例外もしくは拒否を渡してよい。
【００３６】
図７は、いくつかの実施形態による、ストレージノードに維持された階層型データ構造のバージョンを利用したスナップショット分離によるアクセス要求の処理を例示するシーケンス図である。スナップショット読み取り要求では、トランザクションログストレージへのアクセスは実行されない。代わりに、階層型データ構造の最新または現在のバージョンにアクセスし、読み取り要求を処理する。クライアント７１０は、スナップショット読み取り要求７３０を階層型ストレージノード７２０に送信してよい。階層型ストレージノード７２０は、要求がスナップショット読み取りであることを識別し、階層型データ構造の現在のバージョンを利用して、要求の処理を行ってよい。その後、階層型ストレージノード７２０は、読み取り要求の結果を示す読み取り応答７４０を送信してよい。
【００３７】
図８は、いくつかの実施形態による、トランザクションログストレージを利用した直列化可能分離による条件付きのアクセス要求の処理を例示するシーケンス図である。いくつかの例では、アクセス要求は、階層型データストアの条件が満たされたことを前提としてよい。例えば、予期される条件は、ストレージノード上の階層型データ構造が進んだ特定の時点（論理時間）またはポイント（例えば、最後に適用されたシーケンス番号がＸより大きい場合）を識別してよい。別の例では、予期される条件は、階層型データ構造のノード、属性などの予期されるデータ値（複数可）に基づいてよい。予期される条件は、階層ストレージノード８２０に送信された条件付きアクセス要求８３０の一部として、指定された動作（例えば、読み取りまたは書き込み）と共に含まれてよい。階層型ストレージノード８２０は、その条件を審査してよく、条件を満たす場合、アクセスデータ、指定の動作及び階層型ストレージノード８２０において階層型データ構造の最後に適用されたトランザクション番号を含む競合検証要求８４０をトランザクションログストレージ２５０に送信することによって、図６で上述した直列化可能なアクセス要求に類似するアクセス要求の処理に進む。トランザクションログストレージ２５０はその後、コミットするか、または競合検証指示８５０のトランザクションと競合したため拒否してよい。階層型ストレ
ージノード８２０は、その後、要求の肯定応答または拒否及びトランザクション番号トークンを示すアクセス要求応答８６０を送信してよい。応答８６０はまた、条件の失敗を示す（例えば、階層型データ構造が条件を満たさなかったこと）を示すように送信されてよい。
【００３８】
図９は、いくつかの実施形態による、トランザクションログストレージを利用した直列化可能分離によるバッチアクセス要求の処理を例示するシーケンス図である。いくつかのシナリオでは、階層型データ構造に対して大規模な変更を行うために（例えば、移動して階層型データ構造内のサブツリーを再調整または再構成する）、同じタイプまたは異なるタイプの複数の動作（例えば、読み取り動作、書き込み動作または読み取り動作及び書き込み動作）を実行してよい。図９に示す通り、クライアント９１０は、指定された動作を伴うバッチアクセス要求９３０を送信して、コミットまたは失敗を一緒に行ってよい。例えば、バッチアクセス要求９３０は、階層型データ構造内に異なるノードを作成するための複数の要求を含んでよい。少なくともいくつかの実施形態では、バッチアクセス要求９３０の動作の実行は、バッチアクセス要求の別の動作の実行が実行順に成功することに依存してよい。例えば、バッチアクセス要求９３０は、３つのノードを作成する動作及び３つのノードをまとめて接続またはリンクする他の動作を含んでよい。接続動作は、作成動作の成功に依存し得る（失敗すると、接続動作も失敗する）。別の例では、１つ以上の動作の結果として生成されたデータ（例えば、ノードの作成に関する識別子または他のメタデータ）を他の動作（複数可）への入力として使用してよい。バッチ要求における他の動作の結果に依存する様々な他の動作が含まれてよく、したがって、前述の例は限定を意図するものではない。階層ストレージノード９２０は、複数の動作、影響を受けた／アクセスされたデータ（例えば、リソースノード、ディレクトリノード、リンクなど）及び階層型ストレージノード９２０において階層型データ構造の現在のバージョンの最後に適用されたトランザクション番号を含む競合検証要求９４０を送信してよい。トランザクションログストレージ２５０は、動作のセット全体に競合検証を実行し、競合検証指示９５０の動作セット全体をコミットするか、または拒否してよい。階層型ストレージノード９２０は、その後、バッチ動作がコミットされて肯定応答された（トランザクション番号トークンを含む）か、または拒否されたかどうかを示すために、バッチ応答９６０をクライアント９１０に提供してよい。
【００３９】
図１０は、いくつかの実施形態による、トランザクションログストレージ及びトランザクション状態トークンを利用した直列化可能分離によるクライアント固有のトランザクション要求の処理を例示するシーケンス図である。単一のバッチに類似する動作をグループ化する代わりに、クライアント指定のトランザクションを実行し、要求を終わりまでコミットする必要なく、クライアントが同じトランザクションの一部として複数のアクセス要求を実行できるようにしてよい。このようにして、アクセス要求のすべてが所望どおりに実行されない場合にはトランザクションが中止できるよう（図示せず）、様々な偶発的シナリオまたは条件的シナリオが考慮され得る。さらに、（例えば、スティッキーセッションなしで）いずれのストレージノードもクライアント指定のトランザクションを処理する必要がないように、トランザクション状態をクライアントから階層型ストレージノードに渡してよいが、その作業は複数の階層型ストレージノードに分散することができる。例えば、クライアント１０１０は、複数の初期動作を含むトランザクションを開始する要求１０４０を、階層型ストレージノード１０２０に送信してよい。階層型ストレージノード１０２０は、初期動作を実行し、結果をトランザクションステージ１０５０の形態で返してよい。
【００４０】
クライアント１０１０は、その後、トランザクション状態１０５０を審査して、次のステップを決定してよい。例えば、トランザクション状態１０５０は、階層型データ構造から読み取られたデータを含んでよく、これはクライアント１０１０が予期する状態または
所望する状態であってもなくてもよい。当該状態である場合、クライアント１０６０はトランザクションをコミットして進み、（トランザクション状態情報１０５０から生成された）トランザクション状態トークン及び（必要に応じて）追加の動作を含むコミットトランザクション要求１０６０を含んでよい。トランザクション状態トークンは、トランザクションを実行するための別のストレージノードからの必要な情報をすべて含んでいるため、均等に分散された要求に対するロードバランシング技法を実装してよく、コミットトランザクション要求１０６０を階層型ストレージノード１０３０に送ってよい。階層型ストレージノード１０３０は、その後、競合検証要求１０７０を生成し、競合審査のためにトランザクションログストレージ２５０に送信する。トランザクション状態トークンは、トランザクションが階層型ストレージノード１０２０で開始した時点の階層型データ構造のトランザクションシーケンス番号を含んでよく、競合検証要求のトランザクション開始番号（例えば、トランザクションシーケンス番号）を含んでよい。トランザクションストレージログ２１０は、その後、競合検証指示１０８０を階層型ストレージノード１０３０に送信してよく、これは、次に、応答１０９０においてトランザクションがコミットされたか、例外が発生したかを認識してよい。いくつかの実施形態では、コミットされたトランザクションのシーケンス番号を示すよう、トランザクション番号トークンを含めてよい。
【００４１】
図１１は、いくつかの実施形態による、ページネーショントークンを利用してページネーションされた結果配信によるアクセス要求の処理を例示するシーケンス図である。いくつかのシナリオでは、クエリまたはその他のアクセス要求によって生成された結果が大きすぎて単一の応答メッセージで送信することができない。個々の階層型ストレージノードを特定のクライアントと結びつけることによって、クライアントがデータを検索している間にストレージノートで状態を維持できるようにするのではなく、クライアントが単一のストレージノードでスティッキーセッションを必要することなく、任意のストレージノードから結果を検索できるようにするために、ページネーション技法を利用してよい。例えば、図１１に示す通り、クライアント１１０は、結果的に大量のデータセット（例えば、男性であるすべてのユーザノードを検索するクエリ）となる読み取り要求１１３０を、インタフェース６００を介して送信する。階層型ストレージノード１１２０がアイドル状態または結果処理状態を維持することを要求する読み取り応答のストリームを提供する代わりに、読み取り応答１１４０は、初期結果及び結果ページネーショントークンを含んでよい。結果ページネーショントークンは、検索される残りの結果及びそれらの検索方法を示してよい。いくつかの実施形態では、結果ページネーショントークンは、クライアントによって変更されて、読み取り動作を実行するために使用される整合性レベル及び／または分離レベルを変更してよく、これによって、残りの結果は整合性レベル及び／または分離レベルへの変更結果としてアクセスされた変更バージョンに従って変更されてよい。クライアント１１１０は、その後、結果ページネーショントークンを有する別の読み取り要求１１５０を、階層型ストレージノード１１２０または別の階層型ストレージノードに送信してよい。階層型ストレージノード１１２０は、その後、追加の結果を識別し、結果ページネーショントークンに提供された情報に基づいて、追加の結果を提供し、後続の応答１１６０に含めてよい。係る技法は、全体の結果セットがクライアント１１０に提供されるまで、数多く繰り返して実行する可能性がある。
【００４２】
ディレクトリストレージサービス、アクセス要求及び図２〜図１１で説明した他の技法は、クライアントの階層型データ構造を記憶し、異なるシナリオにおいて階層型データ構造の複数のバージョンへのアクセスを提供する分散型データストアの例を提供する。しかしながら、他の様々なタイプの分散型ストレージシステムは複数のバージョンの階層型データ構造を実装してよく、これは、他の数のタイプの構成要素を利用してよく、分散型データストレージを提供してよい。図１２は、いくつかの実施形態による、サービスアクセス要求に対してバージョン化された階層型データ構造を実装する方法及び技法を例示する高レベルフローチャートである。上記の実施形態を含む様々な異なる分散データストアは
、後述する技法を実装してよい。
【００４３】
１２１０に示す通り、階層型データ構造のバージョンは、分散型データストアの階層型データ構造のトランザクションログに一貫した状態で維持されてよい。例えば、異なる数のストレージノードは、階層型データ構造のローカルコピーまたは複製を、複製グループまたは保護グループの一部として単独で維持してよい。各ストレージノードは、同じまたは異なるバージョンの階層型データ構造を維持してよい。いくつかの実施形態では、ストレージノードは、各ストレージノードが任意の他のストレージノードで実行された階層型データ構造への更新と最終的に一貫性を有し得ることを保証する、最終的に一貫性を有する整合性モデルを実装してよい。例えば、階層型データ構造のトランザクションログは、一貫性メカニズム、順序付けトランザクション及び分離トランザクションとして機能してよく、これによって、競合トランザクションが禁止される（例えば、楽観的並行性を利用する）。いくつかの実施形態では、競合していないと示されたトランザクションはトランザクションログにコミットされ、送信側のストレージノードにコミットされた点として報告される。いくつかの実施形態では、ストレージノードは、その後、トランザクションを適用してよく、他の実施形態では、図１３に関して後述の通り、ストレージノードはトランザクションを後で適用してよい。
【００４４】
経時的に、ストレージノードは、トランザクションログに関して異なる時点（例えば、論理時間）に対応する多数の異なるバージョンを取得してよい。したがって、１２２０に示す通り、階層型データ構造に送られるアクセス要求が受信される場合、アクセス要求を処理するために、バージョンの１つを選択する必要があり得る。多数の異なるタイプのアクセス要求が受信されてよい。例えば、いくつかのアクセス要求は、特定のデータ、属性、値または階層型データ構造によって記憶もしくは表現される他の情報（例えば、インデックス属性を利用することによって実行され得るクエリ、またはリソースなどの特定のノードへのディレクトリパスを決定するためのクエリ）を取得するクエリまたは他の読み取り要求であってよい。図６〜図１１に関して上述した通り、アクセス要求は、条件付きのトランザクションまたはバッチであってよく、アクセス要求を処理するときに実行する特定の分離レベル（例えば、直列化可能またはスナップショット）を指定してよい。アクセス要求は、明示的に（例えば、トランザクションシーケンス番号またはトークンを含むことによって）またはアクセス要求のタイプを基に暗示的に（例えば、スナップショット読み取りはストレージノードにおける現在のバージョンを利用する）、利用する階層型データ構造のバージョンを識別してよい。ゆえに、１２３０に示す通り、要求を処理する階層型データ構造のバージョンのうちの１つが識別されてよい。
【００４５】
要求は、１２４０に示す通り、要求を処理するときに実行する分離レベル及び／または整合性レベルを示してよい。例えば、要求のタイプは、（例えば、特定の種類のクエリまたは検索動作を要求することによる）スナップショット分離を示してよい。スナップショット分離が示される場合、１２７０から肯定終了することによって示される通り、アクセス要求は、トランザクションログを呼び出すことなく、階層型データ構造の識別されたバージョンを利用して処理してよい。このように、古くなった可能性がわずかにある（ただし、依然として一貫性のある）データが許容可能である一部のアクセス要求では、さらなるネットワーク通信を行うことなく、高速に実行するローカル動作を利用可能であってよい。少なくともいくつかの実施形態では、スナップショット分離要求の識別されたバージョンは、要求の高速処理を実行するためにメモリに維持されてよい。いくつかの実施形態では、要求は、階層型データ構造の個々の部分のダーティーリードまたは一貫性のない読み取りが許容可能であることを示してよく、これは、スナップショット分離よりも低い分離レベルを示す。いくつかの実施形態では、要求は（例えば、トランザクションシーケンス番号を含むことによる）スナップショット分離とは異なる分離レベルを提供する特定の時点を示してよい。分離及び一貫性ならびに整合性レベルの様々な組み合わせは、クライ
アントによって指定されてよく、したがって、前述の例は限定を意図するものではない。
【００４６】
１２４０から否定終了することによって示される通り、スナップショット分離が示されていない場合、トランザクションログを利用して直列化可能分離を実施してよい。いくつかの実施形態では、要求が明示的に（または暗示的に）適切な分離レベルを呼び出す必要があり得、ゆえに、（図１３に示す通り）示されたスナップショット分離を伴わないアクセス要求が常に直列化可能分離で処理されないことがあることに留意されたい。１２１０に示す通り、アクセス要求に基づく新しいトランザクションをトランザクションログに送信してよい。例えば、影響を受けるノード、オブジェクト及び／またはトランザクションの変化を説明する他の情報を提供してよく、これによって、競合検出を実行してよい。トランザクションログは、競合検出分析を実行して、トランザクションが既にコミットされたトランザクションと競合するかどうかを判定してよい。競合する場合、１２６０から肯定終了することによって示され、１２８０で示される通り、アクセス要求を送信したクライアントに例外、拒否または他のエラー指示が返されてよい。いくつかの実施形態では、例外は、競合（特定のリソースノードに対する変更など、特に競合する動作を含む）を示してよい。しかしながら、１２６０から否定終了することによって示される通り、トランザクションが競合しない場合、コミットされた指示が新しいトランザクションに対して提供されている。コミットメント確認応答は、トランザクションログ内のトランザクションの位置を示すシーケンス番号を含んでよい。要求の処理の一部として、アクセス要求は、１２７０に示す通り、識別されたバージョンを利用してよい。読み取り動作では、これは、識別されたバージョンに見つかったデータを送信することを含んでよい。書き込み動作では、アクセス要求を処理することは、書き込み動作がコミットされたという確認応答を提供することを含んでよい。
【００４７】
図１３は、いくつかの実施形態による、階層型データ構造のトランザクションログと一貫性のあるストレージノードにおいて階層型データ構造の維持バージョンを実装する方法及び技法を例示する高レベルフローチャートである。１３１０に示す通り、様々な実施形態では、階層型データ構造のトランザクションログを読み取ってよい。例えば、トランザクションログへのアクセス要求は、ストレージノードにおける階層型データ構造の現在のバージョンに適用された最新のトランザクションを識別するトランザクションシーケンス番号で開始して実行されてよい。１３２０に示す通り、階層型データ構造の適用されていないトランザクション（複数可）を識別してよい。例えば、（例えば、より大きいトランザクションシーケンス番号を有するトランザクション）よりも最近コミットされたトランザクションは、トランザクションログから識別され取得されてよい。
【００４８】
１３３０に示す通り、識別されたトランザクションは、その後、ストレージノードにおける階層型データ構造の現在のバージョンに適用されてよい。例えば、トランザクションは、トランザクションの一部として実行された変更（リソース、ディレクトリ、属性、リンク、または階層型データ構造の他の部分を追加、削除、移動または変更する動作など）を記述してよい。変更されたオブジェクトを維持する／記述するキーバリューまたは他のストアの対応するエントリは、変更を反映するように（例えば、オブジェクトに追加の属性を追加すること、属性値を変更すること、新しい属性を追加することなどによって）更新されてよい。識別された変更が完了すると、その後、いくつかの実施形態では、適用されたトランザクションに対応するトランザクションシーケンス番号を、メタデータまたは階層型データ構造のバージョンを示す他の情報に記録してよい（例えば、記憶されたシーケンス番号をより大きいトランザクションシーケンス番号まで増加する）。
【００４９】
１３４０に示す通り、いくつかの実施形態では、階層型データ構造の過去のバージョン情報を更新して、階層型トランザクションの結果として適用される変更を記述してよい。このようにして、（トランザクションの適用前に）階層型データ構造の以前のバージョン
の生成、アクセス、推定、再構成などを行うことができる。例えば、図３及び図４に関して上述の通り、階層型データ構造の過去のデータストアは、階層型データ構造の現在のバージョンに記憶されているオブジェクトの以前のバージョンを記憶するキーバリューストアとして表現されてよい。以前のバージョンオブジェクトは、現在のオブジェクトバージョンに対する以前のオブジェクトバージョンを識別するための、バージョン番号とともにトランザクションによって変更されたオブジェクトのコピーであってよい。以前のオブジェクトバージョンへのポインタ、リンクまたはインデックス値が、現在のオブジェクトバージョンに含まれてよい。同様に、直近のオブジェクトバージョンよりも古いオブジェクトバージョンへのポインタ、リンクまたはインデックス、元のバージョンに到達し得るまで追跡され得る一連のオブジェクトバージョンの作成。
【００５０】
１３４０からのループバック矢印（及び１３２０からの否定終了）によって示される通り、トランザクションログは、記憶ノード上で維持される階層型データ構造のバージョンが最終的にトランザクションログに一貫していることを確実にするために、複数回にわたり審査されてよい。例えば、トランザクションログの読み取りは周期的に実行されてよいか、またはイベントが発生した場合（例えば、ストレージノードでの番号アクセス要求の処理）に実行されてよい。
【００５１】
本明細書で説明される方法は、様々な実施形態において、ハードウェアとソフトウェアの任意の組み合わせによって実施されてよい。例えば、一実施形態では、方法は、プロセッサに結合されたコンピュータ可読記憶媒体に記憶されたプログラム命令を実行する１つ以上のプロセッサを含むコンピュータシステム（例えば、図１４のコンピュータシステム）によって実装されてよい。プログラム命令は、本明細書で記載される機能性（例えば、本明細書に記載されるディレクトリストレージサービス及び／またはストレージサービス／システムを実装する様々なサーバ及び他の構成要素の機能性）を実装するように構成されてよい。図面に図示され、本明細書に記載される様々な方法は、方法の実施形態例を表す。任意の方法の順序は変更されてもよく、様々な要素が追加され、並べ替えられ、組み合わされ、省略され、変更されてもよい。
【００５２】
さらに、本開示の実施形態は、以下の条項を考慮して説明することができる。
【００５３】
１．プロセッサ及びメモリを備える複数のストレージノードであって、階層型データ構造のそれぞれのバージョンを前記階層型データ構造のトランザクションログに一貫した状態で記憶する、複数のストレージノードと、
前記階層型データ構造のトランザクションログを維持するトランザクションログストアとを備えるシステムであって、前記ストレージノードのそれぞれは、
前記階層型データ構造の一部として記憶される指定データの読み取り要求をクライアントから受信し、
前記ストレージノードに維持される前記階層型データ構造のそれぞれのバージョンのうちの１つを前記読み取り要求の処理のために識別し、
前記識別されたバージョンに含まれる前記指定データを記憶する前記ストレージノードにおける１つ以上の位置にアクセスして、前記指定データを取得し、
前記識別されたバージョンに含まれる前記指定データを前記クライアントに戻す
ように構成される、システム。
【００５４】
２．前記ストレージノードのそれぞれはさらに、
前記階層型データ構造に送られる書き込み要求を別のクライアントから受信し、
前記ストレージノードに維持される前記階層型データ構造の前記それぞれのバージョンのうちの１つを前記読み取り要求の処理のために識別し、
前記ストレージノードにおける前記階層型データ構造の前記識別されたバージョンに関
する前記書き込み要求を実行し、
前記書き込み要求を基に、前記階層型データ構造の前記トランザクションログストアにトランザクションを送信し、前記トランザクションは前記階層型データ構造の前記識別されたバージョンを示し、
前記トランザクションが前記階層型データ構造の前記トランザクションログにコミットされているという指示を前記トランザクションログストアから受信することに応じて、前記書き込み要求の確認応答を他のクライアントに送信するように構成される、条項１に記載のシステム。
【００５５】
３．前記ストレージノードのそれぞれはさらに、
前記トランザクションログストアから前記トランザクションを取得し、
前記ストレージノードに維持される前記階層型データ構造の現在のバージョンに前記トランザクションを適用し、
前記ストレージノードに維持される前記階層型データ構造の過去のバージョンデータを更新し、前記トランザクションの結果として前記階層型データ構造に適用された変更を表すように構成される、条項２に記載のシステム。
【００５６】
４．前記システムはネットワークベースディレクトリサービスであって、前記クライアントは前記ネットワークベースディレクトリサービスのクライアントであり、前記ストレージノードは前記ネットワークベースディレクトリサービスの１つ以上の他のクライアントの代わりに１つ以上の他の階層型データ構造を記憶するマルチテナントであり、前記階層型データ構造の前記識別されたバージョンは前記ストレージノードのメモリに維持される、条項１に記載のシステム。
【００５７】
５．１つ以上のコンピューティングデバイスによって、
分散型データストアの一部として維持される階層型データ構造に送られるアクセス要求をクライアントから受信することと、
前記アクセス要求を処理するために前記階層型データ構造の複数のバージョンのうちの１つを識別することであって、前記階層型データ構造の複数のバージョンは、前記階層型データ構造にコミットされた変更を表す前記階層型データ構造のトランザクションログと一貫性した状態で前記分散型データストアに維持される、識別することと、
前記階層型データ構造の前記識別されたバージョンを利用する前記アクセス要求を処理することと
を実行することを備える、方法。
【００５８】
６．前記受信、前記識別及び前記アクセス要求の処理は前記分散型データストアの前記階層型データ構造のバージョンを記憶する複数のストレージノードのうちの１つによって実行され、
前記方法はさらに、
前記アクセス要求を受信する前に、
前記１つのストレージノードによって、前記トランザクションログから１つ以上のトランザクションを読み取ることであって、前記トランザクションログへの１つ以上の前記トランザクションは前記複数のストレージノードのうちの異なる１つによって前記トランザクションログに送信される、前記読み取ることと、
前記１つのストレージノードによって、前記１つのストレージノードに維持される前記階層型データ構造の現在のバージョンに前記１つ以上のトランザクションを適用することとを備え、
前記階層型データ構造の前記識別されたバージョンは前記１つ以上のトランザクションを含む、条項５に記載の方法。
【００５９】
７．前記方法はさらに、前記アクセス要求を基に、前記階層型データ構造の前記トランザクションログにトランザクションを送信することであって、前記トランザクションは前記階層型データ構造の前記識別されたバージョンを示し、
前記アクセス要求の処理は、前記トランザクションが前記階層型データ構造に対して前記トランザクションログからコミットされるという指示を受信することに応じて実行され、
前記アクセス要求の処理は、前記アクセス要求の確認応答を前記クライアントに送信することを備える、条項５に記載の方法。
【００６０】
８．前記アクセス要求は前記階層型データ構造の異なるそれぞれのノードに関して実行される複数の動作の実行を指示し、前記トランザクションログに送信される前記トランザクションは前記複数の動作を含み、前記トランザクションがコミットされるという前記指示は、前記複数の動作がコミットされることを示す、条項７に記載の方法。
【００６１】
９．前記複数の動作の少なくとも１つは、実行される前記アクセス要求の前記複数の動作のうちの別の１つの成功に依存する、条項８に記載の方法。
【００６２】
１０．前記アクセス要求は、前記アクセス要求を処理するために指定された分離レベルまたは指定された整合性レベルのうちの少なくとも１つを含み、前記アクセス要求の処理は少なくとも１つの指定された分離レベルまたは指定された整合性レベルに従って実行される、条項５に記載の方法。
【００６３】
１１．前記受信、前記識別及び前記アクセス要求の前記処理は前記分散型データストアの前記階層型データ構造のバージョンを記憶する複数のストレージノードのうちの１つによって実行され、
前記アクセス要求は読み取り要求であって、
前記アクセス要求の処理は、前記１つのストレージノードから、前記読み取り要求及びページネーショントークンを提供するために生成された結果の一部を前記クライアントに送信することを備え、前記ページネーショントークンは前記クライアントに送信される残りの前記結果を示し、
前記方法はさらに、
前記ストレージノードのうちの異なる１つにおいて、別の読み取り要求を前記クライアントから受信することであって、他の読み取り要求は前記ページネーショントークンを含む、前記受信することと、
異なるストレージノードにおいて他の読み取り要求を受信することに応じて、前記ページネーショントークンに示される通り、他の読み取り要求の残りの結果のうちの追加の結果を前記クライアントに送信することとを備える、条項５に記載の方法。
【００６４】
１２．前記アクセス要求は前記アクセス要求を処理するためのスナップショット分離を指定し、前記方法はさらに、
前記アクセス要求がスナップショット分離に従って処理されることを決定することを備え、
前記アクセス要求の処理は、アクセス要求がスナップショット分離に従って処理されることを決定することに応じて実行される、
条項５に記載の方法。
【００６５】
１３．前記受信、前記識別及び前記アクセス要求の前記処理は前記分散型データストアの前記階層型データ構造のバージョンを記憶する複数のストレージノードのうちの１つによって実行され、
前記アクセス要求はトランザクション及び１つ以上の動作の開始を示し、
前記アクセス要求の処理は、前記１つのストレージノードから、前記１つ以上の動作の実行及びトランザクション状態トークンを前記クライアントに送信することを備え、前記トランザクション状態トークンは前記１つ以上の動作の結果として前記階層型データ構造の前記識別されたバージョンに適応される変更を示し、
前記方法はさらに、
前記ストレージノードのうちの異なる１つにおいて、前記トランザクションの一部として前記クライアントから実行される１つ以上の追加の動作を含む別のアクセス要求を受信することであって、他のアクセス要求は前記トランザクション状態トークンを含み、他のアクセス要求は前記トランザクションがコミットされることを示す、前記受信することと、
異なるストレージノードにおいて、他のアクセス要求を受信することに応じて、
前記トランザクション状態トークンで示される前記変更に従って、異なるストレージノードにおいて、前記階層型データ構造の識別されたバージョンを前記変更することと、
前記階層型データ構造の前記変更されたバージョンに関する前記１つ以上の追加の動作を実行することと、
前記トランザクションを前記階層型データ構造の前記トランザクションログに送信することと、
前記トランザクションが前記階層型データ構造に対して前記トランザクションログからコミットされるという指示を受信することと、
前記トランザクションが前記トランザクションログからコミットされるという前記指示を受信することに応じて、前記アクセス要求の確認応答を前記クライアントに送信することとを備える、条項５に記載の方法。
【００６６】
１４．１つ以上のコンピューティングデバイスによって実行されると、前記１つ以上のコンピューティングデバイスに、
前記階層型データ構造にコミットされた変更を表す前記階層型データ構造のトランザクションログと一貫性した状態で、分散型データストアの複数のストレージノードにおいて、階層型データ構造のそれぞれのバージョンを維持することと、
前記ストレージノードのうちの１つにおいて、前記階層型データ構造に送られるアクセス要求を受信することと、
前記１つのストレージノードに維持される前記階層型データ構造のそれぞれのバージョンのうちの１つを前記アクセス要求の処理のために識別することと、
前記階層型データ構造の前記識別されたバージョンを利用する前記アクセス要求を処理することと
を実施させるプログラム命令を記憶する、非一時的なコンピュータ可読記憶媒体。
【００６７】
１５．前記プログラム命令は、前記１つ以上のコンピューティングデバイスに、さらに、
前記アクセス要求を基に、前記ストレージノードから、前記階層型データ構造の前記トランザクションログにトランザクションを送信することを実施させ、前記トランザクションは前記階層型データ構造の前記識別されたバージョンを示す、前記送信することと、
前記アクセス要求の処理は、前記トランザクションが前記階層型データ構造に対して前記トランザクションログからコミットされるという指示を受信することに応じて実行され、
前記アクセス要求の処理では、前記プログラム命令は前記１つ以上のコンピューティングデバイスに前記アクセス要求の確認応答を送信させる、条項１４に記載の非一時的なコンピュータ可読記憶媒体。
【００６８】
１６．前記プログラム命令は前記１つ以上のコンピューティングデバイスに、さらに、
前記複数のストレージノードにおいて前記トランザクションをそれぞれ取得することと
、
前記ストレージノードに維持される前記階層型データ構造のそれぞれの現在のバージョンに前記トランザクションを適用することと、
前記ストレージノードに維持される前記階層型データ構造のそれぞれの過去のバージョンデータを更新し、前記トランザクションの結果として前記階層型データ構造に適用された変更を表すことと
を実施させる、条項１５に記載の非一時的なコンピュータ可読記憶媒体。
【００６９】
１７．プログラム命令は１つ以上のコンピューティングデバイスに、さらに、
リモートデータストアに記憶された前記トランザクションログのアーカイブバージョンに前記トランザクションログをコピーすることと、
前記リモートトランザクションログからの１つ以上のトランザクションを、前記複数のストレージノードのうちの１つにある前記階層型データ構造のバージョンに適用し、指定の時点における前記階層型データ構造のバージョンを生成することと
を実施させる、条項１４に記載の非一時的なコンピュータ可読記憶媒体。
【００７０】
１８．前記アクセス要求は、前記階層型データ構造の予期される条件を備え、
前記プログラム命令は、前記１つ以上のコンピューティングデバイスに、さらに、前記階層型データ構造の前記識別されたバージョンに関して予期される条件を査定し、前記予期された条件が満たされていることを判定することを実施させ、
前記トランザクションを前記トランザクションログに送信することは、前記予期された条件が満たされていると判定することに応じて実行され、満たされていないと判定される予期される条件を含むアクセス要求は拒否される、条項１５に記載の非一時的なコンピュータ可読記憶媒体。
【００７１】
１９．前記アクセス要求は読み取り要求を備え、前記識別されたバージョンは前記階層型データ構造の現在のバージョンではなく、前記アクセス要求を処理する場合に、前記プログラム命令は前記１つ以上のコンピューティングデバイスに、前記階層型データ構造の過去のバージョンデータにアクセスして前記階層型データ構造の１つ以上のノードの以前のバージョンを読み取ることを実施させる、条項１４に記載の非一時的なコンピュータ可読記憶媒体。
【００７２】
２０．前記分散型データストアは、前記ネットワークベースストレージサービスに異なるアクセス要求に対する複数の異なるサービスレベル規定を提供するネットワークベースストレージサービスであって、前記プログラム命令は前記１つ以上のコンピューティングデバイスに、さらに、前記アクセス要求を処理するために識別された異なるサービスレベル規定のうちの１つに従って、前記ストレージノードへの前記アクセス要求のル―ティングを実施させ、前記ストレージノードは、識別されたサービスレベル規定に従って前記アクセス要求を処理するように構成される、条項１４に記載の非一時的なコンピュータ可読記憶媒体。
【００７３】
図１４は、様々な実施形態に係る、バージョン化された階層型データ構造を提供する分散型データストアを実装するように構成されるコンピュータシステムならびに上記の様々な他のシステム、構成要素、サービスまたはデバイスを例示するブロック図である。例えば、コンピュータシステム２０００は、異なる実施形態では、階層型データ構造のバージョンを維持する階層型ストレージノードまたは階層型データ構造のトランザクションログを維持するトランザクションログストアの構成要素を実装するように構成され得る。コンピュータシステム２０００は、パーソナルコンピュータシステム、デスクトップコンピュータ、ラップトップコンピュータもしくはノートブックコンピュータ、メインフレームコンピュータシステム、ハンドヘルドコンピュータ、ワークステーション、ネットワークコ
ンピュータ、コンシューマデバイス、アプリケーションサーバ、ストレージデバイス、電話、携帯電話、または一般的な任意のタイプのコンピューティングデバイスを含む様々なタイプのデバイスのいずれでもあってよいが、これらに限定されない。
【００７４】
コンピュータシステム２０００は、入出力（Ｉ／Ｏ）インタフェース２０３０を介してシステムメモリ２０２０に連結された１つ以上のプロセッサ２０１０を含む（これらのプロセッサはいずれも複数のコアを含んでよく、それらのコアはシングルスレッド方式でもマルチスレッド方式でもよい）。コンピュータシステム２０００は、Ｉ／Ｏインタフェース２０３０に連結されたネットワークインターフェース２０４０をさらに含む。様々な実施形態では、コンピュータシステム２０００は、１つのプロセッサ２０１０を含むユニプロセッサシステム、またはいくつかのプロセッサ２０１０（例えば、２個、４個、８個もしくは他の好適な数）を含むマルチプロセッサシステムであってよい。プロセッサ２０１０は、命令を実行可能な任意の好適なプロセッサであってよい。例えば、様々な実施形態では、プロセッサ２０１０は、ｘ８６、ＰｏｗｅｒＰＣ、ＳＰＡＲＣもしくはＭＩＰＳのＩＳＡまたはその他の好適なＩＳＡなどの種々の命令セットアーキテクチャ（ＩＳＡ）のいずれかを実装する汎用プロセッサまたは組み込みプロセッサであってよい。マルチプロセッサシステムでは、プロセッサ２０１０のそれぞれは、通常は同じＩＳＡを実装し得るが、必ずしもそのように実装されるとは限らない。コンピュータシステム２０００は、１つ以上のネットワーク通信デバイス（例えば、ネットワークインターフェース２０４０）をさらに含み、通信ネットワーク（例えば、インターネット、ＬＡＮなど）を介して他のシステム及び／または構成要素と通信する。例えば、システム２０００上で実行されるクライアントアプリケーションは、ネットワークインターフェース２０４０を使用して、本明細書に記載したディレクトリストレージシステムの構成要素の１つ以上を実装する単一のサーバまたはサーバのクラスタ上で実行するサーバアプリケーションと通信してよい。別の例では、コンピュータシステム２０００上で実行するサーバアプリケーションのインスタンスは、ネットワークインターフェース２０４０を使用して、他のコンピュータシステム（例えば、コンピュータシステム２０９０）上に実装され得るサーバアプリケーション（または別のサーバアプリケーション）の他のインスタンスと通信してよい。
【００７５】
例示した実施形態では、コンピュータシステム２０００は、１つ以上の永続ストレージデバイス２０６０及び／または１つ以上のＩ／Ｏデバイス２０８０をさらに含む。様々な実施形態では、永続ストレージデバイス２０６０は、ディスクドライブ、テープドライブ、ソリッドステートメモリ、他の大容量ストレージデバイスまたはその他の永続ストレージデバイスに対応し得る。コンピュータシステム２０００（または分散アプリケーションもしくはそのシステム上で動作するオペレーティングシステム）は、所望により、命令及び／またはデータを永続ストレージデバイス２０６０に記憶してよく、記憶された命令及び／またはデータを必要に応じて検索してよい。例えば、いくつかの実施形態では、コンピュータシステム２０００は、ストレージシステムサーバノードをホストしてよく、永続ストレージ２０６０は、そのサーバノードに取り付けられたＳＳＤを含んでよい。
【００７６】
コンピュータシステム２０００は、１つ以上のシステムメモリ２０２０を含み、これらのメモリは、プロセッサ２０１０（複数可）によりアクセス可能な命令及びデータを記憶するように構成される。様々な実施形態では、システムメモリ２０２０は、任意の好適なメモリ技術（例えば、１つ以上のキャッシュ、スタティックランダムアクセスメモリ（ＳＲＡＭ）、ＤＲＡＭ、ＲＤＲＡＭ、ＥＤＯ  ＲＡＭ、ＤＤＲ  １０  ＲＡＭ、同期式ダイナミックＲＡＭ（ＳＤＲＡＭ）、Ｒａｍｂｕｓ  ＲＡＭ、ＥＥＰＲＯＭ、不揮発性／フラッシュ型メモリまたはその他のタイプのメモリ）を使用して実装され得る。システムメモリ２０２０は、本明細書に記載された方法及び技法を実装するために、プロセッサ２０１０（複数可）により実行可能なプログラム命令２０２５を含み得る。様々な実施形態では、プログラム命令２０２５は、プラットフォームのネイティブバイナリ、Ｊａｖａ（登録
商標）バイトコードなどの任意のインタープリタ型言語、もしくはＣ／Ｃ＋＋、Ｊａｖａ（登録商標）などの任意の他の言語、またはそれらの任意の組み合わせにコード化され得る。例えば、例示した実施形態では、プログラム命令２０２５は、異なる実施形態では、階層型データ構造のバージョンを維持する階層型ストレージノードまたは階層型データ構造のトランザクションログを維持するトランザクションログストアの構成要素の機能性を実装するために実行可能なプログラム命令を含む。いくつかの実施形態では、プログラム命令２０２５は、複数の個別のクライアント、サーバノード及び／または他の構成要素を実装してよい。
【００７７】
いくつかの実施形態では、プログラム命令２０２５は、オペレーティングシステム（図示せず）を実装するために実行可能な命令を含んでよく、このオペレーティングシステムは、ＵＮＩＸ（登録商標）、ＬＩＮＵＸ、Ｓｏｌａｒｉｓ（登録商標）、ＭａｃＯＳ（登録商標）、Ｗｉｎｄｏｗｓ（登録商標）などの様々なオペレーティングシステムのいずれでもよい。プログラム命令２０２５のいずれかまたはすべては、コンピュータプログラム製品またはソフトウェアとして提供され得る。このコンピュータプログラム製品またはソフトウェアは、命令が記憶された非一時的なコンピュータ可読記憶媒体を含んでもよく、この媒体を使用してコンピュータシステム（または他の電子デバイス）をプログラムすることにより、様々な実施形態に応じたプロセスを実行してよい。非一時的なコンピュータ可読記憶媒体は、マシン（例えば、コンピュータ）により読み取り可能な形態（例えば、ソフトウェア、処理アプリケーション）で情報を記憶するための任意のメカニズムを含んでもよい。一般的に、非一時的なコンピュータアクセス可能媒体は、コンピュータ可読記憶媒体またはメモリ媒体を含み得る。このような媒体としては、磁気媒体または光学媒体、例えば、Ｉ／Ｏインタフェース２０３０を介してコンピュータシステム２０００に連結されたディスクまたはＤＶＤ／ディレクトリストレージサービス２２０−ＲＯＭなどがある。非一時的なコンピュータ可読記憶媒体は、ＲＡＭ（例えば、ＳＤＲＡＭ、ＤＤＲ  ＳＤＲＡＭ、ＲＤＲＡＭ、ＳＲＡＭなど）、ＲＯＭなどの任意の揮発性または不揮発性媒体も含み得る。これらの媒体は、コンピュータシステム２０００のいくつかの実施形態では、システムメモリ２０２０または別のタイプのメモリとして含まれ得る。他の実施形態では、プログラム命令は、ネットワークインターフェース２０４０を介して実装され得るようなネットワーク及び／または無線リンクなどの通信媒体を介して伝わる光学的、音響的または他の形態の伝搬信号（例えば、搬送波、赤外線信号、デジタル信号など）を使用して伝送され得る。
【００７８】
いくつかの実施形態では、システムメモリ２０２０は、データストア２０４５を含んでよく、このデータストアは、本明細書に記載されたように構成され得る。例えば、本明細書に記載される階層型ストレージノードまたはトランザクションログストアによって記憶される本明細書に記載される情報は、データストア２０４５または１つ以上のノード上のシステムメモリ２０２０の別の部分、永続ストレージ２０６０及び／または１つ以上のリモートストレージデバイス２０７０に異なる時期及び様々な実施形態で記憶されてよい。概して、システムメモリ２０２０（例えば、システムメモリ２０２０内のデータストア２０４５）、永続ストレージ２０６０及び／またはリモートストレージ２０７０は、データブロック、データブロックの複製、データブロック及び／またはそれらの状態に関連付けられたメタデータ、データベース構成情報、及び／または本明細書に記載された方法及び技法を実装するのに使用可能な任意の他の情報を記憶し得る。
【００７９】
一実施形態では、Ｉ／Ｏインタフェース２０３０は、ネットワークインターフェース２０４０または他の周辺インタフェースを通るものを含む、プロセッサ２０１０、システムメモリ２０２０及びシステム内の任意の周辺デバイスの間のＩ／Ｏトラフィックを調整するように構成され得る。いくつかの実施形態では、Ｉ／Ｏインタフェース２０３０は、任意の必要なプロトコル変換、タイミング変換または他のデータ変換を実行し、ある構成要
素（例えば、システムメモリ２０２０）からのデータ信号を別の構成要素（例えば、プロセッサ２０１０）による使用に好適な形式に変換し得る。いくつかの実施形態では、Ｉ／Ｏインタフェース２０３０は、例えば、ペリフェラル・コンポーネント・インターコネクト（ＰＣＩ）バス規格またはユニバーサル・シリアル・バス（ＵＳＢ）規格の変型などの様々なタイプの周辺バスを通じて取り付けられたデバイスのサポートを含み得る。いくつかの実施形態では、Ｉ／Ｏインタフェース２０３０の機能は、例えば、ノースブリッジ及びサウスブリッジなどの、２つ以上の個別の構成要素に分割され得る。さらに、いくつかの実施形態では、システムメモリ２０２０とのインタフェースなどの、Ｉ／Ｏインタフェース２０３０の機能性の一部またはすべてをプロセッサ２０１０に直接組み込んでよい。
【００８０】
ネットワークインターフェース２０４０は、例えば、コンピュータシステム２０００と、他のコンピュータシステム２０９０（このシステムは、本明細書に記載された実施形態を実装し得る）などの、ネットワークに取り付けられた他のデバイスとの間でデータを交換できるように構成され得る。加えて、ネットワークインターフェース２０４０は、コンピュータシステム２０００と、様々なＩ／Ｏデバイス２０５０及び／またはリモートストレージ２０７０との間の通信を行うことができるように構成され得る。Ｉ／Ｏデバイス２０５０は、いくつかの実施形態では、１つ以上の表示端末、キーボード、キーパッド、タッチパッド、スキャニングデバイス、音声認識デバイスもしくは光学認識デバイスまたは１つ以上のコンピュータシステム２０００によるデータの入力もしくは検索に好適なその他のデバイスを含んでよい。複数のＩ／Ｏデバイス２０５０は、コンピュータシステム２０００内に存在してよく、またはコンピュータシステム２０００を含む分散型システムの様々なノードに分散されてよい。いくつかの実施形態では、同様の入出力デバイスは、コンピュータシステム２０００から分離されてもよく、コンピュータシステム２０００を含む分散型システムの１つ以上のノードと、ネットワークインターフェース２０４０を介するような有線または無線接続を通じて相互作用してもよい。ネットワークインターフェース２０４０は、通常１つ以上の無線ネットワーキングプロトコル（例えば、Ｗｉ−Ｆｉ／ＩＥＥＥ８０２．１１または別の無線ネットワーキング規格）をサポートし得る。しかしながら、様々な実施形態では、ネットワークインターフェース２０４０は、例えば、他のタイプのイーサネット（登録商標）ネットワークなどの、任意の好適な有線または無線の一般的なデータネットワークを介した通信をサポートし得る。加えて、ネットワークインターフェース２０４０は、アナログ音声ネットワークもしくはデジタルファイバ通信ネットワークなどの電気通信ネットワーク／電話網、ファイバチャネルＳＡＮなどのストレージエリアネットワーク、またはその他の好適なタイプのネットワーク及び／またはプロトコルを介した通信をサポートし得る。様々な実施形態では、コンピュータシステム２０００は、図１４に例示した構成要素よりも多い構成要素、これよりも少ない構成要素、またはこれとは異なる構成要素（例えば、ディスプレイ、ビデオカード、オーディオカード、周辺デバイス、ＡＴＭインタフェース、イーサネットインターフェース、フレームリレーインターフェースなどの他のネットワークインターフェースなど）を含んでよい。
【００８１】
本明細書に記載された分散型システムの任意の実施形態、またはそれらの任意の構成要素は、１つ以上のネットワークベースサービスとして実装され得ることを留意されたい。例えば、データベースシステムのデータベース階層内のデータベースエンジンヘッドノードは、データベースサービス及び／または本明細書に記載した分散型ストレージシステムを利用する他のタイプのデータストレージサービスを、ネットワークベースサービスとしてクライアントに与え得る。いくつかの実施形態では、ネットワークベースサービスは、ネットワークを介して相互運用可能なマシン対マシン相互作用をサポートするように設計されたソフトウェア及び／またはハードウェアシステムにより実装され得る。ネットワークベースサービスは、Ｗｅｂサービス記述言語（ＷＳＤＬ）などの、マシンが処理可能な形式で記述されたインタフェースを有してよい。他のシステムは、ネットワークベースサービスのインタフェースを記述することにより定められる方法でネットワークベースサー
ビスと相互作用してよい。例えば、ネットワークベースサービスは、他のシステムが呼び出すことができる様々な動作を定義してよく、様々な動作を要求する際に他のシステムが適合していると見込むことができる特定のアプリケーションプログラミングインターフェース（ＡＰＩ）を定義してよい。
【００８２】
様々な実施形態において、ネットワークベースサービスは、ネットワークベースサービス要求に関連するパラメータ及び／またはデータを含むメッセージの使用を通して、要求、または呼び出され得る。係るメッセージは、拡張マークアップ言語（ＸＭＬ）等の特定のマークアップ言語に従って形式化され、及び／または簡易オブジェクトアクセスプロトコル（ＳＯＡＰ）などのプロトコルを使用してカプセル化され得る。ネットワークベースサービス要求を行うために、ネットワークベースサービスのクライアントは、要求を含むメッセージをアセンブルし、メッセージをネットワークベースサービスに対応するアドレス指定可能なエンドポイント（例えば、ユニフォームリソースロケータ（ＵＲＬ））へ、ハイパーテキストトランスファプロトコル（ＨＴＴＰ）等のインターネットベースのアプリケーション層転送プロトコルを使用して伝送し得る。
【００８３】
いくつかの実施形態において、ネットワークベースサービスは、メッセージベースの技法ではなく、リプリゼンテーショナル・ステート・トランスファ（「ＲＥＳＴｆｕｌ」）技法を使用して実施され得る。例えば、ＲＥＳＴｆｕｌ技法に従って実施されるネットワークベースサービスは、ＳＯＡＰメッセージ内にカプセル化されたパラメータではなく、ＰＵＴ、ＧＥＴまたはＤＥＬＥＴＥなどのＨＴＴＰメソッド内に含まれるパラメータを通して呼び出され得る。
【００８４】
図面に例示され本明細書に説明される様々な方法は、方法の実施形態例を表す。方法はソフトウェア、ハードウェアまたはそれらの組み合わせで手動で実装されてよい。任意の方法の順序は変更されてよく、様々な要素が追加され、並べ替えられ、組み合わされ、省略され、変更されてもよい。
【００８５】
上記の実施形態はかなり詳細に説明されているが、いったん上記開示が完全に理解されると当業者に明らかになるように、多数の変形形態及び修正形態が行われてよい。以下の請求項はすべての係る修正形態及び変更を包含し、したがって、上記の記載は制限的な意味ではなく例示的な意味としてみなされることを意図する。
【図１】
2020091902.tif 000003
【図２】
2020091902.tif 000004
【図３】
2020091902.tif 000005
【図４Ａ】
2020091902.tif 000006
【図４Ｂ】
2020091902.tif 000007
【図４Ｃ】
2020091902.tif 000008
【図５】
2020091902.tif 000009
【図６】
2020091902.tif 000010
【図７】
2020091902.tif 000011
【図８】
2020091902.tif 000012
【図９】
2020091902.tif 000013
【図１０】
2020091902.tif 000014
【図１１】
2020091902.tif 000015
【図１２】
2020091902.tif 000016
【図１３】
2020091902.tif 000017
【図１４】
2020091902.tif 000018
【手続補正書】
【提出日】令和2年3月10日(2020.3.10)
【手続補正１】
【補正対象書類名】特許請求の範囲
【補正対象項目名】全文
【補正方法】変更
【補正の内容】
【特許請求の範囲】
【請求項１】
プロセッサ及びメモリを備える複数のストレージノードであって、階層型データ構造のそれぞれのバージョンを前記階層型データ構造のトランザクションログに一貫した状態で記憶する、前記複数のストレージノードと、
前記階層型データ構造のトランザクションログを維持するトランザクションログストアと、を備えるシステムであって、
前記ストレージノードの１つは、
他の１つの階層型ストレージノードによって実行される１つ以上の以前の動作に基づいて、前記階層型ストレージノードの別の１つによって生成されるトランザクション状態を含む階層型データ構造に対して、トランザクションをコミットするための要求を受信し、
前記トランザクションログストアから、前記１つ以上の以前の動作を含むトランザクションに対する競合検証を要求し、且つ、
トランザクションログストアから受信される前記競合検証に基づいて、前記トランザクションが競合しないことに応じて、前記トランザクションが前記階層型データ構造に対してコミットされたことを承認する応答を前記要求に対して返す、
ように構成される、システム。
【請求項２】
前記トランザクションをコミットするための前記要求は、前記トランザクションの一部として、前記１つのストレージノードによって実行するべき１つ以上の追加の動作を含み、前記要求される競合検証は、前記１つ以上の動作を更に含み、且つ、前記トランザクションが競合しないことに応じて、前記１つのストレージノードは、前記１つのストレージノードに記憶された前記階層型データ構造のバージョンに対して、前記１つ以上の追加の動作を実行するように更に構成される、請求項１に記載のシステム。
【請求項３】
前記１つのストレージノードは、
前記階層型データ構造に対して、１つ以上の更なる動作を含む第２のトランザクションを開始するための要求を受信し、
前記階層型データ構造に対して、１つ以上の更なる動作を実行し、且つ、
トランザクション状態トークンとして、前記第２のトランザクションの状態を示す応答を前記要求に対して返す、
ように更に構成される、請求項１又は請求項２に記載のシステム。
【請求項４】
前記１つのストレージノードは、
他の１つの階層型ストレージノードによって実行される別の１つ以上の以前の動作に基づいて、前記階層型ストレージノードの前記他の１つによって生成されるトランザクション状態を含む前記階層型データ構造に対して、別のトランザクションをコミットするための要求を受信し、
前記トランザクションログストアから、前記他の１つ以上の以前の動作を含む前記他のトランザクションに対する競合検証を要求し、且つ、
前記他のトランザクションのトランザクションログストアから受信される前記競合検証に基づいて、前記トランザクションが競合することに応じて、前記他のトランザクションがコミットし損なうことを示す応答を返す、
ように更に構成される、請求項１から請求項３のいずれか一項に記載のシステム。
【請求項５】
前記システムはネットワークベースディレクトリサービスであり、クライアントは前記ネットワークベースディレクトリサービスのクライアントであり、前記ストレージノードは、前記ネットワークベースディレクトリサービスの１つ以上の他のクライアントに代わって維持される１つ以上の他の階層型データ構造を記憶するマルチテナントであり、且つ、前記階層型データ構造の識別されたバージョンは、前記ストレージノードの前記メモリに維持される、請求項１から請求項４のいずれか一項に記載のシステム。
【請求項６】
１つ以上のコンピューティングデバイスによって、
他のストレージノードによって実行される１つ以上の以前の動作に基づいて、分散型データストアの別のストレージノードによって生成されたトランザクション状態を含む前記分散型データストアのストレージノードにおいて、階層型データ構造に対してトランザクションをコミットするための要求を受信することと、
前記階層型データ構造のトランザクションログから、１つ以上の以前の動作を含む前記トランザクションに対する競合検証を、前記ストレージノードによって要求することと、
トランザクションログストアから受信された前記競合検証に基づいて、前記トランザクションが競合しないことに応じて、前記トランザクションが前記階層型データ構造に対してコミットされたことを承認する応答を、前記ストレージノードによって、前記要求に対して返すことと、
を実行することを備える、方法。
【請求項７】
前記トランザクションをコミットするための前記要求は、前記トランザクションの一部として、前記ストレージノードによって実行するべき１つ以上の追加の動作を含み、前記要求される競合検証は、前記１つ以上の追加の動作を更に含み、且つ、前記トランザクションが競合しないことに応じて、前記方法は、前記ストレージノードにおいて記憶される前記階層型データ構造のバージョンに対して、前記１つ以上の追加の動作を、前記ストレージノードによって実行することを更に備える、請求項６に記載の方法。
【請求項８】
前記階層型データ構造に対して、１つ以上の更なる動作を含む第２のトランザクションを開始するための要求を、前記ストレージノードにおいて受信することと、
前記階層型データ構造に対して、前記１つ以上の更なる動作を、前記ストレージノードによって実行することと、
トランザクション状態トークンとして、前記第２のトランザクションの状態を示す応答を、前記ストレージノードによって、前記要求に対して返すことと、
を更に備える、請求項６又は請求項７に記載の方法。
【請求項９】
他の１つの階層型ストレージノードによって実行される別の１つ以上の以前の動作に基づいて、前記階層型ストレージノードの前記他の１つによって生成されるトランザクション状態を含む前記階層型データ構造に対して、別のトランザクションをコミットするための要求を、前記ストレージノードにおいて受信することと、
前記トランザクションログストアから、前記他の１つ以上の以前の動作を含む前記他のトランザクションに対する競合検証を、前記ストレージノードによって要求することと、
前記他のトランザクションのトランザクションログストアから受信された前記競合検証に基づいて、前記トランザクションが競合することに応じて、前記他のトランザクションがコミットし損なうことを示す応答を、前記ストレージノードによって返すことと、
を更に備える、請求項６から請求項８のいずれか一項に記載の方法。
【請求項１０】
前記分散型データストアはネットワークベースディレクトリサービスであり、クライアントは前記ネットワークベースディレクトリサービスのクライアントであり、前記ストレージノードは、前記ネットワークベースディレクトリサービスの１つ以上の他のクライアントに代わって維持される１つ以上の他の階層型データ構造を記憶するマルチテナントであり、且つ、前記階層型データ構造の識別されたバージョンは、前記ストレージノードのメモリに維持される、請求項６から請求項９のいずれか一項に記載の方法。
【請求項１１】
１つ以上のコンピューティングデバイス上で又は１つ以上のコンピューティングデバイスにわたって実行されると、前記１つ以上のコンピューティングデバイスに、
他のストレージノードによって実行される１つ以上の以前の動作に基づいて、前記分散型データストアの別のストレージノードによって生成されるトランザクション状態を含む分散型データストアのストレージノードにおいて、階層型データ構造に対してトランザクションをコミットするための要求を受信することと、
前記階層型データ構造のトランザクションログから、前記１つ以上の以前の動作を含む前記トランザクションに対する競合検証を、前記ストレージノードによって要求することと、
トランザクションログストアから受信される前記競合検証に基づいて、前記トランザクションが競合しないことに応じて、前記トランザクションが前記階層型データ構造に対してコミットされたことを承認する応答を、前記ストレージノードによって、前記要求に対して返すことと、
を履行させるプログラム命令を記憶する、１つ以上の非一時的なコンピュータ可読記憶媒体。
【請求項１２】
前記トランザクションをコミットするための前記要求は、前記トランザクションの一部として、前記ストレージノードによって実行するべき１つ以上の追加の動作を含み、前記要求される競合検証は、前記１つ以上の追加の動作を更に含み、且つ、前記トランザクションが競合しないことに応じて、前記１つ以上の非一時的なコンピュータ可読媒体は、前記１つ以上のコンピューティングデバイス上で又は前記１つ以上のコンピューティングデバイスにわたって実行されると、前記１つ以上のコンピューティングデバイスに、前記ストレージノードにおいて記憶された前記階層型データ構造のバージョンに対して、前記１つ以上の追加の動作を前記ストレージノードによって実行することを更に履行させて、アクセス要求の承認を送信することを履行させる、請求項１１に記載の１つ以上の非一時的なコンピュータ可読記憶媒体。
【請求項１３】
前記１つ以上のコンピューティングデバイス上で又は前記１つ以上のコンピューティングデバイスにわたって実行されると、前記１つ以上のコンピューティングデバイスに、
前記階層型データ構造に対して、１つ以上の更なる動作を含む第２のトランザクションを開始するための要求を、前記ストレージノードにおいて受信することと、
前記階層型データ構造に対して、前記１つ以上の更なる動作を、前記ストレージノードによって実行することと、
トランザクション状態トークンとして、前記第２のトランザクションの状態を示す応答を、前記ストレージノードによって、前記要求に対して返すことと、
を更に履行させる更なる命令を記憶する、請求項１１又は請求項１２に記載の１つ以上の非一時的なコンピュータ可読記憶媒体。
【請求項１４】
前記１つ以上のコンピューティングデバイス上で又は前記１つ以上のコンピューティングデバイスにわたって実行されると、前記１つ以上のコンピューティングデバイスに、
他の１つの階層型ストレージノードによって実行される別の１つ以上の以前の動作に基づいて、前記階層型ストレージノードの前記他の１つによって生成されるトランザクション状態を含む前記階層型データ構造に対して、別のトランザクションをコミットするための要求を、前記ストレージノードにおいて受信することと、
前記トランザクションログストアから、前記他の１つ以上の以前の動作を含む前記他のトランザクションに対する競合検証を、前記ストレージノードによって要求することと、
前記他のトランザクションのトランザクションログストアから受信される前記競合検証に基づいて、前記トランザクションが競合することに応じて、前記他のトランザクションがコミットし損なうことを示す応答を、前記ストレージノードによって返すことと、
を更に履行させる更なる命令を記憶する、請求項１１から請求項１３のいずれか一項に記載の１つ以上の非一時的なコンピュータ可読記憶媒体。
【請求項１５】
前記分散型データストアはネットワークベースディレクトリサービスであり、クライアントは前記ネットワークベースディレクトリサービスのクライアントであり、前記ストレージノードは、前記ネットワークベースディレクトリサービスの１つ以上の他のクライアントに代わって維持される１つ以上の他の階層型データ構造を記憶するマルチテナントであり、且つ、前記階層型データ構造の識別されたバージョンは、前記ストレージノードのメモリに維持される、請求項１１から請求項１４のいずれか一項に記載の１つ以上の非一時的なコンピュータ可読記憶媒体。
【外国語明細書】
2020091902000001.pdf