(57)【要約】【課題】データの整合性を保証しつつ、データの書込み時における排他ロックの取得を不要とするデータベース装置を提供することにある。【解決手段】実施形態によれば、データベース装置は、ストレージ装置と、複数のノードとで構成される。ストレージ装置は、データの書込みの順序を示すバージョン番号を管理する。複数のノードは、ストレージ装置へのデータの書込み時、他のノードによるデータの読込みのみを禁止する書込用共有ロックを取得すると共に、最新のバージョン番号を取得し、書込みデータを最新のバージョン番号と共にメモリに格納し、当該書込みデータに関する情報として、自ノードのノード番号と、取得した最新のバージョン番号とをストレージ装置に格納して、書込用共有ロックを解放する。【選択図】図１
2015230689.tif 000002
【特許請求の範囲】
【請求項１】
ストレージ装置と、
前記ストレージ装置とネットワークを介して接続される複数のノードと、
を具備し、
前記ストレージ装置は、
他のノードによるデータの読込みとデータの書込みとのうちのデータの読込みのみを禁止する書込用共有ロックを含むデータの整合性保持のための各種ロックを前記複数のノードからの要求に応じてデータ領域単位に設定および解除する排他制御手段と、
前記ストレージ装置に対して実行されるデータの書込みの順序を示すバージョン番号を管理するバージョン番号管理手段と、
を具備し、
前記複数のノードそれぞれは、
前記ストレージ装置のデータ用のキャッシュ領域が確保されるメモリと、
前記メモリを用いて前記ストレージ装置へのデータの書込みを実行するデータ書込み手段と、
を具備し、
前記データ書込み手段は、
書込み対象のデータ領域について前記書込用共有ロックを前記ストレージ装置から取得すると共に、最新のバージョン番号を前記ストレージ装置から取得し、
書込みデータを前記取得した最新のバージョン番号と共に前記メモリに格納し、前記書込みデータに関する情報として、自ノードのノード番号と、前記取得した最新のバージョン番号とを前記ストレージ装置に格納して、前記書込用共有ロックを解放する、
データベース装置。
【請求項２】
前記データ書込み手段は、
前記データ領域に新たなデータを上書きする第１パターンの書込みの場合、旧バージョンの書込みデータとの合併が不要であることを示す第１フラグ値を前記ストレージ装置に格納し、
前記データ領域のデータに処理を施して当該データを更新する第２パターンの書込みの場合、その処理内容を示すデータを書込みデータとして前記ストレージ装置および前記取得した最新のバージョン番号と共に前記メモリに格納し、前記書込みデータに関する情報として、自ノードのノード番号と、前記取得した最新のバージョン番号と、旧バージョンの書込みデータとの合併が必要であることを示す第２フラグ値とを前記ストレージ装置に格納して、前記書込用共有ロックを解放する、
請求項１に記載のデータベース装置。
【請求項３】
前記複数のノードそれぞれは、前記メモリを用いて前記ストレージ装置からのデータの読込みを実行するデータ読込み手段を具備し、
前記データ読込み手段は、
読込み対象のデータ領域について他のノードによるデータの読込みとデータの書込みとのうちのデータの書込みのみを禁止する読込用共有ロックを前記ストレージ装置から取得すると共に、前記読込み対象のデータ領域に対する最新の書込みデータに関するノード番号、バージョン番号および第１フラグ値または第２フラグ値を前記ストレージ装置から取得し、
前記ストレージ装置から第１フラグ値が取得され、かつ、前記ストレージ装置から取得されたバージョン番号が前記読込み対象のデータ領域に対する書込みデータと共に前記メモリに格納されるバージョン番号と一致する場合、前記メモリから読込みデータを取得して、前記読込用共有ロックを解放し、
前記ストレージ装置から第１フラグ値が取得され、かつ、前記ストレージ装置から取得されたバージョン番号が前記読込み対象のデータ領域に対する書込みデータと共に前記メモリに格納されるバージョン番号よりも新しい値であった場合、前記取得したノード番号で示される他のノードに対して前記最新の書込みデータの前記ストレージ装置への反映を要求した後、前記ストレージ装置から読込みデータを取得して、前記読込用共有ロックを解放し、
前記ストレージ装置から第２フラグ値が取得された場合、前記読込み対象のデータ領域に対する書込みデータであって、第１フラグ値を持つ書込みデータの中で最も新しいバージョン番号の書込みデータおよびそれ以降のバージョン番号の第２フラグ値を持つ書込みデータを前記ストレージ装置から取得し、前記取得した複数の書込みデータを合併して読込みデータを取得して、前記読込用共有ロックを解放する、
請求項２に記載のデータベース装置。
【請求項４】
前記データ読込み手段は、
前記ストレージ装置から読込みデータを取得する場合、前記ストレージ装置から取得されたバージョン番号と共に前記読込みデータを前記メモリに格納し、
複数の書込みデータを合併して読込みデータを取得する場合、読込み対象のデータ領域について他のノードによるデータの読込みとデータの書込みとの両方を禁止する排他ロックを前記ストレージ装置から取得すると共に、最新のバージョン番号を前記ストレージ装置から取得し、前記読込みデータを書込みデータとして前記ストレージ装置に格納し、前記書込みデータに関する情報として、自ノードのノード番号と、前記取得した最新のバージョン番号と、前記第１フラグ値とを前記ストレージ装置に格納して、前記排他ロックを解放し、前記取得した最新のバージョン番号と共に前記読込みデータを前記メモリに格納する、
請求項３に記載のデータベース装置。
【請求項５】
前記複数のノードそれぞれは、前記メモリに格納されるデータを前記ストレージ装置に反映させるデータ反映手段をさらに具備し、
前記データ反映手段は、
書込み対象のデータ領域に対する最新の書込みデータに関するバージョン番号を前記ストレージ装置から取得し、
前記ストレージ装置から取得されたバージョン番号が前記書込み対象のデータ領域に対する書込みデータと共に前記メモリに格納されるバージョン番号と一致する場合、前記書込み対象のデータ領域について他のノードによるデータの読込みとデータの書込みとの両方を禁止する排他ロックを前記ストレージ装置から取得すると共に、最新のバージョン番号を前記ストレージ装置から取得し、前記メモリに格納されるデータを前記ストレージ装置に格納し、前記書込みデータに関する情報として、自ノードのノード番号と、前記取得した最新のバージョン番号と、前記第１フラグ値とを前記ストレージ装置に格納して、前記排他ロックを解放する、
請求項３に記載のデータベース装置。
【請求項６】
複数のノードがストレージ装置を共有するデータベース装置におけるデータアクセス方法であって、
前記複数のノードそれぞれは、
前記ストレージ装置へのデータの書込みを実行する場合、書込み対象のデータ領域について他のノードによるデータの読込みとデータの書込みとのうちのデータの読込みのみを禁止する書込用共有ロックを前記ストレージ装置から取得すると共に、前記ストレージ装置に対して実行されるデータの書込みの順序を示す最新のバージョン番号を前記ストレージ装置から取得し、
書込みデータを前記取得した最新のバージョン番号と共に自ノードのメモリに格納し、前記書込みデータに関する情報として、自ノードのノード番号と、前記取得した最新のバージョン番号とを前記ストレージ装置に格納して、前記書込用共有ロックを解放する、
データアクセス方法。
【請求項７】
前記複数のノードそれぞれは、
前記データ領域に新たなデータを上書きする第１パターンの書込みの場合、旧バージョンの書込みデータとの合併が不要であることを示す第１フラグ値を前記ストレージ装置に格納し、
前記データ領域のデータに処理を施して当該データを更新する第２パターンの書込みの場合、その処理内容を示すデータを書込みデータとして前記ストレージ装置および前記取得した最新のバージョン番号と共に自ノードのメモリに格納し、前記書込みデータに関する情報として、自ノードのノード番号と、前記取得した最新のバージョン番号と、旧バージョンの書込みデータとの合併が必要であることを示す第２フラグ値とを前記ストレージ装置に格納して、前記書込用共有ロックを解放する、
請求項６に記載のデータアクセス方法。
【請求項８】
前記複数のノードそれぞれは、
前記ストレージ装置からのデータの読込みを実行する場合、読込み対象のデータ領域について他のノードによるデータの読込みとデータの書込みとのうちのデータの書込みのみを禁止する読込用共有ロックを前記ストレージ装置から取得すると共に、前記読込み対象のデータ領域に対する最新の書込みデータに関するノード番号、バージョン番号および第１フラグ値または第２フラグ値を前記ストレージ装置から取得し、
前記ストレージ装置から第１フラグ値が取得され、かつ、前記ストレージ装置から取得されたバージョン番号が前記読込み対象のデータ領域に対する書込みデータと共に前記メモリに格納されるバージョン番号と一致する場合、自ノードのメモリから読込みデータを取得して、前記読込用共有ロックを解放し、
前記ストレージ装置から第１フラグ値が取得され、かつ、前記ストレージ装置から取得されたバージョン番号が前記読込み対象のデータ領域に対する書込みデータと共に自ノードのメモリに格納されるバージョン番号よりも新しい値であった場合、前記取得したノード番号で示される他のノードに対して前記最新の書込みデータの前記ストレージ装置への反映を要求した後、前記ストレージ装置から読込みデータを取得して、前記読込用共有ロックを解放し、
前記ストレージ装置から第２フラグ値が取得された場合、前記読込み対象のデータ領域に対する書込みデータであって、第１フラグ値を持つ書込みデータの中で最も新しいバージョン番号の書込みデータおよびそれ以降のバージョン番号の第２フラグ値を持つ書込みデータを前記ストレージ装置から取得し、前記取得した複数の書込みデータを合併して読込みデータを取得して、前記読込用共有ロックを解放する、
請求項７に記載のデータアクセス方法。
【請求項９】
前記複数のノードそれぞれは、
前記ストレージ装置から読込みデータを取得する場合、前記ストレージ装置から取得されたバージョン番号と共に前記読込みデータを自ノードのメモリに格納し、
複数の書込みデータを合併して読込みデータを取得する場合、読込み対象のデータ領域について他のノードによるデータの読込みとデータの書込みとの両方を禁止する排他ロックを前記ストレージ装置から取得すると共に、最新のバージョン番号を前記ストレージ装置から取得し、前記読込みデータを書込みデータとして前記ストレージ装置に格納し、前記書込みデータに関する情報として、自ノードのノード番号と、前記取得した最新のバージョン番号と、前記第１フラグ値とを前記ストレージ装置に格納して、前記排他ロックを解放し、前記取得した最新のバージョン番号と共に前記読込みデータを自ノードのメモリに格納する、
請求項８に記載のデータアクセス方法。
【請求項１０】
前記複数のノードそれぞれは、
自ノードのメモリに格納されるデータを前記ストレージ装置に反映させる場合、書込み対象のデータ領域に対する最新の書込みデータに関するバージョン番号を前記ストレージ装置から取得し、
前記ストレージ装置から取得されたバージョン番号が前記書込み対象のデータ領域に対する書込みデータと共に自ノードのメモリに格納されるバージョン番号と一致する場合、前記書込み対象のデータ領域について他のノードによるデータの読込みとデータの書込みとの両方を禁止する排他ロックを前記ストレージ装置から取得すると共に、最新のバージョン番号を前記ストレージ装置から取得し、自ノードのメモリに格納されるデータを前記ストレージ装置に格納し、前記書込みデータに関する情報として、自ノードのノード番号と、前記取得した最新のバージョン番号と、前記第１フラグ値とを前記ストレージ装置に格納して、前記排他ロックを解放する、
請求項８に記載のデータアクセス方法。
【発明の詳細な説明】
【技術分野】
【０００１】
本発明の実施形態は、データベース装置およびデータアクセス方法に関する。
【背景技術】
【０００２】
分散データベースは、複数のノード（データベース）と、これら複数のノードから共有されるストレージ装置（共有ストレージ装置）とをネットワークで接続して構成されるシステムである。このような構成の分散データベースでは、共有ストレージ装置内の同一レコードに対するアクセスを、２以上のノードがほぼ同時に実行しようとするといった状況が発生し得る。そのため、共有ストレージ装置内のレコードの整合性（一貫性）を保つために、データの書込みを行う際、他のノードによるデータの読込みおよびデータの書込みを禁止するロックをかける（取得する）といった排他制御を行うことが一般的である。データの読込みを行う際には、通常、他のノードによるデータの読込みおよびデータの書込みのうちのデータの書込みのみを禁止するロックをかける。前者のロックは、排他ロックなどと称され、また、後者のロックは、共有ロックなどと称される。
【先行技術文献】
【特許文献】
【０００３】
【特許文献１】特開平５−１０８４５３号公報
【発明の概要】
【発明が解決しようとする課題】
【０００４】
分散データベースにおいて、ノード数が増加すると、その増加に応じて、共有ストレージ装置に対するノードからのアクセスも増加する。そうすると、各ノードにおいて、他のノードによって取得された排他ロックが解放されるのを待機する排他ロック解放待ちが頻発するようになる。
【０００５】
つまり、データの書込み時に取得される排他ロックが、分散データベースの拡張性を制約する要因となってしまっていた。
【０００６】
本発明が解決しようとする課題は、データの整合性を保証しつつ、データの書込み時における排他ロックの取得を不要とするデータベース装置およびデータアクセス方法を提供することにある。
【課題を解決するための手段】
【０００７】
実施形態によれば、データベース装置は、ストレージ装置と、前記ストレージ装置とネットワークを介して接続される複数のノードとを具備する。前記ストレージ装置は、排他制御手段およびバージョン番号管理手段を具備する。前記排他制御手段は、他のノードによるデータの読込みとデータの書込みとのうちのデータの読込みのみを禁止する書込用共有ロックを含むデータの整合性保持のための各種ロックを前記複数のノードからの要求に応じてデータ領域単位に設定および解除する。前記バージョン番号管理手段は、前記ストレージ装置に対して実行されるデータの書込みの順序を示すバージョン番号を管理する。前記複数のノードそれぞれは、メモリおよびデータ書込み手段を具備する。前記メモリには、前記ストレージ装置のデータ用のキャッシュ領域が確保される。前記データ書込み手段は、前記メモリを用いて前記ストレージ装置へのデータの書込みを実行する。前記データ書込み手段は、書込み対象のデータ領域について前記書込用共有ロックを前記ストレージ装置から取得すると共に、最新のバージョン番号を前記ストレージ装置から取得する。前記データ書込み手段は、書込みデータを前記取得した最新のバージョン番号と共に前記メモリに格納し、前記書込みデータに関する情報として、自ノードのノード番号と、前記取得した最新のバージョン番号とを前記ストレージ装置に格納して、前記書込用共有ロックを解放する。
【図面の簡単な説明】
【０００８】
【図１】実施形態の分散データベースの一構成例を示す図。
【図２】分散データベースのロックによるアクセス制限を説明するための図。
【図３】実施形態の分散データベースで達成される応答性能の向上を説明するための図。
【図４】実施形態の分散データベースで管理されるバージョン番号の一インクリメント例を示す図。
【図５】実施形態の分散データベースにおけるノードによる共有ストレージ装置へのレコードの書込み手順を説明するための図。
【図６】実施形態の分散データベースで実行されるレコードの書込みの２つのパターンを示す図。
【図７】実施形態の分散データベースにおけるノードによる共有ストレージ装置からのレコードの読込み手順を説明するための図。
【図８】実施形態の分散データベースにおけるレコードの整合性の保持を説明するための第１の図。
【図９】実施形態の分散データベースにおけるレコードの整合性の保持を説明するための第２の図。
【図１０】実施形態の分散データベースにおけるノードによる共有ストレージ装置への上書型でのレコードの書込み時の動作手順を示すフローチャート。
【図１１】実施形態の分散データベースにおけるノードによる共有ストレージ装置への合併型でのレコードの書込み時の動作手順を示すフローチャート。
【図１２】実施形態の分散データベースにおけるノードによる共有ストレージ装置からのレコードの読込み時の動作手順を示すフローチャート。
【図１３】実施形態の分散データベースにおいて実行されるレコード反映処理の動作手順を示すフローチャート。
【図１４】実施形態の分散データベースにおいて実行されるレコード合併処理の動作手順を示すフローチャート。
【発明を実施するための形態】
【０００９】
以下、実施の形態について図面を参照して説明する。
【００１０】
図１は、本実施形態に係る分散データベースの一構成例を示す図である。
【００１１】
図１に示すように、本分散データベースは、複数のノード（データベース）１０と、これら複数のノード１０から共有される共有ストレージ装置２０とが、ネットワークで接続される構成を持つ。各ノード１０は、データの読込み要求や、データの書込み要求を受付け、共有ストレージ装置２０からのデータの読込みや、共有ストレージ装置２０へのデータの書込みを実行する。なお、ここでは、各ノード１０が共有ストレージ装置２０にアクセスする際のデータ領域単位をレコード単位と想定し、以下、例えば、共有ストレージ装置２０へのデータの書込みや共有ストレージ装置２０からのデータの読込み等を、共有ストレージ装置２０へのレコードの書込みや共有ストレージ装置２０からのレコードの読込み等と称する。
【００１２】
各ノード１０は、共有ストレージ装置２０のレコード用のキャッシュ領域（キャッシュ１１１）が確保されるメモリ１１０を備え、このメモリ１１０を用いて、レコードの読込み要求およびレコードの書込み要求に対する応答時間の短縮を図っている。例えば、レコードの読込みが要求された際、読込み対象のレコードがメモリ１１０に格納されていた場合には、そのレコードをメモリ１１０から取得することで、共有ストレージ装置２０に対するアクセスを不要とし、レコードの読込み要求に対する応答時間を短縮する。レコードの書込み要求に対する応答時間の短縮は、メモリ１１０を用いて、いわゆるライトバック方式の書込みを行うことで、共有ストレージ装置２０に対するアクセスを不要とする。複数のノード１０間でのレコードの整合性保持については後述する。
【００１３】
また、各ノード１０のメモリ１１０には、共有ストレージ装置２０のレコードの整合性を保つべくキャッシュ１１１を管理するためのキャッシュ管理情報用のデータ領域１１２も確保される。例えば、レコードの読込みが要求された際、読込み対象のレコードがメモリ１１０に格納されていた場合、各ノード１０は、キャッシュ管理情報に基づき、このメモリ１１０上のレコードを読込み対象のレコードとして取得可能か否かを判断する。読込み対象のレコードとして取得できない場合とは、典型的には、レコードをメモリ１１０に格納した後、他のノード１０により当該レコードが書換えられた場合である。
【００１４】
図２は、複数のノード１０が共有ストレージ装置２０にアクセス可能な分散データベースにおける共有ストレージ装置２０のレコードの整合性を保つためのロックによるアクセス制限を説明するための図である。図２中、（Ａ）は、従来の分散データベースのロックによるアクセス制限を示し、（Ｂ）は、本実施形態の分散データベースのロックによるアクセス制限を示している。
【００１５】
従来の分散データベースでは、図２（Ａ）に示されるように、あるノード１０が共有ストレージ装置２０へレコードを書込む場合、そのノード１０は、書込み対象のレコードについて、他のノード１０によるレコードの読込みおよびレコードの書込みを禁止する排他ロックを取得する。このロックによるアクセス制限は、排他制御と称される。この排他ロックがいずれかのノード１０で取得されている場合、他のノード１０は、この排他ロックが解放されるまで、そのレコードの書込みを実行することはできない。
【００１６】
なお、レコードの読込み時においては、読込み対象のレコードについて、他のノード１０によるレコードの読込みとレコードの書込みとのうちのレコードの書込みのみを禁止する共有ロックが取得される。この共有ロックがいずれかのノード１０で取得されている場合であっても、他のノード１０は、そのレコードの読込みを実行することができる（共有ロックを取得することができる）。
【００１７】
これに対して、本実施形態の分散データベースでは、図２（Ｂ）に示されるように、書込用共有ロックを新設し、レコードの書込みを行うノード１０は、この書込用共有ロックを取得する。書込用共有ロックは、他のノードによるレコードの読込みとレコードの書込みとのうちのレコードの読込みのみを禁止するものである。この書込用共有ロックがいずれかのノード１０で取得されている場合であっても、他のノード１０は、そのレコードの書込みを実行することができる（書込用共有ロックを取得することができる）。
【００１８】
図３は、書込用共有ロックを新設する本分散データベースで達成される応答性能の向上について説明するための図である。
【００１９】
図３中、（Ａ）は、従来の分散データベースにおいて共有ストレージ装置２０内の同一レコードについて複数のノード１０がほぼ同時に書込みを行おうとした場合の処理の流れを示し、（Ｂ）は、本実施形態の分散データベースにおいて共有ストレージ装置２０内の同一レコードについて複数のノード１０がほぼ同時に書込みを行おうとした場合の処理の流れを示している。
【００２０】
前述したように、従来の分散データベースでは、レコードの書込み時、そのレコードについて、他のノード１０によるレコードの読込みおよびレコードの書込みを禁止する排他ロックが取得される。従って、このレコードの書込みを行おうとしている他のノード１０は、この排他ロックが解放されるまで待機することが強いられる。排他ロックは、一時に１台のノード１０のみが取得可能であるので、共有ストレージ装置２０内の同一レコードについて複数のノード１０がほぼ同時に書込みを行おうとした場合、図３（Ａ）に示されるように、排他ロックを取得できた順に、複数のノード１０が１台ずつレコードの書込みを行うこととなる。よって、当該複数のノード１０の台数分の書込み時間を要することとなる。
【００２１】
一方、本実施形態の分散データベースでは、レコードの書込み時、そのレコードについて、他のノード１０によるレコードの読込みとレコードの書込みとのうちのレコードの読込みのみを禁止する書込用共有ロックが取得される。書込用共有ロックは、一時に複数のノード１０が取得可能であるので、共有ストレージ装置２０内の同一レコードについて複数のノード１０がほぼ同時に書込みを行おうとした場合、図３（Ｂ）に示されるように、複数のノード１０がレコードの書込みを並行して実行できる。よって、ほぼ１回分の書込み時間で済むこととなる。
【００２２】
この点を踏まえて、以下、共有ストレージ装置２０内の同一レコードについて複数のノード１０が書込みを並行して実行できるようにする本実施形態の分散データベースの基本原理について詳述する。
【００２３】
再び、図１を参照する。
【００２４】
図１に示すように、複数のノード１０それぞれは、レコード読込機能部１１、レコード書込機能部１２、レコード合併機能部１３およびレコード反映機能部１４を有する。これら各機能部は、例えば、記憶媒体に格納され、プロセッサによって実行されるソフトウェア（プログラム）により実現可能である。
【００２５】
前述したように、各ノード１０は、メモリ１１０、より具体的には、キャッシュ１１１を用いて、レコードの読込み要求およびレコードの書込み要求に対する応答時間の短縮を図っている。また、各ノード１０は、共有ストレージ装置２０のレコードの整合性を保つべくキャッシュ１１１を管理するために、メモリ１１０上でキャッシュ管理情報を管理する。キャッシュ管理情報には、バージョン番号およびロック情報が含まれる。
【００２６】
本分散データベースは、共有ストレージ装置２０に対して実行されるレコードの書込みの順序を示すバージョン番号を管理する。バージョン番号は、いずれかのノード１０が共有ストレージ装置２０へのレコードの書込みを実行する毎にインクリメントされる。図４に、このバージョン番号の一インクリメント例を示す。
【００２７】
図４は、（ａ）ノードＡによるレコード１に対する書込み、（ｂ）ノードＢによるレコード１に対する書込み、（ｃ）ノードＡによるレコード２に対する書込み、の順に、共有ストレージ装置２０へのレコードの書込みが実行されたことに伴い、バージョン番号がインクリメントされるケースを示している。図４に示すように、バージョン番号は、（ノード単位やレコード単位ではなく）分散データベース全体で一意の値となるようにインクリメントされる。
【００２８】
各ノード１０は、このバージョン番号を、キャッシュ１１１に格納されるすべてのレコード分、メモリ１１０上で管理する。ロック情報は、読込用共有ロック、書込用共有ロックおよび排他ロックのレコード単位の取得状況を示す情報である。
【００２９】
一方、共有ストレージ装置２０は、排他制御機能部２１およびバージョン加算機能部２２を有する。これら各機能部も、例えば、記憶媒体に格納され、プロセッサによって実行されるソフトウェア（プログラム）により実現可能である。
【００３０】
また、共有ストレージ装置２０は、共有記憶領域２１０を備えている。共有ストレージ装置２０は、この共有記憶領域２１０内において、レコード２１１および最新バージョン番号２１２を管理する。各レコード２１１は、バージョン番号、ノード番号、ロック情報および合併フラグを含む管理情報２１１Ａを持つ。バージョン番号は、そのレコード２１１の書込み時におけるバージョン番号である。ノード番号は、そのレコード２１１の書込みを行ったノード１０の識別番号である。ロック情報は、そのレコードに関する読込用共有ロック、書込用共有ロックおよび排他ロックの取得状況を示す情報である。合併フラグについては後述する。
【００３１】
まず、図５を参照しながら、本分散データベースにおけるノード１０による共有ストレージ装置２０へのレコード２１１の書込み手順について説明する。
【００３２】
ノード１０のレコード書込機能部１２は、共有ストレージ装置２０へのレコード２１１の書込みを実行するモジュールである。レコード書込機能部１２は、レコード２１１の書込み要求を受けると（図５の（１））、まず、そのレコード２１１に関する書込用共有ロックを取得する（図５の（２））。共有ストレージ装置２０の排他制御機能部２１は、読込用共有ロック、書込用共有ロックおよび排他ロックの設定および解除を制御するモジュールである。
【００３３】
次に、レコード書込機能部１２は、共有ストレージ装置２０側で管理される最新バージョン番号２１２を加算し（図５の（３））、加算された最新バージョン番号２１２を取得する（図５の（４））。共有ストレージ装置２０のバージョン加算機能部２２は、最新バージョン番号２１２のインクリメントを司るモジュールである。
【００３４】
続いて、レコード書込機能部１２は、書込み対象のレコード２１１をキャッシュ１１１に格納すると共に、取得した最新バージョン番号２１２をキャッシュ管理情報としてメモリ１１０に格納する（図５の（５））。
【００３５】
図６に、本分散データベースで実行されるレコード２１１の書込みの２つのパターンを示す。
【００３６】
図６中、（Ａ）は、第１パターンの書込みの一例を示している。図６（Ａ）は、「ａｐｐｌｅ」という値を持つレコードが、「ｂａｎａｎａ」→「ｏｒａｎｇｅ」と書換えられるケースを示している。このように、新しい内容に置換えるレコードの書込みを、ここでは、上書型と称する。
【００３７】
レコード２１１の書込みが上書型の場合、レコード書込機能部１２は、キャッシュ１１１に格納したレコード２１１に関する管理情報２１１Ａとして、メモリ１１０に格納したバージョン番号と、自ノード１０のノード番号と、合併フラグ値「１」を共有ストレージ装置２０に格納する（図５の（６））。
【００３８】
また、図６（Ｂ）は、第２パターンの書込みの一例を示している。図６（Ｂ）は、「１０」という値を持つレコードの値が、「１０加算」→「１０加算」→「１０加算」→「５乗算」と種々の処理が施されて更新されるケースを示している。このように、書込み前の内容を加工するレコードの書込みを、ここでは、合併型と称する。
【００３９】
レコード２１１の書込みが合併型の場合、レコード書込機能部１２は、処理内容を示すデータ（例えば「１０加算」を示すデータ）が記録されるレコード２１１を書込み対象のレコード２１１としてキャッシュ１１１に格納する（図５の（５））。なお、合併型の書込みの場合は、このレコード２１１のキャッシュ１１１への格納（図５の（５））は必須ではない。
【００４０】
また、レコード２１１の書込みが合併型の場合、レコード書込機能部１２は、書込み対象のレコード２１１に関する管理情報２１１Ａとして、メモリ１１０に格納したバージョン番号と、自ノード１０のノード番号と、合併フラグ値「０」を共有ストレージ装置２０に格納し（図５の（６））、さらに、前述の処理内容を示すデータ（例えば「１０加算」を示すデータ）が記録されるレコード２１１を書込み対象のレコード２１１として共有ストレージ装置２０に格納する（図５の（６）´）。
【００４１】
つまり、図６からも明らかなように、合併フラグは、その値が「０」の場合、そのレコードは合併型で書込まれたものであって、レコード２１１の最新の値を得るためには旧バージョンのレコード２１１との合併が必要であることを示す。また、その値が「１」の場合、そのレコードは上書型で書込まれたものであるか、または、合併型で書込まれたが合併済みであり、レコードの最新の値を得るための合併が不要であることを示す。
【００４２】
なお、上書型の書込みと、合併型の書込みとは、同一レコードに対して混在させることが可能である。例えば、合併型の書込みで更新が重ねられてきたレコードの値を、上書型の書込みで初期値にリセットするといったことを行うことができる。
【００４３】
また、図６では、判り易くするために、同一レコードのバージョン番号を連番としているが、前述したように、バージョン番号は、分散データベース全体におけるレコードの書込み順序を示す。
【００４４】
以上の処理を完了すると、レコード書込機能部１２は、書込み対象のレコード２１１に関する書込用共有ロックを解放する（図５の（７））。
【００４５】
次に、図７を参照しながら、本分散データベースにおけるノード１０による共有ストレージ装置２０からのレコード２１１の読込み手順について説明する。
【００４６】
ノード１０のレコード読込機能部１１は、共有ストレージ装置２０からのレコード２１１の読込みを実行するモジュールである。レコード読込機能部１１は、レコード２１１の読込み要求を受けると（図７の（１））、まず、そのレコード２１１に関する読込用共有ロックを取得する（図７の（２））。
【００４７】
次に、レコード読込機能部１１は、そのレコード２１１の最新のバージョン番号（分散データベース全体の最新のバージョン番号ではない）、ノード番号および合併フラグ値を共有ストレージ装置２０から取得する（図７の（３））。合併フラグ値「１」が取得された場合、レコード読込機能部１１は、共有ストレージ装置２０から取得したバージョン番号と、メモリ１１０に格納される当該レコード２１１のバージョン番号とを比較する（図７の（４））。２つのバージョン番号が一致する場合、レコード読込機能部１１は、メモリ１１０、より具体的には、キャッシュ１１１から読込み対象のレコード２１１を取得する。
【００４８】
メモリ１１０に格納されるバージョン番号が共有ストレージ装置２０から取得したバージョン番号よりも古い場合、レコード読込機能部１１は、共有ストレージ装置２０から取得したノード番号で示される他のノード１０、つまり、最新のレコード２１１を保有する他のノード１０に対し、そのレコード２１１の共有ストレージ装置２０への反映を要求する（図７の（５Ａ））。この要求を受けた他のノード１０は、キャッシュ１１１に格納される当該最新のレコード２１１の共有ストレージ装置２０への書込みを実行する（図７の（５Ａ）´）。レコード反映機能部１４は、キャッシュ１１１に格納された（共有ストレージ装置２０に未反映の）レコード２１１を共有ストレージ装置２０に反映させる処理を実行するモジュールである。レコード読込機能部１１は、反映後のレコード２１１（読込み対象のレコード）を共有ストレージ装置２０から取得して、キャッシュ１１１に格納する（図７の（６））。なお、最新のレコード２１１を保有する他のノード１０が当該最新のレコード２１１を共有ストレージ装置２０に反映済みであった場合、他のノード１０に対する最新のレコード２１１の反映要求（図７の（５Ａ））は不要である。未反映か反映済みかは、最新バージョンのレコード２１１（実データ）が共有ストレージ装置２０に存在するか否かで判断できる。
【００４９】
また、合併フラグ値「０」が取得された場合、レコード読込機能部１１は、レコード合併機能部１３に対して、最新の書込みが合併型で行われて未合併の状態にある当該レコード２１１の合併を指示する。レコード合併機能部１３は、合併型で書込まれたレコードの合併を実行するモジュールである。レコード合併機能部１３は、レコード読込機能部１１から指示されたレコード２１１の合併を実行し（図７の（５Ｂ））、レコード読込機能部１１は、合併後のレコード２１１（読込み対象のレコード）を共有ストレージ装置２０から取得して、キャッシュ１１１に格納する（図７の（６））。
【００５０】
レコード合併機能部１３によるレコード２１１の合併の概要を説明すると、レコード合併機能部１３は、合併フラグ値「１」の中で最も新しいバージョン番号のレコード２１１と、それ以降の（合併フラグ値「０」の）バージョン番号のすべてのレコード２１１とを取得し、バージョン番号の昇順にレコード２１１の合併を行い、合併後のレコード２１１を共有ストレージ装置２０に格納すると共に、当該レコード２１１に関する管理情報２１１Ａとして、合併フラグ値「１」を共有ストレージ装置２０に格納する。
【００５１】
以上の処理を完了すると、レコード読込機能部１１は、読込み対象のレコード２１１に関する読込用共有ロックを解放する（図７の（７））。
【００５２】
続いて、図８および図９を参照して、書込用共有ロックを新設して複数のノード１０が同一レコード２１１を対象とする書込みを並行して実行できるようにした本分散データベースにおけるレコード２１１の整合性の保持について説明する。
【００５３】
図８は、複数のノード１０が並行して上書型の書込みを行ったレコード２１１の整合性が保たれる原理を示す図である。
【００５４】
図８には、（ａ）ノードＡによるレコード１に対する上書型の書込み、（ｂ）ノードＢによるレコード１に対する上書型の書込み、が実行された後、（ｃ）ノードＡによるレコード１に対する読込みが実行されるケースが示されている。より具体的には、ノードＡがレコード１に「ｂａｎａｎａ」を書込み、ノードＢがレコード１に「ａｐｐｌｅ」に書き込んだ後（「ｂａｎａｎａ」→「ａｐｐｌｅ」の置換えが行われた後）、ノードＡが自ノードにキャッシュされる「ｂａｎａｎａ」ではなく、ノードＢにキャッシュされる「ａｐｐｌｅ」を、レコード１の読込みで取得するケースである。
【００５５】
図８に示されるように、ノードＡがレコード１に「ｂａｎａｎａ」を書込む際、バージョン番号「１」が取得されている。また、ノードＢがレコード１に「ａｐｐｌｅ」を書込む際には、バージョン番号「２」が取得されている。なお、ここでは、判り易くするために、レコード１について取得されるバージョン番号を便宜的に連番としている。また、上書型の書込みなので、合併フラグの値は「１」である。
【００５６】
ノードＡは、レコード１を読込む際、最新のバージョン番号を調べる。ここでは、最新のバージョン番号が「２」であるのに対し、自ノードにキャッシュされるレコード１のバージョン番号は「１」と古い。そこで、ノードＡは、最新のレコード１をキャッシュするノードＢに対し、当該最新のレコード１の共有ストレージ装置２０への反映を要求し、反映後のレコード１を取得する。
【００５７】
このように、複数のノード１０が並行して上書型の書込みを行ったレコード２１１の整合性は何ら問題なく保たれる。
【００５８】
また、図９は、複数のノード１０が並行して合併型の書込みを行ったレコード２１１の整合性が保たれる原理を示す図である。
【００５９】
図９には、（ａ）ノードＡによるレコード１に対する合併型の書込み、（ｂ）ノードＢによるレコード１に対する合併型の書込み、が実行された後、（ｃ）ノードＡによるレコード１に対する読込みが実行されるケースが示されている。より具体的には、ノードＡがレコード１の値（初期値「０」）に「１００加算」の処理を施し、ノードＢがレコード１の値に「２乗算」の処理を施した後、ノードＡが自ノードにキャッシュされる「１００加算」の結果である「１００」ではなく、次のノードＢにキャッシュされる「２乗算」の結果である「２００」を、レコード１の読込みで取得するケースである。
【００６０】
図９に示されるように、ノードＡがレコード１に「１００加算」を書込む際、バージョン番号「１」が取得されている。また、ノードＢがレコード１に「２乗算」を書込む際には、バージョン番号「２」が取得されている。なお、ここでも、判り易くするために、レコード１について取得されるバージョン番号を便宜的に連番としている。また、ノードＡおよびノードＢがレコード１をキャッシュする例を示しているが、前述したように、合併型の書込みの場合、書込み対象のレコード２１１のキャッシュ１１１への格納は必須ではない。また、合併型の書込みなので、合併フラグの値は「０」である。
【００６１】
ノードＡは、レコード１を読込む際、合併フラグを調べる。読込み時当初の最新のバージョン番号は「２」であり、その合併フラグの値は「０」である。そこで、ノードＡは、レコード１の合併を行い、合併後のレコード１を取得する。ノードＡは、取得した合併後のレコード１をキャッシュ１１１および共有ストレージ装置２０の両方に格納する。
【００６２】
このように、複数のノード１０が並行して合併型の書込みを行ったレコード２１１の整合性も何ら問題なく保たれる。
【００６３】
図１０は、本分散データベースにおけるノード１０による共有ストレージ装置２０への上書型でのレコード２１１の書込み時の動作手順を示すフローチャートである。
【００６４】
まず、ノード１０は、共有ストレージ装置２０から最新バージョン番号と書込用共有ロックを取得する（ブロックＡ１）。書込用共有ロックが取得できた場合（ブロックＡ２のＹＥＳ）、ノード１０は、キャッシュ１１１にレコード２１１を格納、即ち、キャッシュ１１１のレコード２１１を更新する（ブロックＡ３）。書込用共有ロックの取得に成功する場合とは、いずれのノード１０もロックを取得していない場合または他のノード１０が書込用共有ロックを取得している場合である。つまり、書込用共有ロックは、複数のノード１０が同一レコード２１１について並行して取得可能なロックである。
【００６５】
キャッシュ１１１のレコード２１１を更新したら、ノード１０は、共有ストレージ装置２０にバージョン番号と合併フラグを書込み、書込用共有ロックを解放する（ブロックＡ４）。この時に書込まれる合併フラグの値は「１」である。なお、書込用共有ロックが取得できなかった場合（ブロックＡ２のＮＯ）、ノード１０は、書込み要求の発行元に対して、ロック取得失敗のエラーを返却する（ブロックＡ５）。書込み要求の発行元は、このエラーの返却を受けて、要求した処理が失敗したことを認識する。
【００６６】
図１１は、本分散データベースにおけるノード１０による共有ストレージ装置２０への合併型でのレコード２１１の書込み時の動作手順を示すフローチャートである。
【００６７】
合併型の書込みの場合も、ノード１０は、まず、共有ストレージ装置２０から最新バージョン番号と書込用共有ロックを取得する（ブロックＢ１）。書込用共有ロックが取得できた場合（ブロックＢ２のＹＥＳ）、ノード１０は、共有ストレージ装置２０にバージョン番号と合併フラグとレコード２１１を書込み、書込用共有ロックを解放する（ブロックＢ３）。この時に書込まれる合併フラグの値は「０」である。また、この時に書き込まれるレコード２１１には、処理内容を示すデータが記録されている。なお、書込用共有ロックの取得に成功する場合とは、上書型の書込みの場合と同様、いずれのノード１０もロックを取得していない場合または他のノード１０が書込用共有ロックを取得している場合である。このように、書込用共有ロックは、上書型、合併型を問わず、複数のノード１０が同一レコード２１１について並行して取得可能なロックである。また、図１１には、レコード２１１のキャッシュ１１１への格納を省略する場合の動作手順を示している。
【００６８】
なお、書込用共有ロックが取得できなかった場合（ブロックＢ２のＮＯ）、ノード１０は、上書型の書込みの場合と同様、書込み要求の発行元に対して、ロック取得失敗のエラーを返却する（ブロックＢ４）。書込み要求の発行元は、このエラーの返却を受けて、要求した処理が失敗したことを認識する。
【００６９】
図１２は、本分散データベースにおけるノード１０による共有ストレージ装置２０からのレコード２１１の読込み時の動作手順を示すフローチャートである。
【００７０】
まず、ノード１０は、共有ストレージ装置２０から対象レコード２１１の直近バージョン番号と合併フラグと読込用共有ロックを取得する（ブロックＣ１）。読込用共有ロックが取得できた場合（ブロックＣ２のＹＥＳ）、ノード１０は、合併フラグの値が「１」か否かを調べる（ブロックＣ３）。
【００７１】
合併フラグの値が「１」である場合（ブロックＣ３のＹＥＳ）、ノード１０は、キャッシュ１１１にレコード２１１が存在するか否かを調べる（ブロックＣ４）。レコード２１１が存在する場合（ブロックＣ４のＹＥＳ）、ノード１０は、共有ストレージ装置２０から取得したバージョン番号とキャッシュ１１１に格納されるバージョン番号との比較により、キャッシュ１１１に存在するレコード２１１が最新バージョンか否かを調べる（ブロックＣ５）。
【００７２】
最新バージョンである場合（ブロックＣ５のＹＥＳ）、ノード１０は、そのまま、キャッシュ１１１から読込み対象のレコード２１１を取得し（ブロックＣ６）、読込用共用ロックを解放する（ブロックＣ７）。
【００７３】
キャッシュ１１１にレコード２１１が存在しない場合（ブロックＣ４のＮＯ）またはキャッシュ１１１に存在するレコード２１１が最新バージョンでない場合（ブロックＣ５のＮＯ）、ノード１０は、共有ストレージ装置２０に最新バージョンのレコード２１１が反映されているか否かを調べる（ブロックＣ８）。反映されていれば（ブロックＣ８のＹＥＳ）、ノード１０は、共有ストレージ装置２０からキャッシュ１１１にレコード２１１を転送した上で（ブロックＣ９）、キャッシュ１１１から読込み対象のレコード２１１を取得し（ブロックＣ６）、読込用共用ロックを解放する（ブロックＣ７）。
【００７４】
反映されていなければ（ブロックＣ８のＮＯ）、ノード１０は、図１３に動作手順が示されるレコード反映処理を実行し（ブロックＣ１０）、かつ、共有ストレージ装置２０からキャッシュ１１１にレコード２１１を転送した上で（ブロックＣ９）、キャッシュ１１１から読込み対象のレコード２１１を取得し（ブロックＣ６）、読込用共用ロックを解放する（ブロックＣ７）。
【００７５】
合併フラグの値が「０」である場合（ブロックＣ３のＮＯ）、ノード１０は、図１４に動作手順が示されるレコード合併処理を実行し（ブロックＣ１１）、かつ、共有ストレージ装置２０からキャッシュ１１１にレコード２１１を転送した上で（ブロックＣ９）、キャッシュ１１１から読込み対象のレコード２１１を取得し（ブロックＣ６）、読込用共用ロックを解放する（ブロックＣ７）。
【００７６】
なお、読込用共有ロックが取得できなかった場合（ブロックＣ２のＮＯ）、ノード１０は、書込みの場合と同様、読込み要求の発行元に対して、ロック取得失敗のエラーを返却する（ブロックＣ１２）。このエラーの返却を受けて、読込み要求の発行元は、要求した処理が失敗したことを認識する。
【００７７】
図１３は、本分散データベースにおいて実行されるレコード反映処理の動作手順を示すフローチャートである。
【００７８】
図１３中、（Ａ）は、最新バージョンのレコード２１１を共有ストレージ装置２０に反映することを要求する側のノード１０の動作手順を示し、（Ｂ）は、最新バージョンのレコード２１１を共有ストレージ装置２０に反映することを要求された側のノード１０の動作手順を示している。
【００７９】
読込み対象のレコード２１１がキャッシュ１１１に存在しない場合またはキャッシュ１１１に存在する読込み対象のレコード２１１が最新バージョンでない場合であって、共有ストレージ装置２０に最新バージョンのレコード２１１が反映されていない場合、ノード１０は、最新バージョンのレコード２１１をキャッシュ１１１に格納する（ノード番号で示される）他のノード１０に対して、最新バージョンのレコード２１１を共有ストレージ装置２０に反映することを要求する（ブロックＤ１１）。
【００８０】
一方、レコード反映要求を受けたノード１０は、共有ストレージ装置２０に格納されるレコード２１１の直近バージョン番号を取得し（ブロックＤ２１）、共有ストレージ装置２０のレコード２１１が旧バージョンであることを確認する（ブロックＤ２２）。旧バージョンであることを確認したら（ブロックＤ２２のＹＥＳ）、ノード１０は、共有ストレージ装置２０から排他ロックを取得する（ブロックＤ２３）。排他ロックが取得できた場合（ブロックＤ２４のＹＥＳ）、ノード１０は、キャッシュ１１１のレコード２１１を共有ストレージ装置２０に書込み、排他ロックを解放する（ブロックＤ２５）。
【００８１】
なお、レコード反映要求が生じるケースとしては、ここで説明する外部（他のノード１０）から要求されるケースのほか、キャッシュ置換と称される処理を行うケースが存在する。キャッシュ置換とは、キャッシュ１１１のデータを共有ストレージ装置２０に戻すことを保証するための処理である。このキャッシュ置換の場合、ノード１０は、キャッシュ１１１のレコード２１１を共有ストレージ装置２０に書込んだ後、そのレコード２１１をキャッシュ１１１から削除する（ブロックＤ２６）。
【００８２】
排他ロックが取得できなかった場合（ブロックＤ２４のＮＯ）、ノード１０は、反映要求の発行元に対して、ロック取得失敗のエラーを返却する（ブロックＤ２７）。このエラーの返却を受けて、反映要求の発行元は、要求した処理が失敗したことを認識する。
【００８３】
図１４は、本分散データベースにおいて実行されるレコード合併処理の動作手順を示すフローチャートである。
【００８４】
合併型で書込まれて未合併のレコード２１１を合併する場合、ノード１０は、まず、共有ストレージ装置２０から排他ロックを取得する（ブロックＥ１）。排他ロックが取得できた場合（ブロックＥ２のＹＥＳ）、ノード１０は、共有ストレージ装置２０から、対象レコード２１１のうち、合併フラグが「１」の直近バージョンとそれ以降の合併フラグが「０」のレコード２１１とを取得する（ブロックＥ３）。
【００８５】
ノード１０は、取得したレコード２１１を基に、当該レコード２１１を最新バージョンに合併する（ブロックＥ４）。ノード１０は、キャッシュ１１１に合併後のレコード２１１とバージョン番号を書込むと共に（ブロックＥ５）、共有ストレージ装置２０に合併後のレコード２１１を書込み（ブロックＥ６）、排他ロックを解放する（ブロックＥ７）。
【００８６】
このように、本分散データベースによれば、データの整合性を保証しつつ、データの書込み時における排他ロックの取得を不要とすることが実現される。
【００８７】
ところで、以上の説明では、各ノード１０が共有ストレージ装置２０にアクセスする際のデータ領域単位をレコード単位と想定し、バージョン番号や合併フラグをレコード２１１毎に管理する例を示したが、これに限らず、例えば、バージョン番号や合併フラグをフィールド毎に管理するようにしてもよい。
【００８８】
また、以上の説明では、レコード２１１の書込みが上書型および合併型の２つのパターンで実行され得る例を示したが、本分散データベースのデータアクセス手法は、上書型または合併型の一方のみが実行される場合においても有効である。上書型の書込みのみが実行される場合、合併フラグの管理を不要とすることができる。
【００８９】
各実施形態の動作手順は、ソフトウェア（プログラム）によって実現することができるので、このソフトウェアを格納したコンピュータ読み取り可能な記憶媒体を通じてこのソフトウェアを通常のコンピュータにインストールして実行することにより、各実施形態と同様の効果を容易に実現することができる。
【００９０】
本発明のいくつかの実施形態を説明したが、これらの実施形態は、例として提示したものであり、発明の範囲を限定することは意図していない。これら新規な実施形態は、その他の様々な形態で実施されることが可能であり、発明の要旨を逸脱しない範囲で、種々の省略、置換え、変更を行うことができる。これら実施形態やその変形は、発明の範囲や要旨に含まれると共に、特許請求の範囲に記載された発明とその均等の範囲に含まれる。
【符号の説明】
【００９１】
１０…ノード、１１…レコード読込機能部、１２…レコード書込機能部、１３…レコード合併機能部、１４…レコード反映機能部、２０…共有ストレージ装置、２１…排他制御機能部、２２…バージョン加算機能部、１１０…メモリ、１１１…キャッシュ、１１２…データ領域、２１０…共有記憶領域、２１１…レコード、２１１Ａ…管理情報
【図１】
2015230689.tif 000003
【図２】
2015230689.tif 000004
【図３】
2015230689.tif 000005
【図４】
2015230689.tif 000006
【図５】
2015230689.tif 000007
【図６】
2015230689.tif 000008
【図７】
2015230689.tif 000009
【図８】
2015230689.tif 000010
【図９】
2015230689.tif 000011
【図１０】
2015230689.tif 000012
【図１１】
2015230689.tif 000013
【図１２】
2015230689.tif 000014
【図１３】
2015230689.tif 000015
【図１４】
2015230689.tif 000016