(57)【要約】すべてがパーシステントであるか、あるいはまったくそうではない、パーシステントＫＶストアへの変更のために、各々が独自の非パーシステントトランザクションを有する複数のパーシステントキーバリュー（ＫＶ）ストア間で、コンシステンシーを提供するためにデータベースシステム内のトランザクションマネージャのための方法が提供される。この方法は、第１のＫＶストアのトランザクションと、第２のＫＶストアのトランザクションに参加することを含む。すべてがパーシステントであるか、または全くそうでない第１のＫＶストアに対する第１の変更と、第２のＫＶストアに対する第２の変更を含む変更のセットに関して、方法は、第１のＫＶストアのトランザクションへ第１の変更を挿入することと、第２のＫＶストアのトランザクションへ第２の変更を挿入することと、それぞれ、パーシステントグローバルジャーナルへ、第１および第２の変更を記載する第１および第２のサブエントリを含む結合されたジャーナルエントリを作成し、書き込むことを含む。【選択図】図１
2020536339.tif 000002
【特許請求の範囲】
【請求項１】
すべてをパーシスト（persist）するか、あるいは全くしないパーシステントＫＶストアへの変更のために、各々が独自の非パーシステントトランザクションを有する、複数のパーシステントキーバリュー（ＫＶ）間にコンシステンシー（consistency）を提供するためのデータベースシステムにおけるトランザクションマネージャの方法において、
第１のＫＶストアのトランザクションに参加するステップと、
第２のＫＶストアのトランザクションに参加するステップと、
すべてパーシストするか、あるいは全くしない、前記第１のＫＶストアへの第１の変更と前記第２のＫＶストアへの第２の変更を含む変更のセットに関して、
前記第１の変更を、前記第１のＫＶストアのトランザクションにインサートするステップと、
前記第２の変更を前記第２のＫＶストアのトランザクションにインサートするステップと、
それぞれ、パーシステントグローバルジャーナルに、前記第１の変更および前記第２の変更を記載する第１のサブエントリと第２のサブエントリを備えた結合されたジャーナルエントリを作成し、書き込むステップと、
を備えた、方法。
【請求項２】
前記結合されたジャーナルエントリの、前記グローバルジャーナルへの書き込みを完了するのを待つステップと、
前記結合されたジャーナルエントリが、前記グローバルジャーナルに書かれた後で、
前記第１のＫＶストアのトランザクションからデタッチするステップと、
前記第２のＫＶストアのトランザクションからデタッチするステップと、
をさらに備えた、請求項１に記載の方法。
【請求項３】
前記ストレージシステムが、リスタートするのを検出した後で、
前記第１及び第２のＫＶストア上で最後にコミットしたトランザクションを決定するステップと、
前記グローバルジャーナル内の前記結合されたエントリを調べて、対応するＫＶストアにコミットされなかった任意のサブエントリを決定するステップと、
対応するＫＶストアにコミットされなかった任意のサブエントリをリプレイするステップと、
をさらに備えた、請求項２に記載の方法。
【請求項４】
前記第１および第２のＫＶストアのトランザクションに参加する前に、アプリケーションから、変更のセットを受信するステップをさらに備えた、請求項１に記載の方法。
【請求項５】
前記第１および前記第２の変更がすべてコミットされたと決定した後で、前記結合されたジャーナルエントリを削除するステップをさらに備えた、請求項１に記載の方法。
【請求項６】
パーシステントである少なくとも２つのＫＶストアと、
前記少なくとも２つのＫＶストアを管理する少なくとも１つのキーバリュー（ＫＶ）ストアデータベースマネージメントシステム（ＤＢＭＳ）であって、前記少なくとも１つのＫＶストアＤＢＭＳは、各ＫＶストアにパーシステントではない独自のトランザクションを提供する、少なくとも１つのＫＶストアＤＢＭＳと、
パーシステントであるグローバルジャーナルと、
すべてがパーシステントであるか、あるいは全くパーシステントでない少なくとも２つのＫＶストアへの変更に関する少なくとも２つのＫＶストア間のコンシステンシーを提供するトランザクションマネージャであって、前記トランザクションマネージャは、
第１のＫＶストアのトランザクションに参加し、
第２のＫＶストアのトランザクションに参加し、
すべてがパーシステントであるか、あるいは全くパーシステントでない、前記第１のＫＶストアへの第１の変更と、前記第２のＫＶストアへの第２の変更を含む、変更のセットに関して、
前記第１の変更を前記第１のＫＶストアのトランザクションにインサートし、
前記第２の変更を前記第２のＫＶストアのトランザクションにインサートし、
前記第１および第２の変更を、それぞれ前記グローバルジャーナルに記載する、第１及び第２のサブエントリを備えた、結合されたジャーナルエントリを作成し、書き込む、
ように構成される、トランザクションマネージャと、
を備えた、データベースシステム。
【請求項７】
前記トランザクションマネージャは、
前記結合されたジャーナルエントリの、前記グローバルジャーナルへの書き込みの完了を待ち、
前記結合されたジャーナルエントリが、前記グローバルジャーナルへ書かれた後で、
前記第１のＫＶストアのトランザクションからデタッチし、
前記第２のＫＶストアのトランザクションからデタッチする、
ようにさらに構成された、請求項６に記載のシステム。
【請求項８】
前記トランザクションマネージャは、
前記ストレージシステムがリスタートするのを検出した後で、
前記第１及び第２のＫＶストア上で、前記最後にコミットしたトランザクションを決定し、
前記グローバルジャーナル内の前記結合されたエントリを調べて、対応するＫＶストアにコミットされなかった任意のサブエントリを決定し、
対応するＫＶストアにコミットされなかった任意のサブエントリをリプレイする、
ようにさらに構成された、請求項７に記載のシステム。
【請求項９】
前記トランザクションマネージャは、前記変更のセットを発行したアプリケーション、及び前記少なくとも２つのＫＶストアＤＢＭＳとは異なる、請求項８に記載のシステム。
【請求項１０】
前記トランザクションマネージャは、前記変更のセットを発行したアプリケーションの一部である、請求項８のシステム。
【請求項１１】
前記トランザクションマネージャは、前記第１および第２の変更がすべてコミットされたと決定した後で、前記結合されたジャーナルを削除するようにさらに構成された、請求項６に記載のシステム。
【請求項１２】
すべてがパーシステントであるか、あるいは全くそうでないパーシステントＫＶストアへの変更のために、各ＫＶストアが独自の非パーシステントトランザクションを有する、複数のパーシステントキーバリュー（ＫＶ）ストア間に、コンシステンシーを提供するトランザクションマネージャをインプリメントするために、プロセッサにより実行可能な命令で符号化された非一時的コンピュータ可読媒体において、前記命令は、
第１のＫＶストアのトランザクションに参加し、
第２のＫＶストアのトランザクションに参加し、
すべてがパーシステントであるか、または全くそうではない前記第１のＫＶストアに対する第１の変更と、前記第２のＫＶストアに対する第２の変更を含む変更のセットに関して、
前記第１の変更を前記第１のＫＶストアのトランザクションに挿入し、
前記第２の変更を前記第２のＫＶストアのトランザクションに挿入し、
それぞれ、前記第１および第２の変更をパーシステントグローバルジャーナルに記載する第１および第２のサブエントリを備える結合されたジャーナルエントリを作成し、書き込む、
ことを備える、非一時的コンピュータ可読媒体。
【請求項１３】
前記命令はさらに、
前記結合されたジャーナルエントリが、前記グローバルジャーナルへの書き込みを完了するのを待つことと、
前記結合されたジャーナルが前記グローバルジャーナルへ書かれた後で、
前記第１のＫＶストアのトランザクションからデタッチすることと、
前記第２のＫＶストアのトランザクションからデタッチすることと、
をさらに備えた、請求項１２に記載の非一時的コンピュータ可読媒体。
【請求項１４】
前記命令はさらに、
前記ストレージシステムがリスタートしたことを検出した後で、
前記第１および第２のＫＶストア上の前記最後にコミットしたトランザクションを決定することと、
前記グローバルジャーナル内の前記結合されたエントリを調べて対応するＫＶストアにコミットしなかった任意のサブエントリを決定することと、
対応するＫＶストアにコミットされなかった任意のサブエントリをリプレイすることと、
をさらに備える、請求項１２に記載の非一時的コンピュータ可読媒体。
【請求項１５】
前記命令は、前記第１および第２の変更がコミットされたことを判断した後で、前記結合されたジャーナルエントリを削除することをさらに備えた、請求項１４に記載の非一時的コンピュータ可読記憶媒体。
【発明の詳細な説明】
【技術分野】
【０００１】
この発明は、キーバリューストアに関し、特に、キーバリューストアがシステムクラッシュまたはストレージの故障に耐えるためのジャーナリングに関する。
【背景技術】
【０００２】
キーバリュー（ＫＶ）ストアは、単一のデータベースと見ることができる。データをテーブルおよびカラムに配列する構造化照会言語（ＳＱＬ）と異なり、ＫＶストアは単に、キーバリューペアの集合である。キーは、任意であり得、例えば、整数またはストリングであり得る。唯一の要件は、ＫＶストアが、任意の２つのキーをどのように比較するかを知っていることである。バリューも任意であり得、ＫＶストアは、それをバイナリ・ラージ・オブジェクト（ＢＬＯＢ）として扱う。唯一の要件は、ＫＶストアがそれをディスク上に記憶することができるようにバリューサイズを知っていることである。
【０００３】
典型的には、ＫＶストアは、トランザクションにより動作する。新しいトランザクションは、アプリケーションが、例えば新しいキーを挿入するような、ＫＶストア上で何等かの変更を実行したいときオープンされる。後で、このトランザクションのために、さらなる変更を行うことができる。いくつかのポイントで、ＫＶストアは、現在実行しているトランザクションが、十分な変更を累積したと決定する。次に、ＫＶストアは現在のトランザクションをコミットし、トランザクションのためのすべての変更がディスクに保持される。これで、新しい実行中のトランザクションを開くことができる。各トランザクションは、単調に増加する整数のような、ある種のトランザクションＩＤを有する。
【０００４】
アプリケーションの観点から、典型的なフローは、以下の通りである。
１．ＫＶストアトランザクションに参加する。
２．変更のセットを実行する。例えば、新しいキーバリューペアを挿入する、キーバリューペアを削除する、いくつかのキーを変更する、いくつかの値を変更する等である。
３．ＫＶストアトランザクションをデタッチ（detach）する。
【０００５】
それに参加するアプリケーションスレッドが依然としてある間、トランザクションはコミット（commit）することができない。一度だけ、すべてのアプリケーションスレッドがトランザクションからデタッチされると、トランザクションは、コミットを開始することができる。典型的には、アプリケーションスレッドは、ＫＶストアに対するインメモリ変更（in-memory modifications）を実行するためにのみ、非常に短い時間、トランザクションにアタッチされる。
【０００６】
このモデルは、変更のセット全体がディスクに保持されるか、まったく保持されないことを保証する。例えば、トランザクションがコミットする前に、システムがクラッシュした場合、このトランザクションがこれまで集めた、いかなる変更も保持されないであろう。しかしながら、トランザクションからデタッチした後、アプリケーションは、いつ変更のセットが保持されるかを正確に知らない。さらに、クラッシュまたはストレージの故障がある場合、変更のセットは、完全に失われるであろう。
【０００７】
いくつかのアプリケーションの場合、一部のアプリケーションでは、一連の変更を時々失うことは、受け入れられない。このようなアプリケーションは、システムクラッシュやストレージ障害に耐えるために、ジャーナリング（journaling）を使用する必要がある。典型的に、ジャーナリングは、ＫＶストア自体によりインプリメントされるので、任意のアプリケーションが、それを使用することができる。
【０００８】
上記のステップ１で、アプリケーションがＩＤ＝５で実行中のトランザクションに参加すると仮定する。これは、ＩＤ＝４の従前のトランザクションが成功裏にコミットしたことを意味する。ステップ２で、アプリケーションは、新しいキーバリューペア［Ｋ１、Ｖ１］を挿入すると仮定する。これに応答してジャーナルエントリが作られる。
Ｉｎｓｅｒｔ  ［Ｋ１、Ｖ１］、Ｔｒａｎｓ  ＩＤ＝５
【０００９】
次に、このジャーナルエントリは、ディスクに書かれる。この時点で、アプリケーションは、トランザクションからデタッチすることができ、キーインサーションが失われないことが保証され得る。次に、トランザクション５がコミットする機会を得る前にシステムがクラッシュすると仮定する。システムがリスタートした後、システムは、最新のコミットされたトランザクションがＩＤ＝４を有することを知る。従って、４より高いトランザクションＩＤｓを保持するジャーナルエントリに対してスキャンされる。それゆえ、上記ジャーナルエントリは、関連があるとみなされる。従って、［Ｋ１、Ｖ１］ペアは、トランザクション５に再挿入され、従って失われない。このプロセスは、「ジャーナルのリプレイ」と呼ばれる。
【００１０】
今、トランザクション５が成功裏に完了したと仮定する。この場合、システムがその後クラッシュした場合、上記ジャーナルエントリは、関連しているとは、みなされないであろう。これは、ジャーナルエントリが、既にコミットされているトランザクションに代わって、変更を記述しているためである。
【発明の概要】
【００１１】
この開示の１つまたは複数の例において、ストレージシステムは、各々が独自のトランザクションを有するディスクリートＫＶストアを含む。ストレージシステムにおいて、単一の入出力（ＩＯ）パスフローは、１つまたは複数のＫＶストアに対して変更を行うことができる。
【００１２】
ＩＯパスフローをハンドリングすることに関して、異なるＫＶストアに対して一貫したシステムステートを持たせるために、以下を行うようにグローバルジャーナリングメカニズムが設けられる。個別のＫＶストアのトランザクションを結合する。これにより、ＫＶストアがパーシステント媒体（persistent media）（ディスクなど）のメモリ内の変更をコミットできなくなる。結合したすべてのＫＶストアトランザクションに変更を挿入する。結合したジャーナルエントリをアロケートする。ＫＶストア変更毎に、ジャーナル「サブエントリ」を結合したジャーナルエントリに追加する。ここで、ジャーナルサブエントリは、変更が印加されたＫＶストアのトランザクションＩＤを保持する。結合されたジャーナルエントリは、パーシステント媒体への単一のアトミックな書き込みで書き込まれる。ジャーナル書き込みが完了すると、ＫＶストアからトランザクションをデタッチする。
【００１３】
ＫＶストアは、それ自体如何なるジャーナルも有さないことに留意する必要がある。各ＫＶストアは、メモリ内の変更を維持し、それらをパーシステント媒体に定期的にコミットする。この時点で、対応するジャーナルサブエントリは、無効になる。対応するＫＶストアトランザクションのすべてのサブエントリの変更がコミットされると、結合されたジャーナルエントリを解放することができる。システムがクラッシュすると、ジャーナルの各サブエントリのトランザクションＩＤは、対応するＫＶストアにコミットされたかどうかが、チェックされる。
【図面の簡単な説明】
【００１４】
【図１】この開示のいくつかの例にけるストレージシステムである。
【図２】この開示のいくつかの例において、第１の構成における、トランザクションマネージャ、キーバリュー（ＫＶ）データベースマネージメントシステム（ＤＢＭＳｓ）、およびグローバルジャーナル間の相互作用を図示するブロック図である。
【図３】この開示のいくつかの例における複数のＫＶストアにわたってコンシステンシーを提供するための、図１のシステムに関する方法のフローチャートであり、特に、図２の第１の構成におけるトランザクションマネージャである。
【図４】この開示のいくつかの例において、システムクラッシュ、またはストレージ故障からのコミットされなかったトランザクションをリカバーするための、図１のトランザクションマネージャに関する方法のフローチャートである。
【図５】この開示のいくつかの例において、トランザクションマネージャ、複数のＫＶストアのためのＫＶ  ＤＢＭＳｓ、およびグローバルジャーナルとの間の相互作用を例示するブロック図である。
【発明を実施するための形態】
【００１５】
異なる図面における同じ参照符号の使用は、類似または同一のエレメントを指す。いくつかのケースにおいて、１つのアプリケーションは、２以上のＫＶストアに対して作用する。アプリケーションが変更［Ｋ１、Ｖ１］をＫＶストア１に挿入し、変更［Ｋ２、Ｖ２］をＫＶストア２に挿入したいと仮定する。さらに、アプリケーションには、ＫＶストア間のコンシステンシー（consistency）を必要とする。言い換えれば、上述した変更の両方が保持されるか、または両方とも保持されない。
【００１６】
これを達成するための可能な例示フローは、以下の如くである。
１．ＫＶストア１のトランザクションに参加する。
２．ＫＶストア２のトランザクションに参加する。
３．変更［Ｋ１、Ｖ１」をＫＶストア１に挿入する。
４．変更［Ｋ２、Ｖ２］をＫＶストア１に挿入する。
５．ＫＶストア１のトランザクションをデタッチする。
６．ＫＶストア２のトランザクションをデタッチする。
【００１７】
そのようなフローと上述したモデルの場合、ＫＶストア間のコンシステンシーは、可能ではない。各ＫＶストアは、別個のジャーナルを有する。２つの別個のジャーナルエントリは、２つの変更に関して作成されるであろう。ジャーナルエントリの１つは、ディスクに書き込むことはできるが、他のジャーナルエントリは、クラッシュにより書き込むことができないかもしれない。その場合、システムリスタート時に、ジャーナルエントリの１つのみがリプレイされるであろう。この結果は、コンシステンシーの無いＫＶストア間の状態であろう。
【００１８】
この開示の例では、ＫＶストア毎のジャーナルではなく、グローバルジャーナルが提供される。グローバルジャーナルは、以下に示すように、サブエントリからなる、結合されたジャーナルエントリを含む。新しいアプリケーションフローは、
１．ＫＶストア１のトランザクションに参加する（このトランザクションのトランザクションＩＤをＴ１と仮定する）。
２．ＫＶストア２のトランザクションに参加する（このトランザクションのトランザクションＩＤをＴ２と仮定する）。
３．変更［Ｋ１、Ｖ１］をＫＶストア１に挿入する。
４．変更［Ｋ２、Ｖ２］をＫＶストア２に挿入する。
５．両方の変更を記載する結合されたジャーナルエントリを作成する。
Insert into KV store 1:[K1, V1], Trans ID=T1;
Insert into KV store 2:[K2, V2], Trans ID=T2
６．結合されたジャーナルエントリをパーシステント媒体（例えば、ディスク）に書き込み、書き込みが完了するのを待つ。
７．ＫＶストア１のトランザクションをデタッチする。
８．ＫＶストア２のトランザクションをデタッチする。
【００１９】
結合されたジャーナルエントリは、単一のアトミックな書き込み（例えば、１回のディスク書き込み動作）として書き込まれる。それゆえ、両方のサブエントリは、一緒に書き込まれる。両方のトランザクションからのデタッチは、結合されたジャーナルエントリがディスクに保持された後でのみ生じる。これは、関与するＫＶストアトランザクションのいずれも、結合されたジャーナルエントリがディスク上に保持されるまで、コミットすることは、できないことを保証する。結合されたジャーナルエントリが書き込まれる前にトランザクションの、いずれか、または両方が生じる場合、以下の例示フローが起こり得る。
−ＫＶストア１は、結合されたジャーナルエントリが、ディスク上にある前に、そのトランザクションをコミットする可能性がある。
−結合されたジャーナルエントリが、ディスク上にある前に、クラッシュする可能性がある。
−システムがリスタートした後、ＫＶストア１は、その関連する変更を、コミットしたトランザクションＴ１の一部として保持する。
しかしながら、ＫＶストア２は、トランザクションＴ２をコミットしなかった。さらに、ディスク上には、結合されたジャーナルエントリは無く、それは、トランザクションＴ２において変更を再び印加するために使用された可能性がある。この結果、トランザクションＴ１における変更は、保持されるが、トランザクションＴ２における変更は、失われる。それゆえ、システムの状態は不一致となる。
【００２０】
今、上述した８つのステップのすべてが実行されたと仮定する。今、結合されたジャーナルエントリは、ディスク上にあり、各ＫＶストアは、いつでもトランザクションをコミットすることができる。今、以下の例示フローが起こり得ると仮定する。
９．ＫＶストア１は、トランザクションＴ１をコミットする。
１０．ＫＶストア２が、トランザクションＴ２をコミットすることができる前に、システムがクラッシュする。
１１．システムリスタート時に、ステップ６で書き込まれた結合されたジャーナルエントリが調べられる。
１２．第１のサブエントリは、これ以上関連しないと決定される。なぜならば、ＫＶストア１は、トランザクションＴ１が、すでにコミットされており、トランザクションＴ１を示す任意のサブエントリは、もはや関連しないことを認識しているからである。
１３．第２のサブエントリは、依然として関連すると決定される。なぜなら、ＫＶストア２は、トランザクションＴ２をコミットしていないことを認識しているからである。ＫＶストア２は、最後にコミットしたトランザクションがＴ２−１（トランザクションＴ２の前のトランザクション）であったことを認識している。
１４．第２のサブエントリのみがリプレイされ、変更［Ｋ２、Ｖ２］をＫＶストア２のトランザクションＴ２に再度インサートするか、またはディスク上のＫＶストア２に変更［Ｋ２、Ｖ２］を直接コミットする。
１５．システムは整合状態に戻る。
【００２１】
上記モデルは、２つのＫＶストアに限定されない。結合されたジャーナルエントリが単一の書き込み動作に書き込むことができる限り、任意の数のＫＶストアに対してコンシステンシーを達成することができる。
【００２２】
図１は、この開示のいくつかの例におけるデータベースシステム１００である。システム１００は、プロセッサ１０２、メイン（非パーシステント）メモリ１０４、および第２の（パーシステント）メモリ１０６を含む。メインメモリ１０４（例えば、ランダムアクセスメモリ）は、トランザクションマネージャ、第１のＫＶストア１２０を管理するための固有のトランザクション（例えば、トランザクションＩＤ＝Ｔ１を有する現在のトランザクション１１２）を管理するための固有のトランザクションを有する第１のＫＶデータベースマネージメントシステム（ＤＢＭＳ）１１０、第２のＫＶストア１２２を管理するための固有のトランザクション（例えば、トランザクションＩＤ＝Ｔ２を有する現在のトランザクション）を有する第２のＫＶ  ＤＢＭS１１４に関するプログラム命令とデータを記憶する。「ＫＶ  ＤＢＭＳ」と「ＫＶストア」は、交換可能に使用され、しばしば一緒にして１つのエンティティとしてみなされる。オプションとして、メインメモリ１０４は、第１のＫＶストア１２０と第２のＫＶストア１２２をアクセスするアプリケーションに関するプログラム命令とデータを記憶する。代替アプリケーション１１８は、第１のＫＶストア１２０と第２のＫＶストア１２２にアクセスするために、ネットワークによってストレージシステム１００に接続された、他のシステムに配置することができる。
【００２３】
二次メモリ１０６（例えば、ディスク）は、第１のＫＶストア１２０、第２のＫＶストア１２２、およびグローバルジャーナル１２４を記憶する。代替的に、第１のＫＶストア１２０、第２のＫＶストア１２２、およびグローバルジャーナル１２４は、異なる第２のメモリに配置することができる。プロセッサ１０２，メインメモリ１０４、および第２のメモリ１０６は、単一のサーバであり得るか、または、プロセッサ１０２とメインメモリ１０４は、ストレージエリアネットワーク（ＳＡＮ）またはネットワークを介してネットワークにアタッチしたストレージ（ＮＡＳ）のような、ストレージシステムである、第２のメモリ１０６をアクセスするサーバであり得る。
【００２４】
図２は、この開示のいくつかの例における構成２００内のトランザクションマネージャ１０８、第１のＫＶ  ＤＢＭＳ１１０、第２のＫＶ  ＤＢＭＳ１１４、およびグローバルジャーナル１２４を図示するブロック図である。構成２００において、アプリケーション１１８は、トランザクションマネージャ１０８に、変更のセット２０２を発行する。あるいは、トランザクションマネージャ１０８は、変更のセット２０２をインターセプト(intercept）することができる。説明のために、セット２０２は、第１のＫＶストア１２０に対する変更と、第２のＫＶストア１２２に対する変更［Ｋ２、Ｖ２］を含む。すべてを保持する必要がある、または全く保持する必要が無い、複数のＫＶストアへの変更のセットをハンドリングする際に、トランザクションマネージャ１０８は、ＫＶストアのトランザクションに参加し、変更を対応するトランザクションに挿入し、変更および対応するトランザクションを記載するサブエントリを有する、結合されたジャーナルエントリを作成し、書き込み、ＫＶストアのトランザクションからデタッチする。システムクラッシュの場合、トランザクションマネージャ１０８は、コミットされなかった任意のサブエントリをリプレイまたはコミットする。
【００２５】
図３は、この開示のいくつかの例における複数のＫＶストア間にコンシステンシーを提供する、システム１００（図１）、特に、構成２００（図２）のトランザクションマネージャ１０８に関する方法３００のフローチャートである。方法３００は、およびここに記載された他の方法は、１つまたは複数のブロックにより説明される、１つまたは複数の動作、機能、または行動を含むことができる。ブロックは、シーケンシャルな順番に説明されるけれども、これらのブロックは、また、並列におよび／またはここに記載した順番とは異なる順番で実行することができる。また、種々のブロックは、より少ないブロックに結合したり、さらなるブロックに分割したり、および／または所望のインプリメンテーションに基づいて消去したりすることが可能である。方法３００は、第１のＫＶストア１２０（図２）に対する変更［Ｋ１、Ｖ１］および第２のＫＶストア１２０に対する変更［Ｋ２、Ｖ２」のセット２０２（図２）を受信するか、またはインターセプトした後、ブロック３０２で開始することができる。
【００２６】
ブロック３０２において、トランザクションマネージャ１０８は、第１のＫＶストア１２０のトランザクション１１２に参加する。トランザクションマネージャ１０８は、既存のトランザクションに参加することができ、あるいは、トランザクションが存在しないなら、コマンドを第１のＫＶＤＢＭＳ１１０に発行して、新しいトランザクション１１２を作成することができる。これに応答して、トランザクションマネージャ１０８は、第１のＫＶ  ＤＢＭＳ１１０からトランザクション１１２のトランザクションＩＤ（Ｔ１）を受信することができ、あるいは、トランザクションＩＤに関して第１のＫＶ  ＤＢＭＳ  １１０にアクティブに問い合わせを行うことができる。ブロック３０２の次にブロック３０４が続く。ブロック３０４において、トランザクションマネージャ１０８は、ブロック３０２に記載したのと同様な方法で第２のＫＶストア１２２のトランザクション１１６に参加する。ブロック３０４の次にブロック３０６が続く。
【００２７】
ブロック３０６において、トランザクションマネージャ１０８は、適切なインサートコマンドを、第１のＫＶ  ＤＢＭＳ１１０に挿入することにより、第１のＫＶストア１２０のトランザクション１１２に変更［Ｋ１、Ｖ１］を挿入する。それに応じて、第１のＫＶ  ＤＢＭＳ１１０は、変更をトランザクション１１２に追加する。いくつかのＫＶ  ＤＢＭＳに関して、トランザクションマネージャ１０８は、１つのステップでブロック３０２と３０６を実行することができる。ブロック３０６の次に、ブロック３０８が続く。
【００２８】
ブロック３０８において、トランザクションマネージャ１０８は、ブロック３０６に記載したのと同様の方法で、第２のＫＶストア１２２のトランザクション１１６に変更［Ｋ２、Ｖ２］を挿入する。いくつかのＫＶ  ＤＢＭＳに関して、トランザクションマネージャ１０８は、１つのステップで、ブロック３０４と３０８を実行することができる。ブロック３０８の次にブロック３１０が続く。
【００２９】
ブロック３１０において、トランザクションマネージャ１０８は、第１のＫＶストア１２０のトランザクションＴ１に挿入された変更［Ｋ１、Ｖ１］と、第２のＫＶストア１２２のトランザクションに挿入された変更［Ｋ２、Ｖ２］を記載する、結合されたジャーナルエントリ２０４を作成する。次に、トランザクションマネージャ１０８は、結合されたジャーナルエントリ２０４をグローバルジャーナル１２４（図２）に書き込む。ブロック３１０の次にブロック３１２が続く。
【００３０】
ブロック３１２において、トランザクションマネージャ１０８は、結合されたジャーナルエントリ２０４の書き込みを待って、グローバルジャーナル１２４で完了する。結合されたジャーナルエントリ２０４の書き込みが完了した後で、トランザクションマネージャ１０８は、適切なデタッチコマンドを、第１のＫＶ  ＤＢＭＳ１１０に発行することにより第１のＫＶストア１２０のトランザクション１１２からデタッチする。これは、適切であるとみなすとき、例えば、トランザクション１１２が十分な変更を累積したとき、第１のＫＶ  ＤＢＭＳ１１０が、トランザクション１１２をコミットすることを可能にする。ブロック３１２の次にブロック３１４が続く。
【００３１】
ブロック３１４では、トランザクションマネージャ１０８は、ブロック３１２に記載したのと同様の方法で第２のＫＶストア１２２のトランザクション１１６からデタッチする。この場合も、これは、適切とみなすとき、例えば、トランザクション１１６が十分な変更を累積したとき、トランザクション１１６をコミットすることを可能にする。
【００３２】
図４は、この開示の例において、システムクラッシュ、またはストレージの故障によりコミットされなかったトランザクションをリカバーするために、システム１００（図１）、特に、構成２００（図２）のトランザクションマネージャ１０８の方法のフローチャートである。方法４００を示すために、最初のＫＶ  ＤＢＭＳ１１０がトランザクション１１２（トランザクションＩＤ=Ｔ１）を最初のＫＶストア１２０にコミットし、２番目のＫＶ  ＤＢＭＳ  １１４がトランザクション１１６（トランザクションＩＤ=Ｔ２）を２番目のＫＶストア１２２にコミットする前に、システム１００がクラッシュすると仮定する。方法４００は、ブロック４０２において開始することができる。
【００３３】
ブロック４０２において、システム１００がリスタートしたことを検出すると、トランザクションマネージャ１０８は、グローバルジャーナル１２４（図２）内の結合されたジャーナルを調べる。ブロック４０２の次にブロック４０４が続く。
【００３４】
ブロック４０４において、トランザクションマネージャ１０８は、対応するＫＶストアにコミットされなかった、結合されたジャーナルエントリ２０４内の任意のサブエントリを決定する。トランザクションマネージャ１０８は、適切なコマンドを、それぞれ第１のＫＶ  ＤＢＭＳ１１０と第２のＫＶ  ＤＢＭＳ１１４に適切な問い合わせコマンドを発行することにより、それぞれ、第１のＫＶストア１２０と第２のＫＶストア１２２に、最後にコミットされたトランザクションのＩＤｓを決定する。各ＫＶストアは、最後にコミットしたトランザクションのＩＤを記録する。
【００３５】
次に、トランザクションマネージャ１０８は、結合されたジャーナルエントリ２０４のサブエントリに記録されたトランザクションに対して最後にコミットしたトランザクションのＩＤｓを比較する。トランザクションマネージャ１０８は、トランザクションＴ１がすでにコミットされているので、第１のＫＶストア１２０に対する変更に関する第１のサブエントリは、関係ないと決定する（すなわち、第１のＫＶストア上のリターンした、最後にコミットした、トランザクションはＴ１またはそれより高次である）。トランザクションマネージャは、トランザクションＴ２がコミットされなかったので、第２のＫＶストア１２０への返納に関する第２のサブエントリは、関係があると決定する（例えば、第２のＫＶストア１２２上のリターンした、最後にコミットした、トランザクションは、Ｔ２未満である）。ブロック４０４の次にブロック４０６が続く。
【００３６】
ブロック４０６において、トランザクションマネージャ１０８は、対応するＫＶストアにコミットされなかった、任意の関連するサブエントリをリプレイし、サブエントリ内の変更を、対応するＫＶストアに再度インサートする。結合されたジャーナルエントリ２０４内の第２のサブエントリは、関連するので、トランザクションマネージャ１０８は、第２のＫＶストア１２２のトランザクションに参加し、変更［Ｋ２、Ｖ２］をトランザクションにインサートし、トランザクションからデタッチすることにより、変更［Ｋ２、Ｖ２］を第２のＫＶストア１２２に、再度インサートする。結合されたジャーナルエントリ２０４は、グローバルジャーナル１２４に維持されるので、新しい結合されたジャーナルエントリは、作られない。
【００３７】
この開示のいくつかの例において、トランザクションマネージャ１０８は、コミットされたトランザクションＩＤｓを有する、すべてのサブエントリを有する、任意の結合されたジャーナルエントリを周期的に削除する。トランザクションマネージャ１０８は、最後にコミットしたトランザクションのＩＤｓをＫＶストアに問い合わせ、それらをすべての結合したジャーナルエントリのサブエントリ内のＩＤｓと比較する。
【００３８】
図５は、この開示のいくつかの例における構成５００において、トランザクションマネージャ１０８、第１のＫＶ  ＤＢＭＳ１１０、第２のＫＶ  ＤＢＭＳ１１４、およびグローバルジャーナル１２４との間の相互作用を説明するブロック図である。構成５００において、トランザクションマネージャ１０８は、アプリケーション１１８と統合される。さもなければ、構成５００は、構成２００と類似の方法で動作する。開示された実施形態の特徴の種々の他の適応と組み合わせは、この発明の範囲内である。多くの実施形態が、以下の特許請求の範囲により包含される。
【図１】
2020536339.tif 000003
【図２】
2020536339.tif 000004
【図３】
2020536339.tif 000005
【図４】
2020536339.tif 000006
【図５】
2020536339.tif 000007
【国際調査報告】
2020536339.tif 000008
2020536339.tif 000009
2020536339.tif 000010