(57)【要約】キーバリュー（ＫＶ）ストアをアプリケーションに提供するための、ＫＶストアデータベースマネージメントシステム（ＤＢＭＳ）のための方法が提供される。この方法は、第１のロウレベルＫＶストアと、トップレベルＫＶストアを提供することを含む。第１のロウレベルＫＶストアは、ルートノードとリーフノードを含む。トップレベルＫＶストアは、前記第１のロウレベルＫＶストアを指示するリーフノードを含む。トップレベルＫＶストア内のリーフノードは、第１のロウレベルＫＶストアに最小キーと、前記第１のロウレベルＫＶストアのルートノードへのポインタを含む。この方法はさらに、前記ＫＶストアへのキーバリュー挿入が、上限しきい値を超えるロウレベルＫＶストア内のキー数を増加させることを判断し、前記判断に応じて、第２のロウレベルＫＶストアを作る。方法はさらに、第１のロウレベルストアと第２のロウレベルストア内のキーの合計数が、キーバリュー削除からの下限しきい値未満であるかどうか判断し、前記第１のロウレベルストアと、前記第２のロウレベルストアの合計キー数が、前記下限しきい値未満であると、前記第１および第２のロウレベルストアをマージする。【選択図】図５
2020536341.tif 000002
【特許請求の範囲】
【請求項１】
キーバリュー（ＫＶ）ストアを、アプリケーションに提供するためのＫＶストアデータベースマネージメントシステムのための方法において、
第１のロウレベルストアについての、第１の情報を備えるトップレベルストアを提供するステップであって、前記第１の情報は、第１のロウレベルストアの最小キーと、ロケーションを含む、ステップと、
キーバリューペアを、前記ＫＶストアに挿入するための要求を、受信するステップと、
前記第１の情報に基づいて、前記キーバリューペアを、前記第１のロウレベルストアに挿入するステップと、
前記キーバリューペアを、前記第１のロウレベルストアに挿入した後で、前記第１のロウレベルストアのキー数が、上限しきい値を超えたかどうか判断するステップと、
前記第１のロウレベルストアのキー数が、上限しきい値を超えると、
第２のロウレベルストアを作るステップと、
前記トップレベルストアに、前記第２のロウレベルストアについての第２の情報を記憶するステップであって、前記第２の情報は、前記第２のロウレベルストアの最小キーと、ロケーションを含む、ステップと、
を備えた方法。
【請求項２】
前記第１のロウレベルストアのキー数が、前記上限しきい値を超えると、前記第１のロウレベルストア内の、前記キーバリューペアの約半分を、前記第２のロウレベルストアに移動するステップをさらに備えた、請求項１に記載の方法。
【請求項３】
新しいキーバリューペアを、前記第２のロウレベルストア内の前記ＫＶストアに挿入する要求を受信するステップであって、前記新しいキーバリューペアは、単調に増加するキーを備える、ステップと、
前記新しいキーバリューペアを、前記第２のロウレベルストアに記憶するステップと、
をさらに備える請求項１に記載の方法。
【請求項４】
前記第１のロウレベルストアと、記第２のロウレベルストア内の合計キー数が、キーバリュー削除からの下限しきい値未満であるかどうかを判断するステップと、
前記第１のロウレベルストアと、前記第２のロウレベルストアのキーの合計数が、前記下限しきい値未満であるとき、前記第１と第２のロウレベルストアを、マージするステップと、
をさらに備えた、請求項１に記載の方法。
【請求項５】
前記マージは、前記第２のロウレベルストアからのキーバリューペアを、前記第１のロウレベルストアに移動し、前記第２の情報を削除するステップを備える、請求項４に記載の方法。
【請求項６】
前記トップレベルストアの第１のリーフノードは、前記第１及び第２の情報を含む、請求項１に記載の方法。
【請求項７】
前記トップレベルストアの第１のリーフノードは、前記第１の情報を含み、
前記トップレベルストアの第２のリーフノートは、前記第２の情報を含み、
前記方法は、前記トップレベルストアの、前記第１および第２のリーフノードに関するペアレントノードを作ることをさらに備える、請求項１に記載の方法。
【請求項８】
第１のロウレベルＫＶストアと、
前記第１のロウレベルストアについての、第１の情報を備えるトップレベルＫＶストアであって、前記第１の情報は、前記第１のロウレベルストアの最小キーと、ロケーションを含むトップレベルＫＶストアと、
を備えるＫＶストアと、
キーバリューペアを、前記ＫＶストアに挿入する要求を受信し、
前記第１の情報に基づいて、前記キーバリューペアを、前記第１のロウレベルストアに挿入し、
前記第１のロウレベルストアのキー数が、上限しきい値を超えると、新しい第２のロウレベルストアを作り、
前記トップレベルストアに、前記第２のロウレベルストアについての、第２の情報を記憶することであって、前記第２の情報は、前記第２のロウレベルストアの、最小キーと、ロケーションを含む、第２の情報を記憶する、
ように構成されたＫＶストアデータベースマネージメントシステム（ＤＢＭＳ）と、
を備えた、データベースシステム。
【請求項９】
前記ＫＶストアＤＢＭＳは、前記第１のロウレベルストアのキー数が、前記上限しきい値を超えると、前記前記第１のロウレベルストアの、前記キーバリューペアの約半数を、前記第２のロウレベルストアに、移動するようにさらに構成される、請求項８に記載のシステム。
【請求項１０】
前記ＫＶストアＤＢＭＳはさらに、
新しいキーバリューペアを、前記第２のロウレベルストア内の、前記ＫＶストアに挿入する要求を受信することであって、前記新しいキーバリューペアは、単調に増加するキーを備える、受信することと、
前記新しいキーバリューペアを、前記第２のロウレベルストアに記憶することと、
を実行するようにさらに構成される、請求項８に記載のシステム。
【請求項１１】
前記ＫＶストアＤＢＭＳは、前記第１のロウレベルストアと、前記第２のロウレベルストア内のキーの合計数が、キーバリュー削除からの下限しきい値未満であるかどうか判断し、
前記第１のロウレベルストアと、前記第２のロウレベルストア内のキーの前記合計数が、前記下限しきい値未満であるとき、前記第１と第２のロウレベルストアをマージする、
ようにさらに構成される、請求項８に記載のシステム。
【請求項１２】
前記マージは、前記第２のロウレベルストアからのキーバリューペアを、前記第１のロウレベルストアに移動し、前記第２の情報を削除することを備える、請求項１１に記載のシステム。
【請求項１３】
前記トップレベルストアの、第１のリーフノードは、前記第１および第２の情報を含む、請求項８に記載のシステム。
【請求項１４】
前記トップレベルストアの、第１のリーフノードは、前記第１の情報を記憶し、
前記トップレベルストアの、第２のリーフノードは、前記第２の情報を記憶し、
前記方法はさらに、前記トップレベルストアの、前記第１および第２のリーフノードのための、ペアレントノードを作ることを備えた、請求項８に記載のシステム。
【請求項１５】
キーバリュー（ＫＶ）ストアを、アプリケーションに提供するためのＫＶストアデータベースマネージメントシステム（ＤＢＭＳ）をインプリメントするように、プロセッサにより実行可能な命令で符号化されたコンピュータ可読記憶媒体において、前記方法は、
第１のロウレベルストアについての、第１の情報を備えたトップレベルストアを提供することであって、前記第１の情報は、前記第１のロウレベルストアの最小キーと、ロケーションを含む、トップレベルストアを提供することと、
キーバリューペアを、前記ＫＶストアに挿入する要求を受信することと、
前記第１の情報に基づいて、前記キーバリューペアを、前記第１のロウレベルストアに挿入することと、
前記キーバリューペアを、前記第１のロウレベルストアに挿入した後で、前記第１のロウレベルストアのキー数が、上限しきい値を超えたかどうかを判断することと、
前記第１のロウレベルストアのキー数が上限しきい値を超えると、
第２のロウレベルストアを作ることと、
前記トップレベルストアに、前記第２のロウレベルストアについての、第２の情報を記憶することであって、前記第２の情報は、前記第２のロウレベルストアの最小キーと、ロケーションを含む、
非一時的コンピュータ可読記憶媒体。
【請求項１６】
前記命令はさらに、前記第１のロウレベルストアのキー数が、前記上限しきい値を超えると、前記第１のロウレベルストア内の、前記キーバリューペアの、約半数を前記第２のロウレベルストアに移動することをさらに備えた、請求項１５に記載の非一時的コンピュータ可読記憶媒体。
【請求項１７】
前記命令はさらに、
新しいキーバリューペアを、前記第２のロウレベルストア内の前記ＫＶストアに、挿入する要求を受信することであって、前記新しいキーバリューペアは、単調に増加するキーを備える、受信することと、
前記新しいキーバリューペアを、前記第２のロウレベルストアに記憶することと、
をさらに備えた請求項１５に記載の非一時的可読記憶媒体。
【請求項１８】
前記命令はさらに、
前記第１のロウレベルストアを、前記第２のロウレベルストア内のキーの合計数が、キーバリュー削除からの還元しきい値未満であるかどうかを判断することと、
前記第１のロウレベルストアと、前記第２のロウレベルストア内のキーの合計数が前記下限しきい値未満であるとき、前記第１および第２のロウレベルストアをマージすることと、
を備えた、請求項１５に記載の非一時的コンピュータ可読記憶媒体。
【請求項１９】
前記トップレベルストアの第１のリーフノードは、前記第１及び第２の情報を含む、請求項１５に記載の非一時的コンピュータ可読記憶媒体。
【請求項２０】
前記トップレベルストアの第１のリーフノードは、前記第１の情報を含み、
前記トップレベルストアの第２のリーフノードは、前記第２の情報を含み、
前記方法は、前記トップレベルストアの、前記第１のノードと、前記第２のノードのためのペアレントノードをさらに備えた、請求項１５に記載の非一時的コンピュータ可読記憶媒体。
【発明の詳細な説明】
【技術分野】
【０００１】
この発明は、キーバリューストアに関し、特に複数のトランザクションを単一のキーバリューストアに維持することに関する。
【背景技術】
【０００２】
キーバリューストア（ＫＶ）は、単一のデータベースとして見ることができる。表およびカラムにデータを配列する構造化紹介言語（ＳＱＬ）データベースとは異なり、ＫＶストアは、単なるキーバリューペアの集合である。キーは、任意の、例えば、整数またはストリングであり得る。唯一の要件は、ＫＶストアが任意の２つのキーをどのように比較するかを知っていることである。バリューは、また、任意であり得、ＫＶストアは、それをバイナリ・ラージ・オブジェクト（ＢＬＯＢ）として取り扱う。唯一の要件は、ＫＶストアがバリューのサイズを知っているので、それをディスクに記憶することができることである。
【０００３】
典型的に、ＫＶストアは、トランザクションによって動作する。新しいトランザクションは、新しいアプリケーションが、ＫＶストアに対して何らかの変更、例えば、新しいキーを挿入したいとき開かれる。後で、このトランザクションのために更なる変更を行うことができる。ある時点で、ＫＶストアは、実行中のトランザクションが十分な変更を累積したことを判断する。次に、ＫＶストアは、実行中のトランザクションをコミットし、そのためにすべての変更がディスク上に保持（persist）される。これで、新しいトランザクションを開くことができる。各トランザクションは、或る種のトランザクションＩＤ、例えば、単調に増加する整数を有する。
【０００４】
トランザクションに参加しているアプリケーションスレッドが依然としてあるとき、トランザクションは、コミットすることができない。すべてのアプリケーションがトランザクションからデタッチされると、コミットを開始することができる。典型的に、アプリケーションスレッドは、非常に短い時間トランザクションにアタッチされ、ＫＶストアに対するメモリ内変更のみを実行する。
【０００５】
ＫＶストアは、Ｂツリー（例えば、Ｂ＋ツリー）としてインプリメントすることができる。Ｂツリーは、いくつかのレベルで階層化されたツリーブロックで構成されている。ツリーブロックは、リーフノードとインデックスノードを含む。リーフノードは、ＫＶストアが管理するキーとバリューを含む。インデックスノードは、他のインデックスノードまたはリーフノードであり得る、より低いレベルのツリーブロックへのポインタを含む。
【０００６】
Ｂツリーに記憶されたすべてのキーバリューペアは、典型的に昇べきの順に記憶される。これは、ツリーの「左」部分のインデックスノードとリーフノードは、ツリーの「右」部分のインデックスノードとリーフノードよりも低いキーを保持することを意味する。リーフノード内では、キーバリューペアは、またキーによりソートされる。インデックスノードは、キーでソートされた子ポインタも有する。
【０００７】
Ｂツリー内のキーバリューペアのサーチは、ルートノードからスタートし、関連するインデックスノードをたどって、最終的に、必要なキーとバリューが配置されている可能性がある、関連するリーフノードに到達する。各ツリーブロックは、ディスク上に配置されているので、より低いレベルへ「ジャンプ」する度に、関連するツリーブロックをディスクから読む必要がある。
【０００８】
Ｂツリーは、典型的に、レベルが非常に少ないので、非常に広い、すなわち、各インデックスノードは、多数の子ブロックを有する。その結果、キーの検索は、非常に少数のツリーブロックを横断するため、キーを見つけるために必要なディスク読み取りの量は、非常に少なくなる。ツリーブロックのサイズは、典型的に数キロバイト（ＫＢｓ）、例えば、４ＫＢ、１６ＫＢ、３２ＫＢである。
【発明の概要】
【０００９】
この開示の１つまたは複数の例では、ＫＶストアは、いくつかのロウレベルストア（ここでは、「サブＫＶストア」）、およびトップレベルストア（以下、「サブＫＶストアのルート」）として構築される。各サブＫＶストアは、特定のレンジのキーを担当する。
【００１０】
各サブＫＶストアは、独自の実行中のトランザクションを有する。サブＫＶストアのルートも、独自の実行中のトランザクションを有する。サブＫＶストアのルートは、サブＫＶストアのスーパーブロックを追跡する。サブＫＶストアのスーパーブロックは、ディスク上のサブＫＶストアのコンテンツを配置し、構文解析し、正当化するための情報、例えば、ディスク上のサブＫＶストアのコンテンツの座標、コンテンツの長さ、コンテンツのチェックサム、およびサブＫＶストアのトランザクションＩＤを保持する。
【００１１】
ＫＶストアにおいて、変更は、サブＫＶストアに対して累積される。サブＫＶストアは、十分な変更が蓄積されたときに変更をコミットするかどうかを個別に決定するため、ＫＶストア全体で変更がパーシストされることによる書き込みの増幅やその他のオーバーヘッドを回避することができる。
【００１２】
アプリケーションの観点から、唯１つのＫＶストアがある。アプリケーションは、サブＫＶストアによりハンドリングされる、より小さなレンジへのキーレンジの内的分離に気が付かない。この開示の１つまたは複数の例において、サブＫＶストアは、キーバリューペアがＫＶストアに挿入されるか、または除去されると、動的に作成されおよび削除される。キーバリューの挿入によって、上限しきい値を超えるキー数が、サブＫＶストアにより維持されると、サブＫＶストアは、キーのほぼ半分を有する２つのサブＫＶストアに分割される。キーバリューの削除により、隣接するサブＫＶストアにより維持されるキーの合計数が、下限しきい値を下回るとき、隣接サブＫＶストアは、１つのサブＫＶストアにマージされる。いくつかの例において、隣接サブＫＶストアは、１つのサブＫＶストアからキーバリューペアを取り、それを他のサブＫＶストアにマージし、空のサブＫＶストアを削除することにより、マージされる。
【図面の簡単な説明】
【００１３】
【図１】この開示のいくつかの例におけるストレージシステムである。
【図２】この開示の例において、ＫＶストアをアプリケーション１１８に提供するために、図１のキーバリュー（ＫＶ）データベースマネージメントシステム（ＤＢＭＳ）に関する方法のフローチャートである。
【図３】この開示の例におけるサブＫＶストアに関するダイナミックキーレンジをインプリメントする図１のＫＶ  ＤＢＭＳを示す。
【図４】この開示の例におけるサブＫＶストアに関するダイナミックキーレンジをインプリメントする図１のＫＶ  ＤＢＭＳを示す。
【図５】この開示の例におけるサブＫＶストアに関するダイナミックキーレンジをインプリメントする図１のＫＶ  ＤＢＭＳを示す。
【図６】この開示の例におけるサブＫＶストアに関するダイナミックキーレンジをインプリメントする図１のＫＶ  ＤＢＭＳを示す。
【図７】この開示の例において、サブＫＶストアを動的に作成し、削除するための図１のＫＶ  ＤＢＭＳの方法のフローチャートである。
【図８】この開示の例において、図７の方法を示す。
【図９】この開示の例において、図７の方法を示す。
【図１０】この開示の例において、図７の方法を示す。
【図１１】この開示の例において、図７の方法を示す。
【図１２】この開示の例において、図７の方法を示す。
【図１３】この開示の例において、図７の方法を示す。
【図１４】この開示の他の例における、図７の方法を示す。
【図１５】この開示の他の例における、図７の方法を示す。
【図１６】この開示の他の例における、図７の方法を示す
【発明を実施するための形態】
【００１４】
異なる図面における同じ参照符号の使用は、類似または同一のエレメントを示す。Ｘランダムキーが、ＫＶストア内の新しいバリューで更新されると仮定すると、リーフノードＡは、キーバリューペアの多くが更新されるが、リーフノードＢは、キーバリューペアの１つのみが更新されるということが起こり得る。さらに、ＫＶストアは、実行中のトランザクションをコミットするように判断すると仮定する。このトランザクションコミットの一部として、すべての変更されたツリーブロック（リーフノードとインデックスノードの両方）は、ディスクに書き込む必要がある。したがって、リーフノードＡとリーフノードＢの両方は、コンテンツが変更されたので、ディスクに書き込まれる。しかしながら、リーフノードＢをディスクに書き込むことは、非効率である。なぜならば、たった１つのキーバリューが変更されてもリーフ全体をディスクに書き込まなければならないからである。リーフノードＡの書き込みは効率的である。なぜならば、変更されないキーバリューよりも変更されたキーバリューの方が多いからである。
【００１５】
アプリケーションにより変更される数十億のキーバリューペアを保持する大きなＫＶストアを考える。トランザクションコミットは、多数の変更されたリーフノードをディスクへ書き込む必要があるが、各変更されたリーフノードは、多くは、変更されていないということが起こり得る。残念なことに、トランザクションコミットの一部として大量のストリームのディスクへの書き込みが起こり得るという結果になる。ＫＶストアの一部、すなわち、「十分な」コミットを累積した部分のみをコミットすることができることが望ましい。上述した方法では、これは、可能ではない。何故ならば、トランザクションは、特定のツリーブロックにおける変更の量に関係なく、すべての変更されたツリーブロックを、ディスクにパーシスト（persist）しなければならないからである。
【００１６】
この開示の１つまたは複数において、ＫＶストアは、いくつかのロウレベルＫＶストア（以下、「サブＫＶストア」）およびトップレベルＫＶストア（以下、「サブＫＶストアのルート」）として構造化される。各サブＫＶストアは、特定のレンジのキーおよびその独自の実行中のトランザクションを担当する。例えば、左端のＫＶストアは、０乃至９９９９を担当し、次のサブＫＶストアは、１００００乃至１９９９９を担当する等々である。キーレンジの、より小さなレンジへの、そのような分離は、「シャーディング（sharding）」と呼ばれ、各サブレンジと対応するサブＫＶストアは、「シャード（shard）」と呼ばれる。
【００１７】
サブＫＶストアのルートは、独自の実行中のトランザクションを有する。サブＫＶストアのルートは、各サブＫＶストアについて以下の情報（スーパーブロック）を追跡する。
１）サブＫＶストアの最小キー。これはサブＫＶストアが担当するキーのレンジを定義することである。
２）このサブＫＶストアに関して最後にコミットしたトランザクション。
３）ディスク上のサブＫＶストアのルートブロックのロケーション。
【００１８】
スーパーブロックは、サブＫＶストアのルートブロックのチェックサムのような、特定のインプリメンテーションにより必要とされる追加の情報を含むことができる。図１は、この開示のいくつかの例におけるデータベースシステム１０２である。システム１００は、プロセッサ１０２、メイン（非パーシステント）メモリ１０４、および二次（パーシステント）メモリ１０６を含む。
【００１９】
メインメモリ１０４（例えば、ランダムアクセスメモリ）は、二次メモリ１０６に記憶されたＫＶストア１１０を管理するＫＶデータベースマネージメントシステム（ＤＢＭＳ）１０８のためのプログラム命令とデータを記憶する。ＫＶストア１１０は、サブＫＶストア１１２のルートと、サブＫＶストア１１４−０、１１４−１・・・１０４−ｉ（集合的に、「サブＫＶストア１１４」または一般的に個別「サブＫＶストア１１４」）のような多数のサブＫＶストアを包含する。サブＫＶストア１１２とサブＫＶストア１１４のルートは、Ｂツリー、レッド・ブラックツリー、ＡＶＬツリー、またはスキップリスト構造であり得る。さらに、サブＫＶストア１１４は、リンクリストまたはシンプルソートアレイ（simple sorted array）であり得る。ＫＶ  ＤＢＭＳ１０８は、サブＫＶストア１１２およびサブＫＶストア１１４のルートに関して実行中のトランザクションを追跡する。「ＫＶ  ＤＢＭＳ」と「ＫＶストア」は、互換的に使用され、しばしば一緒にして１つのエンティティとしてみなされる。オプションとして、メインメモリ１０４は、ＫＶストア１１０をアクセスするアプリケーション１１８のためのプログラム命令とデータを記憶する。あるいは、アプリケーション１１８は、ＫＶストア１１０にアクセスするための、ネットワークによってストレージシステム１００に接続された別のシステムに配置することができる。
【００２０】
二次メモリ１０６（例えば、ディスク）は、サブＫＶストア１１２およびサブＫＶストア１１４のルートを形成するデータを含む、ＫＶストア１１０を形成するデータを記憶する。あるいは、サブＫＶストア１１２とサブＫＶストア１１４のルートを形成するデータは、異なる二次メモリに配置することができる。プロセッサ１０２、メインメモリ１０４、および二次メモリ１０６は、シングルサーバまたはプロセッサ１０３であり得、メインメモリ１０４は、ストレージエリアネットワーク（ＳＡＮ）、またはネットワークアッタチストレージ（ＮＡＳ）のようなストレージシステムである、二次メモリ１０６にネットワークを介してアクセスするサーバであり得る。
【００２１】
図２は、この開示の例におけるアプリケーション１１８（図１）にＫＶストア１１０（図１）を提供するための、ＫＶ  ＤＢＭＳ１０８（図１）のための方法のフローチャートである。ここに記載した方法２００および他の方法は、１つまたは複数のブロックにより説明される、１つまたは複数の動作、機能、またはアクションを含むことができる。ブロックは、シーケンシャルな順番に説明されているけれども、これらのブロックは、また、並列に実行することができ、および／またはここに記載した順番とは異なる順番で実行することができる。また、種々のブロックは、より少ない数のブロックに結合することができ、さらなるブロックに分割したり、および／または所望のインプリメンテーションに基づいて削除したりすることができる。方法２００は、ブロック２０２で開始することができる。
【００２２】
ブロック２０２において、ＫＶ  ＤＢＭＳ１０８は、サブストア１１２（図１）のルート、およびＫＶストア１１０を形成する、１つ又は複数のサブＫＶストア１１４（図１）を提供する。ＫＶ  ＤＢＭＳ１０８は、異なる実行中のトランザクション１１６（図１）を各ストアに割り当てる。各サブＫＶストア１１４は、特定のキーレンジを担当する。各サブキーストア１１４は、多数のキーバリューペアを格納する。例えば、各サブＫＶストア１１４は、各々がキーバリューペアを格納する、１つまたは複数のリーフノードを有するＢ＋ツリーであり得る。キーバリューペア内のバリューは、実際のデータまたは実際のデータに対するポインタであり得る。
【００２３】
サブＫＶストア１１２のルートは、サブＫＶストア１１４のスーパーブロックを追跡する。例えば、サブＫＶストア１１２のルートは、ゼロまたは複数のインデックスノードおよび１つまたは複数のリーフノードであって各リーフノードは、異なるサブＫＶストアについての情報（スーパーブロック）を記憶するリーフノードを有するＢ＋ツリーであり得る。この情報は、サブＫＶストア１１４の最小キー、サブＫＶストアのための最後にコミットされたトランザクション（ジャーナルを用いたリカバリに使用される）、およびサブＫＶスコアに対するポインタ（例えば、二次メモリ１０６内のサブＫＶストアのルートノード／ブロックに対するロケーション）を含む。ブロック２０２の次にブロック２０６が続く。
【００２４】
ブロック２０４において、ＫＶ  ＤＢＭＳ１０８は、任意のサブＫＶストア１１４が十分な変更（例えば、所定数の書き込み）を累積したかどうかを判断する。そうであるなら、ブロック２０４の次にブロック２０６に進むことができる。そうでなければ、ブロック２０４の次に、ブロック２１０に進むことができる。
【００２５】
ブロック２０６において、ＫＶ  ＤＢＭＳ１０８は、十分な変更を累積した特定のサブＫＶストア１１４の実行中のトランザクションをコミットする。ＫＶ  ＤＢＭＳ１０８は、実行中のトランザクションの期間に、このサブＫＶストア１１４になされた変更を、二次メモリにパーシストして、サブＫＶストアの最後にコミットされたトランザクションを更新することにより、実行中のトランザクションをコミットする。上述したように、サブＫＶストアの最後にコミットしたトランザクションは、二次メモリ１０６上のサブＫＶストア１１２のルート（例えば、サブＫＶストア１１２のルートのリーフノード）により維持される、対応するスーパーブロックに記憶される。ブロック２０６の次に、ブロック２０８に進む。
【００２６】
ブロック２０８において、ＫＶ  ＤＢＭＳ１０８は、この特定のサブＫＶストア１１４に関する新しいトランザクションを開く。ブロック２０６と２０８は、十分な変更を累積した各サブＫＶストアに関して反復することができる。ブロック２０８の次にブロック２１０に進むことができる。ブロック２１０において、ＫＶ  ＤＢＭＳ１０８は、サブＫＶストア１１２のルートが十分な変更を累積したかどうかを判断する。そうであるなら、ブロック２１０の次に、ブロック２１２に進む。そうでなければ、ブロック２１０は、ブロック２０４にループバックする。
【００２７】
ブロック２１２において、ＫＶ  ＤＢＭＳ１０８は、サブＫＶストア１１２のルートの実行中のトランザクションをコミットする。ＫＶ  ＤＢＭＳ１０８は、二次メモリに対する実行中のトランザクションの期間にサブＫＶストア１１２のルートに対してなされた変更を永続化し、サブＫＶストアのルートのスーパーブロック内の最後にコミットされたトランザクションを、サブＫＶストアのルートの実行中のトランザクションで更新することにより実行中のトランザクションをコミットする。サブＫＶストア１１２のルートのスーパーブロックは、最後にコミットされたトランザクションを含み、典型的に、二次メモリ１０６上の固定されたロケーションに記憶された、サブＫＶストアのルートの構文解析と検証を可能にする情報を保持する。ブロック２１２の次に、ブロック２１４に進む。
【００２８】
ブロック２１４において、ＫＶ  ＤＢＭＳ１０８は、サブＫＶストア１１２のルートに関する新しいトランザクションを開く。ブロック２１４は、ブロック２０４に戻り、十分な変更を累積した任意のストアの実行中のトランザクションをコミットし続ける。以下の例は方法２００を示す。サブＫＶストア１１４−０（図１）は、［０、９９９９］のキーレンジを担当し、実行中のトランザクションＴ０を有し、サブＫＶストア１１４−１（図１）は、レンジ［１００００、１９９９９］のキーレンジを担当し、実行中のトランザクションＴ１を有する。アプリケーション１１８（図１）は、レンジ［０、９９９９］内の１０００キーと、レンジ［１００００、１９９９９］内の１０キーを変更する。この時点において、ＫＶ  ＤＢＭＳ１０８（図１）は、サブＫＶストア１１４−０が、実行中のトランザクションＴ０に関して十分な変更を累積したと決定する。ＫＶ  ＤＢＭＳ１０８は、実行中のトランザクションＴ０をコミットし、サブＫＶストア１１４−０内の変更されたブロックを二次メモリ１０６（図１）に書き込む。ＫＶ  ＤＢＭＳ１０８は、サブＫＶストア１１２（図１）のルートを、最後にコミットしたトランザクションのようなサブＫＶストア１１４−０についての新しい情報で更新する。しかしながら、ＫＶ  ＤＢＭＳ１０８は、サブＫＶストア１１４−１の実行中のトランザクションＴ１を長時間開いたままにすることができる。このようにして、本開示の例は、さもなければ少量の変更を運ぶサブＫＶストア１１４−１書き込みノードから生じる可能性がある、潜在的な書き込み増幅（write amplification）を回避する。
【００２９】
サブＫＶストア１１４は、静的キー範囲を有することができ、各サブＫＶストア１１４には、全キー範囲の一部が割り当てられる。典型的にキーレンジは非常に大きい。たとえば、キーが４８ビットの符号無し整数の場合、キーの範囲は［０、２８１４７４９７６７１０６５５]になる。キー範囲全体が統計的にシャーディング（sharding）され、各シャード（shard）が１００００キーに制限されている場合、ＫＶストアは、最終的に２８０億を超えるシャードになる。一方ＫＶストアが常に管理すると予想される、キーと値のペアの最大数は、通常、キー範囲全体のキーの数よりもはるかに少なくなる。例えば、ＫＶストアは、最大１６０億キーを管理することが期待され得る。このような状況で、全キー範囲に対して２８億の静的シャードを作成することは、ほとんどのサブＫＶストアが空になるため、実用的ではない。
【００３０】
この開示の例において、ＫＶ  ＤＢＭＳ１０８は、キーバリューペアが挿入され、除去されるので、サブＫＶストアを動的に作成し削除する。ＫＶ  ＤＢＭＳ１０８は、ある制限内にある、各サブＫＶストアのキーの量を維持する。ＫＶ  ＤＢＭＳ１０８は、サブＫＶストアを作成および削除して、これらの制限を遵守し、シャードの総数を制御する。
【００３１】
図３乃至６は、この開示の例において、サブＫＶストア１１４（図１）に関する動的キーレンジをインプリメントするＫＶ  ＤＢＭＳ１０８（図１）を示す。図３では、ＫＶストア１１０が空であるとき、ＫＶ ＤＢＭＳ１０８は、 キーの範囲全体[０、ＭＡＸ＿ＫＥＹ]を担当し、それゆえ、０の最小のキーを有する、空のサブＫＶストア１１４−０（例えば、リーフノード３０２を指すリーフ）につながる情報（スーパーブロック）を有する、サブＫＶストア１１２のルートを作成する。
【００３２】
図４において、サブＫＶストア１１４−０は、上限しきい値に到達するので、ＫＶ  ＤＢＭＳ１０８は、サブＫＶストア１１４−０を２つのサブＫＶストア（既存のサブＫＶストア１１４−０と新しいサブＫＶストア１１４−１）に分割し、各サブＫＶストアは、サブＫＶストアにもともとあったキーの約半分のキーを有する。したがって、サブＫＶストア１１４−０は、ある範囲のキー［０、X］を担当し、最小キーは０であり、サブＫＶストア１１４−１は、ある範囲のキー［Ｘ＋１、ＭＡＸ＿ＫＥＹ］を担当し、Ｘ＋１1の最小キーを有する。サブＫＶストア１１２のルートがＢ＋ツリーとしてインプリメントされると、１つのリーフノード３０２は、サブＫＶストア１１４−０と１１４−１の両方に導く情報（スーパブロック）を有することができるか、あるいは、各々が、２つのサブＫＶストアの１つに導く情報（スーパブロック）を有することができる。言い換えれば、Ｂ＋ツリー内のリーフは、いくつかのスーパーブロックについての情報を保持することができる。
【００３３】
図５において、より多くのキーバリューの挿入は、さらなるサブＫＶストア１１４を分割させる。たとえば、サブＫＶストア１１４−１は、２つのサブＫＶストアに分割され、各々は、サブＫＶストア１１４−１にもともとあったキーの約半分のキーを有する。サブＫＶストア１１４−１は、ある範囲のキー［Ｘ＋１乃至Ｙ］を担当することになるが、Ｘ＋１の最小キーを継続して有する。新しいサブＫＶストアが作成されると、ＫＶ  ＤＢＭＳ１０８は、サブＫＶストア１１２のルート内のスーパーブロックを更新する。
【００３４】
キーバリューを削除することにより、サブＫＶストア１１４は、低減された数のキーを有することができる。図６において、サブＫＶストアと、その隣接するサブＫＶストア（右または左）のキーの合計数が下限しきい値未満（例えば、サブＫＶストア１１４−０と１１４−１）であり、ＫＶ  ＤＢＭＳ１０８は、一方のサブＫＶストア（例えば、右サブＫＶストア１１４−１）のキーバリューペアを取ることにより、２つのサブＫＶストアをマージし、他方のサブＫＶストア（例えば、左のサブＫＶストア１１４−１）へ、それらをマージすると仮定する。サブＫＶストア１１４−０は、ある範囲のキー［０乃至Ｙ］を担当するが、最小キーは引き続き０である。コンスタントな分割とマージにより、ＫＶ  ＤＢＭＳ１０８は、サブＫＶストア１１４の数が、所定のキー範囲に対して定義された値を超えないようにする。ＫＶストア１１０のキーと値のペアの、予想最大数に基づいて、シャードの最大数は、ユーザーが手動で、またはＫＶ ＤＢＭＳ１０８が自動的にターゲットにすることができる。シャードの数がシャードのターゲット最大数に近づくと、ＫＶ  ＤＢＭＳ１０８は、ターゲット数をオーバシュートしないようにシャードを、より積極的にマージすることができる。例えば、ＫＶ  ＤＢＭＳ１０８は、より低いしきい値を上げて、より早くシャードをマージすることができる。
【００３５】
図７は、この開示の例において、サブＫＶストア１１４（図１）を作成し、削除するためのＫＶ  ＤＢＭＳ１０８（図１）に関する方法７００のフローチャートである。方法７００は、ブロック７０２で開始する。ブロック７０２において、ＫＶ  ＤＢＭＳ１０８は、サブＫＶストア１１２（図１）のルートとサブＫＶストア（例えば、図１のサブＫＶストア１１４−０）を提供する。サブＫＶストア１１２のルートは、サブＫＶストア１１４−０に導く情報（例えば、リーフノードに記憶されたスーパーブロック）を有する。情報（スーパーブロック）は、サブＫＶストア１１４−０の最小キー、サブＫＶストアに関する最後にコミットされたトランザクション、およびサブＫＶストアへのポインタ（例えば、二次メモリ１０６内のサブＫＶストアのルートノード／ブロック）を含む。サブＫＶストア１１４−０は、初めに全レンジのキー［０、ＭＡＸ＿ＫＥＹ］を担当し、０の最小キーを有する。ブロック７０２の次にブロック７０４に進む。
【００３６】
ブロック７０４において、ＫＶ  ＤＢＭＳ１０８は、キーバリューペアをＫＶストア１１０（図１）に挿入するための要求を受信する。ブロック７０４の次に、ブロック７０６に進む。ブロック７０６において、サブＫＶストア（複数の場合もある）１１４についての情報に基づいて、ＫＶ  ＤＢＭＳ１０８は、キーバリューペアを、キーバリューペア内のキーを含む、ある範囲のキーに割り当てられたサブＫＶストア１１４に挿入する。例えば、ＫＶ  ＤＢＭＳ１０８は、サブＫＶストア１１２のルート内の各サブＫＶストア１１４に関する情報（例えば、スーパーブロック）を維持し、各スーパーブロックは、サブＫＶストアの最小数、およびサブＫＶストアへのポインタを記憶する。サブＫＶストア１１２のルートが、Ｂ＋ツリーとしてインプリメントされると、ＫＶ  ＤＢＭＳ１０８は、サブＫＶストアのルートのリーフノードにスーパーブロックを記憶し、サブＫＶストアのルートにツリーブロックを作成し、各サブＫＶストア１１４のスーパーブロックを追跡する。サブＫＶストア１１２のルートをトラバースすることにより、ＫＶ  ＤＢＭＳ１０８は、適切なサブＫＶストア１１４を見つけて、キーバリューペアを挿入する。ブロック７０６の次に、ブロック７０８に進む。
【００３７】
ブロック７０８において、ＫＶ  ＤＢＭＳ１０８は、キーバリュー挿入を受信したサブＫＶストア１１４内のキーの数が、上限しきい値より大きいかどうかを判断する。そうであるなら、ブロック７０８の次にブロック７１０に進む。そうでなければ、ブロック７０８の次にブロック７１６に進む。ブロック７１０においてＫＶ  ＤＢＭＳ１０８は、新しいサブＫＶストア１１４を作成する。ブロック７１０の次に、ブロック７１２に進む。オプションのブロック７１２において、ＫＶ  ＤＢＭＳ１０８は、約半分のキーバリューペアを、新しいサブＫＶストア１１４に移動することにより、上限しきい値を超えるサブＫＶストア１１４を分割する。オプションのブロック７１２は、キーが単調に増加するとき、および新しいキーバリューペアが、新しく作られたサブＫＶストア１１４に挿入されるときは、使用されない。オプションのブロック７１２の次にブロック７１４が続く。
【００３８】
ブロック７１４において、ＫＶ  ＤＢＭＳ１０８は、サブＫＶストア１１２のルートに、新しいサブＫＶストア１１４についての情報を記憶する。例えば、サブＫＶストア１１２のルートが、Ｂ＋ツリーとしてインプリメントされると、ＫＶ  ＤＢＭＳ１０８は、サブＫＶストアのルートにリーフノードを作り、新しいサブＫＶストア１１４の最小キー、新しいサブＫＶストアに関する最後にコミットされたトランザクション、および新しいサブＫＶストアへのポインタを記憶する。サブＫＶストア１１４が分割されると、新しいサブＫＶストア１１４のための最小キーは、新しいサブＫＶストアの第１のキーとなる。キーを単調に増加すると、新しいサブＫＶストア１１４に関する最小キーは、上限しきい値を超えるサブＫＶストア１１４内の最後のキーに続くキーとなる。ＫＶ  ＤＢＭＳ１０８は、またサブＫＶストア１１２のルート内の上位ツリーノードも更新する。例えば、新しいサブＫＶストアの最小キーをペアレントインデックスノードにプロモート（promoting）し、および必要に応じてペアレントノードを分割する。ブロック７１４の次にブロック７１６に進む。
【００３９】
ブロック７１６において、ＫＶ  ＤＢＭＳ１０８は、２つの隣接するサブＫＶストア１１４のキーの合計数が、下限しきい値未満であるかどうか判断する。そうであるなら、ブロック７１６の次にブロック７１８に進む。さもなければ、ブロック７１６は、ブロック７０４に戻り、任意のさらなるキーバリュー挿入を処理する。ブロック７１８において、ＫＶ  ＤＢＭＳ１０８は、２つの隣接するサブＫＶストア１１４を一方のサブＫＶストア１１４にマージし、他方のサブＫＶストア１１４を削除する。例えば、ＫＶ  ＤＢＭＳ１０８は、右側のサブＫＶストア１１４からのキーバリューペアを、左のサブＫＶストア１１４に移動し、右側のサブＫＶストア１１４を削除する。サブＫＶストア１１２のルートが、Ｂ＋ツリーとしてインプリメントされると、ＫＶ  ＤＢＭＳ１０８も、サブＫＶストアのルート内の削除されたサブＫＶストア１１４に関するリーフノードを削除し、サブＫＶストアのルート内の上位ツリーノードを更新する。例えば、削除されたサブＫＶストアの最小キーをペアレントインデックスノードから削除し、ペアレントノードを、必要に応じて他のペアレントノードとマージする。ブロック７１８は、ブロック７０４に戻り、任意のさらなるキーバリュー挿入を処理する。
【００４０】
図８乃至１３は、この開示の一例における方法７００を示す。各サブＫＶストアが１０個のキーに限定され、各キーは、３２ビットの符号なしの整数であると仮定する。図８において、ＫＶ  ＤＢＭＳ１０８は、サブＫＶストア１１２のルートを有する、空のＫＶストア１１０を提供し、サブＫＶストア１１４−０は、キーレンジ全体をカバーする。サブＫＶストア１１２のルートは、サブＫＶストア１１４−０の最小キーと、サブＫＶストア１１４−０へのポインタ８０４を記憶するリーフノード８０２（ルートノードでもある）を有する。簡単のために、サブＫＶストア１１４のツリー構造は、図示されていない。
【００４１】
以下の１０個のキーペアバリュー（単にそれらのキーにより表される）がＫＶストア１１０に挿入されると仮定する：２０７７９、１５、２２０、３２９２、４０１３２、４２７１０、４０００、２０１１１、２１２２２、および４１２２２。図９において、ＫＶ  ＤＢＭＳ１０８は、１０個のキーバリューペアを、サブＫＶストア１４０−０に挿入し、それらは、サブＫＶストア１１４−０においてシーケンシャルに配列される。さらに、５個のキーバリューペア（単にそれらのキーにより表される）がＫＶストア１１０に以下の順番で挿入されると仮定する。３１１４２、６４６９、２５０００、６７５４、３３７３２。キー３１１４２がサブＫＶストア１１４−０に挿入されると、上限しきい値より大きくなる。この結果、図１０において、ＫＶ  ＤＢＭＳ１０８は、新しいサブＫＶストア１１４−１を作ることにより、サブＫＶストア１１４−０を、２つのサブＫＶストアに分割し、サブＫＶストア１１４−０内のキーバリューペアの約半分を、新しいサブＫＶストア１１４−１に移動する。特に、ＫＶＤＢＭＳ１０８は、２１２２２、３１１４２、４０１３２、４１２２２、４２７１０を、新しいサブＫＶストア１１４−１に移動する。ＫＶ  ＤＢＭＳ１０８はまた、サブＫＶストア１１４−１の最小キー２１２２２と、サブＫＶストア１１ｋ４−１へのポインタ１００４を記憶する新しいリーフノード１００２を作ることにより、サブＫＶストア１１２のルートを更新する。ＫＶＤＢＭＳ１０８はまた、最小キー２１２２２、０以上で最小キー２１２２２未満のキーに関するサブＫＶストア１１４−０へのポインタ１００８、および最小キー２１２２２以上のキーに関するサブＫＶストア１１４−１へのポインタ１０１０を記憶するインデックスノード（ルートノードでもある）を作ることができる。インデックスノード１００６では、最小キー２１２２２は、ポインタ１００８の右に記憶され、ポインタ１０１０は、最小キー２１２２２の左に記憶される。
【００４２】
図１１において、ＫＶ  ＤＢＭＳ１０８は、残りの４つのキーを挿入し続け、キー６４６９と６７５４を、サブＫＶストア１４−０に挿入し、キー２５０００および３３７３２をサブＫＶストア１１４−１に挿入する。さらに７つのキーバリューペア（単にそれらのキーにより表される）が以下の順番で、ＫＶストア１１０に挿入されると仮定する。２５８１１、２６９０２、３７４５８、３５１２１、３３９４９、３０３２５。キー２５８１１、２６９０２、３７４５８、３５１２１は、サブＫＶストア１１４−１に挿入されると、上限しきい値（１０）より大きくなる。この結果、図１２において、ＫＶ  ＤＢＭＳ１０８は、新しいサブＫＶストア１１４−２を作ることにより、サブＫＶストア１１４−１を２つのサブＫＶストアに分割し、サブＫＢストア１１４−１内のキーバリューペアの約半分を、新しいサブＫＶストア１１４−２に移動する。特に、ＫＶ  ＤＢＭＳ１０８は、キー３５１２１、３７４５８、４０１３２、４１２２２、４２１７０を、新しいサブＫＶストア１１４−２に移動する。ＫＶ  ＤＢＭＳ１０８は、また、サブＫＶストア１１４−２の最小キー３５１２１を記憶する新しいリーフノード１２０２と、サブＫＶストア１１４−２へのポインタを作ることにより、サブＫＶストア１１２のルートを更新する。ＫＶ  ＤＢＭＳ１０８は、また、最小キー３５１２１とポインタ１２０６を最小キー３５１２１以上のキーに関するサブＫＶストアに加算することにより、インデックスノード１００６を更新する。ポインタ１０１０は、今、最小キー２１２２２以上で最小キー３５１２１未満であるキーを指示することに留意する必要がある。インデックスノード１００６では、最小キー３５１２１は、ポインタ１０１０の右に記憶され、ポインタ１２０６は、最小キー３５１２１の右に記憶される。
【００４３】
今、７個のキーバリューペア（単にそれらのキーで表される）が削除されると仮定する。３０３２５、２６９０２、１５、４０００、２５８１１、３３９４９、２１２２２。これらのキーが削除されると、サブＫＶストア１１４−０と１１４−１内のキーの合計数は、下限しきい値未満になる（例えば、１０個のキー）。図１３において、ＫＶ  ＤＢＭＳ１０８は、サブＫＶストア１１４０１からのキー２５０００、３１１４２、３３７３２を、サブＫＶストア１１４−０に移動することによりサブＫＶストア１１４−０と１１４−１をマージする。ＫＶ  ＤＢＭＳ１０８は、また、リーフノード１００２、および最小キー２１２２２とポインタ１０１０をインデックスノード１００６から削除することにより、サブＫＶストア１１２のルートを更新する。インデックスノード１００６において、最小キー３５１２１は、ポインタ１００８の右に記憶され、ポインタ１２０６は、最小キー３５１２１の右に記憶される。
【００４４】
図１４乃至１６は、キーが単調に増加する、この開示の一例における方法７００を示す。各サブＫＶストアは、１０個のキーに限定され、各キーは、３２ビットの符号なし整数であると仮定する。図１４において、ＫＶ  ＤＢＭＳ１０８は、サブＫＶストア１１２のルートを有するＫＶストア１１０を提供し、サブＫＶストア１１４−０は、キーレンジ全体をカバーする。簡単のために、サブＫＶストア１１２とサブＫＶストア１１４のルートのツリー構造は、図示されていない。
【００４５】
１０個のキーペアバリュー（単にそれらのキー０乃至９による表される）が、ＫＶストア１１０に挿入されると仮定する。ＫＶＤＢＭＳ１０８は、サブＫＶストア１１４−０においてシーケンシャルに配列された１０個のキーバリューペアを、サブＫＶストア１１４−０に挿入すると仮定する。１０個のさらなるキーペアバリュー（単にキー１０乃至１９により表される）がＫＶストア１１０に挿入されると、仮定する。図１５において、ＫＶ  ＤＢＭＳ１０８は、新しいサブＫＶストア１１４−１を作り、さらなる１０個のキーバリューペアを、サブキーストア１１４−１に挿入し、それらは、サブキーストア１１４−１において、シーケンシャルに配列される。さらなる１０個のキーペアバリュー（単に、２０乃至２９により表される）がＫＶストア１１０に挿入されると仮定する。図１６において、ＫＶ  ＤＢＭＳ１０８は、新しいサブＫＶストア１１４−１を作り、さらなる１０個のキーバリューペアをサブＫＶストア１１４−２に挿入し、それらは、サブＫＶストア１１４−２においてシーケンシャルに配列される。
【００４６】
例え、キーバリューペアが単調に増加するキーで挿入されたとしても、キーバリューペアがＫＶストア１１０から除去される特定の順番は、ないと仮定される。それゆえ、サブＫＶストア１１４のマージンは、上述した例に記載されるように生じる。開示した実施形態の特徴の種々の他の適応および組み合わせは、この発明の範囲内である。多くの実施形態が以下の特許請求の範囲により包含される。
【図１】
2020536341.tif 000003
【図２】
2020536341.tif 000004
【図３】
2020536341.tif 000005
【図４】
2020536341.tif 000006
【図５】
2020536341.tif 000007
【図６】
2020536341.tif 000008
【図７】
2020536341.tif 000009
【図８】
2020536341.tif 000010
【図９】
2020536341.tif 000011
【図１０】
2020536341.tif 000012
【図１１】
2020536341.tif 000013
【図１２】
2020536341.tif 000014
【図１３】
2020536341.tif 000015
【図１４】
2020536341.tif 000016
【図１５】
2020536341.tif 000017
【図１６】
2020536341.tif 000018
【国際調査報告】
2020536341.tif 000019
2020536341.tif 000020
2020536341.tif 000021