(19)【発行国】日本国特許庁(JP)
(12)【公報種別】特許公報(B2)
(11)【特許番号】
(24)【登録日】2021-12-27
(45)【発行日】2022-01-19
(54)【発明の名称】データストレージシステムおよびデータストレージを実行するための方法
(51)【国際特許分類】
G06F 21/60 20130101AFI20220112BHJP
【FI】
G06F21/60 340
G06F21/60 320
(21)【出願番号】P 2019517127
(86)(22)【出願日】2017-06-09
(86)【国際出願番号】 CA2017050708
(87)【国際公開番号】W WO2017210798
(87)【国際公開日】2017-12-14
【審査請求日】2020-06-09
(32)【優先日】2016-06-09
(33)【優先権主張国・地域又は機関】US
(73)【特許権者】
【識別番号】518435530
【氏名又は名称】アンフォルマティック・ホリステック・インコーポレーテッド
(74)【代理人】
【識別番号】100140109
【氏名又は名称】小野 新次郎
(74)【代理人】
【識別番号】100118902
【氏名又は名称】山本 修
(74)【代理人】
【識別番号】100106208
【氏名又は名称】宮前 徹
(74)【代理人】
【識別番号】100120112
【氏名又は名称】中西 基晴
(74)【代理人】
【識別番号】100162846
【氏名又は名称】大牧 綾子
(72)【発明者】
【氏名】サボラン,ギー
【審査官】岸野 徹
(56)【参考文献】
【文献】特表2008-537209(JP,A)
【文献】国際公開第2013/065545(WO,A1)
【文献】米国特許出願公開第2014/0289539(US,A1)
【文献】米国特許出願公開第2015/0156174(US,A1)
(58)【調査した分野】(Int.Cl.,DB名)
G06F 21/60
(57)【特許請求の範囲】
【請求項1】
データストレージを実行するためのコンピュータ実装方法であって、前記方法は、
データソースから、記憶されるべきデータを受信するステップと、
前記データを
、記憶されるべきデータをそれぞれ含むコアオブジェクトにセグメント化するステップであって
、前記コアオブジェクトの各々が、不変であり、前記コアオブジェクトの各々が、コレクション中に書き込まれ、一意のオブジェクトIDを割り当てられる、セグメント化するステップと、
前記
コアオブジェクトを、前記
コアオブジェクトのうちの少なくとも1つをそれぞれ含むブロブにグループ化するステップであって、前記ブロブの各々は、その中に含まれる前記
コアオブジェクトのうちの前記少なくとも1つの前記
コアオブジェクトのオブジェクトIDから導出された一意のブロブIDを割り当てられ、
前記ブロブが前記コレクション
に書き込まれるときに最後に書き込まれた前記ブロブに対応する前記コレクションの最後のブロブが
、そのようなものとして識別可能である、グループ化するステップと、
前記コレクションの前記コアオブジェクトの
サブセットを定義する少なくとも
2つの
コアオブジェクトを互いに
ツリー状の構造でリンクすることによって前記コレクションの状態を定義するステップであって、
前記ブロブが前記コレクションに書き込まれたときに前記コレクションの前記サブセットのうち最新に作成されたコアオブジェクトに対応する前記サブセットの最後のコアオブジェクトが、対応するサブセットの
ヘッドオブジェク
トである、定義するステップと、
前記ヘッドオブジェクトの識別情報を記憶するステップと、
前記ブロブの各々を少なくとも1つのバックエンド上に記憶するステップと
を含む、コンピュータ実装方法。
【請求項2】
前記ヘッドオブジェクトの識別情報を記憶する前記ステップが、前記ヘッドオブジェクトの識別情報を前記コレクションの前記最後のブロブに記憶するステップを含む、請求項1に記載の方法。
【請求項3】
前記記憶されたデータの要求時に、前記少なくとも1つのバックエンドのうちの1つから、対応するブロブを選択的に取り出すステップをさらに含む、請求項1または2に記載の方法。
【請求項4】
前記コアオブジェクトの各々がオブジェクトタイプを有し、前記コレクションの前記コアオブジェクトの
サブセットを定義する少なくとも
2つの
コアオブジェクトを互いに
ツリー状の構造でリンクすることによって前記コレクションの前記状態を維持するステップであって、前記少なくとも1つのサブセットの各々の前記最後の
コアオブジェクトが前記
ヘッドオブジェク
トである、維持するステップは、各オブジェクトタイプの
コアオブジェクトをリンクするステップであって、各オブジェクトタイプの
前記最後の
コアオブジェクトが、対応するオブジェクトタイプについての
前記ヘッドオブジェクトである、リンクするステップを含む、請求項1から3のいずれか一項に記載の方法。
【請求項5】
前記ブロブの各々を少なくとも1つのバックエンド上に記憶する前記ステップが、前記ブロブを分散されたバックエンド上に記憶するステップを含む、請求項1から4のいずれか一項に記載の方法。
【請求項6】
前記ブロブを前記少なくとも1つのバックエンド上に記憶する前記ステップより前に前記ブロブを暗号化するステップをさらに含む、請求項1から5のいずれか一項に記載の方法。
【請求項7】
前記ブロブを前記少なくとも1つのバックエンド上に記憶する前記ステップより前に前記ブロブを暗号化する前記ステップと、前記少なくとも1つのバックエンドのうちの1つから対応するブロブを取り出す前記ステップの後に前記ブロブを解読するステップとをさらに含む、請求項3に記載の方法。
【請求項8】
前記ブロブを暗号化する前記ステップより前に前記ブロブを圧縮するステップをさらに含む、請求項6に記載の方法。
【請求項9】
前記ブロブを解読する前記ステップの後に前記ブロブを圧縮解除するステップをさらに含む、請求項7に記載の方法。
【請求項10】
識別可能である複数の最後のブロブを、各フォークされたコレクションの最後のブロブとして導入することによって、前記コレクションをフォークするステップをさらに含む、請求項1から9のいずれか一項に記載の方法。
【請求項11】
フォークされたコレクションを、コレクションの1つとコレクションの別のフォークとにマージするステップをさらに含む、請求項10に記載の方法。
【請求項12】
請求項1から11のいずれか一項に記載の前記方法を行うためにコンピュータが実行するためのステートメントおよび命令をその上に記録しているコンピュータ可読メモリ。
【請求項13】
記憶されるべきデータを受信し、前記データを少なくとも1つのバックエンド上に記憶し、前記少なくとも1つのバックエンドから前記データを取り出すように構成されたコアエンジンモジュールを備える、データストレージシステムであって、前記コアエンジンモジュールが少なくとも1つのコレクションを生成し、管理し、前記少なくとも1つのコレクションは、
記憶されるべきデータをそれぞれ含むコアオブジェクトであって、前記
コアオブジェクトの各々が、不変であり、一意のオブジェクトIDを割り当てられ、前記コアオブジェクト
のサブセット
を定義する少なくとも2つのコアオブジェクトが互いに
ツリー状の構造でリンクされ、
前記コレクションの前記サブセットの最新に作成された前記コアオブジェクトに対応する前記サブセットの最後の
コアオブジェクトが、
前記対応するサブセットの
ヘッドオブジェク
トである、コアオブジェクトと、
前記
コアオブジェクトのうちの少なくとも1つをそれぞれ含むブロブであって、前記ブロブの各々が、含まれる前記
コアオブジェクトのうちの前記少なくとも1つのコアオブジェクトの前記オブジェクトIDから導出された一意のブロブIDを割り当てられ、
前記ブロブが前記コレクションに書き込まれたときに最後に書き込まれた前記ブロブに対応する前記コレクションの最後のブロブが
、そのようなものとして識別可能であり、前記少なくとも1つのサブセットの各々の
前記ヘッドオブジェクトの識別情報を含む、ブロブと、
前記ブロブをその上に記憶し、前記ブロブが、対応するブロブIDを使用して取り出されることを可能にする、バックエンドのうちの前記少なくとも1つと
を備える、データストレージシステム。
【請求項14】
前記コアエンジンモジュールが、コレクションを開き、コアオブジェクトを読み取り、書き込み、削除するように構成されたコアAPIモジュールと、前記コアオブジェクトを生成し、管理するように構成されたコレクションマネージャモジュールと、前記ブロブを生成し、管理するように構成されたブロブマネージャモジュールとを備える、請求項13に記載のデータストレージシステム。
【請求項15】
前記コアエンジンモジュールが、前記少なくとも1つのバックエンド上への記憶より前に前記ブロブを暗号化し、前記少なくとも1つのバックエンドからの取出しの後に前記ブロブを解読する暗号化器モジュールをさらに備える、請求項14に記載のデータストレージシステム。
【請求項16】
前記コアエンジンモジュールが、前記暗号化器モジュールによる暗号化より前に前記ブロブを圧縮し、前記暗号化器モジュールによる解読の後に前記ブロブを圧縮解除する圧縮器モジュールをさらに備える、請求項15に記載のデータストレージシステム。
【請求項17】
前記コアオブジェクトの前
記サブセット
の前記コアオブジェクト間の前記リンクを表すリンクデータが
、コアオブジェクトの
前記サブセットの前記コアオブジェクトの少なくとも一部分に記憶される、請求項13から16のいずれか一項に記載のデータストレージシステム。
【請求項18】
前記コアオブジェクトの各々の前記一意のオブジェクトIDが連続的に割り当てられる、請求項13から17のいずれか一項に記載のデータストレージシステム。
【請求項19】
前記ブロブの各々の前記一意のブロブIDが、前記ブロブの第1のコアオブジェクトの前記オブジェクトIDに対応する、請求項18に記載のデータストレージシステム。
【請求項20】
前記コアオブジェクトの各々がオブジェクトエイリアスと仮想オブジェクトIDとのうちの1つをさらに備える、請求項13から19のいずれか一項に記載のデータストレージシステム。
【請求項21】
コレクションに記憶されたデータの編成および位置特定を容易にするためにインデックス付けサービスを実行するインデックスエンジンをさらに備える、請求項13から20のいずれか一項に記載のデータストレージシステム。
【請求項22】
各コレクションの前記少なくとも1つのバックエンドが、前記ブロブの分散されたストレージを与えるために複数の分散されたバックエンドを備える、請求項13から21のいずれか一項に記載のデータストレージシステム。
【発明の詳細な説明】
【技術分野】
【0001】
関連出願の相互参照
[0001]本出願は、2016年6月9日に出願された米国仮特許出願第62/347,883号の米国特許法第119条(e)項に基づく利益を主張する。上述の出願の全体は、参照により本明細書に組み込まれる。
【0002】
[0002]本発明は、データストレージの分野に関する。より詳細には、本発明は、データストレージを実行するためのシステム、およびデータストレージを実行するための方法に関する。
【背景技術】
【0003】
[0003]リモートの抽象的なロケーションにデータを記憶し、その後、ネットワークに接続された通信デバイスを使用してデータを取り出すために、クラウドデータストレージ技術を使用することは、当技術分野で知られている。データのストレージに進むために、クライアントは、一般に、アプリケーション、プラグイン、API、ウェブブラウザなどを通して、通信デバイスを用いてクラウドストレージプロバイダに接続し、クラウドストレージプロバイダは、回復力を与えるために、(ミラーリング、SAN、RAIDなどの)知られているストレージ技術を使用してそれ自体のサーバまたはデータセンターに(通常のファイルシステムのファイル(たとえば、NTFS、EXT3/4など)、データベースレコード、オブジェクトなどの)データを記憶する。クラウドデータストレージ技術を使用するとき、データのストレージおよび取出しは、たとえば、限定的ではないが、ハードウェア機器、物理的ロケーション、厳密なセキュリティ対策、あるいはデータが物理的に記憶されるサーバまたはデータセンターの他の要件など、データストレージの材料およびセキュリティ態様についてユーザが懸念を抱かないように、クラウドストレージプロバイダによって十分に扱われる。
【0004】
[0004]しかしながら、知られているクラウドデータストレージ技術は、いくつかの欠点がある傾向がある。たとえば、クライアントデータがクラウドストレージプロバイダのインフラストラクチャに直接記憶されることを仮定すれば、クラウドストレージプロバイダは、通常、データへのアクセスを有する。したがって、クライアントは、記憶されたデータの機密性に関してクラウドサービスプロバイダのセキュリティ実施、技術および人員を信用しなければならない。いくつかの場合には、セキュリティを改善するために暗号化を使用することが可能であるが、それでも、クラウドストレージプロバイダは、概して、少なくとも一部の情報にアクセスすることを必要とされる。たとえば、いくつかの事例では、クラウドストレージプロバイダは、データを暗号化および解読するために暗号化鍵へのアクセスを有することを必要とされる。プロバイダが、クライアントデータを保護する暗号化/解読鍵へのアクセスを理論的に決して有しない場合でも、プロバイダは、依然として、何らかの非暗号化メタデータ(たとえばファイル名、ディレクトリ構造、変更日付など)へのアクセスを有することを必要とされ、非暗号化メタデータは、要求時にデータの位置を特定し、データにアクセスするために、重要な特権的情報(たとえば、クライアントリスト、契約の種類、取り組んでいるプロジェクトなど)を含むことができる。したがって、暗号化が使用されるときでも、クライアントは、クラウドストレージプロバイダのセキュリティ実施において一定のレベルの信用を有しなければならない。
【0005】
[0005]その上、各クラウドデータストレージプロバイダの特殊性を仮定すれば、あるクラウドデータストレージプロバイダから別のクラウドデータストレージプロバイダに切り替わること、または複数のクラウドストレージデータプロバイダにわたってクライアントのデータを分散させることはクライアントにとって好都合でない。たとえば、複数のクラウドデータストレージプロバイダにわたってデータを分散させるために、概して、クライアントが、いくつかの知られている境界(たとえば、サブディレクトリ、データベースキーレンジなど)に沿ってデータを手動で区分し、個々のプロバイダに特定の部分を割り当てることが必要とされる。その上、クライアントが、(データの全体または一部分について)後でクラウドデータストレージプロバイダ間で切り替えることを望む場合、クライアントは、概して、対応するデータを一方のプロバイダから他方のプロバイダに手動でコピーし、そのデータに今アクセスしているすべてのユーザが新しいプロバイダを使用することを保証することを必要とされる。データのそのようなコピー中に、完全性を保証するために、更新は中断されるか、または2つのプロバイダのうちの一方のみを対象としなければならない。また、あるプロバイダから別のプロバイダにデータを移動させることは、特定のクラウドデータストレージプロバイダのサービスおよび制限を変えたことの結果として、失敗およびメタデータの損失を引き起こすことがある。
【0006】
[0006]当業者は、上述の短所のうちのいくつかを緩和するためにアグリゲータ(すなわち、クライアントとクラウドデータストレージプロバイダとの間で動作するエージェント)を使用することが可能であることを理解されよう。しかしながら、アグリゲータの使用は、アグリゲータが概してデータへのアクセスを必要とし、したがって、クラウドストレージプロバイダが信用されるであろうレベルと同じレベルで信用される必要があると仮定すれば、機密性の問題をもう一度提起することになる。さらに、そのような場合、クラウドベースストレージサービスの性能はアグリゲータのサービスに依存し、アグリゲータのサービスが失敗または性能に問題があれば、クラウドベースストレージサービスのすべてについての問題を生じることになる。
【0007】
[0007]上述の問題の多くがローカルデータストレージまたはネットワークデータストレージにも適用されることを理解されよう。たとえば、ユーザがパーソナルハードディスクから別のものに切り替えることを望むとき、ユーザは、更新が実行されていない間にすべてのデータを一方のディスクから他方のディスクにコピーすることが必要となる。複数のディスクが使用される場合、ユーザは、どのファイルまたはディレクトリがどのディスクに記憶されるべきであるかを手動で決定することが必要となる。さらに、プラットフォーム間で変わるファイルシステムサポートは、異なるファイルシステムからデータを移動/コピーするときに、しばしば、失敗を引き起こすか、またはメタデータの損失を生じることがある。
【発明の概要】
【発明が解決しようとする課題】
【0008】
[0008]上記に鑑みて、上記で説明された従来技術の懸念のうちのいくつかを克服するかまたは少なくとも最小限に抑えることが可能になるであろう、分散環境においてデータを構造化および記憶するための改善されたシステムおよび方法が必要である。
【課題を解決するための手段】
【0009】
[0009]第1の一般的態様によれば、データストレージを実行するためのコンピュータ実装方法が提供される。本方法は、データソースから、記憶されるべきデータを受信するステップと、データを不変(immutable)コアオブジェクトにセグメント化するステップであって、コアオブジェクトの各々がコレクション中に書き込まれ、一意のオブジェクトIDを割り当てられるセグメント化するステップと、不変オブジェクトをブロブ(blob)にグループ化するステップであって、各ブロブが、オブジェクトのうちの少なくとも1つを含み、ブロブの各々が、その中に含まれるオブジェクトのうちの少なくとも1つのオブジェクトIDから導出された一意のブロブIDを割り当てられ、コレクションの最後のブロブがそのようなものとして識別可能である、グループ化するステップと、コレクションのコアオブジェクトの少なくとも1つのサブセットを互いにリンクすることによってコレクションの状態を定義するステップであって、少なくとも1つのサブセットの各々の最後のオブジェクトが、対応するサブセットのオブジェクトヘッドである、定義するステップと、ヘッドオブジェクトの識別情報を記憶するステップと、ブロブの各々を少なくとも1つのバックエンド上に記憶するステップとを含む。
【0010】
[0010]一実施形態では、ヘッドオブジェクトの識別情報を記憶するステップは、ヘッドオブジェクトの識別情報をコレクションの最後のブロブに記憶するステップを含む。
[0011]一実施形態では、本方法は、記憶されたデータの要求時に、少なくとも1つのバックエンドのうちの1つから、対応するブロブを選択的に取り出すステップをさらに含む。
【0011】
[0012]一実施形態では、コアオブジェクトの各々はオブジェクトタイプを有し、コレクションのコアオブジェクトの少なくとも1つのサブセットを互いにリンクすることによってコレクションの状態を維持するステップであって、少なくとも1つのサブセットの各々の最後のオブジェクトがオブジェクトヘッドである、維持するステップは、各オブジェクトタイプのアクティブオブジェクトをリンクするステップであって、各オブジェクトタイプの最後のオブジェクトが、対応するオブジェクトタイプについてのヘッドオブジェクトである、リンクするステップを含む。
【0012】
[0013]一実施形態では、ブロブの各々を少なくとも1つのバックエンド上に記憶するステップは、ブロブを分散されたバックエンド上に記憶するステップを含む。
[0014]一実施形態では、本方法は、ブロブを少なくとも1つのバックエンド上に記憶するステップより前にブロブを暗号化するステップをさらに含む。
【0013】
[0015]一実施形態では、本方法は、ブロブを少なくとも1つのバックエンド上に記憶するステップより前にブロブを暗号化するステップと、少なくとも1つのバックエンドのうちの1つから対応するブロブを取り出すステップの後にブロブを解読するステップとをさらに含む。
【0014】
[0016]一実施形態では、本方法は、ブロブを暗号化するステップより前にブロブを圧縮するステップをさらに含む。
[0017]一実施形態では、本方法は、ブロブを解読するステップの後にブロブを圧縮解除するステップをさらに含む。
【0015】
[0018]一実施形態では、本方法は、識別可能である複数の最後のブロブを、各フォーク(fork)されたコレクションの最後のブロブとして導入することによって、コレクションをフォークするステップをさらに含む。
【0016】
[0019]一実施形態では、本方法は、フォークされたコレクションを、コレクションのあるフォークとコレクションの別のフォークとにマージするステップをさらに含む。
[0020]別の一般的態様によれば、上記で説明された方法を行うためにコンピュータが実行するためのステートメントおよび命令をその上に記録しているコンピュータ可読メモリをも提供される。
【0017】
[0021]別の一般的態様によれば、記憶されるべきデータを受信し、データを少なくとも1つのバックエンド上に記憶し、少なくとも1つのバックエンドからデータを取り出すように構成されたコアエンジンモジュールを備えるデータストレージシステムをも提供される。コアエンジンモジュールは、記憶されるべきデータをそれぞれ含むコアオブジェクトと、オブジェクトのうちの少なくとも1つをそれぞれ含むブロブと、バックエンドのうちの少なくとも1つとを備える、少なくとも1つのコレクションを生成し、管理する。コアオブジェクトの各々は不変であり、一意のオブジェクトIDを割り当てられる。コアオブジェクトの少なくとも1つのサブセットは互いにリンクされ、少なくとも1つのサブセットの各々の最後のオブジェクトは、対応するサブセットのオブジェクトヘッドである。ブロブの各々は、含まれるオブジェクトのうちの少なくとも1つのオブジェクトIDから導出された一意のブロブIDを割り当てられる。コレクションの最後のブロブは、そのようなものとして識別可能であり、少なくとも1つのサブセットの各々のヘッドオブジェクトの識別情報を含む。少なくとも1つのバックエンドはブロブをその上に記憶し、ブロブが、対応するブロブIDを使用して取り出されることを可能にする。
【0018】
[0022]一実施形態では、コアエンジンモジュールは、コレクションを開き、コアオブジェクトを読み取り、書き込み、削除するように構成されたコアAPIモジュールと、コアオブジェクトを生成し、管理するように構成されたコレクションマネージャモジュールと、ブロブを生成し、管理するように構成されたブロブマネージャモジュールとを備える。
【0019】
[0023]一実施形態では、コアエンジンモジュールは、少なくとも1つのバックエンド上への記憶より前にブロブを暗号化し、少なくとも1つのバックエンドからの取出しの後にブロブを解読する暗号化器モジュールをさらに備える。
【0020】
[0024]一実施形態では、コアエンジンモジュールは、暗号化器モジュールによる暗号化より前にブロブを圧縮し、暗号化器モジュールによる解読の後にブロブを圧縮解除する圧縮器モジュールをさらに備える。
【0021】
[0025]一実施形態では、コアオブジェクトの少なくとも1つのサブセットの各々のコアオブジェクト間のリンクを表すリンクデータは、コアオブジェクトの少なくとも一部分に記憶される。
【0022】
[0026]一実施形態では、コアオブジェクトの各々の一意のオブジェクトIDは連続的に割り当てられる。
[0027]一実施形態では、ブロブの各々の一意のブロブIDは、ブロブの第1のコアオブジェクトのオブジェクトIDに対応する。
【0023】
[0028]一実施形態では、コアオブジェクトの各々はオブジェクトエイリアスと仮想オブジェクトIDとのうちの1つをさらに備える。
[0029]一実施形態では、データストレージシステムは、コレクションに記憶されたデータの編成および位置特定を容易にするためにインデックス付けサービスを実行するインデックスエンジンをさらに備える。
【0024】
[0030]一実施形態では、各コレクションの少なくとも1つのバックエンドは、ブロブの分散されたストレージを与えるために複数の分散されたバックエンドを備える。
[0031]他の目的、利点および特徴は、添付の図面を参照しながら、例示の目的でのみ与えられる、それの実施形態の以下の非制限的説明を読めばより明らかになろう。
【図面の簡単な説明】
【0025】
【
図1】[0032]一実施形態による、データストレージを実行するためのコンピュータ実装方法のステップのフローチャート表現の図である。
【
図1a】一実施形態による、データストレージを実行するためのコンピュータ実装方法のステップのフローチャート表現の図である。
【
図1b】一実施形態による、データストレージを実行するためのコンピュータ実装方法のステップのフローチャート表現の図である。
【
図2】[0033]
図1の方法による、データストレージのために使用されるオブジェクトの一実施形態の概略表現の図である。
【
図3】[0034]
図1の方法による、データストレージのために使用されるブロブの一実施形態の概略表現の図である。
【
図4】[0035]各々がブロブの第1のオブジェクトのオブジェクトIDに対応するブロブIDを有し、オブジェクトが連続的に番号を付けられる、複数のブロブを含むコレクションの例示的な実施形態の概略表現の図である。
【
図5】[0036]
図1の方法を使用するファイルのストレージの例示的な実施形態の概略表現の図である。
【
図6】[0037]最後のオブジェクトタイプおよびオブジェクトリンキングを使用するコレクション管理と、ガベージコレクションに対する影響との例示的な実施形態の概略表現の図である。
【
図7a】[0038]コレクションをフォークすることの例示的な実施形態の概略表現の図である。
【
図7b】コレクションをフォークすることの例示的な実施形態の概略表現の図である。
【
図7c】コレクションをフォークすることの例示的な実施形態の概略表現の図である。
【
図7d】コレクションをフォークすることの例示的な実施形態の概略表現の図である。
【
図8】[0039]一実施形態による、データストレージを実行するためのシステムの概略表現の図である。
【
図9】[0040]アプリケーションが、コアエンジンモジュールと通信するためにファイルシステムエンジンモジュールおよび/またはデータベースエンジンモジュールを使用する一実施形態による、
図8のデータストレージを実行するためのシステムの概略表現の図である。
【発明を実施するための形態】
【0026】
[0041]以下の説明では、同じ参照番号は同様の要素を指す。その上、データの分散されたストレージのためのシステムおよび方法の実施形態は、本明細書で説明および例示されるいくつかの構成要素からなるが、これらの構成要素のすべてが必須であるとは限らず、したがってそれらの限定的な意味にとるべきではない。また、当業者にとって明らかなように、本明細書で手短に説明されるように、および当業者によって本明細書から容易に推論することができるように、データの分散されたストレージのためのシステムおよび方法のために、他の好適な構成要素およびそれらの間の協働を使用してもよいことを理解されたい。
【0027】
[0042]一般論として、データのストレージのための本システムおよび方法は、本明細書で「コアオブジェクト」と呼ばれる小さい個別の独立したストレージユニットに依拠し、コアオブジェクトは、本明細書で「ブロブ」と呼ばれる、より大きいエンティティに凝集(agglomerate)され、ブロブは、異なるファイルシステム、データベース、またはデータの他のタイプが複数の、異種および/またはさもなければ潜在的に互換性のないストレージ媒体にわたって記憶および分散することができるオープンエンドの、ログのようなストレージ構造に記憶される。一実施形態では、セキュリティを高めるために、ブロブは、記憶される前に圧縮および暗号化され、取り出されるときに解読および圧縮解除される。代替の実施形態では、ブロブ自体を圧縮/圧縮解除および暗号化/解読することに加えて、コアオブジェクトを、対応するブロブ内に個々に圧縮および暗号化(その後解読および圧縮解除)することもできる。当業者は、本明細書でブロブと呼ばれるストレージユニットを指すために「ポッド」などの他の用語を使用することができたであろうことを理解されよう。
【0028】
[0043]以下の説明に鑑みて明らかになるように、データのストレージのためのシステムおよび方法は、ブロブが、同時更新が進行中である間でも、中央調整、トラッキングまたは同期を必要とすることなしに、様々な、および場合によっては潜在的に互換性のないストレージプロバイダおよび/またはデバイス間で自由に移動、コピー、および共有されることを可能にする。
【0029】
[0044]本文書の過程において、「コアオブジェクト」という用語は、たとえば、限定的ではないが、データベースレコード、ファイルフラグメント、メタデータ、ディレクトリインデックスなど、任意の論理データを含むことができる基本ストレージユニットを指すために使用される。「ブロブ」という用語は、複数のコアオブジェクトを含み、「バックエンド」(または「ストレージノード」)として知られるストレージ容器(storage vessel)に記憶される、コンテナを指すために使用される。「バックエンド」という用語は、自律型ストレージ容器を指すために使用され、たとえば、限定的ではないが、ローカルハードディスク、フラッシュメモリ、クラウドストレージプロバイダ、およびゾーン、バケットまたはそれの他の隔離ユニット、ネットワーク接続ドライブ、あるいは任意のストレージ媒体(またはそれのパーティション)またはデータを記憶することが可能なサービスを含む。「コレクション」という用語は、全体として管理することができるコヒーレントユニット(coherent unit)を形成する、コアオブジェクト、ブロブおよびバックエンドのグループを指すために使用される。コレクションは、1つまたは複数のユーザが見ることのできるファイルシステム、データベース、オブジェクトストア、または関係するデータを一緒に保つために必要とされる任意の他の形態のグループ化を表すことができる。コヒーレントユニットを形成するコアオブジェクト、ブロブおよびバックエンドのグループを指すために、「コスモス(cosmos)」などの他の指定する用語を使用することができる。
【0030】
[0045]
図1を全体的に参照すると、高いフレキシビリティおよびセキュリティをもつ様々なデバイスおよびサービス上でデータを自由に分散およびホストすることを可能にする、データストレージを実行するための方法10の一実施形態が提供される。図示の実施形態では、データストレージを実行するための方法10は、データソースから記憶されるべきデータを受信するステップ(ステップ11)と、データをコアオブジェクトにセグメント化するステップ(ステップ12)と、コアオブジェクトをブロブにグループ化するステップ(ステップ14)と、ブロブを圧縮するステップ(ステップ16)と、ブロブを暗号化するステップ(ステップ18)と、ブロブを少なくとも1つのバックエンドに記憶するステップ(ステップ20)と、記憶されたデータの要求時に少なくとも1つのバックエンドのうちの1つから対応するブロブを選択的に取り出すステップ(ステップ26)とを含む。
【0031】
[0046]
図1および
図2を参照すると、上述のように、ステップ12において生成されるコアオブジェクト50中に保持されるデータは、何らかの形態の任意の2値データであってもよい。一実施形態では、各コアオブジェクト50は、コアオブジェクト50のコンテンツを記述するヘッダ52と、コアオブジェクトのための実際のデータを含んでいるペイロード54とを含む。たとえば、限定的ではないが、ヘッダ52は、オブジェクトID(OID)52a、オブジェクトタイプ(OType)52b、仮想ID(VID)52c、名前(またはエイリアス)52d、ユニバーサルユニークID(UUID)52e、オブジェクトがそれのタイプの最後のオブジェクトとして追跡されているかどうかを示すフラグ(IsLastTracked)52f、関係するオブジェクトへのリンク(リンク)52g、現在のオブジェクトによって置換されるオブジェクトのID(置換)52h、および/または現在のオブジェクトによって削除される他のオブジェクトのID(削除)52iなどの情報を含むことができる。以下でより詳細に説明されるように、OID52aはオブジェクトの識別子であり、OTypeは、ペイロードを復号するのに役立つ、コアオブジェクト50のコンテンツの目的およびフォーマットを識別する。仮想ID(VID)52c、名前52d、ユニバーサルユニークID(UUID)52e、または他のタイプの識別子を、オブジェクト50が公式OID52a以外の代替識別子を使用して位置を特定されることを可能にするオブジェクト識別情報と呼ぶことができる。オブジェクトがそれのタイプの最後のオブジェクトとして追跡されているかどうかを示すフラグ(IsLastTracked)52f、関係するオブジェクトへのリンク(リンク)52g、現在のオブジェクトによって置換されるオブジェクトのID(置換)52h、および/または現在のオブジェクトによって削除される他のオブジェクトのID(削除)52iは、以下でより詳細に説明されるように、コレクション管理のために使用することができるコレクション管理情報である。しかしながら、代替の実施形態では、コアオブジェクト50を別様に構成することができ、および/またはコアオブジェクト50が図示の実施形態におけるものとは異なる情報を含んでいることがあることを当業者は理解されよう。
【0032】
[0047]生成されるあらゆるコアオブジェクト50は不変であり、すなわち、コアオブジェクトのコンテンツは、永続的であり、オブジェクトが作成され、コレクションにコミットされ、書き込まれると、コンテンツを変更することができない。上記に鑑みて、オブジェクトのコンテンツを更新することができない。したがって、オブジェクトのコンテンツが更新される必要がある場合、新しいコアオブジェクト50が作成されなければならない。一実施形態では、古いオブジェクトは、「置換される」ものとしてフラグを付けることができ、したがって、ガベージコレクションに関して以下でより詳細に説明されるように、それをコレクションからその後除去してもよい。一実施形態では、オブジェクト全体を置換する代わりに、更新されるコアオブジェクトのコンテンツは、元のコアオブジェクトに関する差分情報のみを含んでいる第2のコアオブジェクトを作成することによって、反映してもよいことをも当業者は理解されよう。
【0033】
[0048]その上、コアオブジェクト50の各々は、オブジェクトID(OID)52aと呼ばれる1次識別子によって識別可能である。OID52aは、コアオブジェクト50が作成されたときにそれに割り当てられたコレクション一意の不変な任意長識別子である。OID52aのコレクション一意文字は、各OID52aが所与のコアオブジェクト50に1回のみ割り当てられ、コアオブジェクト50が削除された後でも、コレクションの存続期間の間、決して再利用されないことを意味する。不変性と組み合わせられたとき、コレクション一意OID52aは、所与の不変なコアオブジェクト50の事実上のシグネチャになる。言い換えれば、OID52aのコレクション一意文字は、所与のOID52aとコアオブジェクト50の厳密な不変コンテンツとの間の永続的および非分離的関係を生じる。コアオブジェクト50が不変であり、OID52aがコレクション一意であることを仮定すれば、特定のコアオブジェクト50に関連するデータが更新され、更新されたデータに関連する少なくとも1つの新しいコアオブジェクト50が作成され、それ自体の新しい一意OID52aを割り当てられるとき、オブジェクトを更新することができない。データ更新を管理するためのコレクション管理は、以下でより詳細に説明される。
【0034】
[0049]一実施形態では、コレクション一意OID52aは、OID52aとして絶えず増大する任意長の連続する整数を使用して、生成されたコアオブジェクト50に割り当てられ、すなわち、各新たに作成されたコアオブジェクト50は、最後属性(attributed)OID+1に対応する整数値を有するOID52aを割り当てられる。しかしながら、代替の実施形態では、各新たに生成されたOIDにコレクション一意OIDを割り当てるために他のOID割当て実施を使用することができることを当業者は理解されよう。
【0035】
[0050]
図1、
図3および
図4を参照すると、一実施形態では、ステップ14において、圧縮および暗号化が適用される前に、コアオブジェクト50が、
図3のブロブの未加工コンテンツに対応する未加工ブロブ60a中にアセンブルされる。上述のように、一実施形態(図示せず)では、コアオブジェクト50を個々に圧縮および暗号化することができる。図示の実施形態では、未加工ブロブ60aは、ブロブ60中に含まれているすべてのコアオブジェクト50のストリームを含む。一実施形態では、未加工ブロブ60aは、ブロブ60が書き込まれたときのコレクションの最後のコアオブジェクト50(または最新のコアオブジェクト)に関する情報(最後のオブジェクト状態)をも含む。たとえば、限定的ではないが、そのような情報は、ブロブ60が書き込まれたときのそれらのタイプ(最後のオブジェクトタイプ)の最後のコアオブジェクト50としてタグ付けされるオブジェクトについてのコアオブジェクトタイプ(Otype)52bとOID52aとのリストを含むことができる。ここでも、ブロブ60が書き込まれたときのコレクションの最後のオブジェクト50に関する情報(最後のオブジェクト状態)は、コレクション管理のために使用されるコレクション管理情報であり、もう一度以下でより詳細に説明される。
【0036】
[0051]一実施形態では、未加工ブロブ60aが、圧縮されたブロブ60bに圧縮され(ステップ16)、圧縮されたブロブ60bが暗号化され(ステップ18)、それにより、暗号化されたブロブ60cを生じる。一実施形態では、ブロブのサイズを低減するために使用され、ストレージ中にそれのセキュリティを高める圧縮/暗号化なしに、未加工ブロブ60aまたは圧縮されたブロブ60bをブロブ60として直接使用することができることを当業者は理解されよう。
【0037】
[0052]上記に鑑みて、未加工ブロブ60aが暗号化される一実施形態では、ブロブ60は、データとメタデータ情報の両方を含んでおり、それらのBIDによってのみ識別される。したがって、データおよびメタデータは、それがバックエンド(ローカルメディア、クラウドストレージプロバイダなど)に記憶される前に完全に暗号化される。一実施形態では、各ブロブ60は、使用される暗号化アルゴリズムに関して個々にタグ付けされ、それは、ブロブ60が、様々な暗号化アルゴリズムおよび鍵を使用して個々におよび自律的に暗号化されることを可能にする。そのような個々の暗号化は、データストレージを実行するための本方法を使用して記憶されるデータの機密性を高める。
【0038】
[0053]データを他のユーザとセキュアに共有することができるように、本方法を使用して記憶される前に、コアオブジェクト50に記憶されるべきディレクトリ、ファイル、または他のデータ自体を、個々に秘密暗号化鍵で暗号化することができることを当業者は理解されよう。言い換えれば、コレクションを読み取るためにブロブ解読鍵へのアクセスを有するユーザであっても、そのユーザが適切なデータ解読鍵を有しない限り、データ自体を読み取ることを防止することができる。これは、コレクションが、完全なセキュリティを用いて、中央サーバまたはソフトウェアベースの保護に依拠することなしに複数のユーザと共有されることを効果的に可能にする。
【0039】
[0054]一実施形態では、すべてのブロブ60は初期チェーンチェックサム(チェーンチェックサム、Chain checksum)61cを含み、チェーンチェックサム61cは、ブロブ60が作成されたときにブロブ60から計算されるチェックサム値+前のブロブ60のチェーンチェックサムである。このチェーンチェックサム61cは、コレクション中でこれまでに作成されたすべてのブロブの一意のチェーン値を作成する。たとえば、限定的ではないが、動作中、すべてのバックエンドの最後のブロブが、一致するチェーンチェックサム61cを有するという検証は、すべてのブロブ60が同じコレクションに属することを保証することができる。すべてのブロブ60は、ブロブ60が許可されたユーザによって作り出されており、偽造されていなかったことを暗号で確認するように設計された鍵付きハッシュメッセージ認証コード(HMAC)(認証ダイジェスト)61eと、ブロブ60の送信またはストレージ中に生じる場合があるエラーを迅速に検出するのを助ける完全性チェックサム値(チェックサム)61bとをも含むことができる。
【0040】
[0055]一実施形態では、ブロブ60は、知られているブロックチェーン検証原理、方法およびプロセスに従って、ピアネットワークによって、コレクションのブロブのチェーンを検証するために使用することができるブロックチェーン検証ハッシュ構造(ブロックチェーン検証)61dをも含むことができる。たとえば、一実施形態では、ネットワークに、ブロブ自体の代わりにブロブの認証ダイジェストを検証させることによって、ブロブのコンテンツを送信または開示することなしに、ブロックチェーン検証を実行することができる。認証ダイジェストが、上記で説明されたように、ブロックチェーン検証のために使用される場合、認証ダイジェストによってハッシングされるペイロードが前のブロブのダイジェストをも含むべきであることを理解されよう。
【0041】
[0056]ブロブ60の各々はコレクション一意ブロブID(BID)61aによって識別される。インデックスまたはマップを使用せずに、求められるコアオブジェクト50のOID52aから直接、所与のオブジェクト50を含んでいるブロブ60の識別を可能にするために、コレクション一意BID61aは、特定のブロブ60中に含まれているオブジェクト50のOID52aの導関数である。たとえば、限定的ではないが、一実施形態では、ブロブ60中の第1のオブジェクト50の絶えず増大する任意長の連続する整数属性OID52aは、ブロブ60についてのBID61aとして使用される。この実装形態を使用して、求められるOIDよりも低いか、またはそれに等しい最高のBID61aをもつブロブ60として、特定のオブジェクト50を含むブロブ60を容易に識別することができる。代替の実施形態では、コレクション一意BID61aが、ブロブ60中に含まれているオブジェクト50のOID52aの導関数である他の実装形態を使用できることを当業者は理解されよう。OID52aと同様に、BID61aはまた、概して、所与のブロブ60に1回のみ割り当てられ、コレクションの存続期間の間、一意のままである。一実施形態では、ブロブの実際のシーケンスを開示することを回避するために、BID61aを暗号化することができる。
【0042】
[0057]一実施形態では、BID61aはまた、コレクション中に書き込まれることになる次のBID61aを予測し、コレクションの最後のブロブを識別することが可能であるように予測可能である。ブロブ60中の第1のオブジェクト50の絶えず増大する任意長の連続する整数属性OID52aが、ブロブ60(
図4を参照)についてのBID61aとして使用される実施形態では、BID61aは暗黙的に予測可能である。
図4では、4つのブロブ60は、OID#1~#13を有するオブジェクトを含むBID#1を有するブロブと、OID#14~#44を有するオブジェクトを含むBID#14を有するブロブと、OID#45~#46を有するオブジェクトを含むBID#45を有するブロブと、OID#47~#63を有するオブジェクトを含むBID#47を有するブロブとを備える。そのような実施形態では、次のBIDは、最後のブロブ60の最後のオブジェクト50のOID+1に対応し、コレクションの最後のブロブは、最高BIDをもつブロブ60にすぎない。ここでも、代替の実施形態では、コレクションの予測可能なBIDおよび識別可能な最後のブロブを作り出すための代替実装形態をも使用することができることを当業者は理解されよう。
【0043】
[0058]一実施形態では、生成されたブロブ60をその後分割することができ、分割されたブロブは、それぞれ、特定のブロブ60に現在含まれているコアオブジェクト50のOID52aの導関数である新しいコレクション一意BID61aを割り当てられる。ブロブが分割されたとき、割り当てられたBID61aが、依然として、求められるコアオブジェクト50のOID52aから直接、所与のオブジェクト50を含んでいるブロブ60の識別を可能にしなければならないことを理解されよう。たとえば、ブロブ60中の第1のオブジェクト50の絶えず増大する任意長の連続する整数属性OIDがブロブ60についてのBID61aとして使用される実施形態では、分割は、隣接するOIDが、対応するブロブ60中にグループ化され、コアオブジェクト50のOID52aが、各新しいブロブ60についてのBID61aとして使用されている最低OID52aを有する、コアオブジェクト50を常に生じるべきである。
【0044】
[0059]その上、一実施形態では、隣接するブロブ60(すなわち、コレクション80中の隣接するBID61aを有するブロブ60)を一緒に融合することもでき、融合されたブロブは、特定のブロブ60に現在含まれているコアオブジェクト50のOID52aの導関数である新しいコレクション一意BID61aを割り当てられる。ここでも、割り当てられたBID61aは、依然として、求められるコアオブジェクト50のOID52aから直接、所与のオブジェクト50を含んでいるブロブ60の識別を可能にしなければならない。たとえば、ブロブ60中の第1のオブジェクト50の絶えず増大する任意長の連続する整数属性OIDがブロブ60についてのBID61aとして使用される実施形態では、融合は、融合から生じる新しいブロブ60についてのBID61aとして使用されている最低OID52aを有する、コアオブジェクト50のOID52aを常に生じるべきである。
【0045】
[0060]一実施形態では、所与のタイプ(Otype)52bのコアオブジェクト50を、異なるOtype52bのコアオブジェクト50とは別個のブロブ60にグループ化することができる。したがって、そのような実施形態では、ブロブ60はまた、タイプ(すなわち、本明細書では、グループ化されるコアオブジェクト50のタイプ)に関連し、異なるタイプのブロブ60を異なるバックエンド70に記憶することができる。これは、たとえば、メタデータ読取り性能を改善するために、データオブジェクトからメタデータを分離すること、Otype52bなどに基づいて異なるオブジェクト暗号化アルゴリズム/鍵を実装することなどのために使用することができる。そのような実施形態では、タイプ分けされたコアオブジェクト50と、ブロブ60と、バックエンド70とをサポートするために、コレクションレベルにおいてではなく、バックエンドレベルにおいて、対応するコアオブジェクト50のOID52aから所与のブロブ60のBID61aを導出することができ、ブロブ60は、不連続OID52aを有するコアオブジェクト50を記憶する。言い換えれば、すべての生成されたコアオブジェクトのOID52aからではなく、特定のOtype52bの対応するコアオブジェクトのOID52aから、所与のブロブ60のBID61aを導出することができ、それにより、不連続OID52aを有するコアオブジェクト50をブロブ60に記憶することになる。したがって、コアオブジェクト50を取り出すようにとの後続の要求が、取り出されるべきコアオブジェクト50のOtype52bを考慮に入れて、たとえば、取り出されるべきコアオブジェクト50の特定のOtype52bに関連する(1つまたは複数の)バックエンド70のみに問い合わせることによって扱われるべきである。
【0046】
[0061]別の実施形態では、ブロブ60は、それらのオブジェクトタイプ(Otype)52bに基づいて分離することもでき、したがって、好ましくは、いくつかのOtype52bが同じブロブに書き込まれない。たとえば、大きいデータオブジェクトは、メタデータおよびインデックスオブジェクトから分離することが要求され、それにより、メタデータまたはインデックス情報が取り出されるのと同時に、大量のデータが取り出されるのを防ぐことによって性能を改善することができる。したがって、一実施形態では、ブロブ60へのコアオブジェクト50のアセンブリを実行する前に、オブジェクトが既存のブロブ60に追加されるべきであるのかまたは新しいブロブ60中に作成されるべきであるのかを決定するために、ブロブ60にアセンブルされるべきコアオブジェクト50のOtype52bを考えることができる。
【0047】
[0062]次に
図5を参照すると、データを記憶する方法10のための上記で説明された構造を使用するファイル30のストレージの一例が示されている。
図5に示されている実施形態では、ファイル30は、上記で説明された方法10を使用してクラウドに記憶される。図示の実施形態では、ファイル30は3つのオブジェクト50にセグメント化され、1つは、ファイル名、作成日付など、メタデータを含んでおり、2つは、データフラグメントとしてファイルのコンテンツを含んでいる。最初の2つのオブジェクト50は第1のブロブ60にアセンブルされ、3つ目のオブジェクトは別のブロブ60に入れられる。ブロブ60は圧縮され、暗号化され、バックエンド70として働くクラウドストレージプロバイダに、インターネット上のセキュア接続を通して送信され、ここで、ブロブ60はファイル、データベースレコード、オブジェクト、または未加工ストレージとして記憶することができる。図示の実施形態では、ブロブ60のコピーが、直接ストレージ媒体としても使用することができる(バックエンド70としても動作する)ローカルキャッシュ中にも保たれる。記憶されたデータを取り出すために、ブロブ60が読み取られ、解読され、圧縮解除され、ファイルがそれのセグメントから再アセンブルされる逆プロセスを実行するためにブロブ60の任意のコピーを使用することができることを理解されよう。
【0048】
[0063]上記に鑑みて、ステップ20において、少なくとも1つのバックエンドにブロブ60を記憶するステップ(ステップ20)が、ブロブをストレージ媒体上に記憶するために実行されることを理解されよう。上述のように、バックエンド70は自律型ストレージ容器であり、サポートされるサービスまたはデバイスに適した形態で(たとえば、ファイル、データベースレコード、クラウドオブジェクト、物理デバイスブロックなどとして)ブロブを、それらのBID61aを使用して、問い合わせ、記憶し、取り出すことが可能であることを必要とされるにすぎない。バックエンド70は、メタデータ、構造をサポートすること、オブジェクトまたはブロブがどのように編成されるか、それらの目的などを知ることを必要とされない。バックエンド70は、本来、ブロブ60を、それらのBID61aに基づいて、ブラインドで記憶し、取り出す、完全に一般的で単純なストレージアペンデージ(appendage)である。図示の実施形態では、バックエンド70はクラウドストレージプロバイダおよびローカルキャッシュによって実施されるが、代替の実施形態では、バックエンド70がデータを記憶することが可能な任意のストレージ媒体またはサービスであってもよいことを当業者は理解されよう。上記で説明された構造に鑑みて、バックエンドストレージの能力および特徴の差分は、実質的に影響がない。ブロブを異なる分散されたバックエンド70に記憶することによって、分散されたデータストレージを実行することができるように、複数の分散されたバックエンド70を使用することができることを理解されよう。その上、ブロブ60を、複数のバックエンド70にわたって自由に点在させ、その後、データの完全性に対する影響なしにバックエンド70間で移動させることができる。
【0049】
[0064]上述のように、ブロブ60、コアオブジェクト50およびバックエンド70は、全体として管理することができ、本明細書でコレクション80と呼ぶことができる、コヒーレントユニットに一緒にグループ化される。特に、コレクション80は、OID52aおよびBID61aがコレクション80について常に一意であることを保証する。一実施形態では、各コレクション80について、コアオブジェクト50およびブロブ60に記憶され、上記で定義されたコレクション管理情報は、コレクション全体をコヒーレントおよび最新の状態に保時するための1次機構として使用される。
【0050】
[0065]
図1~
図4を参照すると、一実施形態では、方法10は、ブロブ60が書き込まれる特定の時間におけるコレクションの状態を反映するコレクション状態22を維持する、さらなるステップを含む。動作中、コレクション状態を維持することを可能にするために、各ブロブ60のコレクション管理情報は、ブロブ60が書き込まれたときのコレクションの状態およびそれのコアオブジェクト50を含む。一実施形態では、コレクションの状態は、ブロブ60が書き込まれたとき最後のオブジェクト(最後のオブジェクトタイプ61f)としてタグ付けされる各Otype52bの最後のコアオブジェクト50についてのオブジェクトタイプ(Otype)52bとOID52aとのリストを含む。実際、上述のように、一実施形態では、コアオブジェクト50は、各コアオブジェクト50の一般的な性質を示すように(たとえば、限定的ではないが、ディレクトリインデックスオブジェクトとファイルデータフラグメントオブジェクトとを区別し、それに応じて各オブジェクトをパースするように)設計された所与のタイプ(OType)52bを有する。コアオブジェクト50が作成されたとき、コアオブジェクト50に、それのOtype52bの「最後の」(すなわち、最新のまたは直近に作成された)コアオブジェクトとしてフラグを付けることができる。一実施形態では、各Otype52bについての各最後のコアオブジェクト50のOID52aは、所与のOtype52bの最後のコアオブジェクト50を、それのOID52aを知る必要なしに、その後取り出すことができるように、最後のブロブ60のコレクションの状態で記録される。明らかに、所与のOtype52bの最後のコアオブジェクト50の位置を特定するために、コレクションの最後のブロブ60の識別も必要とされる。
【0051】
[0066]その上、コレクション管理情報は、コアオブジェクト50が互いに参照することを可能にするオブジェクトリンキング情報(すなわち、オブジェクトがOID52aまたは他のオブジェクト識別情報を使用して互いにリンクされる)を含む。特定のコアオブジェクト50のオブジェクトリンキング情報は、対応するコアオブジェクト50に直接記憶され、コアオブジェクト50と、ブロブ60と、コレクション80とが、互いにリンクされるコアオブジェクト50のツリー状の構造で一緒に保持される構造のバルクを定義する。一実施形態では、コレクション80は、各オブジェクトタイプの最後としてフラグを付けられているコアオブジェクト50に対応する「ヘッド」オブジェクト50によって定義され、次いで、他のコアオブジェクト50に連続的にリンクされ、コアオブジェクト50のツリー状のチェーンとしてオブジェクト50をグループ化する。そのような実施形態では、コレクション80の「末尾」(すなわち、そのコレクション状態での最後のブロブおよび最後のオブジェクトタイプ)は、コレクション80内のすべてのオブジェクト50の「ヘッド」として働く。代替の実施形態では、オブジェクトを識別し、リンクする代替のやり方を使用することもできることを理解されよう。その上、代替の実施形態では、コアオブジェクト50を互いにリンクするために、コアオブジェクトタイプ(Otype)52bとは異なるサブセットを使用することができ、最後のオブジェクトはヘッドオブジェクトである。
【0052】
[0067]データ更新(更新されたデータに関連する新しいコアオブジェクト50が作成され、それ自体の新しい一意のOID52aを割り当てられる)の場合、コアオブジェクト50間のリンクは、新しいコアオブジェクト50が現在、古いコアオブジェクト50を置換することを反映するために更新される必要がある。言い換えれば、OID52aによって古いコアオブジェクト50に前にリンクしたコアオブジェクト50は、次に、OID52aによって新しいコアオブジェクト50にリンクする必要がある。オブジェクト50のツリー構造の複雑さに応じて、これは、連続的に更新される必要があるコアオブジェクト50を参照する長いカスケードをもたらすことがある。必要とされるカスケード影響を低減するために、このようなカスケードを制限する既知のデータ構造に従って、コアオブジェクト50を構造化することができ、これは、たとえば、限定的ではないが、親オブジェクト自体を実際に更新することなしに、親オブジェクトに適用される必要があるOIDリンク更新に関する情報を更新されたコアオブジェクト50内に含めることによって、またはOIDリンク更新がツリーの上部にカスケードするのを防ぐために、オブジェクトツリー中の戦略的ポイントにおいて、代替の実施形態として以下で説明されるように非OIDリンクを使用することによってなされる。代替の実施形態では、エイリアス、仮想ID、プライベートインデックスなどの、オブジェクト識別情報を使用することもでき、このオブジェクト識別情報は、オブジェクトのOID52aに加えて、オブジェクトをそれによって参照する場合もある代替識別子であり、より新しいコアオブジェクト50上に後で再割り当てすることができる。たとえば、限定的ではないが、一実施形態では、各コアオブジェクト50は、最初にOID52aと同等である仮想ID(VID)52cを含むことができる。新しいコアオブジェクト50が作成され、より古いコアオブジェクト50を置換するものとしてフラグを付けられるとき、新しいコアオブジェクト50は、より古いコアオブジェクト50のVID52cを自動的に継承することができる。内部的には、VID/OID関連付けを可能にするために、VID52cをVID/OIDペアに記憶することができる。したがって、オブジェクト自体が更新され、置換されるとき、自動的に最新に保たれる識別子を使用してコアオブジェクト50を一緒にリンクするためにVID52cを使用することができる。別の代替の実施形態では、オブジェクト内のリンクを記憶する代わりに、オブジェクト50を、それらのOID52aによって外部で追跡し、リンクするためにプライベートインデックスを使用することができる。
【0053】
[0068]一実施形態では、データストレージを実行するための方法10は、もはや有効でないコアオブジェクト50によって占有されたストレージスペースをリクレームするために、ガベージコレクション24を実行するステップをさらに含むことができる。なぜならば、コアオブジェクト50が、より新しいコアオブジェクト50によって(すなわちデータ更新の結果として)置換され、削除されたか、またはそれらが他のコアオブジェクト50によってもはや参照されていない(他のコアオブジェクト50にリンクされていない)かのいずれかだからである。一実施形態では、ガベージコレクションを実行するステップ24は、暗黙的または明示的であってもよい、クリーンアップされるべきオブジェクトを識別する(またはフラグを付ける)ステップ24aと、コレクションおよびブロブからオブジェクトを物理的に除去する(パージする、purge)ステップ24bとを含む。
【0054】
[0069]一実施形態では、フラグを付けるステップ24a中に、コアオブジェクト50が他のコアオブジェクト50からのすべての参照を失ったとき、もはや必要とされないものとして、コアオブジェクト50に暗黙的にフラグを付けることができる。もはや参照されないものとしてオブジェクトにフラグを付けるためのいくつかの方法を使用することができることを当業者は理解されよう。たとえば、限定的ではないが、一実施形態では、パージするステップ24b中に処理されるパージ候補リストに、参照されないものとしてフラグを付けられているコアオブジェクト50を追加することができる。コレクションに書き込まれる最後のコアオブジェクト50は、アクティブに更新されているコレクションを保護するために、それらが参照されない場合でも、パージ候補リストには決して追加されない。その上、代替の実施形態では、コアオブジェクト50に、ガベージコレクションの対象となるものとして明示的にフラグを付けることもできる。このことは、新しいコアオブジェクト50がそれらを置換するために作成されたとき「置換される」ものとして、またはそれらを明示的に削除するコアオブジェクト50によって「削除される」ものとして、フラグを付けることによってなされる。そのような場合、置換/削除されたコアオブジェクト50のOID52aを、それらを置換/削除したオブジェクトのOID52aとともに、内部インデックスに追加することができ、インデックスはパージ候補リストとして使用される。
【0055】
[0070]パージするステップ24b中に、パージ候補リストにリストされたコアオブジェクト50およびブロブ60は、物理的に除去される。パージプロセスを最適化するために、ブロブ使用しきい値、パージされるべきであるオブジェクトの最小寿命など、様々なパージパラメータを設定することができることを当業者は理解されよう。パージパラメータは、たとえば、限定的ではないが、以下でより詳細に説明されるように、アーカイブする目的のためにオブジェクトのパージを制限するために有用である。ブロブ60を完全にまたは部分的にパージすることができることを理解されよう。ブロブ60内のすべてのオブジェクト50が物理的に除去されるべきである場合、(1つまたは複数の)バックエンド70からブロブ60を完全に削除することができる。しかしながら、ブロブ60のいくつかのオブジェクト50のみが物理的に除去されるべき場合、ブロブ60を開く(すなわち、取り出し、解読し、圧縮解除する)ことができ、特定のオブジェクト50を削除することができ、ブロブ60を再圧縮し、再暗号化し、同じBID61aの下で対応する(1つまたは複数の)バックエンド70に書き込むことができる。
【0056】
[0071]ガベージコレクションは、各バックエンド70について同等であることを必要とされないことを当業者は理解されよう。言い換えれば、部分的にまたは完全にパージされたブロブは、バックエンド70にわたって同期させられる必要がない。いくつかのバックエンド70は、それらの中の元のオブジェクト50のすべてをもつブロブ60をホストし続けることができるが、他のバックエンド70は、コレクション80の完全性に影響を及ぼすことなしに、クリーンアップされたブロブ60のみを有することができる。すべてのブロブバージョンが、アクティブな不変オブジェクト50のまったく同じコピーを含んでいるので、コレクション80の現在状態を反映するためにブロブ60の任意のバージョンを使用することができることを当業者は理解されよう。ブロブ60のバージョン間のばらつきは、使用されるストレージの量と、履歴データ(参照されないコアオブジェクト50)の利用可能性とに影響を及ぼすにすぎない。この非対称性は、アーカイバル目的のために有用であることができることを当業者は理解されよう。
【0057】
[0072]たとえば、限定的ではないが、一実施形態では、直近のオブジェクト50のみを含んでいる完全にパージされたブロブ60をホストするために、ローカルハードディスク、SSDドライブ、SAN、およびキャッシュされたクラウドストレージなどの高性能なバックエンド70を指定することができるが、元の(参照されない)オブジェクト50のより大きい量をもつブロブをホストするために、WORMデバイス(すなわち、DVD、ブルーレイディスクなどの追記型(Write Once Read Many)媒体)、低いコストおよび性能のハードディスク、および長期間アーカイバルクラウドストレージサービスなど、他のより低い性能またはより低いコストのバックエンド70を指定することができる。
【0058】
[0073]次に
図6を参照すると、一実施形態による、最後のオブジェクトタイプ、リンキングを使用するコレクション管理と、ガベージコレクションに対するそれらの影響との一例が示されている。
図6の例では、ブロブ60ごとにコレクション80の展開が続く。
【0059】
[0074]最初に、ステップ1において、(OID#1および#2を割り当てられた)2つのコアオブジェクト50がブロブ#1に書き込まれる。この初期段階において、いずれのコアオブジェクト50も、そのタイプ(Otype)52bの最後のオブジェクトとして追跡されない。コアオブジェクト50はリンクを含んでおらず、リンクされない。この時点で、オブジェクト#1およびオブジェクト#2は、参照されないオブジェクトと見なされるが、それらがコレクションのまさに最後のオブジェクトであるので、パージ可能なコアオブジェクト50と見なされない。
【0060】
[0075]ステップ2において、(OID#3および#4を割り当てられた)2つのさらなるコアオブジェクト50が追加され、ブロブ#3に書き込まれる。コアオブジェクト#4は、それのタイプ(Otype)52bの最後のコアオブジェクト50として追跡され、コアオブジェクト#1、#2および#3へのリンクを含んでおり、それにより、コアオブジェクト#4をヘッドとしてもつオブジェクトのツリーを生成し、ブロブ#1に書き込まれるものを含むすべての他のオブジェクトをリンクする。ヘッドは、ブロブ#3のコレクション状態では、タイプ#1の最後のオブジェクト(この例では、オブジェクト#4のオブジェクトタイプ)として記録される。
【0061】
[0076]ステップ3において、(OID#5および#6を割り当てられた)2つのさらなるコアオブジェクト50が追加され、ブロブ#5に書き込まれる。コアオブジェクト#5は、オブジェクト#4にリンクし、Otype#1の最後のオブジェクトとして追跡される(すなわち、オブジェクト#5は現在、オブジェクトのツリーのヘッドである)。オブジェクト#6は、この段階で、他のコアオブジェクト50に関係せず、したがって、参照されない状態にあるが、それがコレクションの最後のオブジェクトであるので、パージ可能なオブジェクトと見なされない。
【0062】
[0077]ステップ4において、(OID#7、#8および#9を割り当てられた)3つのさらなるコアオブジェクトが追加され、ブロブ#7に書き込まれる。コアオブジェクト#7、#8および#9は、それらのOtypeの最後のオブジェクトとして追跡されない。コアオブジェクト#7、#8および#9はリンクを含んでおらず、リンクされない。同じく、これらのオブジェクトは、参照されないものと見なされるが、それらがコレクションの最後のコアオブジェクト50であるので、パージ可能なコアオブジェクト50とは見なされない。
【0063】
[0078]ステップ5において、(OID#10を割り当てられた)コアオブジェクト50が追加され、ブロブ#10に書き込まれる。コアオブジェクト#10はオブジェクト#5を置換する。オブジェクト#10は、それのOtype(タイプ#1)の最後のコアオブジェクトとして追跡され、オブジェクト#4、#6、#7および#8にリンクされる。これは、オブジェクト#10が現在ヘッドであるオブジェクトのツリーを再構成する。オブジェクト#10とオブジェクト#9とによって置換され、現在、孤立(orphaned)している、オブジェクト#5は、参照されず、使われていないものと見なされ、パージ候補リストに追加することができる。
【0064】
[0079]ステップ6において、(OID#11および#12を割り当てられた)2つのさらなるコアオブジェクト50が追加され、ブロブ#11に書き込まれる。オブジェクト#12はオブジェクト#10を置換する。オブジェクト#12は、それのOtype(タイプ#1)の最後のオブジェクトとして追跡され、オブジェクト#4、#6、および#11にリンクされる。これは、同じく、コアオブジェクト#12が現在ヘッドであるオブジェクトのツリーを再構成する。コアオブジェクト#7、#8および#10は、使われなくなり、パージ候補リストに追加することができる。
【0065】
[0080]
図6の例は、コアオブジェクト50が追加、リンク、置換または廃棄されるとき、各ブロブ60中のコレクション状態が、ステップの各々においてコレクション80中のすべてのアクティブコアオブジェクト50の厳密な状態を反映することを示している。そのような例はまた、以下でより詳細に説明されるように、時間移動(time travel)(または連続探査(continuum exploration))のために、データストレージを実行するための方法10を使用して作り出される構造をどのように容易に使用することができるかの容易な理解を可能にする。本明細書の過程において、「時間移動」という用語は、時間的に戻り、記憶されたデータを、それが前の状態で存在したとして、検査する能力を指す。上記で説明された構造を使用して、時間的に移動し(または連続探査を実行し)、コレクションの状態を、コレクションが過去のある時点において存在したとして、検討するために、コレクション80の「末尾」のビューは、所与のBID61aまたはOID52aにあるように再定義される(すなわち、所与のBID61aをもつブロブ60、または所与のOID52aに関連するブロブ60が、最後のブロブ60であった時点に、最後のブロブ60を手動で再定義する)。したがって、すべてのオブジェクトツリーおよびコアオブジェクト50のビューはまた、所与のBID61aをもつブロブ60が最後のブロブ60であった厳密な時点において、それらがどのように存在したかを反映する。したがって、記憶されたデータの厳密なアーカイブプロセスまたは「スナップショット」がとられることを必要とすることなしに、時間移動を実行することができ、過去のオブジェクトがまだパージされていない限り、記憶されたデータ内の時間移動に対する制限または限界がないことを当業者は理解されよう。コレクションの末尾BIDまたはOIDビューを再定義することが、コレクション自体を変更せず、複数のユーザが、コレクションの異なるビューを同時に保持してもよいことをも当業者は認識されよう。
【0066】
[0081]上記に鑑みて、時間移動と最適化されたブロブパージパラメータとの組合せは、実質的に低減されたストレージリソースを使用する高度アーカイブストラテジーを可能にすることができる。たとえば、限定的ではないが、一実施形態(図示せず)では、従来技術のアーカイバル「スナップショット」機能の挙動をエミュレートするためにバックエンド70の連続性を使用することもできるが、コレクション80を、データがアーカイバルバックエンド上で凍結されるより前のいかなる単一の時点においても連続的に時間移動することを可能にする。そのような実施形態では、元のブロブがすべてコレクションの1次バックエンド(アーカイバルバックエンド)中で凍結され、より新しいまたは部分的にパージされたブロブのみが2次バックエンドに記録されるように、1次バックエンドと2次バックエンドとを階層化することができる。したがって、1次バックエンドと2次バックエンドの両方を、コレクションのための可能なバックエンド70として使用することができる(すなわち、データを取り出すために1次バックエンドと2次バックエンドの両方を使用することができる)が、更新および削除は、2次バックエンド上に記録されるにすぎない。同様のストラテジーを、3次バックエンドに関して1次および2次バックエンド(アーカイバルバックエンド)のために後で使用することができる(すなわち、2次バックエンドのコンテンツも凍結され、3次バックエンドが導入され、より新しいまたは部分的にパージされたブロブは3次バックエンドに記録される)。この時点で、1次、2次および3次バックエンドはコレクションのための可能なバックエンドとして使用されるが、3次バックエンドのみがオブジェクト/ブロブ追加および/または削除を受ける。
【0067】
[0082]上記で説明されたブロブ60およびバックエンド70を使用して、たとえば、ブロブ60を2つまたはそれ以上のロケーションに同時に書き込むミラーリングされた階層化バックエンド70を使用して、完全および増分バックアップストラテジーを容易に実装することもできることをも当業者は理解されよう。代替的に、ライブバックエンド70からスタンバイバックエンド70に外部でブロブ60をコピーすることができる。コアオブジェクト50が不変であり、ブロブ60がログ構造化されることを仮定すれば、ブロブ60を同期させるか、またはどのブロブ60が最後のバックアップから変更されたかの検証に進む必要がなく、バックアップまたはコピーされる必要があるブロブ60のみが新しいブロブ60であることを理解されよう。
【0068】
[0083]上記に鑑みて、上記で説明された構造が、特定の損失または損傷したブロブ60のデータ以外に、データ損失を生じることなしに、概して、ブロブ60に対する損失または損傷を復元することができるロバストな構成を与えることを理解されよう。実際、各ブロブ60のコレクション管理情報が、ブロブ60が書き込まれたときのコレクションの状態とそれのコアオブジェクト50とを含むことを仮定すれば、損傷または損失したブロブが重要な構造的情報を含んでいた場合でも、要求を処理し続けるために、概して、先行するブロブ60(すなわち、特定の損失または損傷したブロブの前に作成されたブロブ)を使用することができる。
【0069】
[0084]前のブロブ60が、依然として、必要なコレクション管理情報のすべてを含んでいる場合、情報のそのような復元を容易に実行することができる。しかしながら、ガベージコレクションが実行され、情報をクリーンアップし始めた場合、前のブロブ60は、コレクション80を探査することを再開するために必要なすべての情報を確実に含んでいるとは限らない。したがって、一実施形態では、ディレクトリインデックスなどの重要なオブジェクトが技術的に使われていない場合でも、ブロブ60の損傷または損失に続く情報の復元の場合に、後で関係する場合がある情報を削除することを回避するために、重要なオブジェクトを保持するようにガベージコレクションを構成することができる。その上、ガベージコレクションが実行され、コレクションを探査することを再開するのに必要な情報が削除された場合、他のコアオブジェクト50へのリンクを含んでいる重要なコアオブジェクト50を、参照されるオブジェクトから再構成することができる。
【0070】
[0085]一実施形態では、データストレージを実行するための方法10は、コレクションを2つまたはそれ以上の別個のサブコレクション25にフォークする(またはクローニングする)ステップをさらに含むことができ、各サブコレクション80は、それらが共通に有する過去のオブジェクトおよびブロブのための同じ物理的ブロブおよびバックエンドを依然として共有しながら、個々に展開することができる。コレクション80がフォークされるとき、コレクション80は、実際のスナップショットまたはコピーがないということよりはむしろ、フォークされたコレクション80間の単純な共有部分があるということを除いて、実質的に、従来技術の「スナップショット」をとること、またはコレクション80全体をコピーし、次いでコピーを変更することと同等の物である。一実施形態では、コレクションをフォークするステップ25を進めるために、分散されたデータストレージを実行するための方法10は、複数の「最後のブロブ」を導入する(すなわち、コレクションの「末尾」を分割する)ステップを含む。
【0071】
[0086]複数の最後のブロブ60から、各フォークは、オブジェクトのそれ自体のツリーを定義する。したがって、「最後のブロブ」が、コレクションの状態とコレクションのすべてのコアオブジェクト50とを一緒に保持する鍵である、上記で説明された構造を仮定すれば、各フォークは、コレクション80の一意のビュー(一意のサブコレクション)を表し、他のフォークまたはベースコレクション80のオブジェクトまたは状態に影響を及ぼすことなしに、この特定のサブコレクション中でコアオブジェクト50を作成/更新することができる。方法10は、対応するフォークによって生成された各サブコレクション中で個々に実行される更新を、コアオブジェクト50およびブロブ60の一意のチェーンを含んでいる単一のコレクション80中に再結合することができるように、フォークを合成および/またはマージする後続のステップをさらに含むことができることを理解されよう。
【0072】
[0087]一実施形態では、時間移動は、各個々のフォーク上で並行して実行することができる。
[0088]実施形態によっては、フォークが論理的または物理的のいずれかであってもよいことを理解されよう。以下でより詳細に説明されるように、論理的フォークは、同じバックエンドの範囲内に作成され、他のフォークと同じブロブ、OIDおよびBID名前空間を共有する。物理的フォークは、別個のバックエンド中に実装され、各々、それら自体の一意のブロブ、OIDおよびBID名前空間を維持する。本方法10のコレクションを複数のサブコレクションにフォークするステップを実装するために、いずれかのフォークタイプ(すなわち、論理的フォークまたは物理的フォークのいずれか)を使用することができることを当業者は理解されよう。
【0073】
[0089]物理的フォークが別個のバックエンドおよび名前空間を使用するので、作成された物理的フォークが、同じOID52aおよびBID61aを、生成されたオブジェクトおよびブロブに割り当てることが可能であることを当業者は理解されよう。したがって、物理的フォークをマージするとき、新しい一意のOID52aをもつターゲットフォーク上に、マージされたオブジェクトを再作成することが必要になる。言い換えれば、論理的フォークでは可能であるが、生成されたフォーク間のオブジェクトを単純にリンクすることは可能でない。上記に鑑みて、2つまたはそれ以上の物理的フォークは、物理的フォークが完全に分離され(ただし、各フォークのブロブに記録される一意フォーク識別子(FID)を通して区別される)、互いとは無関係に展開することを仮定すれば、衝突するBID61a OID52a(すなわち同様のBID61aおよび/またはOID52a)を有することができる。したがって、動作中、2つまたはそれ以上の物理的フォークは、共有部分(すなわち、物理的フォークの作成の前に生成された部分)のみを有する異なるコレクションと同様に動作する。2つの物理的フォークをマージするために、マージヘルパーは、他の物理的フォーク上で作成されたオブジェクトに対応するターゲットフォーク上で新しいオブジェクトを作成し、したがって、別の物理的フォークに対して適用される変更を再統合する(以下で詳述される
図7dおよび対応する例を参照)ことが必要とされる。
【0074】
[0090]一実施形態では、チェーンチェックサムによって物理的フォークをさらに保護することができる。そのようなチェックサム値は、物理的フォークの合成またはマージに関与する前に、物理的フォークが同じ共通ブロブに基づくことを検証するために使用することができる。
【0075】
[0091]
図7aを参照すると、論理的フォークが開かれ、更新され、その後ベースコレクションに合成される、一実施形態による、コレクションをフォークすることの一例が表されている。ここでも、
図7aの例では、ブロブ60ごとにコレクション80およびサブコレクションの展開が続く。
図7aの例では、コレクションのコアオブジェクトのための2つのオブジェクトタイプ(Otype)52b、すなわち、通常コアオブジェクトのためのOtype#1と、論理的フォークコアオブジェクトを表すOtype#-5とがある。
【0076】
[0092]ステップ1において、(OID#1および#2を割り当てられた)2つのコアオブジェクト50が作成され、ブロブ#1に書き込まれる。オブジェクト#2は、オブジェクト#1にリンクし、Otype#1の最後のオブジェクトとしてフラグを付ける。オブジェクト#1および#2をもつオブジェクトツリーは、Otype#1の最後のオブジェクトとしてのオブジェクト#2を伴って、ブロブ#1に記憶されたコレクションの状態に反映される。
【0077】
[0093]ステップ2において、論理的フォークコアオブジェクトが作成され(FID#3を割り当てられ、それ自体の使用のために19までのオブジェクトOIDを予約し)、(OID#4を割り当てられた)オブジェクトが作成され、ブロブ#3に書き込まれる。オブジェクト#4は、フォーク#3のサブコレクション中のコレクションに追加され、オブジェクト#2にリンクされる。ブロブ#3に記憶されたコレクション状態は、ブロブ#3がフォーク#3のサブコレクションに属し、オブジェクトのツリーがオブジェクト#4から開始することを反映する。ブロブ#3に記憶されたコレクション状態は、最後のフォークオブジェクト(OType#-5)がフォーク#3であることをも反映する。この時点で、コレクション80は、2つのサブコレクション(元のコレクションのサブコレクション、およびフォーク#3のサブコレクション)を含み、その両方はオブジェクト#1および#2を共有するが、フォーク#3のサブコレクションは、より大きいオブジェクトツリーを有する(すなわち、オブジェクト#4をも含む)。
【0078】
[0094]ステップ3において、(OID#5および#6を割り当てられた)2つの新しいコアオブジェクト50がフォーク#3のサブコレクション中で作成され、ブロブ#5に記憶される。オブジェクト#6は、オブジェクト#4および#5にリンクされ、それのOtype(タイプ#1)の最後のオブジェクトとしてフラグを付けられる。これは、オブジェクト#1および#2を依然として共有するヘッド(すなわち最後のオブジェクト)としてオブジェクト#6をもつオブジェクトのツリーを作成し、サブコレクションはベースコレクションに対応する。ステップ3において、フォーク#3を参照すると、フォーク#3は、フォーククローズオブジェクト#7の書込みによって閉じられる。ブロブ#5は、フォーク#3の下に書き込まれ、フォークおよびそれのオブジェクトの最新の状態を反映する。
【0079】
[0095]この時点で、コレクションは2つのフォークを有し、ベースコレクションであるフォーク#0(FID#0)は、Otype#1の最後のオブジェクトがオブジェクト#2(OID#2)であることを示す状態を有し、それは2つのオブジェクト(オブジェクト#1および#2)のツリーを形成し、閉じられた論理的フォークのサブコレクションであるフォーク#3(FID#3)は、それのヘッドとして(およびオブジェクト#5、#4、#2および#1にリンクする)オブジェクト#6(OID#6)をもつオブジェクトのツリーを有する。フォーク#3のサブコレクション中のコレクション状態はまた、最後のフォークオブジェクト(Otype#-5)がOID#7を有することを示し、それにより、フォーク#3が閉じられたことを示す。
【0080】
[0096]ステップ4において、論理的フォーク#3のサブコレクションは、(#19までのOIDがフォーク#3に予約されたことを仮定すれば)ベースコレクションのための次の予約されていないOIDである(OID#20を割り当てられたフォークベース合成コアオブジェクト50を作成することによってベースコレクションに合成され、ブロブ#20に書き込まれる。合成は、フォーク#3のサブコレクションの状態を反映するためにコレクション状態を更新することによって実行され、それにより、フォーク#3のサブコレクションのオブジェクトツリーからのすべてのオブジェクトをメインコレクション(FID#0)中に自動的に統合する。合成がベースコレクションに対して行われるので、ブロブ#20もベースコレクションに属し、FID#0を有する。この時点で、フォークオブジェクト#20(Otype#-5の最後のオブジェクト)を通してフォーク履歴を検査することができるが、場合によっては、コレクションは、フォークを有しないと見なされ、他の標準コレクションのように動作する。
【0081】
[0097]
図7bを参照すると、2つの論理的フォークが開かれ、更新され、その後ベースコレクションにマージされる、一実施形態による、コレクションをフォークすることの一例が表されている。ここでも、
図7bの例では、ブロブ60ごとにコレクション80およびサブコレクションの展開が続く。
図7bの例では、ここでも、コレクションのコアオブジェクトのための2つのオブジェクトタイプ、すなわち、通常コアオブジェクトのためのOtype#1と、論理的フォークコアオブジェクトを表すOtype#-5とがある。
【0082】
[0098]ステップ1において、(OID#1および#2を割り当てられた)2つのコアオブジェクト50が作成され、ブロブ#1に書き込まれる。オブジェクト#2は、オブジェクト#1にリンクし、Otype#1の最後のオブジェクトとしてフラグを付けられる。オブジェクト#1および#2をもつオブジェクトツリーは、Otype#1の最後のオブジェクトとしてのオブジェクト#2を伴って、ブロブ#1に記憶されたコレクションの状態に反映される。
【0083】
[0099]ステップ2において、論理的フォークコアオブジェクトが作成され(FID#3を割り当てられ、それ自体の使用のために#19までのオブジェクトOIDを予約し)、(OID#4を割り当てられた)コアオブジェクトが作成され、ブロブ#3に書き込まれる。オブジェクト#4は、フォーク#3のサブコレクション中のコレクションに追加され、オブジェクト#2にリンクされる。ブロブ#3に記憶されたコレクション状態は、ブロブ#3がフォーク#3のサブコレクションに属し、オブジェクトのツリーがオブジェクト#4から開始することを反映する。ブロブ#3に記憶されたコレクション状態は、最後のフォークオブジェクト(OType#-5)がフォーク#3であることをも反映する。この時点で、コレクション80は、2つのサブコレクション(元のコレクションのサブコレクション、およびフォーク#3のサブコレクション)を含み、その両方はオブジェクト#1および#2を共有するが、フォーク#3のサブコレクションは、より大きいオブジェクトツリーを有する(すなわち、オブジェクト#4をも含む)。
【0084】
[00100]ステップ3において、第2の論理的フォークコアオブジェクトが作成され(FID#20(利用可能な次のOID)を割り当てられ、それ自体の使用のために#39までのオブジェクトOIDを予約し)、(OID#21を割り当てられた)コアオブジェクトが作成され、ブロブ#20に書き込まれる。オブジェクト#21は、フォーク#20のサブコレクション中のコレクションに追加され、オブジェクト#2にリンクされる。ブロブ#20に記憶されたコレクション状態は、ブロブ#20がフォーク#20のサブコレクションに属し、オブジェクトのツリーがオブジェクト#21から開始することを反映する。ブロブ#20に記憶されたコレクション状態は、最後のフォークオブジェクト(OType#-5)がフォーク#20であることをも反映する。フォークオブジェクト#20は、フォーク#3がこの時点でもアクティブであることを示す。この時点で、コレクション80は、3つのサブコレクション(元のコレクションのサブコレクション、フォーク#3のサブコレクション、およびフォーク#20のサブコレクション)を含み、すべてがオブジェクト#1および#2を共有するが、それ以外は異なるオブジェクトヘッドおよびツリーを有する。
【0085】
[00101]ステップ4において、フォーク#3はフォーク#20と並行して展開する。(OID#5および#6を割り当てられた)2つのコアオブジェクト50が作成される。オブジェクト#6は、オブジェクト#4および#5にリンクされ、それのOtype(タイプ#1)の最後のオブジェクトとしてフラグを付けられる。これは、ヘッド(すなわち最後のオブジェクト)としてオブジェクト#6をもつ、フォーク#3中のオブジェクトのツリーを作成する。ステップ4において、フォーク#3を参照すると、フォーク#3は、(FID#7を割り当てられた)フォーククローズオブジェクト#7の書込みによって閉じられる。ブロブ#5は、フォーク#3の下に書き込まれ、フォークおよびそれのオブジェクトの最新の状態を反映する。
【0086】
[00102]ステップ5において、フォーク#20はフォーク#3と並行して展開する。(OID#22、#23および#24を割り当てられた)3つのコアオブジェクト50が作成され、ブロブ#22に書き込まれる。オブジェクト#24はオブジェクト#21および#23にリンクされる。オブジェクト#24は、それのOtype(タイプ#1)の最後のオブジェクトとしてフラグを付けられる。オブジェクト#23はオブジェクト#22にリンクされる。これは、ヘッド(すなわち最後のオブジェクト)としてオブジェクト#24をもつ、フォーク#20中のオブジェクトのツリーを作成する。ステップ5において、フォーク#20を参照すると、フォーク#20は、(FID#25を割り当てられた)フォーククローズオブジェクトの書込みによって閉じられ、同じくブロブ#22に書き込まれる。ブロブ#22は、フォーク#20の下に書き込まれ、フォークおよびそれのオブジェクトの最新の状態を反映する。
【0087】
[00103]ステップ6において、論理的フォーク#3のサブコレクションは、(FID#40(最後のOIDがフォーク#20に予約された後に、利用可能な次のOID)を割り当てられた)マスタフォークコアオブジェクトを作成することによってベースコレクションに合成され、ブロブ#40に書き込まれる。合成は、フォーク#3のサブコレクションの状態を反映するためにコレクション状態を更新することによって実行され、それにより、フォーク#3のサブコレクションのオブジェクトツリーからのすべてのオブジェクトをメインコレクション中に自動的に統合する。マスタフォークオブジェクト#40は、合成されたフォーク(FID#3)と、この時点で依然としてアクティブである他のフォーク(FID#20)と、マスタフォーク(FID#40)とを識別する。
【0088】
[00104]マスタフォーク(FID#40)およびフォークオブジェクト#20がコレクション80の異なる展開を反映するので、(フォーク#3の場合に行われたように)これらの2つのフォークのコンテンツを単純に合成することができない。したがって、両方のフォークの展開を単一のフォーク中に統合するために、2つのフォークはマージされなければならない。したがって、ステップ7において、フォーク#20とフォーク#40とをマージする目的で、新しい論理的フォークが作成される(FID#41を割り当てられ、それ自体の使用のために#50までのオブジェクトOIDを予約する)。(OID#42を割り当てられた)コアオブジェクト50が作成される。オブジェクト#42はマスタフォーク#40のオブジェクト#5を置換し、フォーク#20のオブジェクト#21を削除する。(OID#43を割り当てられた)追加のコアオブジェクト50が作成され、3つのオブジェクトツリーに属するオブジェクト、すなわち、1)マージフォーク#41の新たに作成されたオブジェクト#42、2)マスタフォーク#40のオブジェクト#4(およびしたがって、マスタフォーク#40からのオブジェクトのチェーン#4-#2-#1)、ならびに3)フォーク#20のオブジェクト#23にリンクする。オブジェクト43は、現在、マージフォーク#41のOtype#1の新しいヘッドオブジェクトである。ステップ7において、フォーク#41を参照すると、フォーク#41は、(FID#44を割り当てられた)フォーククローズコアオブジェクトの書込みによって最終的に閉じられ、ブロブ#41に書き込まれる。ブロブ#41はフォーク#40の下に書き込まれ、コレクション状態は、フォーク#20および#40からのすべての要素をマージするオブジェクトのツリーを反映する。
【0089】
[00105]現在、マージフォーク#40が、すべての他のフォークが1つのフォーク(フォーク#41)中にマージされたコレクションの状態を表すと仮定すれば、論理的フォーク#41のサブコレクションは、(FID#51(利用可能な次のOID)を割り当てられた)フォークベース合成コアオブジェクトでベースコレクションに合成される。この合成は、フォーク#41のサブコレクションの状態を反映するためにコレクション状態を更新することによって実行され、それにより、フォーク#41のサブコレクションのオブジェクトツリーからのすべてのオブジェクトをメインコレクション(FID#0)中に自動的に統合する。合成がベースコレクションに対して行われるので、ブロブ#51もベースコレクションに属し、FID#0を有する。この時点で、コレクションは、フォークを有しないと見なされ、他の標準コレクションのように動作する。
【0090】
[00106]
図7cを参照すると、物理的フォークが開かれ、更新され、その後ベースコレクションに合成される、一実施形態による、コレクションをフォークすることの一例が表されている。ここでも、
図7cの例では、ブロブ60ごとにコレクション80およびサブコレクションの展開が続く。
図7cの例では、コレクションのコアオブジェクトのための2つのオブジェクトタイプ、すなわち、通常コアオブジェクトのためのOtype#1と、物理的フォークコアオブジェクトを表すOtype#-6とがある。
【0091】
[00107]ステップ1において、(OID#1および#2を割り当てられた)2つのコアオブジェクト50が作成され、ブロブ#1に書き込まれる。オブジェクト#1および#2をもつオブジェクトツリーは、Otype#1の最後のオブジェクトとしてのオブジェクト#2を伴って、ブロブ#1に記憶されたコレクションの状態に反映される。さらに、(FID#3を割り当てられた)物理的フォークコアオブジェクトが作成される。各Otypeについての最後のオブジェクト(Otype#1についてのOID#2、およびOtype#-6についてのOID#3)は、ブロブ#3中のコレクション状態に記録される。ブロブ#1がこの時点でベースコレクションに属することを仮定すれば、それはFID#0を用いて書き込まれる。
【0092】
[00108]新しい物理的フォーク(フォーク#3)のすべてのブロブ60を保存するために、新しいバックエンドが割り当てられる。新しい物理的フォークに関連するブロブを保存するために、任意のバックエンドタイプおよび/または構成を使用することができることを理解されよう。一実施形態では、バックエンドは、一時メモリベースフォークであってもよい。
【0093】
[00109]ステップ2において、(OID#4を割り当てられた)コアオブジェクトが作成され、ブロブ#4に書き込まれる。オブジェクト#4は、FID#3をもつコレクションに追加され、物理的フォーク(フォーク#3)は、現在、ヘッドとしてのOID#4が物理的フォークに記憶され、ベースコレクションに記憶されたOID#2および#1にチェーン結合された、オブジェクトのチェーンを表す。ブロブ#3に記憶されたコレクション状態は、ブロブ#3がフォーク#3(FID#3)のサブコレクションに属し、オブジェクトのツリーがオブジェクト#4から開始することを反映する。この時点で、コレクション80は、2つのサブコレクション(元のコレクションのサブコレクション、およびフォーク#3のサブコレクション)を含み、その両方はオブジェクト#1および#2を共有するが、フォーク#3のサブコレクションは、より大きいオブジェクトツリーを有する(すなわち、オブジェクト#4をも含む)。物理的フォーク(フォーク#3)が、ヘッドとしてOID#2をもつオブジェクトツリーを依然として含むベースコレクションに影響を及ぼさないことを理解されよう。
【0094】
[00110]ステップ3において、(OID#5および#6を割り当てられた)2つの新しいコアオブジェクト50がフォーク#3のサブコレクション中で作成され、ブロブ#5に記憶される。オブジェクト#6は、オブジェクト#4および#5にリンクされ、それのOtype(タイプ#1)の最後のオブジェクトとしてフラグを付けられる。これは、オブジェクト#1および#2を依然として共有するヘッド(すなわち最後のオブジェクト)としてオブジェクト#6をもつオブジェクトのツリーを作成し、サブコレクションはベースコレクションに対応する。ステップ3において、フォーク#3を参照すると、フォーク#3は、(FID#7を割り当てられた)フォーククローズオブジェクト#7の作成によって閉じられ、ブロブ#5に書き込まれる。ブロブ#5は、フォーク#3の下に書き込まれ、フォークおよびそれのオブジェクトの最新の状態を反映する。現在、フォーク#3が閉じられたものとしてマークされるので、いかなる他のコアオブジェクトをもこの物理的フォークに書き込むことができず、それにより、フォークがその後更新されないことを保証する。
【0095】
[00111]
図7cの例では、物理的フォーク(フォーク#3)が作成されて以来ベースコレクションが更新されなかったと仮定すれば、物理的フォーク中で行われた変更を、単純な合成を用いてメインコレクション中に再統合することができる。図示の実施形態では、これは、ステップ4および5において、物理的フォーク(フォーク#3)に関連するブロブをメインコレクションバックエンド中にコピーすることによって達成される。代替の実施形態(図示せず)では、メインコレクションへの、物理的フォークにおいて行われた変更の再統合を、メインコレクションの一部であるものとして物理的フォーク(フォーク#3)のバックエンドを再構成することによって達成することもできる。そのような再構成は、ブロブ移動なしに、物理的フォーク(フォーク#3)に関連するブロブをメインコレクションバックエンド中に再コピーすることと同じことを達成するであろう。
【0096】
[00112]最終的に、ステップ6において、メインコレクション中で、(FID#8を割り当てられた)フォーク合成コアオブジェクトが作成され、ブロブ#8に書き込まれる。ベースコレクション中のフォーク合成コアオブジェクトの作成は、FID#0(メインコレクションのFID)を用いて将来のブロブが書き込まれることになることを保証する。
【0097】
[00113]
図7dを参照すると、物理的フォークが開かれ、ベースコレクションと同時に更新され、その後ベースコレクションとマージされる、一実施形態による、コレクションをフォークすることの一例が示される。ここでも、
図7dの例では、ブロブ60ごとにコレクション80およびサブコレクションの展開が続く。
図7dの例では、コレクションのコアオブジェクトのための2つのオブジェクトタイプ、すなわち、通常コアオブジェクトのためのOtype#1と、物理的フォークコアオブジェクトを表すOtype#-6とがある。
【0098】
[00114]ステップ1において、(OID#1および#2を割り当てられた)2つのコアオブジェクト50が作成され、ブロブ#1に書き込まれる。オブジェクト#2は、オブジェクト#1にリンクし、Otype#1の最後のオブジェクトとしてフラグを付けられる。オブジェクト#1および#2をもつオブジェクトツリーは、Otype#1の最後のオブジェクトとしてのオブジェクト#2を伴って、ブロブ#1に記憶されたコレクションの状態に反映される。さらに、(FID#3を割り当てられた)物理的フォークコアオブジェクトが作成される。各Otypeについての最後のオブジェクト(Otype#1についてのOID#2、およびOtype#-6についてのOID#3)は、ブロブ#3中のコレクション状態に記録される。ブロブ#1がこの時点でベースコレクションに属することを仮定すれば、それはFID#0を用いて書き込まれる。
【0099】
[00115]ここでも、新しい物理的フォーク(フォーク#3)のすべてのブロブ60を保存するために、新しいバックエンドが割り当てられる。上述のように、新しい物理的フォークに関連するブロブを保存するために、任意のバックエンドタイプおよび/または構成を使用することができることを理解されよう。
【0100】
[00116]ステップ2において、(OID#4を割り当てられた)コアオブジェクトが作成され、ブロブ#4に書き込まれる。オブジェクト#4は、FID#3をもつコレクションに追加され、物理的フォーク(フォーク#3)は、現在、ヘッドとしてのOID#4が物理的フォークに記憶され、ベースコレクションに記憶されたOID#1にチェーン結合された、オブジェクトのチェーンを表す。ブロブ#3に記憶されたコレクション状態は、ブロブ#3がフォーク#3(FID#3)のサブコレクションに属し、オブジェクトのツリーがオブジェクト#4から開始することを反映する。この時点で、コレクション80は、2つのサブコレクション(元のコレクションのサブコレクション、およびフォーク#3のサブコレクション)を含む。フォーク#3のサブコレクションは、オブジェクト#1にリンクされたオブジェクト#4を含むオブジェクトツリーを有する)。物理的フォーク(フォーク#3)が、ヘッドとしてOID#2をもつオブジェクトツリーを依然として含むベースコレクションに影響を及ぼさないことを理解されよう。
【0101】
[00117]ステップ3において、(OID#4および#5を割り当てられた)2つのコアオブジェクトがベースコレクション中で作成され、ベースコレクションのブロブ#4に書き込まれる。新たに作成されたコアオブジェクトおよびブロブは、物理的フォークおよびベースコレクションが現在、完全に分岐した(すなわち、異なるコレクションと同様に動作する)ことを仮定すれば、物理的フォーク(フォーク#3)中のものとは異なることを理解されよう。ベースコレクションは、現在、OID#5をもつコアオブジェクトのツリーを有し、OID#4は、物理的フォーク(フォーク#3)中でオブジェクトOID#4を有するコアオブジェクトとは異なる。2つのフォーク(すなわち、物理的フォーク、およびベースコレクションのフォーク)は異なるFIDを有し、異なるバックエンドを使用し、したがって、互いから分離されるが、コレクションがフォークされる前に存在した共通コアオブジェクト#1を依然として共有する。
【0102】
[00118]ステップ4において、(OID#5および#6を割り当てられた)2つのコアオブジェクトが物理的フォーク中で作成され、物理的フォーク(すなわち、FID#3をもつ)のブロブ#5に記憶される。ここでも、物理的フォーク#3のオブジェクト#5がベースコレクションのオブジェクト#5とは異なることが理解されなければならない。フォーク#3のオブジェクト#6は、オブジェクト#4および#5にリンクされ、それのOtype(タイプ#1)の最後のオブジェクトとしてフラグを付けられる。ステップ4において、フォーク#3を参照すると、フォーク#3は、(FID#7を割り当てられた)フォーククローズオブジェクトの書込みによって閉じられ、ブロブ#5に書き込まれる。ブロブ#5は、フォーク#3の下に書き込まれ、フォークおよびそれのオブジェクトの最新の状態を反映する。ブロブ#5中のコレクション状態は、オブジェクトOID#6(Otype#1)と、フォーククローズオブジェクト#7(Otype#-6)とをそれらのOtypeの最後のオブジェクトとして反映する。現在、フォーク#3が閉じられたものとしてマークされるので、いかなる他のコアオブジェクトをもこの物理的フォークに書き込まれず、それにより、フォークがその後更新されないことを保証する。
【0103】
[00119]ベースコレクションと物理的フォーク(フォーク#3)とが同時に更新され、フォークは単純に合成することができないので、物理的フォーク中で行われた変更をベースコレクション中に再統合するために、フォークはマージされる必要がある。ステップ5において、ベースコレクションと物理的フォーク(フォーク#3)とは、ヘルパー(図示せず)を使用してマージされる。ヘルパーは、新たに作成されたコアオブジェクト中のベースコレクション中の物理的フォーク(フォーク#3)のコアオブジェクト(すなわちコアオブジェクト#4、#5および#6)のペイロードを再構成する。図示の実施形態では、フォーク#3のコアオブジェクト#4は、ベースコレクションのコアオブジェクト#6の下に再作成され、フォーク#3のコアオブジェクト#5は、ベースコレクションのコアオブジェクト#7の下に再作成され、フォーク#3のコアオブジェクト#6は、ベースコレクションのコアオブジェクト#8の下に再作成され、各新たに作成されたコアオブジェクトは、ベースコレクションの対応する既存のオブジェクトにリンクされるか、または必要に応じて置換/削除される。マージの後に、オブジェクト#1は2つの親(オブジェクト#2およびオブジェクト#6)を有する。これは有効な構成体であり、オブジェクトがそれの子であってもよいリンクの数に対する理論的な限界がない。(FID#9を割り当てられた)物理的フォークマージは、物理的フォーク#3がベースコレクション中にマージされ、もはや使用されていないという事実を記録するためにベースコレクションに書き込まれる。すべてのマージされたコアオブジェクトを含むブロブは、それらのブロブが現在ベースコレクションに属するように、FID#0の下に書き込まれる。
【0104】
[00120]マージが複雑であり、多くのブロブを伴う一実施形態(図示せず)では、論理的フォークは、最初にメインコレクション中で作成し、メインコレクションに合成する前にマージプロセスを記録するために使用することができる。論理的フォークの使用は、すべての更新が統合されるまで、マージ操作がオブジェクトのメインコレクションのビューに影響を及ぼすのを防ぐのを助ける。
【0105】
[00121]上記に鑑みて、不変性と、それが含んでいるコアオブジェクト50のOID52aの導関数であるBID61aをもつコアオブジェクト50の一意のOID52aとの組合せは、ブロブ60が、中央制御、追跡、インデックスまたはマップを必要としない、高度に安定した、自律型で自由なモバイルデータコンテナであることを可能にする。
【0106】
[00122]コアオブジェクト50がそれら自体不変であり、OID52aが永続的に一意であるので、拡大すると、ブロブ60は本質的に不変である。したがって、ブロブ60中のコアオブジェクト50が、コンテンツまたはOID52aのいずれによっても変化することができないことを仮定すれば、別のロケーションにコピーまたは複製されたブロブ60のどの「バージョン」が、所与のコアオブジェクト50の最新バージョンを含んでいるかを定義または記憶する必要がなく、所与のBID61aをもつすべてのブロブ60は、等価である。
【0107】
[00123]BID61aがブロブ60のコアオブジェクト50のOID52aから導出されるので、求められるコアオブジェクト50のOID52aのみを使用して、どのブロブ60が所与のコアオブジェクト50を含んでいるかを決定し、それにより、どのブロブ60がどのコアオブジェクト50を含んでいるかに関するインデックスまたはマップを維持しなければならないという負担を削除することができる。
【0108】
[00124]BID61aは、ブロブ60の識別情報だけでなく、拡大すると、ブロブ60内のすべてのオブジェクト50の識別情報、状態およびコンテンツをも伝達するので、これは、バックエンド70をもつブロブ60のコンテンツに関する情報を共有する必要を防ぎ、制御情報または他のメタデータを含むブロブ全体が、暗号化され、完全に隠されることを可能にする。ブロブ60が、データの、完全に密閉され、暗号化されたコンテナであるので、ブロブ60のコンテンツまたは性質に関して何も知る必要がなく、任意の機構またはエージェントによってそれらをセキュアにコピーすることができる。したがって、バックエンド70は、バックエンド70のインフラストラクチャが異なる場合でも、ブロブ60のコンテンツを理解または確認すること(あるいはそれらが含んでいるものを理解するために中央の権限者(central authority)に確認すること)なしに、ブロブを、あるバックエンドから別のバックエンドに自由に移動およびコピーすることができる。交換される必要がある唯一の物は、ブロブ60のBID61aおよびコンテンツである。
【0109】
[00125]最終的に、求められるコアオブジェクト50のOID52aからBID61aが導出され、ストレージバックエンド70によって保持されるBID61aのショートリストを使用してBID61aの位置を特定することができるので、コアオブジェクト50の正確なロケーションは、BID導出を通してリアルタイムで自動的に開示される。ブロブ60の追跡またはインデックス付けは、必要とされない。これは、中央ユニットへの通知なしに、バックエンド70間のブロブ60の自由な移動または点在を可能にする。ストレージバックエンド70は、それらがどのブロブ60を含んでいるかを知ることが必要とされる唯一の構成要素である。所与のBID61aをもつブロブ60がどこかで利用可能である限り、データは容易に利用可能である。その上、データの利用可能性および完全性を高めるために、ブロブ60を、中央調整なしに、任意のストレージ媒体またはサービスに自由に複製することができる。ブロブのコピーがどこに位置しても、それを使用することができる。
【0110】
[00126]上記に鑑みて、説明される構造はまた、更新のためにさえ、中央サーバなどの中央調整ユニットの使用を必要とすることなしに、コレクション80がピアツーピアモードでユーザ間で共有されることを可能にする。コレクション共有は、衝突完全性原理の適用によって、ブロブ60の構造とログ構成されたコアオブジェクト50とに鑑みて可能である。たとえば、コレクションのピアツーピア共有が2つまたはそれ以上のユーザ間で実行される一実施形態では、2つまたはそれ以上のユーザがオブジェクトを追加し、同じブロブ60に同時に書き込むことを試みる場合、衝突が検出され、ユーザのうちの1つのみがブロブ60を書き込むことに成功し、他は、衝突の結果として失敗することになる。ブロブ60の書込みのそのような失敗は、コレクション80が更新されたことを暗示する。したがって、ブロブの書込みが失敗したユーザの各々は、コレクションの新しい状態でコレクションのそれのビューをリフレッシュし、新しいブロブ60の下にオブジェクトを再構成する必要がある。その後、それは、次いで(新しいBID61aの下に書き込まれた)新しいブロブ中で更新を再サブミットすることができる。もちろん、衝突が再び検出された場合、プロセスは、それが当のユーザについて成功するまで繰り返される。代替の実施形態では、衝突の発生を制限または緩和するために、衝突完全性原理に関して、またはそれとは別に、追加の機構を使用することができる。たとえば、限定的ではないが、各ユーザが衝突の危険および頻度を低減するために、論理的フォークを使用することができる。衝突検出が機能するために、場合によっては衝突するブロブは、すべてのユーザによって共有される同じバックエンドに記憶されなければならないことを当業者は認識されよう。しかしながら、物理的フォークに関連するブロブ、または衝突することができない、論理的フォーク中の予約されるOID範囲を、すべてのユーザによって必ずしも使用または共有されるとは限らない任意のバックエンドに記憶してもよい。また、一実施形態では、完全性を共有することを保証するために、衝突検出の代わりにロックサーバを使用することができることを、当業者は認識されよう。別の代替の実施形態では、共有される共通バックエンド70を使用することも、衝突検出に依拠することもなしに、ピアツーピア共有を行うこともできる。これは、コレクションが、各ユーザがブロブ60のプライベートコピーをもつそれ自体の物理的バックエンド70を有し、したがって、コレクション80のそれら自体のコピーを別々に読み取り、更新することができるように単に構成された、デタッチされたバックエンド共有として知られている。クライアントが再接続するとき、それらのデタッチされたコレクションを、それらがデタッチされていた間に実行された変更を再統合するために、それらが物理的フォークであったかのように、合成/マージすることができる。
【0111】
[00127]データストレージを実行するための方法10が上記で説明されており、次に、上記で説明された分散されたデータストレージを実行するためのシステム100について説明する。
【0112】
[00128]
図8および
図9に関して、一実施形態では、システム100は、(ファイルシステムエンジンモジュール132、データベースエンジンモジュール134、インデックスエンジンモジュール130など)エンジンモジュール104など、データソースとデータ通信しているコアエンジンモジュール110、および/またはデータストレージを要求するアプリケーション106を含む。大まかに言えば、コアエンジンモジュール110は、分散されたデータストレージを実行するために、すべての他のサービスが依拠する基本サービスを与えるエンジンである。言い換えれば、コアエンジンモジュール110は、システム100の主要なモジュールであり、それは、オブジェクト、ブロブ、コレクションおよびバックエンドの作成、更新、コレクションからの削除を管理すること、ブロブ圧縮/圧縮解除(必要な場合)を実行すること、ブロブ暗号化/解読(必要な場合)を実行すること、コレクション管理を実行することなどを行う。
【0113】
[00129]コアエンジンモジュール110、エンジンモジュール104、および/またはアプリケーション106、ならびに/あるいはそれの副構成要素は、ローカルコンピューティングシステムの一部(すなわち、各構成要素/副構成要素が、それ自体のメモリおよびプロセッサを有する同じコンピューティングユニット上にインストールされる)であってよい。ただし、一実施形態では、コアエンジンモジュール110、エンジン104、および/またはアプリケーション106、ならびに/あるいはそれの副構成要素を、たとえば、ネットワークを介して互いとデータ通信している別個のコンピューティングユニット上に分散させることができることを当業者は理解されよう。
【0114】
[00130]一実施形態では、コアエンジンモジュール110は、それを通して追加のエンジンモジュール104およびアプリケーション106がストレージサービスを要求することができる、コアアプリケーションプログラミングインターフェース(API)モジュール112を含む。アプリケーション106は、データを記憶するためにシステム100を使用する外部プログラムである。一実施形態では、アプリケーション106は、それらのデータを個別オブジェクトとして構造化するためにコアエンジンAPIモジュール112を使用する。代替の実施形態(
図9を参照)では、アプリケーション106はまた、テーブルレコードとしてそれのデータを記憶するために、以下でより詳細に説明されるデータベースエンジンモジュール134を使用するか、あるいはファイルとともに動作するために、直接または間接的に、同じく以下でより詳細に説明されるファイルシステムエンジンモジュール132を使用することができる。一実施形態では、コアAPIモジュール112は、コレクションを開き、コアオブジェクトなどを読み取り、書き込み、削除するように動作可能である。
【0115】
[00131]一実施形態では、コアエンジンモジュール110はまた、コアAPIモジュール112と通信しているコレクションマネージャモジュール114を含む。コレクションマネージャモジュール114は、すべての高レベル要求を扱い、コアオブジェクトを管理する。たとえば、コレクションマネージャモジュール114は、作成されたオブジェクトに準拠OIDを割り当て、一実施形態では、上記で説明されたように、オブジェクトに適切なオブジェクト識別情報(エイリアス、VIDなど)を割り当てる。コレクションマネージャモジュール114はまた、対応する方法に関して上記で説明されたように、使われていないオブジェクト、すなわち、参照されず、定義されたパージパラメータに従ってパージ可能であるオブジェクトを識別し、パージするように動作可能なガベージコレクタを含む。
【0116】
[00132]コレクションマネージャモジュール114は、ブロブを生成し、管理するためのブロブマネージャモジュール116と通信する。ブロブマネージャモジュール116はブロブを生成し(すなわち、オブジェクトをブロブ中にアセンブルし)、BIDを割り当て、ブロブの位置を特定し、複数のバックエンドへのアクセスを協調させ、バックエンドとの非同期入力/出力(l/O)を実装する。
【0117】
[00133]コレクションマネージャモジュール114およびブロブマネージャモジュール116は、オブジェクトおよびブロブの上記で説明された中心的特徴、すなわち、オブジェクト不変性と、永続的に一意のオブジェクトID(OID)と、導出されたブロブID(BID)と、予測可能なBIDとを実装し、それらは、容量がその後、インデックス、中央制御、追跡または同期を使用せずにデータをあるバックエンド170(または記憶ロケーション)から別のものに自由に記憶し、移動し、コピーし、点在させることと、ロックまたは中央調整サーバを使用しない更新を用いてピアツーピアモードでそのデータを共有することとを可能にする。
【0118】
[00134]ブロブマネージャモジュール116は、ブロブのコンテンツを圧縮および圧縮解除するために、独立した圧縮機モジュール118と通信する。一実施形態では、圧縮機モジュール118は、複数の圧縮アルゴリズムを実装することができ(それは、異なるブロブのために異なる圧縮アルゴリズムを使用することができ)、ブロブがそれの圧縮解除のために読み取られるとき、後続の圧縮解除のために使用される圧縮アルゴリズムを識別するために、圧縮タグとともに各ブロブをカプセル化する。ブロブに圧縮が適用されない一実施形態では、コアエンジンモジュール110には圧縮機モジュール118がなくてもよいことを当業者は理解されよう。
【0119】
[00135]コアエンジンモジュール110はまた、圧縮機モジュール118と通信する暗号化器モジュール120を含む。圧縮機モジュール118と同様に、暗号化器モジュール120は複数の暗号化アルゴリズムを実装することができ、したがって、異なるブロブに異なる暗号化を適用し、それにより、システム100全体のセキュリティを向上させることができる。暗号化器モジュール120はまた、バックエンドから読み取られるとき、各特定のブロブをどのように解読することができるかを示す暗号化タグとともにブロブをカプセル化することができる。ここでも、ブロブに暗号化が適用されない一実施形態では、コアエンジンモジュール110には暗号化器モジュール120がなくてもよいことを当業者は理解されよう。
【0120】
[00136]図示の実施形態では、暗号化器モジュール120は、バックエンド170とデータ通信している。上述のように、複数のバックエンドを各コレクションに関連付けることができ、記憶されたデータの分散されたデータストレージを実行するために、ブロブがそれのストレージのための複数のバックエンドにわたって自律的に分散および/または点在させることができる。コアエンジンモジュール110に暗号化器モジュール120および/または圧縮機モジュール118がない一実施形態では、バックエンド170は、ブロブマネージャモジュール116と直接データ通信していてもよい。
【0121】
[00137]図示の実施形態では、圧縮機モジュール118、暗号化器モジュール120およびバックエンド170はストリームハンドラとして動作し、ブロブを読み取り、書き込むために、それら自体との間でデータを自由に受け渡す。容易に理解されるように、ストリームの最後に、バックエンド170は、ブロブがクラウド中のおよび/またはローカル物理ストレージデバイス上の実際に物理的に記憶されるところである。
【0122】
[00138]まだ
図8および
図9を参照すると、一実施形態では、システム100は、以下でより詳細に説明される、インデックスエンジンモジュール130、ファイルシステムエンジンモジュール132、およびデータベースエンジンモジュール134などの追加のエンジンモジュールを含む。インデックスエンジンモジュール130、ファイルシステムエンジンモジュール132およびデータベースエンジンモジュール134は、ユーザ、オペレーティングシステムおよびアプリケーションにファイルおよびデータベースサービスを与えるように動作可能である。
【0123】
[00139]インデックスエンジンモジュール130は、コレクションに記憶されたデータを、容易に編成し、そのデータの位置を特定することができるように、ファイルシステムエンジンモジュール132およびデータベースエンジンモジュール134などの他のエンジンモジュールに、およびアプリケーション106にインデックス付けサービスを与える。言い換えれば、インデックスエンジンモジュール130は、値が鍵によって効率的に記憶され、取り出されることを可能にするために鍵/値ペアを記憶する。たとえば、限定的ではないが、一実施形態では、インデックスエンジンモジュール130の場合、インデックス(すなわち、バイナリ鍵/値ペアからなる単純な汎用辞書)を、OIDによって互いにリンクされ、ヘッドオブジェクトが所与のインデックスについてのすべてのオブジェクトのツリーを保持する、通常コアエンジンオブジェクトとして保存することができる。一実施形態では、インデックスは、ログ構成されたB+ツリーとして内部に記憶されるが、代替の実施形態では、高速探索、シーケンシャルアクセス、挿入および削除を可能にする他のデータ構造を、インデックスを記憶するために使用することもできることを当業者は理解されよう。たとえば、限定的ではないが、一実施形態では、インデックスエンジンモジュール130は、それのオブジェクトのためのオブジェクトエイリアスおよび仮想IDを管理するために、特に、コアエンジンモジュール110によって使用される。インデックスエンジンモジュール130は、任意の形式の鍵/値ペアを含んでいることができるプライベートインデックスを維持するために使用することもできる。たとえば、限定的ではないが、一実施形態では、プライベートインデックスは、鍵/値ペアを効率的に管理するために、たとえば、動的辞書、名前付き項目のリストなどを保持するために、(以下でより詳細に説明される、ファイルシステムエンジンモジュール132およびデータベースエンジンモジュール134などの)エンジンモジュールによって使用することができる。
【0124】
[00140]ファイルシステムエンジンモジュール132は、オブジェクトおよびブロブの上記で説明された構造を使用してファイルストレージを実装する。一実施形態では、ファイルシステムエンジンモジュール132は、コアエンジンモジュール110とデータ通信しており、APIを含み、APIを通して、ファイル、ディレクトリ、メタデータおよび関連する構造を記憶し、取り出すために、アプリケーション、ユーザコンピューティングデバイスなどによって、readdir、open、read/writeおよびcloseなど、よく知られているファイルシステムプリミティブを使用することができる。たとえば、限定的ではないが、一実施形態では、ファイルがローカルファイルであるかのように、ユーザによるファイルのストレージを可能にするために、ファイルシステムエンジンモジュール132をオペレーティングシステムインターフェース(たとえば、FUSE)に直接接続することができる。したがって、ファイルシステムエンジンモジュール132は、ユーザが、コアエンジンモジュール110を使用して、クラウドストレージプロバイダ、または中央調整のない他の媒体など、複数のバックエンド上にそれらのファイルを記憶し、セキュアに点在させることを可能にする。上記のことに鑑みて、コアエンジンモジュール110のバックエンド170が物理的ディスクまたは他のローカルストレージ媒体である実施形態では、システム100を、ユーザのコンピューティングデバイスのための真のエンドツーエンドファイルシステムとして直接使用することができ、分散されたストレージのすべての特徴および利点がシステム100によって与えられることを当業者は理解されよう。
【0125】
[00141]データベースエンジンモジュール134は、公開されたインターフェース(たとえば、SQL、CLI、ODBCなど)を通してアプリケーションにデータベースサービスを与え、対応する構造(たとえば、スキーマ、フィールド、インデックス、レコードなど)をコアオブジェクトおよびインデックスエンジンプライベートインデックスとして記憶する。したがって、データベースエンジンモジュール134は、データベースのためのデータストレージを実行するために、インデックスエンジンモジュール130およびコアエンジンモジュール110と共同する。本システム100のインデックスエンジンモジュール130およびコアエンジンモジュール110の使用は、データベースが、上記で説明されたシステム100のすべての利益をもつ、複数のクラウドストレージプロバイダ、共有ストレージシステムおよびローカルメディアなど、異なるバックエンド170上に完全に分散および点在されることを可能にする。
【0126】
[00142]データの分散された記憶のための上記で説明された方法およびシステムは、インデックス、中央制御、追跡または同期を使用せずに、あるストレージロケーション(クラウドストレージプロバイダ、ネットワークディスク、ローカルメディアなど)から別のストレージロケーションにデータを自由に記憶し、移動し、コピーし、点在させることと、ロックまたは中央調整サーバを使用しない更新を用いてピアツーピアモードでそのデータを共有することとを可能にする。そのような特性は、データがローカルディスクとクラウドストレージとに同時に記憶され、リアルタイムで更新され、中央システムへの通知なしにある媒体から別の媒体に移動またはコピーされ、コアエンジンに自動的に、高い完全性で任意の時間に、必要とされる情報の位置を特定し、その情報を取り出させることを可能にする。
【0127】
[00143]いくつかの代替の実施形態および例について、本明細書で説明および図示した。上記で説明された本発明の実施形態は、例にすぎないものとする。当業者は、個々の実施形態の特徴、ならびに構成要素の可能な組合せおよび変形形態を諒解されよう。当業者は、実施形態のいずれかを、本明細書で開示された他の実施形態との任意の組合せで与えることができることをさらに諒解されよう。本発明は、それの中心的特性から逸脱することなく他の特定の形態で実施されてもよいことを理解されたい。したがって、本例および実施形態は、あらゆる点で、限定的ではなく例示的と見なされるべきであり、本発明は、本明細書で与えられる詳細に限定されるべきではない。したがって、特定の実施形態が例示され、説明されたが、添付の特許請求の範囲において規定される本発明の範囲から著しく逸脱することなく、多数の変更が思い浮かぶ。