(19)【発行国】日本国特許庁(JP)
(12)【公報種別】特許公報(B2)
(11)【特許番号】
(24)【登録日】2023-09-07
(45)【発行日】2023-09-15
(54)【発明の名称】動的キーレンジを有するKVストアにおけるシャードの維持
(51)【国際特許分類】
G06F 16/28 20190101AFI20230908BHJP
【FI】
G06F16/28
(21)【出願番号】P 2020541341
(86)(22)【出願日】2018-09-25
(86)【国際出願番号】 US2018052545
(87)【国際公開番号】W WO2019070449
(87)【国際公開日】2019-04-11
【審査請求日】2021-09-16
(32)【優先日】2017-10-05
(33)【優先権主張国・地域又は機関】US
(73)【特許権者】
【識別番号】520119699
【氏名又は名称】ザダラ ストレージ インコーポレイテッド
(74)【代理人】
【識別番号】100120891
【氏名又は名称】林 一好
(74)【代理人】
【識別番号】100165157
【氏名又は名称】芝 哲央
(74)【代理人】
【識別番号】100205659
【氏名又は名称】齋藤 拓也
(74)【代理人】
【識別番号】100126000
【氏名又は名称】岩池 満
(74)【代理人】
【識別番号】100185269
【氏名又は名称】小菅 一弘
(72)【発明者】
【氏名】リャカス アレックス
(72)【発明者】
【氏名】カウシク ヴィー. シアム
【審査官】松尾 真人
(56)【参考文献】
【文献】特開2015-069461(JP,A)
【文献】特開2016-062609(JP,A)
【文献】特開2013-061739(JP,A)
(58)【調査した分野】(Int.Cl.,DB名)
G06F 16/00-16/958
(57)【特許請求の範囲】
【請求項1】
キーバリュー(KV)ストアを、アプリケーションに提供するためのKVストアデータベースマネージメントシステムのためのコンピュータによって実行される方法であって、
以下のステップのためのプログラム命令を実行するハードウェアプロセッサを使用し、
上層のトップレベルストアと下層の少なくとも1つのロウレベルストアを含む、パーシステントメモリに格納された2層の階層データ構造を維持するステップであって、前記トップレベルストアは、第1のロウレベルストアについての第1の情報を備え、前記第1の情報は、前記第1のロウレベルストアの最小キーと、ロケーションを含む、ステップと、
キーバリューペアを、前記KVストアに挿入するための要求を、受信するステップと、
前記第1の情報に基づいて、前記キーバリューペアを、前記第1のロウレベルストアに挿入するステップと、
前記キーバリューペアを、前記第1のロウレベルストアに挿入した後で、前記第1のロウレベルストアのキー数が、上限しきい値を超えたかどうか判断するステップと、
前記第1のロウレベルストアのキー数が、上限しきい値を超えると、
前記少なくとも1つのロウレベルストアの第2のロウレベルストアを作るステップと、
前記トップレベルストアに、前記第2のロウレベルストアについての第2の情報を記憶するステップであって、前記第2の情報は、前記第2のロウレベルストアの最小キーと、ロケーションを含む、ステップと、
を備え、
ここで、前記2層の階層データ構造を維持するステップは、
前記トップレベルストアの実行中のトランザクションを累積するステップと、
前記トップレベルストアの実行中のトランザクションをコミットするステップと、
前記少なくとも1つのロウレベルストアのそれぞれについて、それぞれ実行中のトランザクションを累積するステップと、
前記少なくとも1つのロウレベルストアのそれぞれについて前記それぞれ実行中のトランザクションをコミットするステップであって、前記ロウレベルストアのそれぞれについて前記それぞれ実行中のトランザクションをコミットすることは、前記トップレベルストアについて前記実行中のトランザクションをコミットすることから独立して行われ、前記少なくとも1つのロウレベルストアの他のものに対する前記それぞれ
実行中のトランザクションをコミットすることからも独立して行われる、ステップと、
を備えた方法。
【請求項2】
前記ハードウェアプロセッサが、前記第1のロウレベルストアのキー数が、前記上限しきい値を超えると、前記第1のロウレベルストア内の、前記キーバリューペアの約半分を、前記第2のロウレベルストアに移動するためのプログラム命令をさらに実行する、請求項1に記載のコンピュータによって実行される方法。
【請求項3】
前記ハードウェアプロセッサが、新しいキーバリューペアを、前記第2のロウレベルストア内の前記KVストアに挿入する要求を受信するステップであって、前記新しいキーバリューペアは、単調に増加するキーを備える、ステップと、
前記新しいキーバリューペアを、前記第2のロウレベルストアに記憶するステップと、
をさらに実行する請求項1に記載のコンピュータによって実行される方法。
【請求項4】
前記ハードウェアプロセッサが、前記第1のロウレベルストアと、前記第2のロウレベルストア内の合計キー数が、キーバリュー削除からの下限しきい値未満であるかどうかを判断するステップと、
前記第1のロウレベルストアと、前記第2のロウレベルストアのキーの合計数が、前記下限しきい値未満であるとき、前記第1と第2のロウレベルストアを、マージするステップと、
をさらに実行する、請求項1に記載のコンピュータによって実行される方法。
【請求項5】
前記マージは、前記第2のロウレベルストアからのキーバリューペアを、前記第1のロウレベルストアに移動し、前記第2の情報を削除するステップを備える、請求項4に記載のコンピュータによって実行される方法。
【請求項6】
前記トップレベルストアの第1のリーフノードは、前記第1及び第2の情報を含む、請求項1に記載のコンピュータによって実行される方法。
【請求項7】
前記トップレベルストアの第1のリーフノードは、前記第1の情報を含み、
前記トップレベルストアの第2のリーフノートは、前記第2の情報を含み、
前記コンピュータによって実行される方法は、前記トップレベルストアの、前記第1および第2のリーフノードに関するペアレントノードを作ることをさらに備える、請求項1に記載のコンピュータによって実行される方法。
【請求項8】
下層に格納された第1のロウレベルKVストアと、
上層に格納され、前記第1のロウレベルKVストアについての、第1の情報を備えるトップレベルKVストアであって、前記第1の情報は、前記第1のロウレベルKVストアの最小キーと、ロケーションを含むトップレベルKVストアと、
を備える、パーシステントメモリに格納され、前記上層と前記下層を有する2層の階層データ構造(110)として維持されるKVストアと、
キーバリューペアを、前記KVストアに挿入する要求を受信し、
前記第1の情報に基づいて、前記キーバリューペアを、前記第1のロウレベルKVストアに挿入し、
前記第1のロウレベルKVストアのキー数が、上限しきい値を超えると、新しい第2のロウレベルKVストアを前記下層に作り、
前記トップレベルKVストアに、前記第2のロウレベルKVストアについての、第2の情報を記憶することであって、前記第2の情報は、前記第2のロウレベルKVストアの、最小キーと、ロケーションを含む、第2の情報を記憶する、
ように構成されたKVストアデータベースマネージメントシステム(DBMS)と、
を備え、
前記KVストアデータベースマネージメントシステム(DBMS)は、
前記トップレベルKVストアの実行中のトランザクションを累積し、
前記トップレベルKVストアの実行中のトランザクションをコミットし、
少なくとも1つのロウレベルKVストアのそれぞれについて、それぞれ実行中のトランザクションを累積し、
前記少なくとも1つのロウレベルKVストアのそれぞれについて前記それぞれ実行中のトランザクションをコミットするように構成され、前記ロウレベルKVストアのそれぞれについて前記それぞれ実行中のトランザクションをコミットすることは、前記トップレベルKVストアについて前記実行中のトランザクションをコミットすることとは独立して行われ、前記少なくとも1つのロウレベルKVストアの他のものに対する前記それぞれ
実行中のトランザクションのコミットからも独立して行われる、
データベースシステム。
【請求項9】
前記KVストアDBMSは、前記第1のロウレベルKVストアのキー数が、前記上限しきい値を超えると、前記前記第1のロウレベルKVストアの、前記キーバリューペアの約半数を、前記第2のロウレベルKVストアに、移動するようにさらに構成される、請求項8に記載のシステム。
【請求項10】
前記KVストアDBMSはさらに、
新しいキーバリューペアを、前記第2のロウレベルKVストア内の、前記KVストアに挿入する要求を受信することであって、前記新しいキーバリューペアは、単調に増加するキーを備える、受信することと、
前記新しいキーバリューペアを、前記第2のロウレベルKVストアに記憶することと、
を実行するようにさらに構成される、請求項8に記載のシステム。
【請求項11】
前記KVストアDBMSは、前記第1のロウレベルKVストアと、前記第2のロウレベルKVストア内のキーの合計数が、キーバリュー削除からの下限しきい値未満であるかどうか判断し、
前記第1のロウレベルKVストアと、前記第2のロウレベルKVストア内のキーの前記合計数が、前記下限しきい値未満であるとき、前記第1と第2のロウレベルKVストアをマージする、
ようにさらに構成される、請求項8に記載のシステム。
【請求項12】
前記マージは、前記第2のロウレベルKVストアからのキーバリューペアを、前記第1のロウレベルKVストアに移動し、前記第2の情報を削除することを備える、請求項11に記載のシステム。
【請求項13】
前記トップレベルKVストアの、第1のリーフノードは、前記第1および第2の情報を含む、請求項8に記載のシステム。
【請求項14】
前記トップレベルKVストアの、第1のリーフノードは、前記第1の情報を記憶し、
前記トップレベルKVストアの、第2のリーフノードは、前記第2の情報を記憶し、
前記KVストアデータベースマネージメントシステム(DBMS)はさらに、前記トップレベルKVストアの、前記第1および第2のリーフノードのための、ペアレントノードを作るように構成されている、請求項8に記載のシステム。
【請求項15】
キーバリュー(KV)ストアを、アプリケーションに提供するためのKVストアデータベースマネージメントシステム(DBMS)をインプリメントするように、プロセッサにより実行可能な命令で符号化されたコンピュータ可読記憶媒体において、前記命令は、
上層のトップレベルストアと下層の少なくとも1つのロウレベルストアを含む、パーシステントメモリに格納された2層の階層データ構造を維持することであって、前記トップレベルストアは、前記少なくとも1つのロウレベルストアの第1のロウレベルストアについての第1の情報を備え、前記第1の情報は、前記第1のロウレベルストアの最小キーと、ロケーションを含む、2層の階層データ構造を維持することと、
キーバリューペアを、前記KVストアに挿入する要求を受信することと、
前記第1の情報に基づいて、前記キーバリューペアを、前記第1のロウレベルストアに挿入することと、
前記キーバリューペアを、前記第1のロウレベルストアに挿入した後で、前記第1のロウレベルストアのキー数が、上限しきい値を超えたかどうかを判断することと、
前記第1のロウレベルストアのキー数が上限しきい値を超えると、
前記少なくとも1つのロウレベルストアの第2のロウレベルストアを作ることと、
前記トップレベルストアに、前記第2のロウレベルストアについての、第2の情報を記憶することであって、前記第2の情報は、前記第2のロウレベルストアの最小キーと、ロケーションを含む、第2の情報を記憶することと、
を備え、
前記2層の階層データ構造を維持することは、
前記トップレベルストアの実行中のトランザクションを累積することと、
前記トップレベルストアの実行中のトランザクションをコミットすることと、
前記少なくとも1つのロウレベルストアのそれぞれについて、それぞれ実行中のトランザクションを累積することと、
前記少なくとも1つのロウレベルストアのそれぞれについて前記それぞれ実行中のトランザクションをコミットすることであって、前記ロウレベルストアのそれぞれについて前記それぞれ実行中のトランザクションをコミットすることは、前記トップレベルストアについて前記実行中のトランザクションをコミットすることから独立して行われ、前記少なくとも1つのロウレベルストアの他のものに対する前記それぞれ
実行中のトランザクションをコミットすることからも独立して行われる、コミットすることと、
を備える、非一時的コンピュータ可読記憶媒体。
【請求項16】
前記命令はさらに、前記第1のロウレベルストアのキー数が、前記上限しきい値を超えると、前記第1のロウレベルストア内の、前記キーバリューペアの、約半数を前記第2のロウレベルストアに移動することをさらに備えた、請求項15に記載の非一時的コンピュータ可読記憶媒体。
【請求項17】
前記命令はさらに、
新しいキーバリューペアを、前記第2のロウレベルストア内の前記KVストアに、挿入する要求を受信することであって、前記新しいキーバリューペアは、単調に増加するキーを備える、受信することと、
前記新しいキーバリューペアを、前記第2のロウレベルストアに記憶することと、
をさらに備えた請求項15に記載の非一時的可読記憶媒体。
【請求項18】
前記命令はさらに、
前記第1のロウレベルストア
と、前記第2のロウレベルストア内のキーの合計数が、キーバリュー削除からの
下限しきい値未満であるかどうかを判断することと、
前記第1のロウレベルストアと、前記第2のロウレベルストア内のキーの合計数が前記下限しきい値未満であるとき、前記第1および第2のロウレベルストアをマージすることと、
を備えた、請求項15に記載の非一時的コンピュータ可読記憶媒体。
【請求項19】
前記トップレベルストアの第1のリーフノードは、前記第1及び第2の情報を含む、請求項15に記載の非一時的コンピュータ可読記憶媒体。
【請求項20】
前記トップレベルストアの第1のリーフノードは、前記第1の情報を含み、
前記トップレベルストアの第2のリーフノードは、前記第2の情報を含み、
前記命令は、前記トップレベルストアの、前記第1のリーフノードと、前記第2のリーフノードのためのペアレントノードを作ることをさらに備えた、請求項15に記載の非一時的コンピュータ可読記憶媒体。
【発明の詳細な説明】
【技術分野】
【0001】
この発明は、キーバリューストアに関し、特に複数のトランザクションを単一のキーバリューストアに維持することに関する。
【背景技術】
【0002】
キーバリューストア(KV)は、単一のデータベースとして見ることができる。表およびカラムにデータを配列する構造化紹介言語(SQL)データベースとは異なり、KVストアは、単なるキーバリューペアの集合である。キーは、任意の、例えば、整数またはストリングであり得る。唯一の要件は、KVストアが任意の2つのキーをどのように比較するかを知っていることである。バリューは、また、任意であり得、KVストアは、それをバイナリ・ラージ・オブジェクト(BLOB)として取り扱う。唯一の要件は、KVストアがバリューのサイズを知っているので、それをディスクに記憶することができることである。
【0003】
典型的に、KVストアは、トランザクションによって動作する。新しいトランザクションは、新しいアプリケーションが、KVストアに対して何らかの変更、例えば、新しいキーを挿入したいとき開かれる。後で、このトランザクションのために更なる変更を行うことができる。ある時点で、KVストアは、実行中のトランザクションが十分な変更を累積したことを判断する。次に、KVストアは、実行中のトランザクションをコミットし、そのためにすべての変更がディスク上に保持(persist)される。これで、新しいトランザクションを開くことができる。各トランザクションは、或る種のトランザクションID、例えば、単調に増加する整数を有する。
【0004】
トランザクションに参加しているアプリケーションスレッドが依然としてあるとき、トランザクションは、コミットすることができない。すべてのアプリケーションがトランザクションからデタッチされると、コミットを開始することができる。典型的に、アプリケーションスレッドは、非常に短い時間トランザクションにアタッチされ、KVストアに対するメモリ内変更のみを実行する。
【0005】
KVストアは、Bツリー(例えば、B+ツリー)としてインプリメントすることができる。Bツリーは、いくつかのレベルで階層化されたツリーブロックで構成されている。ツリーブロックは、リーフノードとインデックスノードを含む。リーフノードは、KVストアが管理するキーとバリューを含む。インデックスノードは、他のインデックスノードまたはリーフノードであり得る、より低いレベルのツリーブロックへのポインタを含む。
【0006】
Bツリーに記憶されたすべてのキーバリューペアは、典型的に昇べきの順に記憶される。これは、ツリーの「左」部分のインデックスノードとリーフノードは、ツリーの「右」部分のインデックスノードとリーフノードよりも低いキーを保持することを意味する。リーフノード内では、キーバリューペアは、またキーによりソートされる。インデックスノードは、キーでソートされた子ポインタも有する。
【0007】
Bツリー内のキーバリューペアのサーチは、ルートノードからスタートし、関連するインデックスノードをたどって、最終的に、必要なキーとバリューが配置されている可能性がある、関連するリーフノードに到達する。各ツリーブロックは、ディスク上に配置されているので、より低いレベルへ「ジャンプ」する度に、関連するツリーブロックをディスクから読む必要がある。
【0008】
Bツリーは、典型的に、レベルが非常に少ないので、非常に広い、すなわち、各インデックスノードは、多数の子ブロックを有する。その結果、キーの検索は、非常に少数のツリーブロックを横断するため、キーを見つけるために必要なディスク読み取りの量は、非常に少なくなる。ツリーブロックのサイズは、典型的に数キロバイト(KBs)、例えば、4KB、16KB、32KBである。
【発明の概要】
【0009】
この開示の1つまたは複数の例では、KVストアは、いくつかのロウレベルストア(ここでは、「サブKVストア」)、およびトップレベルストア(以下、「サブKVストアのルート」)として構築される。各サブKVストアは、特定のレンジのキーを担当する。
【0010】
各サブKVストアは、独自の実行中のトランザクションを有する。サブKVストアのルートも、独自の実行中のトランザクションを有する。サブKVストアのルートは、サブKVストアのスーパーブロックを追跡する。サブKVストアのスーパーブロックは、ディスク上のサブKVストアのコンテンツを配置し、構文解析し、正当化するための情報、例えば、ディスク上のサブKVストアのコンテンツの座標、コンテンツの長さ、コンテンツのチェックサム、およびサブKVストアのトランザクションIDを保持する。
【0011】
KVストアにおいて、変更は、サブKVストアに対して累積される。サブKVストアは、十分な変更が蓄積されたときに変更をコミットするかどうかを個別に決定するため、KVストア全体で変更がパーシストされることによる書き込みの増幅やその他のオーバーヘッドを回避することができる。
【0012】
アプリケーションの観点から、唯1つのKVストアがある。アプリケーションは、サブKVストアによりハンドリングされる、より小さなレンジへのキーレンジの内的分離に気が付かない。この開示の1つまたは複数の例において、サブKVストアは、キーバリューペアがKVストアに挿入されるか、または除去されると、動的に作成されおよび削除される。キーバリューの挿入によって、上限しきい値を超えるキー数が、サブKVストアにより維持されると、サブKVストアは、キーのほぼ半分を有する2つのサブKVストアに分割される。キーバリューの削除により、隣接するサブKVストアにより維持されるキーの合計数が、下限しきい値を下回るとき、隣接サブKVストアは、1つのサブKVストアにマージされる。いくつかの例において、隣接サブKVストアは、1つのサブKVストアからキーバリューペアを取り、それを他のサブKVストアにマージし、空のサブKVストアを削除することにより、マージされる。
【図面の簡単な説明】
【0013】
【
図1】この開示のいくつかの例におけるストレージシステムである。
【
図2】この開示の例において、KVストアをアプリケーション118に提供するために、
図1のキーバリュー(KV)データベースマネージメントシステム(DBMS)に関する方法のフローチャートである。
【
図3】この開示の例におけるサブKVストアに関するダイナミックキーレンジをインプリメントする
図1のKV DBMSを示す。
【
図4】この開示の例におけるサブKVストアに関するダイナミックキーレンジをインプリメントする
図1のKV DBMSを示す。
【
図5】この開示の例におけるサブKVストアに関するダイナミックキーレンジをインプリメントする
図1のKV DBMSを示す。
【
図6】この開示の例におけるサブKVストアに関するダイナミックキーレンジをインプリメントする
図1のKV DBMSを示す。
【
図7】この開示の例において、サブKVストアを動的に作成し、削除するための
図1のKV DBMSの方法のフローチャートである。
【
図10】この開示の例において、
図7の方法を示す。
【
図11】この開示の例において、
図7の方法を示す。
【
図12】この開示の例において、
図7の方法を示す。
【
図13】この開示の例において、
図7の方法を示す。
【
図14】この開示の他の例における、
図7の方法を示す。
【
図15】この開示の他の例における、
図7の方法を示す。
【
図16】この開示の他の例における、
図7の方法を示す
【発明を実施するための形態】
【0014】
異なる図面における同じ参照符号の使用は、類似または同一のエレメントを示す。Xランダムキーが、KVストア内の新しいバリューで更新されると仮定すると、リーフノードAは、キーバリューペアの多くが更新されるが、リーフノードBは、キーバリューペアの1つのみが更新されるということが起こり得る。さらに、KVストアは、実行中のトランザクションをコミットするように判断すると仮定する。このトランザクションコミットの一部として、すべての変更されたツリーブロック(リーフノードとインデックスノードの両方)は、ディスクに書き込む必要がある。したがって、リーフノードAとリーフノードBの両方は、コンテンツが変更されたので、ディスクに書き込まれる。しかしながら、リーフノードBをディスクに書き込むことは、非効率である。なぜならば、たった1つのキーバリューが変更されてもリーフ全体をディスクに書き込まなければならないからである。リーフノードAの書き込みは効率的である。なぜならば、変更されないキーバリューよりも変更されたキーバリューの方が多いからである。
【0015】
アプリケーションにより変更される数十億のキーバリューペアを保持する大きなKVストアを考える。トランザクションコミットは、多数の変更されたリーフノードをディスクへ書き込む必要があるが、各変更されたリーフノードは、多くは、変更されていないということが起こり得る。残念なことに、トランザクションコミットの一部として大量のストリームのディスクへの書き込みが起こり得るという結果になる。KVストアの一部、すなわち、「十分な」コミットを累積した部分のみをコミットすることができることが望ましい。上述した方法では、これは、可能ではない。何故ならば、トランザクションは、特定のツリーブロックにおける変更の量に関係なく、すべての変更されたツリーブロックを、ディスクにパーシスト(persist)しなければならないからである。
【0016】
この開示の1つまたは複数において、KVストアは、いくつかのロウレベルKVストア(以下、「サブKVストア」)およびトップレベルKVストア(以下、「サブKVストアのルート」)として構造化される。各サブKVストアは、特定のレンジのキーおよびその独自の実行中のトランザクションを担当する。例えば、左端のKVストアは、0乃至9999を担当し、次のサブKVストアは、10000乃至19999を担当する等々である。キーレンジの、より小さなレンジへの、そのような分離は、「シャーディング(sharding)」と呼ばれ、各サブレンジと対応するサブKVストアは、「シャード(shard)」と呼ばれる。
【0017】
サブKVストアのルートは、独自の実行中のトランザクションを有する。サブKVストアのルートは、各サブKVストアについて以下の情報(スーパーブロック)を追跡する。
1)サブKVストアの最小キー。これはサブKVストアが担当するキーのレンジを定義することである。
2)このサブKVストアに関して最後にコミットしたトランザクション。
3)ディスク上のサブKVストアのルートブロックのロケーション。
【0018】
スーパーブロックは、サブKVストアのルートブロックのチェックサムのような、特定のインプリメンテーションにより必要とされる追加の情報を含むことができる。
図1は、この開示のいくつかの例におけるデータベースシステム102である。システム100は、プロセッサ102、メイン(非パーシステント)メモリ104、および二次(パーシステント)メモリ106を含む。
【0019】
メインメモリ104(例えば、ランダムアクセスメモリ)は、二次メモリ106に記憶されたKVストア110を管理するKVデータベースマネージメントシステム(DBMS)108のためのプログラム命令とデータを記憶する。KVストア110は、サブKVストア112のルートと、サブKVストア114-0、114-1・・・104-i(集合的に、「サブKVストア114」または一般的に個別「サブKVストア114」)のような多数のサブKVストアを包含する。サブKVストア112とサブKVストア114のルートは、Bツリー、レッド・ブラックツリー、AVLツリー、またはスキップリスト構造であり得る。さらに、サブKVストア114は、リンクリストまたはシンプルソートアレイ(simple sorted array)であり得る。KV DBMS108は、サブKVストア112およびサブKVストア114のルートに関して実行中のトランザクションを追跡する。「KV DBMS」と「KVストア」は、互換的に使用され、しばしば一緒にして1つのエンティティとしてみなされる。オプションとして、メインメモリ104は、KVストア110をアクセスするアプリケーション118のためのプログラム命令とデータを記憶する。あるいは、アプリケーション118は、KVストア110にアクセスするための、ネットワークによってストレージシステム100に接続された別のシステムに配置することができる。
【0020】
二次メモリ106(例えば、ディスク)は、サブKVストア112およびサブKVストア114のルートを形成するデータを含む、KVストア110を形成するデータを記憶する。あるいは、サブKVストア112とサブKVストア114のルートを形成するデータは、異なる二次メモリに配置することができる。プロセッサ102、メインメモリ104、および二次メモリ106は、シングルサーバまたはプロセッサ103であり得、メインメモリ104は、ストレージエリアネットワーク(SAN)、またはネットワークアッタチストレージ(NAS)のようなストレージシステムである、二次メモリ106にネットワークを介してアクセスするサーバであり得る。
【0021】
図2は、この開示の例におけるアプリケーション118(
図1)にKVストア110(
図1)を提供するための、KV DBMS108(
図1)のための方法のフローチャートである。ここに記載した方法200および他の方法は、1つまたは複数のブロックにより説明される、1つまたは複数の動作、機能、またはアクションを含むことができる。ブロックは、シーケンシャルな順番に説明されているけれども、これらのブロックは、また、並列に実行することができ、および/またはここに記載した順番とは異なる順番で実行することができる。また、種々のブロックは、より少ない数のブロックに結合することができ、さらなるブロックに分割したり、および/または所望のインプリメンテーションに基づいて削除したりすることができる。方法200は、ブロック202で開始することができる。
【0022】
ブロック202において、KV DBMS108は、サブストア112(
図1)のルート、およびKVストア110を形成する、1つ又は複数のサブKVストア114(
図1)を提供する。KV DBMS108は、異なる実行中のトランザクション116(
図1)を各ストアに割り当てる。各サブKVストア114は、特定のキーレンジを担当する。各サブキーストア114は、多数のキーバリューペアを格納する。例えば、各サブKVストア114は、各々がキーバリューペアを格納する、1つまたは複数のリーフノードを有するB+ツリーであり得る。キーバリューペア内のバリューは、実際のデータまたは実際のデータに対するポインタであり得る。
【0023】
サブKVストア112のルートは、サブKVストア114のスーパーブロックを追跡する。例えば、サブKVストア112のルートは、ゼロまたは複数のインデックスノードおよび1つまたは複数のリーフノードであって各リーフノードは、異なるサブKVストアについての情報(スーパーブロック)を記憶するリーフノードを有するB+ツリーであり得る。この情報は、サブKVストア114の最小キー、サブKVストアのための最後にコミットされたトランザクション(ジャーナルを用いたリカバリに使用される)、およびサブKVスコアに対するポインタ(例えば、二次メモリ106内のサブKVストアのルートノード/ブロックに対するロケーション)を含む。ブロック202の次にブロック206が続く。
【0024】
ブロック204において、KV DBMS108は、任意のサブKVストア114が十分な変更(例えば、所定数の書き込み)を累積したかどうかを判断する。そうであるなら、ブロック204の次にブロック206に進むことができる。そうでなければ、ブロック204の次に、ブロック210に進むことができる。
【0025】
ブロック206において、KV DBMS108は、十分な変更を累積した特定のサブKVストア114の実行中のトランザクションをコミットする。KV DBMS108は、実行中のトランザクションの期間に、このサブKVストア114になされた変更を、二次メモリにパーシストして、サブKVストアの最後にコミットされたトランザクションを更新することにより、実行中のトランザクションをコミットする。上述したように、サブKVストアの最後にコミットしたトランザクションは、二次メモリ106上のサブKVストア112のルート(例えば、サブKVストア112のルートのリーフノード)により維持される、対応するスーパーブロックに記憶される。ブロック206の次に、ブロック208に進む。
【0026】
ブロック208において、KV DBMS108は、この特定のサブKVストア114に関する新しいトランザクションを開く。ブロック206と208は、十分な変更を累積した各サブKVストアに関して反復することができる。ブロック208の次にブロック210に進むことができる。ブロック210において、KV DBMS108は、サブKVストア112のルートが十分な変更を累積したかどうかを判断する。そうであるなら、ブロック210の次に、ブロック212に進む。そうでなければ、ブロック210は、ブロック204にループバックする。
【0027】
ブロック212において、KV DBMS108は、サブKVストア112のルートの実行中のトランザクションをコミットする。KV DBMS108は、二次メモリに対する実行中のトランザクションの期間にサブKVストア112のルートに対してなされた変更を永続化し、サブKVストアのルートのスーパーブロック内の最後にコミットされたトランザクションを、サブKVストアのルートの実行中のトランザクションで更新することにより実行中のトランザクションをコミットする。サブKVストア112のルートのスーパーブロックは、最後にコミットされたトランザクションを含み、典型的に、二次メモリ106上の固定されたロケーションに記憶された、サブKVストアのルートの構文解析と検証を可能にする情報を保持する。ブロック212の次に、ブロック214に進む。
【0028】
ブロック214において、KV DBMS108は、サブKVストア112のルートに関する新しいトランザクションを開く。ブロック214は、ブロック204に戻り、十分な変更を累積した任意のストアの実行中のトランザクションをコミットし続ける。以下の例は方法200を示す。サブKVストア114-0(
図1)は、[0、9999]のキーレンジを担当し、実行中のトランザクションT0を有し、サブKVストア114-1(
図1)は、レンジ[10000、19999]のキーレンジを担当し、実行中のトランザクションT1を有する。アプリケーション118(
図1)は、レンジ[0、9999]内の1000キーと、レンジ[10000、19999]内の10キーを変更する。この時点において、KV DBMS108(
図1)は、サブKVストア114-0が、実行中のトランザクションT0に関して十分な変更を累積したと決定する。KV DBMS108は、実行中のトランザクションT0をコミットし、サブKVストア114-0内の変更されたブロックを二次メモリ106(
図1)に書き込む。KV DBMS108は、サブKVストア112(
図1)のルートを、最後にコミットしたトランザクションのようなサブKVストア114-0についての新しい情報で更新する。しかしながら、KV DBMS108は、サブKVストア114-1の実行中のトランザクションT1を長時間開いたままにすることができる。このようにして、本開示の例は、さもなければ少量の変更を運ぶサブKVストア114-1書き込みノードから生じる可能性がある、潜在的な書き込み増幅(write amplification)を回避する。
【0029】
サブKVストア114は、静的キー範囲を有することができ、各サブKVストア114には、全キー範囲の一部が割り当てられる。典型的にキーレンジは非常に大きい。たとえば、キーが48ビットの符号無し整数の場合、キーの範囲は[0、281474976710655]になる。キー範囲全体が統計的にシャーディング(sharding)され、各シャード(shard)が10000キーに制限されている場合、KVストアは、最終的に280億を超えるシャードになる。一方KVストアが常に管理すると予想される、キーと値のペアの最大数は、通常、キー範囲全体のキーの数よりもはるかに少なくなる。例えば、KVストアは、最大160億キーを管理することが期待され得る。このような状況で、全キー範囲に対して28億の静的シャードを作成することは、ほとんどのサブKVストアが空になるため、実用的ではない。
【0030】
この開示の例において、KV DBMS108は、キーバリューペアが挿入され、除去されるので、サブKVストアを動的に作成し削除する。KV DBMS108は、ある制限内にある、各サブKVストアのキーの量を維持する。KV DBMS108は、サブKVストアを作成および削除して、これらの制限を遵守し、シャードの総数を制御する。
【0031】
図3乃至6は、この開示の例において、サブKVストア114(
図1)に関する動的キーレンジをインプリメントするKV DBMS108(
図1)を示す。
図3では、KVストア110が空であるとき、KV DBMS108は、 キーの範囲全体[0、MAX_KEY]を担当し、それゆえ、0の最小のキーを有する、空のサブKVストア114-0(例えば、リーフノード302を指すリーフ)につながる情報(スーパーブロック)を有する、サブKVストア112のルートを作成する。
【0032】
図4において、サブKVストア114-0は、上限しきい値に到達するので、KV DBMS108は、サブKVストア114-0を2つのサブKVストア(既存のサブKVストア114-0と新しいサブKVストア114-1)に分割し、各サブKVストアは、サブKVストアにもともとあったキーの約半分のキーを有する。したがって、サブKVストア114-0は、ある範囲のキー[0、X]を担当し、最小キーは0であり、サブKVストア114-1は、ある範囲のキー[X+1、MAX_KEY]を担当し、X+11の最小キーを有する。サブKVストア112のルートがB+ツリーとしてインプリメントされると、1つのリーフノード302は、サブKVストア114-0と114-1の両方に導く情報(スーパブロック)を有することができるか、あるいは、各々が、2つのサブKVストアの1つに導く情報(スーパブロック)を有することができる。言い換えれば、B+ツリー内のリーフは、いくつかのスーパーブロックについての情報を保持することができる。
【0033】
図5において、より多くのキーバリューの挿入は、さらなるサブKVストア114を分割させる。たとえば、サブKVストア114-1は、2つのサブKVストアに分割され、各々は、サブKVストア114-1にもともとあったキーの約半分のキーを有する。サブKVストア114-1は、ある範囲のキー[X+1乃至Y]を担当することになるが、X+1の最小キーを継続して有する。新しいサブKVストアが作成されると、KV DBMS108は、サブKVストア112のルート内のスーパーブロックを更新する。
【0034】
キーバリューを削除することにより、サブKVストア114は、低減された数のキーを有することができる。
図6において、サブKVストアと、その隣接するサブKVストア(右または左)のキーの合計数が下限しきい値未満(例えば、サブKVストア114-0と114-1)であり、KV DBMS108は、一方のサブKVストア(例えば、右サブKVストア114-1)のキーバリューペアを取ることにより、2つのサブKVストアをマージし、他方のサブKVストア(例えば、左のサブKVストア114-1)へ、それらをマージすると仮定する。サブKVストア114-0は、ある範囲のキー[0乃至Y]を担当するが、最小キーは引き続き0である。コンスタントな分割とマージにより、KV DBMS108は、サブKVストア114の数が、所定のキー範囲に対して定義された値を超えないようにする。KVストア110のキーと値のペアの、予想最大数に基づいて、シャードの最大数は、ユーザーが手動で、またはKV DBMS108が自動的にターゲットにすることができる。シャードの数がシャードのターゲット最大数に近づくと、KV DBMS108は、ターゲット数をオーバシュートしないようにシャードを、より積極的にマージすることができる。例えば、KV DBMS108は、より低いしきい値を上げて、より早くシャードをマージすることができる。
【0035】
図7は、この開示の例において、サブKVストア114(
図1)を作成し、削除するためのKV DBMS108(
図1)に関する方法700のフローチャートである。方法700は、ブロック702で開始する。ブロック702において、KV DBMS108は、サブKVストア112(
図1)のルートとサブKVストア(例えば、
図1のサブKVストア114-0)を提供する。サブKVストア112のルートは、サブKVストア114-0に導く情報(例えば、リーフノードに記憶されたスーパーブロック)を有する。情報(スーパーブロック)は、サブKVストア114-0の最小キー、サブKVストアに関する最後にコミットされたトランザクション、およびサブKVストアへのポインタ(例えば、二次メモリ106内のサブKVストアのルートノード/ブロック)を含む。サブKVストア114-0は、初めに全レンジのキー[0、MAX_KEY]を担当し、0の最小キーを有する。ブロック702の次にブロック704に進む。
【0036】
ブロック704において、KV DBMS108は、キーバリューペアをKVストア110(
図1)に挿入するための要求を受信する。ブロック704の次に、ブロック706に進む。ブロック706において、サブKVストア(複数の場合もある)114についての情報に基づいて、KV DBMS108は、キーバリューペアを、キーバリューペア内のキーを含む、ある範囲のキーに割り当てられたサブKVストア114に挿入する。例えば、KV DBMS108は、サブKVストア112のルート内の各サブKVストア114に関する情報(例えば、スーパーブロック)を維持し、各スーパーブロックは、サブKVストアの最小数、およびサブKVストアへのポインタを記憶する。サブKVストア112のルートが、B+ツリーとしてインプリメントされると、KV DBMS108は、サブKVストアのルートのリーフノードにスーパーブロックを記憶し、サブKVストアのルートにツリーブロックを作成し、各サブKVストア114のスーパーブロックを追跡する。サブKVストア112のルートをトラバースすることにより、KV DBMS108は、適切なサブKVストア114を見つけて、キーバリューペアを挿入する。ブロック706の次に、ブロック708に進む。
【0037】
ブロック708において、KV DBMS108は、キーバリュー挿入を受信したサブKVストア114内のキーの数が、上限しきい値より大きいかどうかを判断する。そうであるなら、ブロック708の次にブロック710に進む。そうでなければ、ブロック708の次にブロック716に進む。ブロック710においてKV DBMS108は、新しいサブKVストア114を作成する。ブロック710の次に、ブロック712に進む。オプションのブロック712において、KV DBMS108は、約半分のキーバリューペアを、新しいサブKVストア114に移動することにより、上限しきい値を超えるサブKVストア114を分割する。オプションのブロック712は、キーが単調に増加するとき、および新しいキーバリューペアが、新しく作られたサブKVストア114に挿入されるときは、使用されない。オプションのブロック712の次にブロック714が続く。
【0038】
ブロック714において、KV DBMS108は、サブKVストア112のルートに、新しいサブKVストア114についての情報を記憶する。例えば、サブKVストア112のルートが、B+ツリーとしてインプリメントされると、KV DBMS108は、サブKVストアのルートにリーフノードを作り、新しいサブKVストア114の最小キー、新しいサブKVストアに関する最後にコミットされたトランザクション、および新しいサブKVストアへのポインタを記憶する。サブKVストア114が分割されると、新しいサブKVストア114のための最小キーは、新しいサブKVストアの第1のキーとなる。キーを単調に増加すると、新しいサブKVストア114に関する最小キーは、上限しきい値を超えるサブKVストア114内の最後のキーに続くキーとなる。KV DBMS108は、またサブKVストア112のルート内の上位ツリーノードも更新する。例えば、新しいサブKVストアの最小キーをペアレントインデックスノードにプロモート(promoting)し、および必要に応じてペアレントノードを分割する。ブロック714の次にブロック716に進む。
【0039】
ブロック716において、KV DBMS108は、2つの隣接するサブKVストア114のキーの合計数が、下限しきい値未満であるかどうか判断する。そうであるなら、ブロック716の次にブロック718に進む。さもなければ、ブロック716は、ブロック704に戻り、任意のさらなるキーバリュー挿入を処理する。ブロック718において、KV DBMS108は、2つの隣接するサブKVストア114を一方のサブKVストア114にマージし、他方のサブKVストア114を削除する。例えば、KV DBMS108は、右側のサブKVストア114からのキーバリューペアを、左のサブKVストア114に移動し、右側のサブKVストア114を削除する。サブKVストア112のルートが、B+ツリーとしてインプリメントされると、KV DBMS108も、サブKVストアのルート内の削除されたサブKVストア114に関するリーフノードを削除し、サブKVストアのルート内の上位ツリーノードを更新する。例えば、削除されたサブKVストアの最小キーをペアレントインデックスノードから削除し、ペアレントノードを、必要に応じて他のペアレントノードとマージする。ブロック718は、ブロック704に戻り、任意のさらなるキーバリュー挿入を処理する。
【0040】
図8乃至13は、この開示の一例における方法700を示す。各サブKVストアが10個のキーに限定され、各キーは、32ビットの符号なしの整数であると仮定する。
図8において、KV DBMS108は、サブKVストア112のルートを有する、空のKVストア110を提供し、サブKVストア114-0は、キーレンジ全体をカバーする。サブKVストア112のルートは、サブKVストア114-0の最小キーと、サブKVストア114-0へのポインタ804を記憶するリーフノード802(ルートノードでもある)を有する。簡単のために、サブKVストア114のツリー構造は、図示されていない。
【0041】
以下の10個のキーペアバリュー(単にそれらのキーにより表される)がKVストア110に挿入されると仮定する:20779、15、220、3292、40132、42710、4000、20111、21222、および41222。
図9において、KV DBMS108は、10個のキーバリューペアを、サブKVストア140-0に挿入し、それらは、サブKVストア114-0においてシーケンシャルに配列される。さらに、5個のキーバリューペア(単にそれらのキーにより表される)がKVストア110に以下の順番で挿入されると仮定する。31142、6469、25000、6754、33732。キー31142がサブKVストア114-0に挿入されると、上限しきい値より大きくなる。この結果、
図10において、KV DBMS108は、新しいサブKVストア114-1を作ることにより、サブKVストア114-0を、2つのサブKVストアに分割し、サブKVストア114-0内のキーバリューペアの約半分を、新しいサブKVストア114-1に移動する。特に、KVDBMS108は、21222、31142、40132、41222、42710を、新しいサブKVストア114-1に移動する。KV DBMS108はまた、サブKVストア114-1の最小キー21222と、サブKVストア11k4-1へのポインタ1004を記憶する新しいリーフノード1002を作ることにより、サブKVストア112のルートを更新する。KVDBMS108はまた、最小キー21222、0以上で最小キー21222未満のキーに関するサブKVストア114-0へのポインタ1008、および最小キー21222以上のキーに関するサブKVストア114-1へのポインタ1010を記憶するインデックスノード(ルートノードでもある)を作ることができる。インデックスノード1006では、最小キー21222は、ポインタ1008の右に記憶され、ポインタ1010は、最小キー21222の左に記憶される。
【0042】
図11において、KV DBMS108は、残りの4つのキーを挿入し続け、キー6469と6754を、サブKVストア14-0に挿入し、キー25000および33732をサブKVストア114-1に挿入する。さらに7つのキーバリューペア(単にそれらのキーにより表される)が以下の順番で、KVストア110に挿入されると仮定する。25811、26902、37458、35121、33949、30325。キー25811、26902、37458、35121は、サブKVストア114-1に挿入されると、上限しきい値(10)より大きくなる。この結果、
図12において、KV DBMS108は、新しいサブKVストア114-2を作ることにより、サブKVストア114-1を2つのサブKVストアに分割し、サブKBストア114-1内のキーバリューペアの約半分を、新しいサブKVストア114-2に移動する。特に、KV DBMS108は、キー35121、37458、40132、41222、42170を、新しいサブKVストア114-2に移動する。KV DBMS108は、また、サブKVストア114-2の最小キー35121を記憶する新しいリーフノード1202と、サブKVストア114-2へのポインタを作ることにより、サブKVストア112のルートを更新する。KV DBMS108は、また、最小キー35121とポインタ1206を最小キー35121以上のキーに関するサブKVストアに加算することにより、インデックスノード1006を更新する。ポインタ1010は、今、最小キー21222以上で最小キー35121未満であるキーを指示することに留意する必要がある。インデックスノード1006では、最小キー35121は、ポインタ1010の右に記憶され、ポインタ1206は、最小キー35121の右に記憶される。
【0043】
今、7個のキーバリューペア(単にそれらのキーで表される)が削除されると仮定する。30325、26902、15、4000、25811、33949、21222。これらのキーが削除されると、サブKVストア114-0と114-1内のキーの合計数は、下限しきい値未満になる(例えば、10個のキー)。
図13において、KV DBMS108は、サブKVストア11401からのキー25000、31142、33732を、サブKVストア114-0に移動することによりサブKVストア114-0と114-1をマージする。KV DBMS108は、また、リーフノード1002、および最小キー21222とポインタ1010をインデックスノード1006から削除することにより、サブKVストア112のルートを更新する。インデックスノード1006において、最小キー35121は、ポインタ1008の右に記憶され、ポインタ1206は、最小キー35121の右に記憶される。
【0044】
図14乃至16は、キーが単調に増加する、この開示の一例における方法700を示す。各サブKVストアは、10個のキーに限定され、各キーは、32ビットの符号なし整数であると仮定する。
図14において、KV DBMS108は、サブKVストア112のルートを有するKVストア110を提供し、サブKVストア114-0は、キーレンジ全体をカバーする。簡単のために、サブKVストア112とサブKVストア114のルートのツリー構造は、図示されていない。
【0045】
10個のキーペアバリュー(単にそれらのキー0乃至9による表される)が、KVストア110に挿入されると仮定する。KVDBMS108は、サブKVストア114-0においてシーケンシャルに配列された10個のキーバリューペアを、サブKVストア114-0に挿入すると仮定する。10個のさらなるキーペアバリュー(単にキー10乃至19により表される)がKVストア110に挿入されると、仮定する。
図15において、KV DBMS108は、新しいサブKVストア114-1を作り、さらなる10個のキーバリューペアを、サブキーストア114-1に挿入し、それらは、サブキーストア114-1において、シーケンシャルに配列される。さらなる10個のキーペアバリュー(単に、20乃至29により表される)がKVストア110に挿入されると仮定する。
図16において、KV DBMS108は、新しいサブKVストア114-1を作り、さらなる10個のキーバリューペアをサブKVストア114-2に挿入し、それらは、サブKVストア114-2においてシーケンシャルに配列される。
【0046】
例え、キーバリューペアが単調に増加するキーで挿入されたとしても、キーバリューペアがKVストア110から除去される特定の順番は、ないと仮定される。それゆえ、サブKVストア114のマージンは、上述した例に記載されるように生じる。開示した実施形態の特徴の種々の他の適応および組み合わせは、この発明の範囲内である。多くの実施形態が以下の特許請求の範囲により包含される。