特表2015-526832(P2015-526832A)IP Force 特許公報掲載プロジェクト 2022.1.31 β版

知財求人 - 知財ポータルサイト「IP Force」

▶ ヴイエムウェア インコーポレイテッドの特許一覧

<>
  • 特表2015526832-分散キーバリューストア 図000003
  • 特表2015526832-分散キーバリューストア 図000004
  • 特表2015526832-分散キーバリューストア 図000005
  • 特表2015526832-分散キーバリューストア 図000006
  • 特表2015526832-分散キーバリューストア 図000007
  • 特表2015526832-分散キーバリューストア 図000008
< >
(19)【発行国】日本国特許庁(JP)
(12)【公報種別】公表特許公報(A)
(11)【公表番号】特表2015-526832(P2015-526832A)
(43)【公表日】2015年9月10日
(54)【発明の名称】分散キーバリューストア
(51)【国際特許分類】
   G06F 12/00 20060101AFI20150814BHJP
【FI】
   G06F12/00 518A
   G06F12/00 531J
   G06F12/00 545A
【審査請求】有
【予備審査請求】未請求
【全頁数】32
(21)【出願番号】特願2015-530155(P2015-530155)
(86)(22)【出願日】2013年9月5日
(85)【翻訳文提出日】2015年2月26日
(86)【国際出願番号】US2013058181
(87)【国際公開番号】WO2014088660
(87)【国際公開日】20140612
(31)【優先権主張番号】13/692,777
(32)【優先日】2012年12月3日
(33)【優先権主張国】US
(81)【指定国】 AP(BW,GH,GM,KE,LR,LS,MW,MZ,NA,RW,SD,SL,SZ,TZ,UG,ZM,ZW),EA(AM,AZ,BY,KG,KZ,RU,TJ,TM),EP(AL,AT,BE,BG,CH,CY,CZ,DE,DK,EE,ES,FI,FR,GB,GR,HR,HU,IE,IS,IT,LT,LU,LV,MC,MK,MT,NL,NO,PL,PT,RO,RS,SE,SI,SK,SM,TR),OA(BF,BJ,CF,CG,CI,CM,GA,GN,GQ,GW,KM,ML,MR,NE,SN,TD,TG),AE,AG,AL,AM,AO,AT,AU,AZ,BA,BB,BG,BH,BN,BR,BW,BY,BZ,CA,CH,CL,CN,CO,CR,CU,CZ,DE,DK,DM,DO,DZ,EC,EE,EG,ES,FI,GB,GD,GE,GH,GM,GT,HN,HR,HU,ID,IL,IN,IS,JP,KE,KG,KN,KP,KR,KZ,LA,LC,LK,LR,LS,LT,LU,LY,MA,MD,ME,MG,MK,MN,MW,MX,MY,MZ,NA,NG,NI,NO,NZ,OM,PA,PE,PG,PH,PL,PT,QA,RO,RS,RU,RW,SA,SC,SD,SE,SG,SK,SL,SM,ST,SV,SY,TH,TJ,TM,TN,TR,TT,TZ,UA,UG,US,UZ
(71)【出願人】
【識別番号】510149482
【氏名又は名称】ヴイエムウェア インコーポレイテッド
【氏名又は名称原語表記】VMware,Inc.
(74)【代理人】
【識別番号】100105957
【弁理士】
【氏名又は名称】恩田 誠
(74)【代理人】
【識別番号】100068755
【弁理士】
【氏名又は名称】恩田 博宣
(74)【代理人】
【識別番号】100142907
【弁理士】
【氏名又は名称】本田 淳
(72)【発明者】
【氏名】カステリャーノ、ルカ
(57)【要約】
1つの実施形態において、分散トランザクション対応キーバリューストアを実装するシステムが提供される。このシステムはノードの集合を含み、各ノードが、データログファイルの集合を記憶する1つまたは複数の記憶装置に通信可能に連結され、各データログファイルはあるキー名前空間のためのキーバリューペアを含む。各ノードは、そのノード固有のトランザクションログファイルを使って、テータログファイルの集合の中のキーバリューペアを変更し、または取得するためのトランザクションを実行するように構成され、トランザクションログファイルは、そのトランザクションの状態情報を含む。トランザクションは、各トランザクションの原子性および耐久性が保障される方法で実行される。
【特許請求の範囲】
【請求項1】
分散トランザクション対応キーバリューストアを実装するシステムであって、
データログファイルの集合を保存する1つまたは複数の記憶装置に通信可能に各々連結されるノードの集合を備え、各データログファイルが1つのキー名前空間のためのキーバリューペアを含み、
各ノードがそのノードに固有のトランザクションログファイルを用いて前記データログファイルの集合の中のキーバリューペアを変更または取得するトランザクションを実行するように構成され、前記トランザクションログファイルが前記トランザクションの状態情報を含み、
前記トランザクションが、各トランザクションの原子性および耐久性が確保されるように実行される、システム。
【請求項2】
各ノードに固有の前記トランザクションログファイルがそのノードのローカル記憶装置に保存される、請求項1に記載のシステム。
【請求項3】
各ノードに固有の前記トランザクションログファイルが、各トランザクションがそのノードによって開始されたか、コミットされたか、または中断されたかを示す、請求項1に記載のシステム。
【請求項4】
各ノードに固有の前記トランザクションログファイルは、そのノードにより読出し可能および書込み可能であるが、前記ノードの集合の中の他のノードは読出しかできない、請求項1に記載のシステム。
【請求項5】
各ノードは、各トランザクションのノード単位スナップショット分離性がさらに確保されるように前記トランザクションを実行するように構成される、請求項1に記載のシステム。
【請求項6】
各ノードがさらに、検索式および目標とするキー名前空間を含む検索操作に応答して前記データログファイルの集合を検索するように構成され、当該検索することが、
前記目標とするキー名前空間のためのキーバリューペアを含むデータログファイルを前記データログファイルの集合の中から特定し、
前記検索式を満たすキーバリューペアに関する前記データログファイルを検索する
ことを含む、請求項1に記載のシステム。
【請求項7】
各ノードが、前記データログファイルの集合の中の1つまたは複数のキーバリューペアを変更するトランザクションを、
データログスナップショットを決定し、
1つまたは複数のキーバリューサブセットを決定する
ことによって実行するように構成され、
前記データログスナップショットは、前記ノードが前記トランザクションのためにアクセスする1つまたは複数のデータログファイルを前記データログファイルの集合の中から特定するものであり、前記データログスナップショットが、前記1つまたは複数のデータログファイルについてバージョン番号およびサイズを含み、
各キーバリューサブセットは、前記ノードが前記トランザクションのために変更しようとする、前記1つまたは複数のデータログファイルのうちの関連するデータログファイルからのキーバリューペアを含む、請求項1に記載のシステム。
【請求項8】
前記ノードが、さらに、
前記トランザクションのためのトランザクション識別子を決定し、
前記トランザクション識別子を含み且つ前記変更されたトランザクションが開始されたことを示す第一のトランザクションログエントリを前記ノードに固有の前記トランザクションログファイルに書き込み、
前記1つまたは複数のキーバリューサブセットの中の各キーバリューサブセットについて、1つまたは複数のデータログエントリを前記キーバリューサブセットに関連付けられたデータログファイルに付加するように試みる
ことによって前記トランザクションを実行するように構成され、
各データログエントリが、前記キーバリューサブセットに関連付けられたデータログファイルにおけるキーバリューペアへの変更を特定する、請求項7に記載のシステム。
【請求項9】
前記1つまたは複数のデータログエントリを前記キーバリューサブセットに関連付けられたデータログファイルに付加するように試みることが、
前記キーバリューサブセットに関連付けられたデータログファイルの前記バージョン番号を前記データログスナップショットから取得し、
前記バージョン番号を入力パラメータとして取得する付加操作を起動する
ことを含み、
前記バージョン番号が前記キーバリューサブセットに関連付けられたデータログファイルの現在のバージョン番号と一致すれば前記付加操作は成功し、
前記バージョン番号が前記現在のバージョン番号と一致しなければ前記付加操作は失敗する、請求項8に記載のシステム。
【請求項10】
前記ノードが、さらに、
前記1つまたは複数のキーバリューサブセットのうちの各キーバリューサブセットについての前記付加操作が成功した場合に、前記トランザクション識別子を含み且つ前記変更されたトランザクションがコミットされたことを示す第二のトランザクションログエントリを前記ノードに固有の前記トランザクションログファイルに書き込むことによって前記トランザクションを実行するように構成される、請求項9に記載のシステム。
【請求項11】
前記ノードが、さらに、
前記1つまたは複数のキーバリューサブセットのうちのいずれかのキーバリューサブセットについての前記付加操作が失敗した場合に、前記トランザクション識別子を含み且つ前記変更されたトランザクションが中断されたことを示す第二のトランザクションログエントリを前記ノードに固有の前記トランザクションログファイルに書き込むことによって前記トランザクションを実行するように構成される、請求項9に記載のシステム。
【請求項12】
前記付加操作が、前記ノード上で実行される分散ファイルシステム(DFS)コンポーネントにより実装され、かつ、前記付加操作が、前記分散ファイルシステムによって原子的であることが保証される、請求項9に記載のシステム。
【請求項13】
前記1つまたは複数のデータログエントリを前記キーバリューサブセットに関連付けられたデータログファイルに付加するように試みることが、
前記付加操作が失敗した場合に、
前記データログスナップショットから前記キーバリューサブセットに関連付けられたデータログファイルの長さを取得し、
前記キーバリューサブセットに関連付けられたデータログファイルを、そのファイルの終わりから前記取得された長さまで降順に読み出し、
前記キーバリューサブセットに関連付けられたデータログファイルが読み出されたときに、前記キーバリューサブセットに関連付けられたデータログファイルの中の何れかのキーが前記キーバリューサブセットの中のキーと一致するか否かを判断し、
一致が発見された場合に前記トランザクションを中断すべきであると判断し、
一致が発見されない場合に、
前記データログスナップショットを更新して、前記キーバリューサブセットに関連付けられたデータログファイルの現在のバージョン番号および現在の長さを含めるとともに、
前記現在のバージョン番号を渡すことによって前記付加操作を再起動する、
ことを含む、請求項9に記載のシステム。
【請求項14】
各ノードが、前記データログファイルの集合の中の1つまたは複数のキーバリューペアを取得するトランザクションを、
前記1つまたは複数のキーバリューペアの各キーバリューペアについて、
前記キーバリューペアを含むデータログファイルを前記データログファイルの集合の中から特定し、
前記データログファイルの長さを保存し、
前記データログファイルを処理する
ことによって実行するように構成され、
前記データログファイルを処理することが、
前記保存されたデータログファイルの長さに基づいて、前記キーバリューペアの最も新しい変更を表すデータログエントリを前記データログファイルの中から決定し、
前記データログエントリに関連付けられたソースノードおよびソーストランザクションを特定し、
前記ソースノードに固有のトランザクションログファイルを取得し、
前記ソーストランザクションの現在の状態を表す前記ソースノードに固有のトランザクションログエントリを前記トランザクションログファイルの中から決定し、
前記ソーストランザクションがコミットされたことを前記トランザクションログエントリが示す場合に、前記データログエントリの中で特定された前記キーバリューペアを返し、
前記ソーストランザクションがコミットされたことを前記トランザクションログエントリが示さない場合に、
前記保存されたデータログファイルの長さを調整して前記データログエントリをスキップし、
前記調整した後の前記保存された長さに基づいて前記データログファイルを再処理する、
ことによって前記データログファイルを処理することを含む、請求項1に記載のシステム。
【請求項15】
前記ノードが、さらに、
前記トランザクションログエントリを決定する前に、前記トランザクションログファイルの長さを段階的トランザクションログスナップショットから取得することによって前記トランザクションを実行するように構成され、
前記段階的トランザクションログスナップショットが、前記トランザクション中に前記ノードがアクセスするトランザクションログファイルと、そのアクセス時のトランザクションログファイルの対応する長さを特定するものであり、
前記トランザクションログエントリの決定が、前記取得されたトランザクションログファイルの長さに基づいて行われる、請求項14に記載のシステム。
【請求項16】
各データログファイルおよびトランザクションログファイルが、所定の時間間隔で、または所定のサイズに達した時点で圧縮される、請求項1に記載のシステム。
【請求項17】
ノードの集合の中の1つのノードにより実行される方法であって、前記ノードは、データログファイルの集合を保存する1つまたは複数の記憶装置に通信可能に連結され、各データログファイルがキー名前空間のためのキーバリューペアを含み、
当該方法は、
前記ノードがそのノードに固有のトランザクションログファイルを用いて前記データログファイルの集合の中のキーバリューペアを変更または取得するトランザクションを実行することを備え、前記トランザクションログファイルが前記トランザクションの状態情報を含み、
前記トランザクションが、各トランザクションの原子性および耐久性を確保するように実行される方法。
【請求項18】
前記トランザクションは、各トランザクションのノード単位スナップショット分離性がさらに確保されるように実行される、請求項17に記載の方法。
【請求項19】
コンピュータソフトウェアを具現化する非一時的コンピュータ読取可能媒体であって、前記コンピュータソフトウェアはノードの集合の中の1つのノードにより実行され、前記ノードは、データログファイルの集合を保存する1つまたは複数の記憶装置に通信可能に連結され、各データログファイルがキー名前空間のためのキーバリューペアを含み、前記コンピュータソフトウェアは、前記ノードに対して、
前記ノードに固有のトランザクションログファイルを用いて前記データログファイルの集合の中のキーバリューペアを変更または取得するトランザクションを実行すること
を含む方法を実行させるものであり、
前記トランザクションログファイルが前記トランザクションの状態情報を含み、
前記トランザクションが、各トランザクションの原子性および耐久性が確保されるように実行される、非一時的コンピュータ読取可能媒体。
【請求項20】
前記トランザクションが、各トランザクションのノード単位スナップショット分離性がさらに確保されるように実行される、請求項19に記載の非一時的コンピュータ読取可能媒体。
【発明の詳細な説明】
【技術分野】
【0001】
本発明は、分散キーバリューストアに関する。
【背景技術】
【0002】
キーバリューストア(key-value store)は、ユーザがキーバリューペア(key-value pairs)の形態でデータを保存、検索できるデータベースの1つである。キーバリューペアのキーは、それとペアになる値を一意的に特定する標識(例えば、番号、ストリング等)である。キーバリューペアの値は、どのような種類のデータオブジェクトまたはデータオブジェクトの集合であってもよい。一般的なキーバリューストアは、ユーザに対して、PUT、GET、DELELEという3つの操作を可能とさせる。PUT操作は1つまたは複数の指定されたキーバリューペアをキーバリューストアに保存し、GET操作は1つまたは複数の指定されたキーバリューの値をキーバリューストアから取得し、DELETE操作は1つまたは複数の指定されたキーによって特定されたキーバリューペアをキーバリューストアから削除する。
【発明の概要】
【発明が解決しようとする課題】
【0003】
実際にはいくつかのキーバリューストアが分散され、換言すれば、これらによってユーザはPUT、GET、DELETE等のキーバリュー操作を、ノードと呼ばれる個々の(物理的または仮想)コンピュータの集合の何れからも起動させることができる。このような分散キーバリューストアは、非分散キーバリューストアより高い耐障害性とスケーラビリティを提供する。しかしながら、中央集中的でないその性質から、分散キーバリューストアはキーバリュー操作の実行に関するトランザクション保証(例えば、原子性、耐久性、分離性等の保証)を容易に提供することができない。
【課題を解決するための手段】
【0004】
1つの実施形態において、分散トランザクション対応キーバリューストアを実装するシステムが提供される。このシステムはノードの集合を含み、各ノードは、データログファイルの集合を保存する1つまたは複数の記憶装置に通信可能に連結され、各データログファイルは1つのキー名前空間のためのキーバリューペアを含む。各ノードは、そのノードに固有のトランザクションログファイルを使って、データログファイルの集合の中のキーバリューペアを変更する、または取得するトランザクションを実行するように構成され、トランザクションログファイルはそのトランザクションの状態情報を含む。トランザクションは、各トランザクションの原子性および耐久性が確保される方法で実行される。
【0005】
以下の詳細な説明と添付の図面により、特定の実施形態の性質と利点をよく理解できる。
【図面の簡単な説明】
【0006】
図1】1つの実施形態による分散トランザクション対応キーバリューストアのシステム実装を示す。
図2】ある実施形態による変更(例えば、PUTとDELETE)トランザクションを実行するためのプロセスを示す。
図3】ある実施形態による変更(例えば、PUTとDELETE)トランザクションを実行するためのプロセスを示す。
図4】ある実施形態によるGETトランザクションを実行するためのプロセスを示す。
図5】ある実施形態によるGETトランザクションを実行するためのプロセスを示す。
図6】1つの実施形態による、キー名前空間での検索を実行するためのプロセスを示す。
【発明を実施するための形態】
【0007】
下記において、説明を目的として、各種の実施形態を理解できるように様々な例と詳細が示されている。しかしながら、当業者にとっては、ある実施形態はこれらの詳細の一部がなくても実施でき、またはそれらの変形や同等物でも実施できることが明らかである。
【0008】
特定の実施形態は、分散トランザクション対応キーバリューストア(distributed, transactional key-value store)、すなわち「DTKVストア」に関する。DTKVストアは、ノードの集合を含むことができ、各ノードで、ユーザがデータをキーバリューペアの形態で保存し、取得することができるようなキーバリュー操作(例えば、PUT、GET、DELETE等)を実行できる。従来の分散キーバリューストアとは異なり、DTKVストアはこれらの操作を、特定のトランザクション特性(例えば、原子性、耐久性、およびノード単位スナップショット分離性)が確実に満たされる方法で実行できる。
【0009】
1つの実施形態において、DTKVストアは、データログファイルの集合とトランザクションログファイルの集合を含むデータ構成を利用できる。データログファイルの集合は、DTKVストアのノード間で共有可能であり(例えば、各ノードにより読出、書込み可能とすることができ)、DTKVストアによって保持される実際のキーバリューペアを保存できる。トランザクションログファイルの集合の中の各トランザクションログフファイルはDTKVストア内の特定のノードに固有とすることができ(例えば、そのノードによる読出、書込みは可能であるが、他のノードは読出しかできない)、そのノードにより実行されたトランザクションの状態の追跡を続けることができる。以下に詳しく説明するように、DTKVストアは、キーバリュー操作の実行時にこれらのデータログファイルおよびトランザクションログファイルとやり取りして、トランザクション保証を効率的でスケーラブルな方法で提供する。
【0010】
他の実施形態において、DTKVストアは、ユーザがDTKVストアによって保持されているキーおよび/またはキーバリューペアを効率的に検索できるようにする。この実施形態において、DTKVストアはキーを1つまたは複数のキー名前空間に分割し、各キー名前空間のためのキーバリューペアを1つまたは複数の別々のデータログファイルに保存する。すると、DTKVストアにより、ユーザは(SEARCH操作を通じて)キー名前空間によりキーおよび/またはキーバリューペアを検索できる。ユーザが特定のキー名前空間に関してSEARCH操作を起動させると、DTKVストアはその検索をそのキー名前空間に関係付けられたデータログファイル(複数の場合もある)の内容に限定することができる(DTKVストア内のデータログファイルの全部を検索しなくてよい)。
【0011】
I.システム実装
図1は、1つの実施形態によるDTKVストア100のシステム実装を示している。図のように、DTKVストア100は、相互に接続されたノードの集合102−1〜102−Nを含む。ノード102−1〜102−Nは、物理コンピュータ装置(例えば、サーバコンピュータシステム、パーソナル(例えば、デスクトップまたはラップトップ)コンピュータシステム等)でも、仮想マシン(VM)でも、物理および仮装装置の組み合わせでもよい。ノード102−1〜102−Nは、当業者の知るローカルエリアネットワーク(LAN)、ワイドエリアネットワーク(WAN)、インターネットをはじめとする何れかのタイプのコンピュータネットワークを介して相互に接続されていてもよい。
【0012】
I.A.DTKVサービス
DTKVストア100の中の各ノード102−1〜102−Nは、分散トランザクション対応キーバリューサービス、すなわち「DTKVサービス」(104−1〜104−N)を含む。DTKVサービス104−1〜104−Nはソフトウェアおよび/またはハードウェアベースのコンポーネントであり、DTKVストア100の主な処理タスクを実行する。例えば、各DTKVサービス104−1〜104−Nは、1人または複数のユーザ(例えば、人または自動化/プログラムエージェント)に対して、DTKVストア100の中のキーバリューペアの保存、取得、検索の操作を可能とさせる。特定の操作に対するユーザの起動を受けると、DTKVサービス104−1〜104−Nは、その操作を実行し、応答(該当する場合)をユーザに返すことができる。1つの実施形態において、DTKVサービス104−1〜104−Nは以下の操作を可能とさせる。
(1)PUT((key1,value1),(key2,value2),…):1つまたは複数の指定されたキーバリューベアを保存する。
(2)GET(key1,key2,…):1つまたは複数の指定されたキーに対応する1または複数のキーバリューペアを取得する。
(3)DELETE(key1,key2,…):1つまたは複数の指定されたキーに対応する1つまたは複数のキーバリューペアを削除する。
(4)SEARCH(namespace,search expression):指定されたキー名前空間の中で、指定された検索式(例えば、正規表現)を満たす、キーおよび/またはキーバリューペアを検索する。
【0013】
一般に、各DTKVサービス104−1〜104−Nは、DTKVストア100の中の他のDTKVサービスとは独立して、およびこれらと同時に動作できる。例えば、ノード102−1のDTKVサービス104−1は、たとえば第一のユーザ集合から受け取った第一のPUT、GET、DELETおよび/またはSEARCH操作集合の起動を処理することができる。それと略同時に、ノード102−2のDTKVサービス104−2は、例えば第二のユーザ集合から受け取った第二のPUT、GET、DELETEおよび/またはSEARCH操作集合の起動を処理することができ、その際、DTKVサービス104−1が実行する処理には全く依存しない。この分散平行処理モデルによって、DTKVストア100を耐障害性とすることができ、すなわち、1つのノードおよび/またはDTKVサービスが利用できなくなっても、ユーザは依然として他の利用可能なノード/DTKVサービスの1つを介してDTKVストア100にアクセスできる。さらに、この分散平行処理モデルにより、DTKVストア100はスケーラブルとすることができ、これは、システム管理者が増大したユーザ負荷を扱う上での必要性に応じてDTKVストア100に新たなノード(各々が新たなDTKVサービスを実行する)を追加できるからである。
【0014】
I.B.トランザクション特性
従来の分散キーバリューストアと異なり、DTKVストア100はトランザクション対応であり、換言すれば、DTKVストア100は、DTKVサービス104−1〜104−Nがキーバリュー操作を実行する時に特定のトランザクション特性が満たされることを確実にし/保証することができる。このようなトランザクション特性を満たす(または、満たすことが意図された)キーバリュー操作のインスタンスが、トランザクションと呼ばれる。特定の実施形態において、DTKVストア100は原子性、耐久性、ノード単位スナップショット分離性というトランザクション特性を保証できる。
【0015】
原子性とは、1つの実施形態において、トランザクションの全要素が単独で不可分の群として成功に終わるか、失敗する(例えば、中断される)ことが求められるトランザクション特性である。これは、これはトランザクションを部分的に実行できないため、「オール・オア・ナッシング」特性として知られる。例えば、3つのキーバリューペア(K1、V1)、(K2、V2)、(K3、V3)を保存するPUT操作のインスタンスを考える。原子性の特性は、これらのキーバリューペアの3つ全部が一緒にコミットされる(例えば、ディスク上に書き込まれ)か、まったくコミットされないことを求める。
【0016】
耐久性とは、1つの実施形態において、あるトランザクションの結果としてコミットされたすべての変化(例えば、変更、削除)が一貫していることを求めるトランザクション特性であり、換言すれば、コミットされた変化は、例えば電源停止、クラッシュ、またはその他のシステムエラーによって未完了となるべきではない。
【0017】
ノード単位スナップショット分離性とは、1つの実施形態において、DTKVストア100上で実行される各トランザクションが同時に行われる他のトランザクションから分離されることを求めるトランザクション特性である。換言すれば、この特性を満たすトランザクションは、それがあたかも、他のどのユーザも同時にDTKVストア100の中のキーバリューペアにアクセスし、またはこれを変更していないかのように見える環境で操作する。それゆえ、DTKVストア100の内容は、トランザクションの開始時に「フリーズ」していると考えることができ、他のトランザクションによって行われる部分的な変化は見えるべきではない。
【0018】
例えば、DTKVサービス104−1がキーバリューペア(K1、V1)と(K2、V2)を保存する第一のPUTトランザクションの実行を開始し、それと略同時にDTKVサービス104−2がキーバリューペア(K1、V3)と(K2、V4)を保存する第二のPUTトランザクションの実行を開始したとする。ノード単位スナップショット独立性の特性によれば、DTKVストア100はこれらのトランザクションの終了時に、(K1、V1)と(K2、V2)(これは、第二のPUTトランザクション→第一のPUTトランザクションという逐次的実行順序を示す)か、(K1、V3)と(K2、V4)(これは、第一のPUTトランザクション→第二のPUTトランザクションという逐次的実行順序を示す)のいずれかを含んでいるはずである。例えば(K1、V1)と(K2、V4)の最終状態が有効でなく、それは、この最終状態が第一のPUTトランザクションの部分的実行と第二のPUTトランザクションの部分的実行を表しているからである。
【0019】
他の例として、DTKVサービス104−1が2つの新しいキーバリューペア(K1、V1)と(K2、V2)を挿入するPUTトランザクションの実行を開始し、それと略同時にDTKVサービス104−2がキーK1とK2の値を読み出すGET操作の実行を開始した場合を考える。(K1、V1)の挿入後で、かつ(K2、V2)の挿入開始の前には比較的長い休止があると仮定する。この場合の結果として、3つの可能性が考えられる。
1)DTKVサービス104−2がK1またはK2の何れについても値を発見しない。
2)DTKVサービス104−2がK1の値V1は発見するが、K2の値は発見しない。
3)DTKVサービス104−2がK1の値V1とK2の値V2を発見する。
【0020】
これら3つの考えられる結果のうち、(1)と(3)だけがノード単位スナップショット分離性の特性を満たし、GETトランザクションの開始時にDTKVストア100はDTKVサービス104−2にとってフリーズしているように見える。
【0021】
上記を実現するために、ノード単位スナップショット分離性は3つの部分要求事項を含むことができる。第一の部分要求事項は、同時に行われるトランザクションが同じデータ(例えば、同じキーバリューペア)を変更できないことを明示する。このような状況が発生すると、同時に実行されるトランザクションの1つは中断されなければならない。上記の、2つのPUTトランザクションの同時実行が関わる上記の例では、この部分要求事項によれば第一のPUTトランザクションまたは第二のPUTトランザクションの何れかが中断されることになり、それは、これらが両方とも同じキーK1とK2を変更しようとしているからである。これにより、DTKVストア100の、一方または両方のトランザクションの部分実行を表す最終状態が回避される。
【0022】
第二の部分要求事項は、PUTトランザクションと同時に実行され、同じキー集合に対して操作するGETトランザクションが、PUTトランザクションの変更の全部を含むか、全く含まない値の集合を返すべきである、というものである。この要求事項は読出分離性と呼ばれる。
【0023】
第三の部分要求事項は、DTKVストア100の中の各ノードがそのノードから発生する(すなわち、その上で実行される)すべてのトランザクションの固有の実行順序を保持することを求める。それゆえ、図1の実施形態では、この第三の部分要求事項は、ノード102−1がDTKVサービス104−1の実行するすべてのトランザクション(例えば、PUT、GET、DELETE等のインスタンス)についての固有の実行順序を保持すること、ノード102−2がそのDTKVサービス104−2の実行するすべてのトランザクションについての固有の実行順序を保持すること、等々を求める。これは、分散システム内のすべてのトランザクション(換言すれば、全ノードにわたるトランザクション)が全体として順序付けられる(すなわち、単独の固有のコミット順序に従って整理される)ことを求める「スナップショット」分離性の、より厳格なトランザクション特性とは異なる点に留意するべきである。
【0024】
上記のトランザクション特性を確実に満たすことによって、DTKVストア100は、そのキーバリューペアレポジトリが、ノード102−1〜102−Nにまたがるキーバリュー操作の同時起動に関係なく、また機器の(例えば、ノードまたは記憶装置)の故障に関係なく、確実に一貫した方法で保持されるようにすることができる。これによって、ユーザは、競合状態、ダーティリード、部分書込み、およびトランザクション非対応の処理から生じうる他の既知の問題について心配することなく、DTKVストア100と信頼性の高いやり取りを行うことができる。
【0025】
I.C.データ構成
特定の実施形態において、DTKVストア100は、2種類のファイル、すなわちデータログファイル(106−1〜106−M)とトランザクション(「txn」)ログファイル(108−1〜108−N)を含むデータ構成を利用できる。以下のセクションIIで説明するように、DTKVサービス104−1〜104−Nは、PUT、GET、DELETEトランザクションの実行時にこれらのデータログファイルおよびトランザクションログファイルを操作して、各トランザクションの原子性、耐久性、ノード単位スナップショット分離性を保証することができる。
【0026】
図1の実施形態において、データログファイル106−1〜106−Mは、中央記憶装置110(例えば、専用のストレージサーバ上でホストされている)に保存されているように示され、トランザクションログファイル108−1〜108−Nは、それぞれノード102−1〜102−Nのローカル記憶装置112−1〜112−Nに保存されているように示されている。しかしながら、理解すべき点として、データログファイル106−1〜106−Mとトランザクションログファイル108−1〜108−Nは、ローカルまたはリモート接続を通じてノード102−1〜102−Nにアクセス可能などの記憶装置または記憶装置の組み合わせにも保存できる。
【0027】
I.C.1.データログファイル
データログファイル106−1〜106−Mは、DTKVストア100によって保持される実際のキーバリューペアを保存する。各データログファイル106−1〜106−Mは、DTKVサービス104−1〜104−Nの間で共有可能であり、それによって各DTKVサービスによって読出可能、書込み可能である。いくつのかの実施形態において、各データログファイル106−106−Mは、所定のキー名前空間に関連付けることができる。1つの実施形態において、1つの特定のキー名前空間に属するキーバリューペアのすべてが1つのデータログファイル上に保存されるように、キー名前空間とデータログファイルとの間に1対1のマッピングがあってもよい。例えば、データログファイル106−1を営業部門の従業員の氏名を含む第一のキー名前空間に関連付けることができる、データログファイル106−2をマーケティング部門の従業員の氏名を含む第二のキー名前空間に関連付けることができる、等々である。他の実施形態では、キー名前空間とデータログファイルの間に1対多のマッピングがあってもよく、それによって特定のキー名前空間内のキーを複数のデータログファイルにまたがって保存できる。何れの場合も、各データログファイル106−1〜106−Mは一般に、そのデータログファイルに関連付けられたキー名前空間の範囲内にあるキーバリューペアだけを保存する。キー名前空間によるデータログファイルのこのような分割は、DTKVトア100内でのキーおよび/またはキーバリューペアの検索工程を容易にし、これについては以下のセクションIIIで説明する。
【0028】
各データログファイル106−1〜106−Mは、データログエントリと呼ばれるエントリアレイまたはリストとして整理できる。DTKVサービス104−1〜104−Nは、それがDTKVストア100のキーバリューの内容を変更する「変更」トランザクション(すなわち、PUTおよびDELETEトランザクション)を実行する際に、これらのデータログエントリを作成する。データログエントリは2種類、すなわち、DTKVストア100内のキーバリューペアの保存を示すPUTデータログエントリと、DTKVストア100からのキーバリューペアの削除を示すDELETEデータログエントリのうちの一方とすることができる。各PUTデータログエントリは、保存されるキーと値を特定する「キー」と「値」のフィールドを含むことができ、その一方で、各DELETEデータログエントリは、削除されるキーバリューペアのキーを特定する単独の「キー」のフィールドを含むことができる。さらに、各データログエントリ(PUTまたはDELETEの各々)は、そのデータログエントリを作成したDTKVサービスのホストノード(例えば、102−1〜102−N)を特定する「ノード」のフィールドと、そのノードにデータログエントリを作成させたトランザクションを特定するトランザクション識別(「txnID」)フィールドを含むことができる。
【0029】
例えば、データログエントリ“PUT key:K1 value:V1 node:N1 txnID:T1”を考える。このデータログエントリは、トランザクションIDがT1のPUTトランザクションがノードN1で実行され、このPUTトランザクションがキーバリューペア(K1、V1)を保存させたことを示す。他の例として、データログエントリ、“DELETE key:K1 node:N2 txnID:T2”を考える。このデータログエントリは、トランザクションIDがT2のDELETEトランザクションがノードN2で実行され、このDELETEトランザクションがキーK1により特定されるキーバリューペアを削除させたことを示す。
【0030】
特定の実施形態において、DTKVサービス104−1〜104−Nは、これらが(例えば原子的な「付加」操作を通じて)新しいデータログエントリを各データログファイル106−1〜106−Mの末尾に付加だけするように構成され、すなわち、DTKVサービス104−1〜104−Nは新しいデータログエントリをデータログファイルの始めまたは途中に挿入したり、データログファイル内の既存のデータログエントリを変更したりできない。これらの実施形態において、各データログファイル106−1〜106−Mは同じキーについての複数のデータログエントリを含むことができ、データログファイル内のあるキーの最後の(すなわち、最も新しい)データログエントリが、そのキーの現在の値を決定する。例えば、以下の例示的なデータログファイルを考える。
PUT key:K1 value:V1 node:N1 txnID:T1
PUT key:K1 value:V2 node:N2 txnID:T2
DEL key:K1 node:N3 txnID:T4
PUT key:K1 value:V3 node:N1 txnID:T5
この例では、4つのデータログエントリのすべてがキーK1に関係する。しかしながら、データログエントリは(上記のような「付加」の制限により)上から下に時系列的に順序が付けられるため、最後のデータログエントリがキーK1の現在の値、すなわちV3を決定する。それより古いデータログエントリは、最後のデータログエントリによって上書きされた過去のエントリと考えることができる。
【0031】
他の実施形態において、DTKVサービス104−1〜104−Nは、これらがファイルバージョンに関してデータログファイル106−1〜106−Mにアクセスし/これを変更するように構成される。換言すれば、各データログファイル106−1〜106−Mはバージョン番号に関連付けられ、DTKVサービス104−1〜104−Nは、データログファイルにアクセスする時にバージョン番号を指定するほか、データログファイルを変更する時にデータログファイルのバージョン番号を上げる。
【0032】
I.C.2.トランザクションログファイル
トランザクションログファイル108−1〜108−Nは、DTKVサービス104−1〜104−Nにより実行されるトランザクションに関する状態情報を保存する。特定の実施形態において、各トランザクションログファイル108−1〜108−Nは、DTKVストア100内の特定のノード/DTKVサービスに固有のものとする(すなわちこれに関連付けられる)ことができる。例えば、トランザクションログファイル108−1はノード102−1/DTKVサービス104−1に特定とすることができる、トランザクションログファイル108−2はノード102−2/DTKVサービス104−2に特定とすることができる、等々である。これらの実施形態において、各トランザクションログファイル108−1〜108−Nには、それに関連するDTKVサービスしか書き込むことができず、そのDTKVサービスによって開始/実行されたトランザクションに関する状態情報だけが保存される。その他の、関連付けられていないDTKVサービスはそのトランザクションログファイルを読み出すことができる(ただし、書き込むことはできない)。
【0033】
各トランザクションログファイル108−1〜108−Nは、トランザクションログエントリと呼ばれるエントリアレイまたはリストとして整理できる。あるトランザクションログファイルに関連付けられたDTKVサービスは、このDTKVサービスがDTKVストア100のキーバリューの内容を変更する変更トランザクションを実行する際にこれらのトランザクションログエントリを作成する。トランザクションログエントリは3種類、すなわち、変更トランザクションの開始を示すBEGINトランザクションログエントリ、変更トランザクション実行の成功を示すCOMMITトランザクションログエントリ、変更トランザクション実行の失敗を示すABORTトランザクションログエントリであるのうちの1つとすることができる。これらの3種類のトランザクションログエントリの各々は、そのトランザクションを開始した(それゆえ、そのトランザクションログエントリを作成した)DTKVサービスのホストノード(例えば、102−1〜102−N)を特定する「ノード」のフィールドと、あるノードに関連するトランザクションを一意的に特定するトランザクション識別(「txnID」)のフィールドを含むことができ、「ノード」のフィールドと「txnID」のフィールドとの組み合わせは、DTKVストア100の中の全ノードにわたって固有とすることができる。
【0034】
1つの実施形態において、トランザクション識別フィールドはTKVストア100のすべてのノード102−1〜102−Nにわたって固有とすることができる。代替的な実施形態において、トランザクション識別フィールドは1つのノードに関連してのみ固有とすることができる。
【0035】
データログファイル106−1〜106−Mと同様に、DTKVサービス104−1〜104−Nはこれらが(例えば原子的な「付加」操作を通じて)新しいトランザクションログエントリを各トランザクションログファイル108−1〜108−Nの末尾に付加だけするように構成でき、すなわち、DTKVサービス104−1〜104−Nは新しいトランザクションログエントリをトランザクションログファイルの始めまたは途中に挿入したり、あるトランザクションログファイル内の既存のトランザクションエントリを変更したりすることはできない。これらの実施形態において、トランザクションログファイルは、同じトランザクションIDについて最大で2つのトランザクションログエントリまで含むことができ(1つのBEGINトランザクションログエントリと1つのCOMMITまたはABORTトランザクションログエントリ)、特定のトランザクションIDに関する最後の(すなわち、最も新しい)トランザクションログエントリがそのトランザクションの現在の状態を決定する。例えば、以下の例示的なトランザクションログファイルを考える。
BEGIN txnID:T1 node:N1
BEGIN txnID:T2 node:N2
COMMIT txnID:T1 node:N1
この例において、トランザクションID T1により特定されるトランザクションについての2つのトランザクションログエントリがあり、トランザクションID T2により識別されるトランザクションについての1つのトランザクションログエントリがある。トランザクションT1に関する最後のトランザクションログエントリはCOMMITエントリであり、トランザクションT1の実行が成功したことを示す。これと反対に、トランザクションT2に関する最後のトランザクションログエントリはBEGINエントリであり、トランザクションT2が依然として進行中であることを示す。
【0036】
さらに、データログファイル106−1〜106−Mと同様に、DTKVサービス104−1〜104−Nは、これらがファイルバージョンに関連してトランザクションログファイル108−1〜108−Nにアクセスし/これを変更するように構成される。換言すれば、各トランザクションログファイル108−1〜108−Nはバージョン番号に関連付けられ、DTKVサービス104−1〜104−Nは、トランザクションログファイルにアクセスする時にバージョン番号を指定するほか、トランザクションログファイルを変更する時にトランザクションログファイルのバージョン番号を上げる。
【0037】
I.C.3 ログファイルの圧縮
データログエントリとトランザクションログエントリをそれぞれデータログファイル106−1〜106−Mとトランザクションログファイル108−1〜108−Nに付加することに関連する1つの考えられる問題は、これらのログファイルがサイズの点で無限に増大しうることである。これに対応するために、特定の実施形態において、「圧縮」プロセス(ノード102−1〜102−Nのうちの1つ、または図1に示されていない他の装置でホストされる)が各データログファイルおよびトランザクションログファイルを分析して、もはや不要となったログエントリを削除できる。例えば、上記のデータログファイルの例においては、圧縮プロセスは最初の3つのデータログエントリを安全に削除でき、それは、これらがもはやキーK1の現在の値に影響を与えなくなっているからである。さらに、上記のトランザクションログファイルの例において、圧縮プロセスは、トランザクションT1を参照する2つのトランザクションログエントリを安全に削除でき、それは、このトランザクションがすでにコミットされているからである。それゆえ、圧縮プロセスはデータログファイル106−1〜106−Mとトランザクションログファイル108−1〜108−Nが管理不能に大きくなるのを防止できる。1つの実施形態において、圧縮プロセスは、例えばDTKVストア100の管理者によって決定される所定の時間間隔で実行できる。他の実施形態において、圧縮プロセスはトリガイベント、例えば、特定のデータログファイルまたはトランザクションログファイルが所定のサイズ閾値を超えて大きくなったことに応答して実行することもできる。また別の施形態において、圧縮プロセスはノード102−1〜102−Nのランタイム中に優先順位の低い(すなわちバックグラウンド)プロセスとして徐々に実行することができる。この後者の場合、優先順位の低いログファイル圧縮は、例えばテータログファイルが比較的小さいサイズを超えて大きくなった時に開始することができる。
【0038】
I.D.分散ファイルシステム
図1に示されるように、各ノード102−1〜102−Nは、DTKVサービス104−1〜104−Nに加えて、関連する分散ファイルシステム(「DFS」)コンポーネント114−1〜114−Nを含む。各DFSコンポーネント114−1〜114−Nは、それに関連するDTKVサービス104−1〜104−Nに、データログファイル106−1〜106−Mとトランザクションログファイル108−1〜108−Nへのアクセスおよびその変更を容易にするようなファイルシステムレベルの各種の機能を提供できる。
【0039】
例えば、上のI.C.1とI.C.2に記したように、特定の実施形態において、DTKVサービス104−1〜104−Nは、(1)データ/トランザクションログファイルの異なるバージョンを作り/これにアクセスするファイルバージョニングと、(2)データ/トランザクションログエントリをデータ/トランザクションログファイルに付加するための原子的な「付加」操作に依存する。(1)と(2)をDTVKサービス104−1〜104−Nに直接実装するのではなく、DFSコンポーネント114−1〜114−Nはこれらの(およびその他の)機能をファイルシステムレベルで実装し、この機能を1つまたは複数のアプリケーションプログラミングインタフェース(「API」)を介して提供することができる。したがって、これらの実施形態において、DTKVサービス104−1〜104−Nは、DFSコンポーネント114−1〜114−Nによって提供されるAPIを起動するだけで、データログファイル106−1〜106−Mおよびトランザクションログファイル108−1〜108−Nと上述の方法でやり取りできる。
【0040】
特定の実施形態において、各DFSコンポーネント114−1〜114−Nは以下のAPIを提供する。
(1)GetVersion(file):指定されたファイルの現在のバージョン番号を返す。
(2)Read/(file,outVersion.offset,length):指定されたオフセットと長さで始まる指定されたファイルに関するデータとそのファイルの現在のバージョン番号を返す。
(3)Append(file.inVersion):データを指定されたファイルの末尾に、そのファイルの現在のバージョン番号がパラメータinVersionの値と一致したとき、その場合に限って付加し、現在のバージョン番号がinVersionと一致しない場合は、エラーが返され、データは付加されない。これに加えて、付加操作は原子的であり、換言すれば、全部のデータが付加されるか、どのデータも付加されない。データが付加されると、これは耐久性がある(すなわち、不揮発性記憶装置に保存された)と考えることができる。
(4)Rename(file1,file2):1つの原子的操作の中でファイル1をファイル2に名称変更し、これはまた、そのファイルの現在のバージョン番号も変更する。
【0041】
DTKVサービス104−1〜104−Nが上記のDFS APIを使ってデータログファイル106−1〜106−Mとトランザクションログファイル108−1〜108−Nを操作する方法を以下に説明する。
【0042】
II.トランザクションアルゴリズム
DTKVストア100の上記のようなシステム実装を念頭に置き、以下のセクションでは、DTKVサービス104−1〜104−Nがキーバリュートランザクション(例えばPUT、GET、DELETE)をトランザクション上で一貫した方法で実行するように実装できる各種のアルゴリズムについて説明する。
【0043】
II.A.変更トランザクション
図2は、DTKVストア100の何れかのDTKVサービス(以下、「DTKVサービス104−X」とする)が変更(PUTまたはDELETE)トランザクションを実行するために行うことのできる、1つの実施形態によるプロセス200を示している。このアルゴリズムにより、DTKVサービス104−Xは、その変更トランザクションについて、原子性、耐久性、ノード単位スナップショット分離性のトランザクション特性が確実に満たされるようにすることができる。
【0044】
ブロック202で、DTKVサービス104−Xはその変更トランザクションのための、「データログスナップショット」と呼ばれるデータ構造を決定することができる。1つの実施形態において、データログスナップショットは、DTKVストア100内の、DTKVサービは104−Xがとトランザクションの結果としてアクセスする(例えば、読み出すか書き込む)すべてのデータログファイルへの参照を含むことができる。例えば、変更トランザクションが、キーバリューペア(K1、V1)と(K2、V2)を保存するためのPUTトランザクションT1であり、K1がデータログファイル106−1に保存され、K2がデータログ106−2に保存されると仮定する。この例において、データログスナップショットはデータログファイル106−1とデータログファイル106−2の両方への参照を含み、これは、DTKVサービス104−Xがトランザクションの実行の成功時に両方のファイルを変更するからである。データログファイルへの参照を含むことに加えて、データログスナップショットはまた、各データログファイルについて、変更トランザクション開始時のそのデータログファイルのバージョン番号およびサイズも含むことができる。
【0045】
ブロック204で、DTKVサービス104−Xは変更トランザクションに関する1つまたは複数のキーバリューサブセットを決定することができる。1つの実施形態において、これらのキーバリューサブセットは、変更トランザクションにより特定され、データログファイルによって分割されたキーバリューペアの集合に対応することができる。それゆえ、トランザクションT1の例の場合、DTKVサービス104−Xは2つのキーバリューサブセット、すなわち、キーバリューペア(K1、V1)を含む第一のキーバリューサブセットと、キーバリューペア(K2、V2)を含む第二のキーバリューサブセットを決定できる。この例において、キーバリューペア(K1、V1)と(K2、V2)は、これらが別々のデータログファイル(それぞれ106−1と106−2)に存在するため、別のキーバリューサブセットに含められる。
【0046】
ブロック206では、DTKVサービス104−Xが、変更トランザクションが開始されたことを示す第一のトランザクションログエントリを、それに関連付けられたトランザクションログファイル(例えば、トランザクションログファイル108−X)に書き込むことができる。特定の実施形態において、第一のトランザクションログエントリは、トランザクションID(例えばT1)によって変更トランザクションを識別するBEGINトランザクションログエントリと、そのトランザクションを開始したノード(例えば、DTKVサービス104−Xのホストノード、すなわちノード102−X)とすることができる。ブロック206の一部として、DTKVサービス104−Xは、その変更トランザクションについて、そのトランザクションがまだ持っていなければ、トランザクションIDを生成できる。特定の実施形態において、DTKVサービス104−Xは、第一のトランザクションログエントリを、このエントリをトランザクションログファイル108−Xに付加することによって書き込むことができる。DTKVサービス104−Xは、それに関連付けられたDFSコンポーネント(例えば、DFSコンポーネント114−X)により提供される原子的な「付加操作」を起動することによってこれを遂行できる。
【0047】
DTKVサービス104−Xが第一のトランザクションログエントリを書き込むと、DTKVサービス104−Xは、ブロック204で決定された各キーバリューサブセットに関するループに入ることができる(ブロック208)。このループの中では、DTKVサービス104−Xはまず、DTKVサービス104−Xが(現在のキーバリューサブセットを考えて)現在のキーバリューサブセットに関連付けられたデータログファイルに追加する1つまたは複数のデータログエントリを決定することができる(ブロック210)。例えば、トランザクションT1の例に関して、現在のキーバリューサブセットがキーバリューペア(K1、V1)を含む場合、DTKVサービス104−Xは以下のデータログエントリ、“PUT key:K1 valu:V1 node:102−X txnID:T1”を決定できる。
【0048】
DTKVサービス104−Xはすると、ブロック210で決定されたデータログエントリを現在のキーバリューサブセットに関連付けられたデータログファイルに書き込むことができる(ブロック212)。ブロック206で書き込まれた第一のトランザクションログエントリと同様に、DTKVサービス104−Xは、DFSコンポーネント114−Xによって提供される原子的な付加操作を起動することによって、これらのデータログエントリをデータログファイルに書き込むことができる。この起動の一環として、DTKVサービス104−Xは付加操作に、データログスナップショットに保存されていたデータログファイルのバージョン番号(これは、そのトランザクションの開始時のそのテータログファイルのバージョン番号に対応する)を渡すことができる。
【0049】
ブロック214で、DTKVサービス104−Xは付加操作が成功したか否かを判断することができる。セクションI.D.で述べたように、DFSコンポーネント114−Xによって提供される付加操作は、その操作に渡されたバージョン番号が変更中のファイルの、その操作の起動時のバージョン番号と一致すれば成功するように設計される。反対に、付加操作はバージン番号が一致しなければ失敗するように設計される。それゆえ、DTKVサービス104−Xは、ブロック214で、付加操作が失敗したと判断すると、DTKVサービス104−Xは、データログファイルが変更トランザクションの開始以降に(例えば同時に実行された他のトランザクションによって)更新/変更されたと結論付けることができ、これは、そのデータログファイルの現在のバージョン番号がもはやデータログスナップショットから渡されたバージョン番号と一致しなくなっているからである。この場合、DTKVサービス104−Xはトランザクションログファイル18−Xに、(DFSコンポーネント114−Xによって提供された付加トランザクションを通じて)、変更トランザクションが中断されたことを示す第二のトランザクションログエントリ(例えば、ABORTトランザクションログエントリ)を書き込むことができ、プロセス200は終了できる。
【0050】
これに対し、DTKVサービス104−Xがブロック214で付加操作が成功したと判断すると、DTKVサービス104−Xは、データログファイルがその変更トランザクションの開始以降に更新/変更されなかったと結論付けることができ、これは、そのデータログファイルの現在のバージョン番号がデータログスナップショットから渡されたバージョン番号と一致するからである。この場合、現在のループの繰り返しは終了でき(ブロック218)、プロセス200はブロック208に戻ることができ、DTKVサービス104−Xは別のキーバリューサブセットを処理できる。DTKVサービス104−Xがすべてのキーバリューサブセットの処理に成功すると(すなわち、すべてのキーバリューサブセットに関するデータログエントリのそれぞれに関連付けられたデータログファイルへの付加が成功すると)、DTKVサービス104−Xはブロック220で、トランザクションログファイル108−Xに、(DFSコンポーネント114−Xにより提供される付加操作を通じて)、変更されたトランザクションがコミットされたことを示す第二のトランザクションログエントリ(例えば、COMMITトランザクションログエントリ)を書き込むことができる。
【0051】
図2のアルゴリズムは対象の変更トランザクションに関する原子性および耐久性を保証できるが、これは、DTKVサービス104−Xが、アルゴリズムの最後のステップ(ブロック216または220の何れか)において変更トランザクションをコミットまたは中断する。この最後のステップの一部として、DTKVサービス104−XはDFSコンポーネント114−Xにより提供された付加操作を起動して、COMMITまたはABORTトランザクションログエントリの何れかをトランザクションログファイル108−Xに書き込み、この付加操作はDFSコンポーネント114−Xによって、上のセクションI.D.で述べたように、その原子性および耐久性が保証される。それゆえ、トランザクション全体が原子性および耐久性を有することが保証される。
【0052】
場合により、DTKVサービス104−X(またはノード102−X)は、それがCOMMITまたはABORTトランザクションログエントリをトランザクションログファイル108−Xに書き込む前であり、かつそれが1つまたは複数のデータログエントリを1つまたは複数のデータログファイルに書き込んだ後にクラッシュするかもしれない。しかしながら、以下のセクションII.B.で説明するように、DTKサービス104−1〜104−Nが取得し(すなわち、GET)トランザクションを実行するために行うアルゴリズムは、データログファイル106−1〜106−Mの中の、適当なトランザクションログファイルの中に対応するCOMMITトランザクションログエントリを持たないデータログエントリのすべてを無視することができる。それゆえ、このような場合でも、中断された変更トランザクションは原子的であると考えることができるが、これは、トランザクションログファイル108−Xの中にCOMMITトランザクションログエントリがなければ、データログファイルに書き込まれたどの変更もユーザにとって見えないからである。
【0053】
さらに、図2のアルゴリズムは、同時に実行される他のトランザクションに関して、対象の変更トランザクションのノード単位スナップショット分離を確実に行うことができる。フロック212〜216に関して述べたように、変更トランザクションに関わったデータログファイルの何れかが(例えば、同時に実行される他のトランザクションによって)変更トランザクションの開始以降に変えられた場合、DTKVサービス104−Xがブロック212で起動する付加操作は失敗し、変更トランザクションは中断される。したがって、この結果は、同時に実行される2つのトランザクションは同じデータを変更できないという第一のノード単位スナップショット分離の要求事項を満たす。これに加えて、以下のセクションII.B.で説明するように、DTKVサービス104−1〜104−Nが取得(すなわち、GET)トランザクションを実行するために行うアルゴリズムは、データログファイル106−1〜106−Mの中の、適当なトランザクションログファイルに対応するCOMMITトランザクションログエンティティを持たないデータログエントリのすべてを無視することができ、それゆえ、DTKVストア100は、同時に実行される変更トランザクションの状態以前のように見える。この特性は、読出分離のノード単位スナップショット分離性という第二の要求事項を保証する。最後に、単独のトランザクションログファイルがDTKVストア100の中の各ノード102−1〜102−Nに関連付けられることに留意するべきであり、その単独のトランザクションログファイルはそれに関連付けられたノードから発生する(すなわち、その上で実行される)すべてのトランザクションについての固有のトランザクションログエントリのリストを含む。したがって、このデータ構成は、各ノードの固有のコミット順序という、ノード単位スナップショット分離性の第三の要求事項を満たす。
【0054】
図2のアルゴリズムに関する1つの問題は、それがトランザクション上正しい結果を生むものの、変更トランザクションの特定の組み合わせの同時実行を不必要に阻止する可能性がある。例えば、キーバリューペアの互いに素な集合に作用する2つのPUTトランザクションT1とT2、例えばトランザクションT1がキーバリューペア(K1、V1)と(K2、V2)を保存するように構成され、トランザクションT2がキーバリューペア(K3、V3)と(K4、V4)を保存するように構成される場合を考える。キーK1がデータログファイルD1に保存され、キーK2とK3がデータログファイルD2に保存され、キーK4がデータログファイルD3に保存されると仮定する。それゆえ、これら2つのトランザクションのデータログスナップショットは、これらがどちらもデータログファイルD2を含むため、交差する。
【0055】
この例において、トランザクションT1とT2が図2のプロセス200に従って同時に実行される場合、トランザクションのうちの一方は、データログファイルD2のバージョン番号が一方のトランザクションまたは他方の実行中に変化する(それゆえ、フロック212の付加操作が失敗する)ため、中断される。しかしながら、トランザクションの観点からはどちらのトランザクションも中断する必要がなく、それは、これらが異なるキーバリューペアを変更するため、T1が部分的にT2に上書きする、またはその逆が起きる虞がないからである。
【0056】
この問題に対処するために、プロセス200を図3に示されるように改良できる。特に、図3は、DTKVサービス104−Xが図2のブロック214の後で、かつブロック216の前に実行できるサブプロセス300を示している。このサブプロセスにより、DTKVサービス104−Xは対象の変更トランザクションの中断を、その変更トランザクションと同時に実行される他の変更トランザクションの間でキーバリューペアが重複していない場合に回避できる。
【0057】
サププロセス300は、DTKVサービス104−Xが、付加操作が現在のキーバリューサブセットについて失敗したと判断した時(例えば、図のブロック214)に始まる。ブロック302で、DTKVサービス104−Xは現在のキーバリューサブセットに関連付けられたデータログファイルの長さを取得することができる。図2のブロック202に関して述べたように、このデータログファイル長さはデータログスナップショットの中に保存され、変更トランザクションの開始時のデータログファイルの長さを表す。
【0058】
ブロック304で、DTKVサービス104−Xは、ファイルの終わりからブロック302で取得された長さまで降順でデータログファイルを読み出すことができる。特定の実施形態において、DTKVサービス104−Xはこの読出を、DFSコンポーネント114−Xによって可能とされ、セクションI.D.で説明した読出操作を起動することによって実行できる。このようにしてファイルを読み出すことにより、DTKVサービス104−Xは変更トランザクションが始まった時から付加操作が失敗した時までの間にファイルに追加されたキーバリューペアを特定できる。
【0059】
DTKVサービス104−Xが、ブロック304でデータログファイルから読み取られた何れかのキーと現在のキーバリューサブセットの中のキーとが一致していることを発見すると(ブロック306)、DTKVサービス104−Xは、変更トランザクションのキーバリューペアと同時に実行される他のトランザクションのキーバリューペアの間に重複があると判断できる。したがって、ブロック308で、DTKVサービス104−Xはトランザクションログファイル108−Xに、(DFSコンポーネント114−Xにより提供される付加操作を通じて)、変更トランザクションが中断されたことを示す第二のトランザクションログエントリ(例えば、ABORTトランザクションログエントリ)を書き込むことができる。
【0060】
これに対して、DTKVサービス104−Xが、ブロック306で何れかの一致を発見しない場合、DTKVサービス104−Xは、変更トランザクションのキーバリューペアと同時に実行される他のトランザクションのキーバリューペアの間に重複がないと判断できる。この場合、DTKVサービス104−Xはデータログスナップショットを更新して、そのデータログファイルの現在のバージョン番号および現在の長さを含めることができる(ブロック310)。するとDTKVサービス104−Xは、サブプロセス300を図2のブロック212へと移行させることができる。ブロック212で、DTKVサービス104−Xは現在のバージョン番号を有するデータログファイルについての付加操作を再試行でき、プロセス200をその時点から前述のように実行できる。
【0061】
図2または図3に示されていないが、いくつかの実施形態において、DTKVサービス104−Xは変更トランザクションをその中断後に自動的に再試行(すなわち、その実行を再開)できる。これは、変更トランザクションの実行が成功する可能性を高めることができる。特定の実施形態において、DTKVストア100の管理者はDTKVサービス104−Xがこのような再試行を行うべきか否かを示す1つ以上のパラメータと、行うべきであれば、トランザクション当たりの再試行の最大回数を決定できる。
【0062】
II.B.GETトランザクション
図4は、DTKVサービス104−Xが取得(すなわち、GET)トランザクションを実行するために行うことのできる、1つの実施形態によるプロセス400を示す。
【0063】
ブロック402で、DTKVサービス104−Xは、GETトランザクションのキーセット(すなわち、入力キーの集合)の各キーについてのループに入ることができる。このループの中で、DTKVサービス104−Xはまず、現在のキーを保存するデータログファイルを特定し、そのデータログファイルの長さを保存することができる(ブロック404)。
【0064】
ブロック406で、DTKVサービス104−Xは、ブロック404で特定されたデータログファイルで現在のキーを参照する最後の(すなわち、最も新しい)データログエントリを検索することができる。セクションI.C.1.で述べたように、あるキーに関するデータログファイルの中の最後のデータログエントリは一般に、そのキーの現在の値を表す。特定の実施形態において、DTKVサービス104−Xはこの検索を、DFSコンポーネント114−Xにより可能とされ、セクションI.Dで説明した読出操作を使ってデータログファイルを(ブロック404の長さの値から)降順に読み出すことによって行うことができる。
【0065】
DTKVサービス104−Xが現在のキーに関する最後のデータログエントリを発見すると、DTKVサービス104−Xは、そのデータログエントリの「ノード」と「txnID」フィールドを使って、データログエントリを作らせたソースノードおよびソーストランザクションを特定することができる(ブロック408)。するとDTKVサービス104−Xは、ソースノードに関連付けられたトランザクションログファイルを取得し、そのトランザクションログファイルで、そのソーストランザクションIDを参照する最後の(すなわち、最も新しい)トランザクションログエントリを検索できる(ブロック410と412)。このようにして、DTKVサービス104−Xは、ソーストランザクションの現在の状態を判断できる。
【0066】
元のトランザクションの最後のトランザクションログエントリがCOMMITエントリであれば(ブロック414)、DTKVサービス104−Xは、ブロック406で判断された最後のデータログエントリが有効であると判断でき、それゆえ、最後のデータログエントリの中で特定された値を現在のキーの現在の値として返すことができる(ブロック416)。そこでプロセス400を終了できる。
【0067】
これに対して、最後のトランザクションログエントリがCOMMITエントリでなければ、DTKVサービス104−Xはブロック406で判断された最後のデータログエントリが有効でないと判断でき、これは、最後のデータログエントリを作成したソーストランザクションがまだコミットされていないからである。したがって、DTKVサービス104−Xは、保存されていたそのデータログファイルの長さを調整して、最後のデータログエントリをスキップすることができる(ブック418)。すると、プロセス400の流れはブロック406に戻ることができ、DTKVサービス104−Xは、そのデータログファイルで現在のキーを参照する最後の(すなわち、最も新しい)データログエントリを再度検索する。この、後の検索では、DTKVサービス104−Xは以前に発見したデータログエントリに遭遇せず、これは、DTKVサービス104−Xが新たに保存された長さ(これは過去に発見されたデータログエントリをスキップする)から降順にファイルを読み出すからである。すると、プロセス400を上述のように進めることができる。
【0068】
最終的に、DTKVサービス104−Xは現在のキーに関する有効なデータログエントリを発見し、ブロック416でそのデータログエントリからの値を返すことができる。するとループ402を進めて、DTKVサービス104−Xが各キーの値を返すまで、そのキーセットの残りのキーを処理することができる。
【0069】
直感的に、図4のアルゴリズムは、DTKVストア100に値を追加した変更トランザクションが適当なトランザクションログファイルにコミットされたとしてマークされない限り、GETトランザクションが指定されたキーの値を確実に返さないようにする。それゆえ、このアルゴリズムは、変更トランザクションの原子性を、変更トランザクションが何らかの理由によってCOMMITトランザクションログエントリの作成前に中断されたか失敗した場合に、変更トランザクションが失敗の前に作成したトランザクションデータログエントリのすべてがユーザから見えないという点で、保証する。
【0070】
しかしながら、図4のアルゴリズムは、変更トランザクションが同時に行われる場合に、GETトランザクションに関するノード単位スナップショット分離性を保証しない。例えば、キーバリューペア(K1、W1)と(K2、W2)を保存するためのPUTトランザクションT1が開始され、キーK1とK2の以前の値がそれぞれV1とV2であったとする。さらに、キーK1とK2の値を読み出すためのGETトランザクションT2が、トランザクションT1と略同時に開始され、以下のイベントシーケンスが起こるとする。
1.T1が開始される。
2.T1により、キーK1が値W1で更新される。
3.T1により、キーK2が値W2で更新される。
4.T2が開始される。
5.T2がキーK1のための最後のデータログエントリを検索し、値W1を発見するが、適当なトランザクションログファイルをチェックして、T1に関するCOMMITトランザクションログエントリを発見せず(T1がまだコミットされていないため)、その結果、T2が、キーK1に関する、それより前のデータログエントリを検索し、値V1を発見し、V1を返す。
6.T1がコミットされ、COMMITトランザクションログエントリが書き込まれる。
7.T2がキーK2に関する最後のデータログエントリを検索し、値W2を発見し、T1に関するCOMMITトランザクションログエントリを発見し、W2を返す。
【0071】
このシーケンスの最後に、GETトランザクションT2はキーK1とK2それぞれのための値V1とW2を返し、これは、結果として得られた値がPUTトランザクションT1の部分的実行を示しているため、ノード単位スナップショット分離の特性に違反する。
【0072】
この欠点に対処するために、特定の実施形態において、図4のプロセス400を図5に示されるように改良できる。特に、図5は、DTKVサービス104−Xが図4のブロック410と414の間で実行できるサブプロセス500を示している。このようなサブプロセス500により、DTKVサービス104−Xは、GETトランザクションが確実に、1つまたは複数の、同時に実行される変更トランザクションの部分的実行を示す結果を返さないようにすることができる。
【0073】
このようなサブプロセス500は、DTKVサービス104−Xが現在のキーの最後のデータログエントリに関連付けられるソーストランザクションに関するトランザクションログファイルを取得した後(図4のブロック410)に始まる。ブロック502で、DTKVサービス104−Xは、「段階的トランザクションログスナップショット」(progressive transaction log snapshot)にアクセスでき、これは1つのGETトランザクションの実行中に訪問されたすべてのトランザクションログファイル(およびそのバージョン番号と長さ)を継続的に追跡するように意図されたデータ構造である。特にDTKVサービス104−Xは、この段階的トランザクションログスナップショットにアクセスし、現在のGETトランザクション中にブロック410で呼び出されたトランザクションログファイルをDTKVサービス104−Xが過去に訪問した(例えば、これを読み取った)ことがあるかを判断できる。
【0074】
DTKVサービス104−Xが過去にそのトランザクションログファイルを訪問したことがないと判断すると(ブロック504)、DTKVサービス104−Xはトランザクションログファイルとその現在の長さ/バージョン番号を段階的トランザクションログスナップショットに追加できる(ブロック506)。これに対して、DTKVサービス104−Xが過去にそのトランザクションログファイルを訪問したことがあると判断すると、DTKVサービス104−Xは段階的トランザクションログスナップショットからトランザクションログファイルの長さを読み出すことができる(ブロック508)。すると、DTKVサービス104−Xはこのトランザクションログファイルで、ソーストランザクションIDを参照する最後のトランザクションログエントリを検索できる(ブロック510)。DTKVサービ104−Xはこの検索を、(ブロック506が実行された場合は)トランザクションログファイルの現在の長さから、または(ブロック508が実行された場合は)段階的トランザクションログスナップショットの長さからファイルを降順に読み出すことによって行うことができる。すると、サププロセス500は図4のブロック414に移行でき、プロセス400をその時点から前述のように進めることができる。
【0075】
図5に示される方法で段階的トランザクションログスナップショットを利用することによって、DTKVサービス104−XはGETトランザクションの実行中にそれがアクセスするトランザクションログファイルの状態を有効に「フリーズ」させることができる。それゆえ、DTKVサービス104−Xは、GETトランザクションが、同時に実行される1つまたは複数の変更トランザクションにより、トランザクション上誤った結果(例えば、ノード単位スナップショット分離性を満たさない結果)を返すような状況を回避できる。例えば、サブプロセス500を前の例、すなわちPUTトランザクションT1がGETトランザクションT2と同時に実行される場合に適用すると、以下の代替的なイベントシーケンスが発生する。
1.T1が開始される。
2.T1により、キーK1が数値W1で更新される。
3.T1により、キーK2を数値W2で更新させる。
4.T2が開始される。
5.T2がキーK1に関する最後のデータログエントリを検索して、値W1を発見するが、適当なトランザクションログファイルを検索し、T1に関するCOMMITトランザクションログエントリを発見せず(T1がまだコミットされていないため)、その結果、T2がキーK1に関する、それより前のデータログエントリを検索し、値V1を発見し、V1を返す。
6.T2が、訪問されたトランザクションログファイルとその長さを段階的トランザクションログスナップショットに追加する。
7.T1がコミットされ、COMMITトランザクションログエントリが書き込まれる。
8.T2は、キーK2に関する最後のデータログエントリを検索し、値W2を発見し、適当なトランザクションログファイルが過去に訪問されたと判断し、それゆえ、段階的トランザクションログスナップショットに保存された長さからトランザクションログファイルを検索する。
9.T2はトランザクションログスナップショットの中でT1に関するCOMMITトランザクションログエントリを発見せず(ステップ(7)で書き込まれたCOMMITがスキップされるため)、キーK2に関するそれより前のデータログエントリを検索し、値V2を発見し、V2を返す。
【0076】
このシーケンスの最後に、GETトランザクションT2はキーK1とK2に関する値、それぞれV1とV2を返し、これは、それがPUTトランザクションT1の部分的実行を表していないため、トランザクション上、正しい。
【0077】
III.キー名前空間による検索
前述のように、特定の実施形態において、DTKVストア100は保存されたキーおよび/またはキーバリューペアの効率的な検索をサポートすることができる。特に、DTKVストア100は、キーを1つまたは複数のキー名前空間に分割して、各キー名前空間のためのキーバリューペアを1つまた複数の別々のデータログファイルに保存することができる。すると、DTKVサービス104−1〜104−Nにより、ユーザは(セクションI.A.で説明したSEARCH操作を通じて)キーおよび/またはキーバリューペアをキー名前空間により検索できる。ユーザが特定のキー名前空間に関連してSEARCH操作を起動させると、DTKVストアはその検索をそのキー名前空間に関連付けられたデータログファイル(複数の場合もある)の内容に限定することができる(DTKVストア100の中のデータログファイルの全部を検索しなくてもよい)。
【0078】
図6は、SEARCH操作を実行するためにDTKVサービス104−Xが行うことのできる、1つの実施形態によるプロセス600を示す。ブロック602で、DTKVサービス104−XはSEARCH操作の起動を受けることができ、これは検索式および目標とするキー名前空間を含む。検索式は、例えば正規表現またはその他のあらゆる種類のクエリストリングとすることができる。
【0079】
ブロック604で、DTKVサービス104−Xは、目標とするキー名前空間に関連付けられた1つ以上のデータログファイル(すなわち、目標とするキー名前空間のためのキーバリューペアを含む)を特定できる。
【0080】
ブロック606で、DTKVサービス104−Xは、ブロック604で特定された1つまたは複数のデータログファイルで、検索式を満たすキーおよび/またはキーバリューペアを検索できる。するとDTKVサービス104−Xは、発見されたキーおよび/またはキーバリューペアを要求者に返すことができる。1つの実施形態において、DTKVサービス104−Xは、それに関連付けられたDFSコンポーネント114−Xにより提供され、セクションI.D.で説明した読出操作を起動させることによって、この検索を実行できる。代替的な実施形態において、この検索はどのような周知のテキスト検索アルゴリズムを使って実行してもよい。
【0081】
本明細書で説明された各種の実施形態は、コンピュータシステムに保存されたデータに係る様々なコンピュータ実装操作を利用してもよい。例えば、これらの操作は、物理的数量の物理的操作を必要とする場合もあり、通常、必ずしもそうであるとは限らないが、これらの数量が電気または磁気信号の形態をとることもあり、この場合、これらまたはそれを表すものの保存、転送、合成、比較、またはその他の操作を行うことができる。さらに、このような操作はしばしば、生成、特定、決定、比較等の用語で呼ばれる。本明細書において説明された1つまたは複数の実施形態を形成する操作は何れも、有益な機械操作であってもよい。これに加えて、1つまたは複数の実施形態はまた、これらの操作を実行するための機器または装置に関係している。装置は、特定の必要な目的のために特に構成されていてもよく、またはコンピュータの中に保存されたコンピュータプログラムにより選択的に作動され、または構成される汎用コンピュータであってもよい。特に、各種の汎用マシンは、本明細書の教示に従って書かれたコンピュータプログラムと共に使用されてもよく、あるいはこれは必要な操作を実行するための、より専用化された装置を構成する上でより好都合である場合がある。本明細書で説明された各種の実施形態は、ハンドヘルド機器、マイクロプロセッサシステム、マイクロプロセッサベースまたはプログラム可能な民生用電子機器、ミニコンピュータ、メインフレームコンピュータ等を含むその他のコンピュータシステム構成で実施してもよい。
【0082】
1つまたは複数の実施形態は、1つまたは複数の非一時的コンピュータ読出可能記憶媒体の中に埋め込まれた1つまたは複数のコンピュータプログラム、または1つまたは複数のコンピュータプログラムモジュールとして実装されてもよい。非常一時的コンピュータ読取可能媒体という用語は、後にコンピュータシステムに入力可能なデータを保存できるあらゆるデータ記憶装置を指す。非一時的コンピュータ読取可能媒体は、コンピュータによる読取を可能にする方法でコンピュータプログラムを具現化するための、既存の、または今後開発されるどのような技術に基づいていてもよい。非一時的コンピュータ読取可能媒体の例としては、ハードドライブ、ネットワークアタッチトストレージ(NAS)、リードオンリメモリ、ランダムアクセスメモリ(例えば、フラッシュメモリ装置)、CD(コンパクトディスク)、例えばCD−ROM、CD−RまたはCD−RW、DVD(デジタルバーサタイルディスク)、磁気テープ、その他の光および光以外のデータ記憶装置がある。非一時的コンピュータ読取可能媒体はまた、ネットワーク接続されたコンピュータシステム上で分散させることができ、それによってコンピュータ読取可能コードを分散させて保存され、実行される。
【0083】
さらに、本明細書に記載された各種のコンポーネント、操作、データストア間の境界はある程度任意であり、特定の操作は特定の例示的構成に関連して示されている。機能のその他の割当も考えられ、これらも本発明の範囲に含まれる。一般に、例示的な構成の中で別のコンポーネントとして説明されている構造や機能は、複合的な構造またはコンポーネントとして実装してもよい。同様に、1つのコンポーネントとして説明されている構造や機能は、別のコンポーネントとして実装してもよい。
【0084】
上記の説明は、各種の実施形態を、特定の実施形態の態様の実施の仕方の例に関連して示している。上記の例と実施形態は、これらがすべての実施形態であるとみなすべきではなく、以下の特許請求の範囲により定義される特定の実施形態の柔軟性と利点を説明するために提示されている。上記の開示と以下の特許請求の範囲に基づき、他の配置、実施形態、実施例、均等物も、特許請求の範囲により定義されるその範囲から逸脱することなく、利用してよい。
図1
図2
図3
図4
図5
図6
【国際調査報告】