IP Force 特許公報掲載プロジェクト 2022.1.31 β版

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

▶ 株式会社Scalarの特許一覧

特開2022-180556ビザンチン故障を検知するデータ管理システム及び方法
<>
  • 特開-ビザンチン故障を検知するデータ管理システム及び方法 図1
  • 特開-ビザンチン故障を検知するデータ管理システム及び方法 図2
  • 特開-ビザンチン故障を検知するデータ管理システム及び方法 図3
  • 特開-ビザンチン故障を検知するデータ管理システム及び方法 図4
  • 特開-ビザンチン故障を検知するデータ管理システム及び方法 図5
  • 特開-ビザンチン故障を検知するデータ管理システム及び方法 図6
  • 特開-ビザンチン故障を検知するデータ管理システム及び方法 図7
  • 特開-ビザンチン故障を検知するデータ管理システム及び方法 図8
  • 特開-ビザンチン故障を検知するデータ管理システム及び方法 図9
  • 特開-ビザンチン故障を検知するデータ管理システム及び方法 図10
  • 特開-ビザンチン故障を検知するデータ管理システム及び方法 図11
  • 特開-ビザンチン故障を検知するデータ管理システム及び方法 図12
  • 特開-ビザンチン故障を検知するデータ管理システム及び方法 図13
< >
(19)【発行国】日本国特許庁(JP)
(12)【公報種別】公開特許公報(A)
(11)【公開番号】P2022180556
(43)【公開日】2022-12-06
(54)【発明の名称】ビザンチン故障を検知するデータ管理システム及び方法
(51)【国際特許分類】
   G06F 16/182 20190101AFI20221129BHJP
【FI】
G06F16/182
【審査請求】未請求
【請求項の数】13
【出願形態】OL
(21)【出願番号】P 2022151926
(22)【出願日】2022-09-22
(62)【分割の表示】P 2022531632の分割
【原出願日】2022-05-24
(31)【優先権主張番号】63/192,211
(32)【優先日】2021-05-24
(33)【優先権主張国・地域又は機関】US
(31)【優先権主張番号】63/327,586
(32)【優先日】2022-04-05
(33)【優先権主張国・地域又は機関】US
(71)【出願人】
【識別番号】519026250
【氏名又は名称】株式会社Scalar
(74)【代理人】
【識別番号】110002365
【氏名又は名称】特許業務法人サンネクスト国際特許事務所
(72)【発明者】
【氏名】山田 浩之
(57)【要約】      (修正有)
【課題】トランザクションを並列実行しつつビザンチン故障を検知する。
【解決手段】データベースシステムは、クライアントと、同一のトランザクション要求について同じ決定的関数を実行する第1のシステム150Pの第1のサーバ155Pと、第2のシステム150Sの第2のサーバ155Sと、を備える。トランザクション要求毎に、順序付けフェーズにおいて、第2のサーバが、クライアントからのトランザクション要求をstrict serializableな半順序に順序付けし、コミットフェーズでは、第1のサーバが、当該要求に従うトランザクションを当該半順序で実行して第1の応答をクライアントに返し、検証フェーズでは、第2のサーバが、クライアントからのトランザクション要求に従うトランザクションを当該半順序で実行して第2の応答をクライアントに返す。クライアントは、第2の応答と第1の応答の比較結果を基にビザンチン故障を検知する。
【選択図】図1
【特許請求の範囲】
【請求項1】
第1及び第2の計算機システムから構成されるデータ管理システムであって、
対象の状態を表すオブジェクトをリード及び/又はライトするトランザクションの要求であるトランザクション要求を送信するクライアントと、
同一のトランザクション要求について同じ決定的関数を実行する第1及び第2のサーバと
を備え、
前記第1の計算機システムが、第1のオブジェクト群セットを管理し、当該第1のオブジェクト群セットは、対象毎の第1のオブジェクト群であり、第1のオブジェクト群は、一つ以上の第1のオブジェクトであり、第1のオブジェクトは、対象の状態を表し、
前記第2の計算機システムが、第2のオブジェクト群セットを管理し、当該第2のオブジェクト群セットは、対象毎の第2のオブジェクト群であり、第2のオブジェクト群は、一つ以上の第2のオブジェクトであり、第2のオブジェクトは、対象の状態を表し、
前記第1のサーバが、前記第1の計算機システムに備えられ、
前記第2のサーバが、前記第2の計算機システムに備えられ、
順序付けフェーズ、コミットフェーズ及び検証フェーズがあり、
トランザクション要求毎に、
前記順序付けフェーズにおいて、
前記クライアントが、当該トランザクション要求を前記第2のサーバに送信し、
前記第2のサーバが、前記クライアントからの当該トランザクション要求をstrict serializableな半順序に順序付けし、
前記コミットフェーズにおいて、
前記クライアントが、当該トランザクション要求を前記第1のサーバに送信し、
前記第1のサーバが、前記クライアントからの当該トランザクション要求に従うトランザクションを、前記順序付けフェーズにおいて決定された半順序で実行し、当該トランザクション要求の第1の応答を前記クライアントに返し、
前記検証フェーズにおいて、
前記第2のサーバが、前記クライアントからのトランザクション要求に従うトランザクションを前記順序付けフェーズにおいて決定された半順序で実行し、当該トランザクション要求の第2の応答を前記クライアントに返し、
前記クライアントが、前記第2の応答と前記第1の応答との比較の結果を基に、ビザンチン故障を検知する、
データ管理システム。
【請求項2】
前記順序付けフェーズにおいて、
前記第2のサーバが、前記クライアントからのトランザクション要求に従うトランザクションを仮実行することで当該トランザクションの競合の有無を判定し、競合が無いことが判定された場合に所定の応答を前記クライアントに返し、
前記コミットフェーズにおいて、
前記所定の応答を受信したクライアントが、前記トランザクション要求を前記第1のサーバに送信し、
前記第1のサーバが、前記クライアントからのトランザクション要求に従うトランザクションを実行し、当該トランザクションにおいてリード及び/又はライトされた一つ以上の第1のオブジェクトの各々について第1のプルーフを作成し、当該トランザクションの実行結果である第1の結果と、当該作成された一つ以上の第1のプルーフとを有する第1の応答を前記クライアントに返し、
前記検証フェーズにおいて、
前記第2のサーバが、当該トランザクション要求に従うトランザクションを実行し、当該トランザクションにおいてリード及び/又はライトされた一つ以上の第2のオブジェクトの各々について第2のプルーフを作成し、当該トランザクションの実行結果である第2の結果と、当該作成された一つ以上の第2のプルーフとを有する第2の応答を前記クライアントに返し、
前記クライアントが、前記第1の応答が有する一つ以上の第1のプルーフと、前記第2の応答が有する一つ以上の第2のプルーフとが一致するか否かの判定と、前記第1の応答が有する第1の結果と、前記第2の応答が有する第2の結果とが一致するか否かの判定とを行い、いずれかの判定の結果が偽の場合にビザンチン故障を検知する、
請求項1に記載のデータ管理システム。
【請求項3】
前記順序付けフェーズにおいて、前記第2のサーバが、前記受信したトランザクション要求に従うトランザクションを仮実行することで、リード又はライトされる一つ以上の第2のオブジェクトを特定し、当該特定された一つ以上の第2のオブジェクトの各々についてロックを取得できた場合に、前記所定の応答を返し、
前記検証フェーズにおいて、前記第2のサーバが、前記トランザクション要求に従うトランザクションを実行した場合に、当該トランザクション要求について前記順序付けフェーズにおいて取得した全てのロックを解放する、
請求項2に記載のデータ管理システム。
【請求項4】
第2のオブジェクトがロックされてから一定時間経過しても当該第2のオブジェクトがロックされたままの場合、
前記第2のサーバが、当該ロックを取得しているトランザクションを特定し、特定されたトランザクションのIDを指定した所定の要求を前記第1のサーバに送信し、
前記第1のサーバが、前記所定の要求を受信し、当該要求で指定されているIDに対応のトランザクションについてのステータスを表す応答を返し、
前記第2のサーバが、当該応答を受信し、当該応答が表すステータスがアボート済の場合、当該第2のオブジェクトのロックを解放する、
請求項3に記載のデータ管理システム。
【請求項5】
前記受信した応答が表すステータスがコミット済であり、取得されているロックのタイプがリードロックの場合、前記第2のサーバが、当該第2のオブジェクトのロックを解放する、
請求項4に記載のデータ管理システム。
【請求項6】
前記受信した応答が表すステータスがコミット済であり、取得されているロックのタイプがライトロックの場合、
前記第2のサーバが、当該第2のオブジェクトのオブジェクトIDと、当該ロックが取得されたときの当該第2のオブジェクトのバージョンとを特定し、当該特定されたオブジェクトIDと、当該特定されたバージョンの次のバージョンとを指定したプルーフ要求を、前記第1のサーバに送信し、
前記第1のサーバが、当該プルーフ要求を受信し、当該プルーフ要求で指定されているオブジェクトID及びバージョンの第1のオブジェクトを特定し、当該特定された第1のオブジェクトの第1のプルーフを作成し、当該第1のプルーフを返し、
当該第1のプルーフは、当該第1のオブジェクトのオブジェクトID及びバージョンと、当該第1のオブジェクトの作成に使用された全ての第1のオブジェクトのオブジェクトID及びバージョンの集合である第1のインプットとを含み、
前記第2のサーバが、当該第1のプルーフを受信し、当該第1のプルーフを用いて、当該ロックが取得されたときの第2のオブジェクトの次バージョンの第2のオブジェクトを作成し、当該作成された次バージョンの第2のオブジェクトを前記第2のオブジェクト群セットにライトし、当該ロックを解放する、
請求項4に記載のデータ管理システム。
【請求項7】
前記第2のサーバが、
前記受信した第1のプルーフが表すバージョンと、当該ロックが取得されたときの第2のオブジェクトのバージョンとの比較を含む検証である順序付け検証を行い、
当該検証においてエラーが検知されない場合に、前記次バージョンの第2のオブジェクトを作成及びライトと、当該ロックの解放とを行う、
請求項6に記載のデータ管理システム。
【請求項8】
前記受信した応答が表すステータスがアボート済及びコミット済のいずれでもない場合、前記第2のサーバは、
当該ロックを解放せず、
当該ロックが取得されている第2のオブジェクトを別のトランザクションがリード又はライトする場合に、前記所定の要求を前記第1のサーバに送信する、
請求項4に記載のデータ管理システム。
【請求項9】
前記検証フェーズにおいて、前記第2のサーバが、前記クライアントから前記一つ以上の第1のプルーフを受信し、当該一つ以上の第1のプルーフについて順序付け検証を行い、
第1のプルーフは、当該第1のプルーフに対応の第1のオブジェクトのオブジェクトID及びバージョンと、当該第1のオブジェクトの作成に使用された全ての第1のオブジェクトのオブジェクトID及びバージョンの集合である第1のインプットとを含み、
前記順序付け検証において、第1のプルーフにおけるオブジェクトIDと同じオブジェクトIDの第2のオブジェクトについて取得されているロックのタイプがライトロックであり、且つ、当該ロックが取得されたときの第2のオブジェクトの次バージョンと、当該第1のプルーフが表すバージョンとが同じである場合、前記第2のサーバが、
当該ロックが取得されたオブジェクトIDについて次バージョンのレコードを生成するためにリードされた全ての第2のオブジェクトのオブジェクトID及びバージョンの集合である第2のインプットと、前記受信した第1のプルーフにおける第1のインプットとが一致しているか否かを判定し、
当該判定の結果が偽である場合、ビザンチン故障を意味するビザンチン故障エラーを前記クライアントに返す、
請求項2に記載のデータ管理システム。
【請求項10】
前記順序付け検証において、前記第2のサーバは、前記一つ以上の第1のプルーフのいずれについてもエラーが検知されなかった場合、前記トランザクション要求に従うトランザクションを実行する、
請求項9に記載のデータ管理システム。
【請求項11】
前記順序付け検証において下記のいずれかの場合に、前記第2のサーバは、ビザンチン故障の可能性があることを意味するエラーである検証エラーを前記クライアントに返す、
・第1のプルーフにおけるオブジェクトIDと同じオブジェクトIDの第2のオブジェクトについて取得されているロックのタイプがリードロックであり、且つ、当該ロックが取得されたときの第2のオブジェクトのバージョンと、当該第1のプルーフが表すバージョンとが異なっている、
・第1のプルーフにおけるオブジェクトIDと同じオブジェクトIDの第2のオブジェクトについて取得されているロックのタイプがライトロックであり、且つ、当該ロックが取得されたときの第2のオブジェクトの次バージョンと、当該第1のプルーフが表すバージョンとが異なっている、
請求項9に記載のデータ管理システム。
【請求項12】
前記順序付けフェーズにおいて、
前記第2のサーバは、前記クライアントからのトランザクション要求にクライアントの正しい認証用データがあるかを検証し、
前記第2のサーバは、前記第2のサーバの認証用データを前記クライアントに返し、
前記コミットフェーズにおいて、
前記第1のサーバは、前記クライアントからのトランザクション要求に、クライアント及び第2のサーバのそれぞれの正しい認証用データがあるかを検証し、
前記第1のサーバは、前記一つ以上の第1のプルーフの各々に、前記第1のサーバの認証用データを含め、
前記検証フェーズにおいて、
前記第2のサーバは、前記クライアントからの一つ以上の第1のプルーフの各々に第1のサーバの正しい認証用データがあるかを検証し、
前記第1及び第2のサーバのいずれも、認証用データの検証においてエラーが検知された場合、認証エラーを前記クライアントに返し、
前記順序付けフェーズ又は前記コミットフェーズにおける認証エラーは、ビザンチン故障であるが第1及び第2のオブジェクト群セットには相違が生じないエラーであり、
前記検証フェーズにおける認証エラーは、ビザンチン故障であり第1及び第2のオブジェクト群セットに相違が生じているエラーである、
請求項2に記載のデータ管理システム。
【請求項13】
第1及び第2の計算機システムから構成されるデータ管理システムにより行われる方法であって、
対象の状態を表すオブジェクトをリード及び/又はライトするトランザクションの要求であるトランザクション要求毎に、
順序付けフェーズにおいて、
クライアントが、当該トランザクション要求を第2のサーバに送信し、
前記第2のサーバが、前記クライアントからの当該トランザクション要求をstrict serializableな半順序に順序付けし、
コミットフェーズにおいて、
前記クライアントが、当該トランザクション要求を第1のサーバに送信し、
前記第1のサーバが、前記クライアントからの当該トランザクション要求に従うトランザクションを、前記順序付けフェーズにおいて決定された半順序で実行し、当該トランザクション要求の第1の応答を前記クライアントに返し、
検証フェーズにおいて、
前記第2のサーバが、前記クライアントからのトランザクション要求に従うトランザクションを前記順序付けフェーズにおいて決定された半順序で実行し、当該トランザクション要求の第2の応答を前記クライアントに返し、
前記クライアントが、前記第2の応答と前記第1の応答との比較の結果を基に、ビザンチン故障を検知し、
前記第1のサーバが、前記第1の計算機システムに備えられており、
前記第2のサーバが、前記第2の計算機システムに備えられており、
前記第1及び第2のサーバは、同一のトランザクション要求について同じ決定的関数を実行するようになっており、
前記第1の計算機システムが、第1のオブジェクト群セットを管理し、当該第1のオブジェクト群セットは、対象毎の第1のオブジェクト群であり、第1のオブジェクト群は、一つ以上の第1のオブジェクトであり、第1のオブジェクトは、対象の状態を表し、
前記第2の計算機システムが、第2のオブジェクト群セットを管理し、当該第2のオブジェクト群セットは、対象毎の第2のオブジェクト群であり、第2のオブジェクト群は、一つ以上の第2のオブジェクトであり、第2のオブジェクトは、対象の状態を表す、
データ管理方法。
【発明の詳細な説明】
【技術分野】
【0001】
本発明は、概して、データ管理に関し、特に、ビザンチン故障の検知に関する。
【背景技術】
【0002】
下記のデータ管理システムが知られている。
・複数の計算機システムを有する。複数の計算機システムが、それぞれ、オブジェクト群セットを格納する。複数の計算機システムにおけるオブジェクト群セットは同じ状態に保たれる。
・計算機システムにおけるオブジェクト群セットは、対象毎のオブジェクト群である。「オブジェクト群」は、一つ以上のオブジェクトである。「オブジェクト」は、対象の状態を表す。「対象」は、任意の有体物又は無体物である。例えば、「対象」として、口座を採用し、対象の「状態」として、口座における残高を採用することができる。
・計算機システムは、オブジェクトをリード及び/又はライトするトランザクションの要求に応答して、トランザクションを実行する。
・計算機システムは、一つ又は複数のノードでよく、ネットワークを含んでもよい。計算機システムは、当該計算機システムの管理者(例えば、一組織又は一個人)から操作され得るが、当該計算機システムの管理者以外の者(例えば、組織又は個人)からは操作され得ない。例えば、計算機システム1は管理者1から操作され得るが、計算機システム2は管理者1から操作され得ない。計算機システム2は管理者2のみから操作され得る。
【0003】
データ管理システムにおけるビザンチン故障を検知する方法として、非特許文献1に開示の方法「PeerReview」がある。PeerReviewは、peer-to-peerで動作する。また、PeerReviewでは、計算機システムは、単一ノードである。PeerReviewについて、便宜上、最初にレコードを作成するノードを「プライマリノード」と呼び、プライマリノード以外のノードを「セカンダリノード」と呼ぶ。
【0004】
PeerReviewは、全順序ハッシュチェーン型実行ログをプライマリノードで作成し、プライマリノードと同じ状態や結果を計算するために一以上のセカンダリノードの各々に当該ログをシーケンシャルに再生させる。
【先行技術文献】
【非特許文献】
【0005】
【非特許文献1】Andreas Haeberlen, Petr Kouznetsov, and Peter Druschel. 2007.PeerReview: Practical Accountability for Distributed Systems. In SOSP. 175-188.(https://people.mpi-sws.org/~druschel/publications/peerreview-sosp07.pdf)
【発明の概要】
【発明が解決しようとする課題】
【0006】
上述したデータ管理システムにおけるビザンチン故障の検知を、strict serializabilityを保証し、且つ、トランザクションを並列に実行可能としつつ実現することが望ましい。しかし、PeerReviewでは、セカンダリノードは、プライマリノードが作成した全順序ハッシュチェーン型実行ログをシーケンシャルに再生する必要があり、そのため、トランザクション実行の全体的な並列性が制限される。
【課題を解決するための手段】
【0007】
第1及び第2の計算機システムから構成されるデータ管理システムが、対象の状態を表すオブジェクトをリード及び/又はライトするトランザクションの要求であるトランザクション要求を送信するクライアントと、同一のトランザクション要求について同じ決定的関数を実行する第1及び第2のサーバとを備える。
【0008】
第1の計算機システムが、第1のオブジェクト群セットを管理する。当該第1のオブジェクト群セットは、対象毎の第1のオブジェクト群である。第1のオブジェクト群は、一つ以上の第1のオブジェクトである。第1のオブジェクトは、対象の状態を表す。
【0009】
第2の計算機システムが、第2のオブジェクト群セットを管理する。当該第2のオブジェクト群セットは、対象毎の第2のオブジェクト群である。第2のオブジェクト群は、一つ以上の第2のオブジェクトである。第2のオブジェクトは、対象の状態を表す。
【0010】
第1のサーバが、第1の計算機システムに備えられる。第1のサーバによるトランザクションの実行では、第1のオブジェクトが第1のオブジェクト群セットからリードされる、及び/又は、第1のオブジェクトが第1のオブジェクト群セットにライトされる。
【0011】
第2のサーバが、第2の計算機システムに備えられる。第2のサーバによるトランザクションの実行では、第2のオブジェクトが第2のオブジェクト群セットからリードされる、及び/又は、第2のオブジェクトが第2のオブジェクト群セットにライトされる。
【0012】
順序付けフェーズ、コミットフェーズ及び検証フェーズがある。トランザクション要求毎に、順序付けフェーズにおいて、クライアントが、当該トランザクション要求を第2のサーバに送信し、第2のサーバが、クライアントからの当該トランザクション要求をstrict serializableな半順序に順序付けし、コミットフェーズにおいて、クライアントが、当該トランザクション要求を第1のサーバに送信し、第1のサーバが、クライアントからの当該トランザクション要求に従うトランザクションを、順序付けフェーズにおいて決定された半順序で実行し、当該トランザクション要求の第1の応答をクライアントに返し、検証フェーズにおいて、第2のサーバが、クライアントからのトランザクション要求に従うトランザクションを順序付けフェーズにおいて決定された半順序で実行し、当該トランザクション要求の第2の応答をクライアントに返し、クライアントが、第2の応答と第1の応答との比較の結果を基に、ビザンチン故障を検知する。
【発明の効果】
【0013】
データ管理システムにおけるビザンチン故障の検知を、strict serializabilityを保証し、且つ、トランザクションを並列に実行可能としつつ実現することができる。
【図面の簡単な説明】
【0014】
図1】実施形態に係るデータベースシステムの構成の一例を示す。
図2】ハードウェア構成の一例を示す。
図3】ロックテーブルの構成の一例を示す。
図4】プルーフの構成の一例を示す。
図5】順序付けフェーズでの処理の流れの一例を示す。
図6】コミットフェーズでの処理の流れの一例を示す。
図7】検証フェーズでの処理の流れの一例を示す。
図8】リカバリ処理の流れの一例を示す。
図9】リカバリ試行処理の流れの一例を示す。
図10】アボート試行処理の流れの一例を示す。
図11】プルーフ取得処理の流れの一例を示す。
図12】順序付け検証の流れの一例を示す。
図13】新規状態導出処理の流れの一例を示す。
【発明を実施するための形態】
【0015】
以下の説明では、「インターフェース装置」は、一つ以上のインターフェースを含む。一つ以上のインターフェースは、一つ以上の同種の通信インターフェースデバイス(例えば一つ以上のNIC(Network Interface Card))であってもよいし二つ以上の異種の通信インターフェースデバイス(例えばNICとHBA(Host Bus Adapter))であってもよい。
【0016】
また、以下の説明では、「記憶装置」は、一つ以上のメモリを含む。記憶装置に関して少なくとも一つのメモリは、揮発性メモリでよい。記憶装置は、主に、プロセッサによる処理の際に使用される。記憶装置は、メモリの他に、一つ以上の不揮発性の記憶デバイス(例えば、HDD(Hard Disk Drive)又はSSD(Solid State Drive))を含んでもよい。
【0017】
また、以下の説明では、「プロセッサ」は、一つ以上のプロセッサを含む。少なくとも一つのプロセッサは、典型的には、CPU(Central Processing Unit)のようなマイクロプロセッサである。一つ以上のプロセッサの各々は、シングルコアでもよいしマルチコアでもよい。プロセッサは、処理の一部又は全部を行うハードウェア回路を含んでもよい。
【0018】
また、以下の説明では、「プログラム」を主語として処理を説明する場合があるが、プログラムは、プロセッサによって実行されることで、定められた処理を、適宜に記憶装置(例えばメモリ)及び/又はインターフェース装置(例えば通信ポート)等を用いながら行うため、処理の主語がプロセッサとされてもよい。プログラムを主語として説明された処理は、プロセッサあるいはそのプロセッサを有する装置が行う処理としてもよい。また、プロセッサは、処理の一部又は全部を行うハードウェア回路(例えばFPGA(Field-Programmable Gate Array)又はASIC(Application Specific Integrated Circuit))を含んでもよい。プログラムは、プログラムソースから計算機のような装置にインストールされてもよい。プログラムソースは、例えば、プログラム配布サーバ又は計算機が読み取り可能な記録媒体(例えば非一時的な記録媒体)であってもよい。また、以下の説明において、二つ以上のプログラムが一つのプログラムとして実現されてもよいし、一つのプログラムが二つ以上のプログラムとして実現されてもよい。
【0019】
また、以下の説明では、「yyy部」の表現にて機能を説明することがあるが、機能は、一つ以上のコンピュータプログラムがプロセッサによって実行されることで実現されてもよいし、一つ以上のハードウェア回路(例えばFPGA又はASIC)によって実現されてもよいし、それらの組合せによって実現されてもよい。プログラムがプロセッサによって実行されることで機能が実現される場合、定められた処理が、適宜に記憶装置及び/又はインターフェース装置等を用いながら行われるため、機能はプロセッサの少なくとも一部とされてもよい。機能を主語として説明された処理は、プロセッサあるいはそのプロセッサを有する装置が行う処理としてもよい。
【0020】
また、以下の説明では、同種の要素を区別しないで説明する場合には、参照符号のうちの共通符号を使用し、同種の要素を区別する場合は、参照符号を使用することがある。
【0021】
また、以下の説明では、「レコード」とは、アプリケーションプログラムのようなプログラムから見た一つの論理的な電子データの塊であり、具体的には、対象の状態を表すオブジェクトの一例である。レコードとしてのデータは、例えば、キーバリューペア又はタプルがある。
【0022】
また、以下の実施形態において、「ビザンチン故障」は、任意の故障でよく、改ざんのような悪意のある内部攻撃を含んでよい。
【0023】
図1は、実施形態に係るデータベースシステムの構成の一例を示す。
【0024】
二つの計算機システム150を有するデータベースシステム130がある。データベースシステム130は、データ管理システムの一例である。
【0025】
二つの計算機システム150がそれぞれデータベース154を有する。二つの計算機システム150のデータベース154が同じ状態に保たれる。
【0026】
二つの計算機システム150は、プライマリシステム150Pとセカンダリシステム150Sである。プライマリシステム150Pが、第1の計算機システムの一例である。セカンダリシステム150Sが、第2の計算機システムの一例である。プライマリシステム150Pが、最初にコミットを行う計算機システムである。セカンダリシステム150Sが、プライマリシステム150P以外の計算機システムである。
【0027】
プライマリシステム150Pが、プライマリデータベース154Pと、プライマリサーバ155Pとを有する。プライマリサーバ155Pは、一つ又は複数のプライマリサーバ部11P(例えば11P1~11P3)を有するデータベースサーバである。プライマリサーバ部11Pが、プライマリデータベース154Pに対してデータの入出力を行う。プライマリデータベース154Pが、第1のオブジェクト群セットの一例であり、プライマリサーバ155Pが、第1のサーバの一例である。プライマリデータベース154Pは、複数レプリカから構成される分散データベースでもよい。プライマリシステム150Pが、プライマリのデータベースシステムであって、プライマリサーバ155Pが、プライマリシステム150Pの外に存在してもよい。
【0028】
同様に、セカンダリシステム150Sが、セカンダリデータベース154Sと、セカンダリサーバ155Sとを有する。セカンダリサーバ155Sは、一つ又は複数のセカンダリサーバ部12P(例えば11S1~11S3)を有する。セカンダリサーバ部12Pが、セカンダリデータベース154Sに対してデータの入出力を行う。セカンダリデータベース154Sが、第2のオブジェクト群セットの一例であり、セカンダリサーバ155Sが、第2のサーバの一例である。セカンダリデータベース154Sも、複数レプリカから構成される分散データベースでもよい。セカンダリシステム150Sが、セカンダリのデータベースシステムであって、セカンダリサーバ155Sが、セカンダリシステム150Sの外に存在してもよい。
【0029】
データベース154は、対象毎に、全てのバージョンのレコードを有してもよい。また、対象毎に、過去のバージョンのレコードは、データベース154とは別に管理されてもよく、過去のバージョンのレコードは、計算機システム150の中及び外のどちらに存在してもよい。
【0030】
また、データベース154において、レコードは、当該レコードのライトを含んだトランザクションのID(例えばnonce)や、当該レコードの生成のためのインプット(当該レコードの生成のためにリードされた全てのレコードのID及びバージョンの集合)や、MACを含んでもよいし、トランザクションID、インプット及びMACといったデータが、当該レコードに紐づけられてデータベース154とは別の場所に存在してもよい。MACは、認証用データの一例である。認証用データは、MACに代えて、authentication(受信者が、受信したデータがそのデータの送信者から送信されたと確信できること)に使用される他種のデータ、例えば電子署名でもよい。
【0031】
セカンダリサーバ155Sが、ロックテーブル12を管理する。ロックテーブル12は、複数のセカンダリサーバ部11Sに共通でもよいし、各セカンダリサーバ部11Sが、ロックテーブル12を保持し、一のセカンダリサーバ部11Sがロックテーブル12を更新した場合にその更新が他のセカンダリサーバ部11Sのロックテーブル12に反映されてもよい。また、各セカンダリサーバ部11Sがロックテーブル12の一部分を有し(例えば、第1のセカンダリサーバ部11S1がロックテーブル12の第1の部分を有し、第2のセカンダリサーバ部11S2がロックテーブル12の第2の部分を有し)、複数のセカンダリサーバ部11S全体が一つのロックテーブル12を有してもよい。
【0032】
データベースシステム130のクライアントシステム110が、一つ又は複数のクライアント計算機10(例えば10A~10C)を有する。クライアント計算機10は、物理的又は仮想的な計算機である。クライアント計算機10は、アプリケーション101と、データベースクライアント102とを有する。
【0033】
本実施形態に係るデータベースシステム130は、データベースクライアント102とデータベースサーバ155とを含む。データベースサーバ155が、データベース154を含み、計算機システムとして構成されてもよい。
【0034】
データベースシステム130は、競合しないトランザクションを並列に実行する。データベースシステム130は、計算機システム150におけるビザンチン故障を検知する。
【0035】
データベースクライアント102は、アプリケーション101に対してデータベースシステム130の単一のビューを提供する。データベース154は、単一ノードデータベースでもよいしマルチノード分散データベースでもよい。
【0036】
データベースサーバ155P(データベースサーバ部11P1~11P3)及び155S(データベースサーバ部11S1~11S3)は、同じ決定的関数のセットを有する。データベースクライアント102は、実行するべき関数への参照と、その関数についてのすべての必要とされるパラメータとを含むトランザクション要求を発行する。
【0037】
データベースシステム130は、リードオペレーション及びライトオペレーションをサポートする。
【0038】
両方のデータベース154がACID(Atomicity、Consistency、Isolation及びDurability)且つIsolationにおいてはstrict serializabilityを必ずしも提供しなくてもよい。例えば、プライマリデータベース154Pが、ACIDをread committed Isolationで提供してもよく、セカンダリデータベース154Sが、単一レコードに対する単一オペレーションにおいてDurabilityとLinearizabilityを提供してもよい。両方のデータベース154が、レコードのセットから構成され、レコードのセットにおいては、プライマリキーが各レコードを識別する。
【0039】
本実施形態では、下記が採用されている。
・二つの計算機システム150が正常であり、二つの計算機システム150に同じ要求が入力された場合、二つの計算機システム150は同じ決定的関数のセットを有しているため、結果は同じである。
・一方の計算機システム150にビザンチン故障があり他方の計算機システム150が正常の場合、safetyは提供され、ビザンチン故障の検知が可能である。
・二つの計算機システム150の両方にビザンチン故障がある場合、各計算機システム150におけるビザンチン故障を検知できない可能性がある。
・二つの計算機システム150のいずれも特権的な能力を有しない。つまり、データベースシステム130は、非中央集権的なシステムである。また、二つの計算機システム150のデータベース154を同じ状態に保つために、二つの計算機システム150は合意を経てトランザクションやリカバリといった処理を行う。別の言い方をすれば、各計算機システム150は、もう1つの計算機システム150の合意無しにトランザクションやリカバリを進めることはできない。
・データベース154は、対象毎にレコード群を有してよい。各対象について、レコード群は、一つ以上のレコードでよい。一つの主キー(レコードID)が一つの対象に対応してよい。本実施形態では、一つの主キー(一つの対象)につき、全てのバージョンのレコードがデータベース154に存在するが、過去のバージョンのレコードは、データベース154の外で管理されてもよいし、一部のバージョンのレコードは管理対象外であってもよい。
・データベースシステム130は、MAC(Message Authentication Code)のために2つのタイプの秘密データを管理する。一方の秘密データは、クライアント102とサーバ155との間で共有される秘密データ(以下、秘密ClientServer)である。他方の秘密データは、プライマリサーバ155Pとセカンダリサーバ155Sとの間で共有される秘密データ(以下、秘密PrimarySecondary)である。
【0040】
データベースシステム130のベースとなる物理的な計算機システムは、図2に例示のシステムでよい。すなわち、物理的な計算機システムは、通信ネットワーク19に接続された一つ又は複数の計算機230で構成されてよい。計算機230は、通信ネットワーク19に接続されるインターフェース装置231、データベース154の一部又は全部やコンピュータプログラムを記憶する記憶装置232、及び、それらの装置231及び232に接続されたプロセッサ233を有してよい。プロセッサ233がサーバプログラムを実行することでデータベースサーバ部11又はデータベースサーバ155が実現されてよい。一つ以上の計算機230がデータベース154を記憶しデータベースサーバ155を実現し、一つの計算機システム150がそのデータベース154及びデータベースサーバ155を含んでよい。
【0041】
クライアントシステム110も、少なくとも一つの計算機を含んだ物理的な計算機システムに基づくシステムでよい。一つ又は複数の計算機がそれぞれクライアント計算機でよい。一つ又は複数のクライアント計算機のプロセッサがアプリケーションプログラムやクライアントプログラムを実行してよく、アプリケーションプログラムが実行されることでアプリケーション101が実現されてよく、また、クライアントプログラムが実行されることでデータベースクライアント102が実現されてよい。アプリケーション101とデータベースクライアント102は、同一のクライアント計算機に存在してもよいし別々のクライアント計算機に存在してもよい。
【0042】
図3は、ロックテーブル12の構成の一例を示す。
【0043】
ロックテーブル12は、セカンダリデータベース154Sの主キー毎にロックエントリ300を有する。つまり、ロックエントリ300は、一つの主キーにつき一つである。ロックエントリ300は、レコードID301、バージョン302、ロックタイプ303、ロックカウント304、ロックホルダ305、インプット306及び最新更新時刻307といったデータを有する。一つのロックエントリ300を例に取る。また、図3の説明において、そのロックエントリ300のレコードID301及びバージョン302に対応するレコードを「対応レコード」と言う。
【0044】
レコードID301は、セカンダリデータベース154Sのうちの対応レコードのIDを表す。バージョン302は、対応レコードのバージョンを表す。バージョンは、例えば番号であり、対応レコードがコミットされた場合にインクリメントされる。
【0045】
ロックタイプ303は、ロックのタイプを表す。ロックタイプ303として、“リードロック”、“ライトロック”及び“ロック無し”がある。“リードロック”は、リードのために取得されたロックを意味する。“ライトロック”は、ライトのために取得されたロックを意味する。“ロック無し”は、ロックが取得されていないことを意味する。
【0046】
ロックカウント304は、対応レコードのロックを取得しているトランザクションの数を表す。ライトロックについては、トランザクション数は1である。リードロックについては、トランザクション数は1以上である。ロックホルダ305は、ライトロック又はリードロックを取得しているトランザクションのトランザクションID(nonce)の集合である。
【0047】
インプット306は、ライトロックが取得された場合に格納されるデータであり、当該ライトロックが取得されたレコードIDについて次バージョンのレコードを生成するためにリードされた全てのレコードのID及びバージョンの集合である。例えば、対応レコードの次バージョンのレコードの生成のためにレコード(レコードID“k1”及びバージョン“2”)とレコード(レコードID“k2”及びバージョン“3”)がリードされた場合、対応レコードのインプット306は、レコードID“k1”及びバージョン“2”とレコードID“k2”びバージョン“3”の集合である。
【0048】
最新更新時刻307は、ロックエントリ300が更新された最新の時刻(日時)を表す。
【0049】
図4は、プルーフの構成の一例を示す。
【0050】
後述するように、本実施形態では、ライト又はリードされるレコード毎に当該レコードのプルーフ(当該レコードのリード又はライトのプルーフ)が作成される。プルーフは、レコードID401、バージョン402、nonce(トランザクションID)403、インプット404及び署名405といったデータを有する。図4の説明において、図4に例示のプルーフに対応するレコードを「対応レコード」と言う。
【0051】
レコードID401は、対応レコードのIDを表す。バージョン402は、対応レコードのバージョンを表す。
【0052】
nonce(トランザクションID)403は、対応レコードをリード又はライトするトランザクションのnonce(ID)を表す。インプット404は、対応レコードを作成するためにリードされたレコードのID及びバージョンの集合である。
【0053】
署名405は、秘密PrimarySecondaryを用いて作成されたMACであり、データ401~404についてのMACである。
【0054】
データベースシステム130のビザンチン故障検知プロトコルの重要な点は、プライマリサーバ155Pとセカンダリサーバ155Sとが、非中央集権的且つ並列にトランザクションの半順序関係について合意を交わすことである。プロトコルは、3つのフェーズ、すなわち、順序付けフェーズ、コミットフェーズ、及び検証フェーズで構成される。まず、セカンダリサーバ155Sが、クライアント102から与えられたトランザクションを、競合に基づいて半順序に順序付けする(順序付けフェーズ)。次に、プライマリサーバ155Pが、セカンダリサーバ155Sによって順序付けされたトランザクションを実行及びコミットする(コミットフェーズ)。最後に、セカンダリサーバ155Sが、プライマリサーバ155Pから与えられた順序付け結果を検証し、トランザクションを実行する(検証フェーズ)。3フェーズプロトコルは、両方の計算機システム150が正常である限り、両方のデータベース154に同じ正しい(strict serializableな)状態及び結果を導出させる。どちらかの計算機システム150にビザンチン故障が発生した場合には、それらの状態又は結果は相異なるものとなる。クライアント102は、その相違を検知し、データベースシステム130におけるビザンチン故障を検知することができる。以下、各フェーズを詳細に説明する。なお、以下の説明において、「エラーを応答にセットする」とは、エラーを表すデータを応答にセットすることを意味する。「結果を応答にセットする」とは、トランザクション実行の結果を表すデータを応答にセットすることを意味する。例えば、結果を表すデータは、トランザクション実行の成否を表すデータと、決定的関数の実行により得られた状態(例えば、リードされたレコードが表す状態、又は、リードされた複数のレコードが表す複数の状態を用いて算出された状態)を表すデータとを含む。
【0055】
図5は、順序付けフェーズでの処理の流れの一例を示す。
【0056】
クライアント102が、アプリケーション101から、データベースシステム130に対する関数の実行のためのトランザクション要求を受信した場合に、順序付けフェーズが開始する。クライアント102は、アプリケーション101からのトランザクション要求に基づき内部的なトランザクション要求を作成する(S501)。トランザクション要求は、<n、f、a、s>というパラメータを有している。パラメータは下記の通りである。
・nは、要求を識別する一意なトランザクションID(例えば、nonce(又はUUID))である。
・fは、関数への参照である。
・aは、関数の引数である。
・sは、秘密ClientServerを用いて、n、f、及びaについて作成されるMAC(以下、MACClient)である。
【0057】
クライアント102は、作成されたトランザクション要求をセカンダリサーバ155Sに送信する(S502)。
【0058】
セカンダリサーバ155Sは、トランザクション要求を受信し(S503)、秘密ClientServerを用いて、当該トランザクション要求のMACClientを検証する(S504)。S504においてエラーが検知された場合(S505:No)、セカンダリサーバ155Sは、MAC検証エラーを応答にセットし(S516)、当該応答をクライアント102に返す(S517)。
【0059】
なお、「MAC検証エラー」は、ビザンチン故障があることを意味する。しかし、順序付けフェーズではトランザクションは実行されないため、ここでのMAC検証エラーは、ビザンチン故障があるがプライマリデータベース154Pとセカンダリデータベース154Sに相違が無いことを意味する。
【0060】
S504においてエラーが検知されなかった場合(S505:Yes)、セカンダリサーバ155Sは、S503で受信したトランザクション要求を、トランザクション要求用のデータベースにライトする(S506)。トランザクション要求毎にnonce(トランザクションID)があり、そのデータベースには、nonceを主キーとしたレコードがあり、そのレコードに、トランザクション要求それ自体(又は、そのトランザクション要求が有するパラメータ)がライトされる。同一nonceを有するトランザクション要求が既にライトされている場合、セカンダリサーバ155Sは、S503で受信したトランザクション要求に従うトランザクションをアボートする。
【0061】
S506の後、セカンダリサーバ155Sは、S503で受信したトランザクション要求で指定されている関数の実行をシミュレーションして、その関数によって、どのレコードがリードされどのレコードがライトされることになるのか、すなわち、リードセット(リードされる一つ以上のレコード)及びライトセット(ライトされる一つ以上のレコード)を識別する。シミュレーションでは、レコードをセカンダリデータベース154Sにライトすること無しに、関数が実行される。つまり、シミュレーションは、トランザクション要求の仮実行に相当する。
【0062】
リードセット及びライトセットが識別された後に、セカンダリサーバ155Sは、リードセット内のレコード毎にリードロックを取得し、ライトセット内のレコード毎にライトロックを取得しようとする(S508)。具体的には、セカンダリサーバ155Sは、下記を試行する。
・リードセット内のレコード毎に、セカンダリサーバ155Sは、当該レコードの主キーからロックエントリ300を識別する。識別されたロックエントリ300におけるロックタイプ303が“ロック無し”又は“リードロック”であれば、リードロックの取得に成功する(ロックタイプ303が“ロック無し”であれば、セカンダリサーバ155Sは、ロックタイプ303を“リードロック”に更新する)。リードロックの取得が成功の場合、セカンダリサーバ155Sは、ロックカウント304の値を1インクリメントし、ロックホルダ305に当該トランザクションのID(Nonce)を追加し、最新更新時刻307を更新する。
・ライトセット内のレコード毎に、セカンダリサーバ155Sは、当該レコードの主キーからロックエントリ300を識別する。識別されたロックエントリ300におけるロックタイプ303が“ロック無し”であれば、ライトロックの取得に成功する。ライトロックの取得が成功の場合、セカンダリサーバ155Sは、ロックタイプ303を“ライトロック”に更新し、ロックカウント304を“1”とし、ロックホルダ305に当該トランザクションのID(Nonce)を登録し、インプット306に、当該レコードの作成のためにリードされた全てのレコード(リードセット内の一つ以上のレコード)の各々のレコードのID及びバージョンを登録し、最新更新時刻307を更新する。
【0063】
リードセット及びライトセットの全てのレコードについてロックが取得された場合(S509:Yes)、セカンダリサーバ155Sは、秘密PrimarySecondaryを用いて、トランザクションIDについてMAC(以下、MACSecondary)を作成し(S510)、当該作成されたMACSecondaryを応答にセットし(S511)、当該応答をクライアント102に返す(S515)。
【0064】
少なくとも一つのレコードについてロックが取得されなかった場合(S509:No)、リカバリ処理(図8図13参照)が行われる(S512)。その後、セカンダリサーバ155Sは、S503で受信したトランザクション要求についてS508で取得したロックを全て解放する(S513)。そして、セカンダリサーバ155Sは、エラーを応答にセットし(S514)、当該応答をクライアント102に返す(S515)。なお、リカバリ処理において、順序付け検証(図12)が行われた場合、下記の通りでよい。
・順序付け検証(図12)において、後述のS1206、S1209又はS1211が行われた場合、S514はスキップされ、S515が行われる。つまり、クライアント102に返る応答は、順序付け検証においてエラーがセットされた応答でよい。
・順序付け検証(図12)において、後述のS1212が行われた場合、S514は行われる。すなわち、順序付け検証において応答にセットされたOKはエラーに差し替えられる。
【0065】
S511、S514及びS516において、応答には、S503で受信したトランザクション要求が有するトランザクションIDがセットされてもよい。
【0066】
クライアント102は、S515又はS517で送信された応答を受信する(S519)。クライアント102は、当該応答にエラーがセットされている場合(S520:No)、エラーを識別し、エラーをアプリケーション101に返す(S521)。当該応答にエラーがセットされていない場合(S520:Yes)、S501で作成されたトランザクション要求について、順序付けフェーズが終了し、コミットフェーズが開始される。
【0067】
以上の順序付けフェーズの重要な点は、トランザクション要求の競合の有無を判定しその判定結果に基づいてトランザクション要求を事前に半順序に順序付けすることである。この順序付けフェーズが無いと、競合するトランザクション要求が、非決定的な結果を引き起こすことがある。結果として、プライマリデータベース154Pの状態とセカンダリデータベース154Sの状態とがビザンチン故障が発生せずとも相違することになる。
【0068】
トランザクション要求の競合の有無の判定には、リードセット及びライトセットにおける各レコードについて2フェーズロッキング(2PL)ベースのロック手法が利用される。トランザクション順序付けのための2PLベースのロック手法を使用して、データベースシステム130におけるstrict serializabilityが保証される。
【0069】
順序付けフェーズにおけるいずれの処理も並列に実行される。順序付けフェーズにおいてリードセット及びライトセットの全てのレコードについてロックが取得されたならば、トランザクションは競合しないということである。そのトランザクションは、コミットフェーズにおいてプライマリサーバ155Pにより並列に実行され、その後の検証フェーズにおいてセカンダリサーバ155Sにより並列に実行される。
【0070】
一方、リードセット及びライトセットにおける少なくとも一つのレコードについてロックが取得できなければ、トランザクションは競合するということである。この場合、セカンダリサーバ155Sは、トランザクションをアボートし、そのトランザクション要求について取得されたロックを全て解放する。ロックが解放されるのを待つ代わりにトランザクションをアボートする理由は、セカンダリサーバ155Sがシミュレーション(S507)を再実行して、レコードの最新のバージョンを得て、strict serializableにトランザクションを順序付けする必要があるからである。
【0071】
図6は、コミットフェーズでの処理の流れの一例を示す。
【0072】
クライアント102がセカンダリサーバ155Sから肯定応答(エラーがセットされておらずMACSecondaryがセットされている応答)を受信した場合に、コミットフェーズが開始する。クライアント102は、まず、セカンダリサーバ155Sからの肯定応答に対応したトランザクション要求(S501で作成したトランザクション要求)に、セカンダリサーバ155Sからの肯定応答にセットされているMACSecondaryを追加する(S601)。クライアント102は、当該トランザクション要求をプライマリサーバ155Pへ送信する(S602)。
【0073】
プライマリサーバ155Pは、当該トランザクション要求を受信する(S603)。プライマリサーバ155Pは、そのトランザクション要求におけるMACClientを、秘密ClientServerを用いて検証し、当該トランザクション要求におけるMACSecondaryを、秘密PrimarySecondaryを用いて検証する(S604)。少なくとも一つのMACの検証においてエラーが検知された場合(S605:No)、プライマリサーバ155Pは、MAC検証エラーを応答にセットし(S612)、当該応答をクライアント102に返す(S613)。なお、ここでのMAC検証エラーは、ビザンチン故障があるがプライマリデータベース154Pとセカンダリデータベース154Sに相違が無いことを意味する。プライマリサーバ155Pにおいてトランザクションは実行されていない(S606が行われていない)ためである。
【0074】
いずれのMACの検証においてもエラーが検知されなかった場合(S605:Yes)、プライマリサーバ155Pは、S603で受信したトランザクション要求に従うトランザクションを実行する(S606)。具体的には、プライマリサーバ155Pは、当該トランザクション要求で指定されている関数を参照し、アトミックに、プライマリデータベース154Pからレコードをリード、及び/又は、プライマリデータベース154Pへレコードをライトすること、S603で受信したトランザクション要求をトランザクション要求用のデータベースへライトすることとを行う。ライトされるレコードのバージョンは、そのレコードと同一主キーのライト前のレコードのバージョンの次のバージョンとされる。ライトされるトランザクション要求のトランザクションステータスは、“Committed”又は“Aborted”である。
【0075】
S606の実行が失敗の場合(S607:No)、プライマリサーバ155Pは、トランザクションをアボートし(S608)、エラーを応答にセットし(S609)、当該応答をクライアント102に返す(S613)。
【0076】
S606の実行が成功の場合(S607:Yes)、プライマリサーバ155Pは、ライトされたレコード毎に、及び、リードされたレコード毎に、プルーフ(図4参照)を作成する(S610)。以下、プライマリサーバ155Pが作成したプルーフを、便宜上、「プライマリプルーフ」と呼ぶ。プライマリプルーフが、第1のプルーフの一例であり、プライマリプルーフにおけるインプット404が、第1のインプットの一例である。プライマリプルーフが有する署名405は、プライマリサーバ155Pが秘密PrimarySecondaryを用いて作成したMAC(以下、MACPrimary)である。プライマリサーバ155Pは、当該プライマリプルーフと、トランザクションの実行の結果とを応答にセットし(S611)、当該応答をクライアント102に返す(S613)。プライマリサーバ155Pが応答にセットした結果を、便宜上、「プライマリ結果」と呼ぶ。プライマリ結果が、第1の結果の一例である。
【0077】
S609、S611及びS612において、応答には、S603で受信したトランザクション要求が有するトランザクションIDがセットされてもよい。
【0078】
クライアント102は、プライマリサーバ155Pから応答(第1の応答の一例)を受信する(S614)。クライアント102は、当該応答にエラーがセットされている場合(S615:No)、エラーを識別し、エラーをアプリケーション101に返す(S616)。当該応答にエラーがセットされていない場合(S615:Yes)、S501で作成されたトランザクション要求について、コミットフェーズが終了し、検証フェーズが開始される。
【0079】
コミットフェーズでは、プライマリサーバ155Pは、トランザクション要求を、受信したら直ちに実行してもよいし任意の順序で実行してもよい。具体的には、プライマリサーバ155Pは、受信したトランザクション要求について競合の有無を判定すること無しに(リード又はライトされるレコードについてロックの取得無しに)、受信したトランザクション要求を任意のタイミングで実行してよい。なぜならば、受信したトランザクション要求は、セカンダリサーバ155Sによってstrict serializableを保証して既に半順序に順序付けされているからである。結果として、プライマリサーバ155Pにおいて、競合の無いトランザクション要求の並列実行が可能である。
【0080】
図7は、検証フェーズでの処理の流れの一例を示す。
【0081】
クライアント102がプライマリサーバ155Pから肯定応答(エラーがセットされていない応答)を受信した場合に、検証フェーズが開始する。
【0082】
クライアント102は、アプリケーション101に応答を返す前に、受信した肯定応答内の全プライマリプルーフを、セカンダリサーバ155Sに送信する(S701)。
【0083】
セカンダリサーバ155Sは、クライアント102からプライマリプルーフを受信する(S702)。セカンダリサーバ155Sは、各プライマリプルーフについて、当該プライマリプルーフがプライマリサーバ155Pにより作成されたかどうかを確かめるために、当該プライマリサーバ155P内の署名405(MAC)を、秘密PrimarySecondaryを用いて検証する(S703)。いずれかのプライマリプルーフの署名405(MAC)の検証においてエラーが検知された場合(S704:No)、セカンダリサーバ155Sは、MAC検証エラーを応答にセットし(S711)、当該応答をクライアント102に返す(S712)。ここでのMAC検証エラーは、ビザンチン故障があり、プライマリデータベース154Pとセカンダリデータベース154Sに相違があり得ることを意味する。プライマリサーバ155Pにおいてトランザクションがコミットしている(レコードがプライマリデータベース154Pにライトされている可能性がある)ためである。
【0084】
いずれのプライマリプルーフの署名405(MAC)の検証においてもエラーが検知されなかった場合(S704:Yes)、セカンダリサーバ155Sは、順序付け検証を行う(S705)。
【0085】
順序付け検証では、図12に示すように、プライマリシステム150Pとセカンダリシステム150Sでの順序付けが同じことを確認するために、プライマリプルーフと、プライマリプルーフから識別されるロックエントリ300とが比較される。すなわち、セカンダリサーバ155Sは、プライマリプルーフ毎に、当該プライマリプルーフと、当該プライマリプルーフと同一主キーのロックエントリ300との間で、バージョン及びインプットを比較して、それらが一致するかどうかをチェックする。S513で実施されるリカバリ処理に起因して、ロックエントリの欠落又はバージョンの不一致といったエラーが生じ得るが、順序付け検証では、そのようなエラーが検知され得る。順序付け検証は、事前検証であり、最終的な検証は、クライアント102により実行される。なぜなら、セカンダリシステム150Sに悪意がある場合、順序付け検証をスキップすることがあり得るからである。
【0086】
プライマリプルーフとロックエントリ300(当該プライマリプルーフが有する主キーから特定されるロックエントリ300)との比較を各プライマリプルーフについて行うことは、セカンダリシステム150Sにおける順序付けとプライマリシステム150Pにおける順序付けとの比較に相当する。理由は、下記の通りである。
・プライマリプルーフは、当該プルーフに対応のレコードの作成に使用された全てのレコードのID及びバージョンの集合であるインプット404を有する。同様に、ロックエントリ300も、当該ロックエントリ300に対応のレコードの作成に使用された全てのレコードのID及びバージョンの集合であるインプット306を有する。
・従って、プライマリプルーフもロックエントリ300も、トランザクションにおけるレコードの依存関係を表している。つまり、両方ともトランザクション間の依存関係を表している。
・トランザクション間の依存関係が同じである、ということは、トランザクションは同じ半順序で並んでいることを意味する。
・以上の通りであるため、プライマリプルーフとロックエントリ300との比較を各プライマリプルーフについて行うことは、セカンダリシステム150Sにおける順序付けとプライマリシステム150Pにおける順序付けとの比較に相当する。プライマリシステム150Pとセカンダリシステム150S間でトランザクションの半順序が同じため、同じ結果が導出される。
【0087】
順序付け検証において検証エラー又はビザンチン故障エラーが応答にセットされた場合(S706:No)、セカンダリサーバ155Sは、当該応答をクライアント102に返す(S712)。
【0088】
順序付け検証においてOK(検証成功を意味するデータ)が応答にセットされた場合(S706:Yes)、セカンダリサーバ155Sは、S503で受信したトランザクション要求(S702で受信したトランザクションIDをキーにトランザクション要求用のデータベースから特定されたトランザクション要求)に従うトランザクションを実行する(S707)。
【0089】
S707のトランザクション実行に成功すると、セカンダリサーバ155Sは、S707でリード及び/又はライトされたレコード毎に、プルーフを作成する(S708)。以下、セカンダリサーバ155Sが作成したプルーフを、便宜上、「セカンダリプルーフ」と呼ぶ。セカンダリプルーフが、第2のプルーフの一例であり、セカンダリプルーフにおけるインプット404が、第2のインプットの一例である。セカンダリプルーフが有する署名405は、セカンダリサーバ155Sが秘密PrimarySecondaryを用いて作成したMAC(MACSecondary)である。
【0090】
セカンダリサーバ155Sは、S707でリード又はライトされたレコード毎に、ロックを解放する(S709)。これにより、順序付けフェーズのS508で取得されたロックが解放される。なお、S707でライトされたレコードがあれば、ライトされたレコード毎に、ロックエントリ300のバージョン302がインクリメントされる。また、S709では、更新されたロックエントリ300毎に、最新更新時刻307が更新される。また、S709では、バージョン302のインクリメントと、最新更新時刻307の更新と、ロックの解放は、アトミックに行われる。また、ロックの解放では、リードロックについては、ロックカウント304のデクリメントと、ロックホルダ305からのトランザクションIDの削除が行われ、バージョン302のインクリメントは行われない。
【0091】
S709の後、セカンダリサーバ155Sは、セカンダリプルーフ及び結果(S707の結果)を応答にセットし(S710)、当該応答をクライアント102に返す(S712)。セカンダリサーバ155Sが応答にセットした結果を、便宜上、「セカンダリ結果」と呼ぶ。セカンダリ結果が、第2の結果の一例である。
【0092】
クライアント102は、セカンダリサーバ155Sから応答(第2の応答の一例)を受信する(S713)。クライアント102は、当該応答にエラーがセットされていない場合(S714:No)、エラーを識別し、エラーをアプリケーション101に返す(S718)。
【0093】
当該応答にエラーがセットされていない場合(S714:Yes)、クライアント102は、プライマリ結果とセカンダリ結果を比較し、且つ、全プライマリプルーフと全セカンダリプルーフとを比較する(S715)。プライマリサーバ155Pとセカンダリサーバ155Sで同じトランザクションが実行された場合、全てのプライマリプルーフと全てのセカンダリプルーフは一致するはずである。なぜなら、プライマリサーバ155Pとセカンダリサーバ155Sにより同じ決定的関数が実行され、故に、同じレコードがリードされ同じレコードがライトされるはずだからである。
【0094】
プライマリ結果とセカンダリ結果が一致し、且つ、全プライマリプルーフと全セカンダリプルーフが一致する場合(S715:Yes)、クライアント102は、OK(トランザクションのIDと当該トランザクションの成功とを表すデータ)をアプリケーション101に返す(S716)。
【0095】
プライマリ結果とセカンダリ結果が一致しない、又は、少なくとも一つのプルーフについて一致するプルーフが無い場合(S715:No)クライアント102は、プライマリシステム150Pとセカンダリシステム150Sのいずれかにおいてビザンチン故障があることを表すデータをアプリケーション101に返す(S717)。
【0096】
以上が、ビザンチン故障検知プロトコルの説明である。
【0097】
ビザンチン故障検知プロトコルにおいて、2PLベースの順序付けが採用されている。このため、データベースシステム130におけるstrict serializabilityを保証することができる。一比較例として、順序付けにMVCC(MultiVersion Concurrency Control)を用いることが検討されるが、MVCCでは、セカンダリシステム150Sとプライマリシステム150Pとの間で一貫した順序付けを保証することは困難である。具体的には、例えば、次の通りである。すなわち、競合するトランザクションT1とT2とがデータベースシステム130にほぼ同時に到来し、MVCCを用いて共に順序付けされる、と仮定する。そして、両方のトランザクションが、直列化順序T1→T2で順序付けフェーズを通過する、と仮定する。しかし、その直列化順序T1→T2がプライマリシステム150Pにおいて保証されるものではない。なぜならば、セカンダリシステム150Sは、競合グラフなどの明示的な順序依存性をプライマリシステム150Pに渡さず、故に、プライマリシステム150Pは、セカンダリシステム150Sとは異なる直列化順序(例えば、T2→T1)でトランザクションを順序付けすることがあり得るからである。
【0098】
ビザンチン故障検知プロトコルが上述の三つのフェーズ(順序付け→コミット→検証)で構成されているため、データベースシステム130は、strict serializabilityを保証しつつ、並列実行を達成することができる。
【0099】
また、ビザンチン故障検知プロトコルによれば、セカンダリシステム150Sがプライマリシステム150Pよりも先に始動し、プライマリサーバ155Pがコミットフェーズの処理を行う。コミットフェーズの処理においてトランザクションの状態が確定するが、トランザクションの状態の確定は、セカンダリシステム150Sよりもプライマリシステム150Pが行うことが好ましい。しかし、変形例として、プライマリシステム150Pが先に始動してもよい。すなわち、順序付けフェーズの処理と検証フェーズの処理をプライマリサーバ155Pが行いコミットフェーズの処理をセカンダリサーバ155Sが行ってもよい。
【0100】
ところで、ビザンチン故障検知プロトコルによれば、順序付けフェーズにおいて既にロックが取得されていた場合、取得されているロックが解放されるべきであれば当該ロックを解放するためのリカバリ処理が行われる(S512)。例えば、セカンダリシステム150Sにおいて、ノードクラッシュやネットワーク故障などのクラッシュ故障があると、ロックが取得されたまま(解放されないまま)になることがある。リカバリ処理では、そのようなロックを解放することができる。
【0101】
図8は、リカバリ処理の流れの一例を示す。
【0102】
セカンダリサーバ155Sは、チェックするロックがあれば(S801:Yes)、そのロックから一つのロックを抽出する(S802)。ここで言う「チェックするロック」は、リードセット及びライトセットのうちのロックが取得されなかったレコードについてのロックであって、未だS802で抽出されていないロックである。
【0103】
セカンダリサーバ155Sは、抽出されたロックが失効しているか否かを判定する(S803)。この判定は、当該ロックのロックエントリ300における最新更新時刻307から一定時間経過しているか否かを判定である。なお、ロックが失効していない場合(S804:No)、そのロックが取得されているレコードについては、ロックの解放無しにリカバリ処理が終了し、トランザクションはアボートされる。
【0104】
ロックが失効している場合(S804:Yes)、そのロックのリカバリ試行処理が行われる(S805)。
【0105】
図9は、リカバリ試行処理の流れの一例を示す。
【0106】
セカンダリサーバ155Sは、そのロックのロックホルダ305(トランザクションIDの集合)を取得する(S901)。セカンダリサーバ155Sは、チェックするトランザクションIDがあれば(S902:Yes)、そのトランザクションIDから一つのトランザクションIDを抽出する(S903)。ここで言う「チェックするトランザクションID」は、S901で取得されたトランザクションIDのうち、未だS903で抽出されていないトランザクションIDである。
【0107】
セカンダリサーバ155Sは、S903で抽出されたトランザクションIDのステータスを特定するアボート試行処理を開始する(S904)。すなわち、図10に示すように、セカンダリサーバ155Sは、そのトランザクションIDを指定したアボート要求をプライマリサーバ155Pに送信する(S1001)。プライマリサーバ155Pは、当該アボート要求を受信し、当該アボート要求で指定されているトランザクションIDのトランザクションをアボートすることを試行し(S1002)、そのトランザクションのステータスをセカンダリサーバ155Sに返す(S1003)。そのトランザクションが未だコミットされていなければ、プライマリサーバ155Pがそのトランザクションのアボートに成功し、アボート済を意味するステータス“Aborted”が返される。そのトランザクションが既にコミットされていれば、プライマリサーバ155Pがそのトランザクションのアボートに失敗し、コミット済を意味するステータス“Committed”が返される。そのトランザクションが未だコミットされていないがプライマリサーバ155Pがそのトランザクションのアボートに失敗した場合(例えばセカンダリサーバ155Sがビジー状態であることが理由でトランザクションのアボートに失敗した場合)、所定のステータス“Unknown”が返される。セカンダリサーバ155Sは、アボート要求で指定されたトランザクションIDのトランザクションのステータスを受信する(S1004)。図10に例示のセカンダリサーバ155Sとプライマリサーバ155P間の通信は、クライアント102(典型的には、当該トランザクションIDのトランザクションを要求したクライアント)経由で行われてもよいし当該クライアント102非経由で行われてもよい。また、セカンダリサーバ155Sは、アボート要求に代えて、トランザクションIDを指定したステータス取得要求をプライマリサーバ155Pに送信し、ステータス取得要求に対しプライマリサーバ155Pから応答されたステータスに応じて、アボート要求をプライマリサーバ155Pに送信してもよい。
【0108】
セカンダリサーバ155Sは、プライマリサーバ155Pから応答されたステータスが“Unknown”の場合(S905:No)、S903で取得したIDについてのリカバリをスキップし、他のトランザクションIDをチェックする(S902)。このロック取得済のレコードが別のトランザクションのリードレコード又はライトレコードとなる場合に、そのレコードは再度リカバリ処理の対象になるので、リカバリをスキップすることは問題を引き起こさない。
【0109】
セカンダリサーバ155Sは、プライマリサーバ155Pから応答されたステータスが“Committed”又は“Aborted”の場合(S905:Yes)、そのトランザクションについてのロックをリカバリする。
【0110】
ロックタイプ303が“リードロック”の場合(S906:Yes)、セカンダリサーバ155Sは、トランザクションについてのロックを解放する(S908)。具体的には、セカンダリサーバ155Sは、ロックホルダ305からこのトランザクションのIDを除去し、ロックカウント304をデクリメントする。
【0111】
ロックタイプ303が“ライトロック”であり(S906:No)、ステータスが“Aborted”の場合(S907:Yes)、セカンダリサーバ155Sは、ロックエントリ300のバージョン302をインクリメントすること無しにロックを解放する(S908)。具体的には、セカンダリサーバ155Sは、ロックホルダ305からこのトランザクションIDを除去し(つまりロックホルダ305を空にし)、ロックカウント304をデクリメントする(つまり“0”とする)。
【0112】
ロックタイプ303が“ライトロック”であり(S906:No)、ステータスが“Committed”の場合(S907:No)、セカンダリサーバ155Sは、プルーフ取得処理を開始する(S909)。すなわち、図11に示すように、セカンダリサーバ155Sは、このロックに対応のレコードのプライマリプルーフを取得するべく、プルーフ要求をプライマリサーバ155Pに送信する(S1101)。そのプルーフ要求では、ロックエントリ300のレコードID(主キー)と当該ロックエントリ300のバージョン302の次のバージョンとが指定される。プライマリサーバ155Pは、当該プルーフ要求を受信し、当該プルーフ要求で指定されているレコードID及びバージョンのレコードについてプライマリプルーフを作成する(S1102)。具体的には、プライマリサーバ155Pは、プルーフ要求で指定されているレコードID及びバージョンに該当するレコードから、トランザクションID及びインプットを特定する。プライマリサーバ155Pは、プルーフ要求で指定されているレコードID及びバージョンと、特定されたトランザクションID及びインプットとを基に、MACを生成する。プライマリサーバ155Pは、それらのレコードID、バージョン、トランザクションID、インプット及びMACを含んだプライマリプルーフを作成する。プライマリサーバ155Pは、当該プライマリプルーフをセカンダリサーバ155Sに返す(S1103)。セカンダリサーバ155Sは、S1101で送信したプルーフ要求の応答として、当該プライマリプルーフを受信する(S1104)。
【0113】
セカンダリサーバ155Sは、受信したプライマリプルーフについて順序付け検証(図12)を行う(S910)。この順序付け検証においてOKが応答にセットされた場合に(S911:Yes)、セカンダリサーバ155Sは、当該検証されたプライマリプルーフに対応するレコードの新しい状態を導出する新規状態導出処理(図13参照)を行う(S912)。セカンダリサーバ155Sは、その状態を表すレコードをセカンダリデータベース154Sにライトし(S913)、ロックを解放する(S914)。新しい状態を表すレコードがライトされるので、セカンダリサーバ155Sは、ロックを解放する場合に、ロックエントリ300のバージョン302をインクリメントする。順序付け検証においてエラーが検知された場合(S911:No)、このリカバリ試行処理が終了する。
【0114】
各レコードについてのリカバリ処理は、再試行され得るように冪等である。セカンダリサーバ155Sの複数のプロセスが、リカバリ処理を同時に行ったとしても、一つのプロセスのみが、linearizableにロックを解放する。
【0115】
また、セカンダリサーバ155Sは、プライマリサーバ155Pとの間での合意無しにロックを解放しない。具体的には、セカンダリサーバ155Sは、ライトロックされているレコードのプライマリプルーフをプライマリサーバ155Pから取得し、当該プライマリプルーフの順序付け検証がされた場合に、ロックを解放する。
【0116】
図12は、順序付け検証の流れの一例を示す。
【0117】
セカンダリサーバ155Sは、検証するプライマリプルーフがあれば(S1201:Yes)、そのプライマリプルーフから一つのプライマリプルーフを抽出する(S1202)。ここで言う「検証するプライマリプルーフ」は、クライアント102又はプライマリサーバ155Pから受信したプライマリプルーフのうち、未だS1202で抽出されていないプライマリプルーフである。また、プライマリプルーフは、上述したように、レコード一つにつき一つである。例えば、二つのレコードA及びBをリードし二つのレコードC及びDをライトする場合、プライマリプルーフは四つである。二つのレコードA及びBをリードし二つのレコードA及びBをライトする場合、プライマリプルーフは二つである。
【0118】
セカンダリサーバ155Sは、抽出されたプライマリプルーフに対応のロックエントリ300を取得する(S1203)。具体的には、セカンダリサーバ155Sは、プライマリプルーフのレコードIDと同じレコードIDのロックエントリ300を取得する。
【0119】
セカンダリサーバ155Sは、ロックエントリ300のロックタイプ303が“リードロック”である場合(S1204:Yes)、プライマリプルーフのバージョン402とロックエントリ300のバージョン302が一致するか否かを判定する(S1205)。それらのバージョンが一致する場合(S1205:Yes)、処理がS1201に戻る。それらのバージョンが不一致の場合(S1205:No)、セカンダリサーバ155Sは、検証エラーを応答にセットする(S1206)。なお、「検証エラー」とは、「MAC検証エラー」と異なるエラーであり、ビザンチン故障の可能性がある(しかし必ずしもビザンチン故障があるとは限らない)ことを意味するエラーである。なお、クライアント105は、検証エラーがセットされている応答を受けた場合には、ビザンチン故障によってレコードが改ざんされているかどうかを確認するために、改ざんの可能性があるレコードをリードすることが望ましい。
【0120】
セカンダリサーバ155Sは、ロックエントリ300のロックタイプ303が“リードロック”ではない場合(S1204:No)、当該ロックタイプ303が“ライトロック”であるか否かを判定する(S1207)。ロックタイプ303が“ライトロック”ではない場合(S1207:No)、例えば、ロックタイプ303が改ざんされた場合、セカンダリサーバ155Sは、検証エラーを応答にセットする(S1209)。
【0121】
ロックタイプ303が“ライトロック”である場合(S1207:Yes)、セカンダリサーバ155Sは、ロックエントリ300のバージョン302の1インクリメント後の値と、プライマリプルーフのバージョン402が一致するか否かを判定する(S1208)。それらのバージョンが不一致の場合(S1208:No)、セカンダリサーバ155Sは、検証エラーを応答にセットする(S1209)。
【0122】
それらのバージョンが一致する場合(S1208:Yes)、セカンダリサーバ155Sは、ロックエントリ300のインプット306と、プライマリプルーフのインプット404が一致するか否かを判定する(S1210)。それらのインプットが不一致の場合(S1210:No)、セカンダリサーバ155Sは、ビザンチン故障エラーを応答にセットする(S1211)。それらのインプットが一致する場合(S1210:Yes)、処理がS1201に戻る。
【0123】
セカンダリサーバ155Sは、検証するプライマリプルーフが無い場合(S1201:No)、すなわち、全てのプライマリプルーフについてエラーが検知されない場合、OKを応答にセットする(S1212)。
【0124】
図13は、新規状態導出処理の流れの一例を示す。
【0125】
セカンダリサーバ155Sは、Statesとして空の値をセットする(S1301)。セカンダリサーバ155Sは、プライマリプルーフからインプット404、具体的には、一つ又は複数の入力値を取得する(S1302)。
【0126】
セカンダリサーバ155Sは、チェックする入力値があれば(S1303:Yes)、その入力値から一つの入力値を抽出する(S1304)。ここで言う「チェックする入力値」は、S1302で取得された入力値のうち、未だS1304で抽出されていない入力値である。
【0127】
セカンダリサーバ155Sは、抽出した入力値に対応のレコードをデータベース154Sからリードし(S1305)、リードしたレコードをStatesに追加する(S1306)。
【0128】
チェックされる入力値がなければ(S1303:No)、セカンダリサーバ155Sは、S909で取得されたプライマリプルーフが有するトランザクションIDをキーに、トランザクション要求用のデータベースからトランザクション要求を取得する(S1307)。セカンダリサーバ155Sは、取得されたトランザクション要求で指定されている関数を取得する(S1308)。セカンダリサーバ155Sは、Statesを用いて、当該関数を実行する(S1309)。これにより新しい状態(States)が得られる。セカンダリサーバ155Sは、得られた新しい状態を返す(S1310)。
【0129】
以上、一実施形態を説明したが、これらは本発明の説明のための例示であって、本発明の範囲をこれらの実施形態にのみ限定する趣旨ではない。本発明は、他の種々の形態でも実行することが可能である。
【0130】
例えば、同一のトランザクション要求について同じ決定的関数をプライマリサーバ155P及びセカンダリサーバ155Sが実行することは、同じ決定的関数のセットがプライマリサーバ155P及びセカンダリサーバ155Sに予めインストールされている以外の方法により実現されてもよい。例えば、クライアント102が、トランザクション要求の送信の都度に、トランザクション要求と共に決定的関数をプライマリサーバ155P及びセカンダリサーバ155Sに送信し、プライマリサーバ155P及びセカンダリサーバ155Sは、それぞれ、トランザクション要求と共に受信した決定的関数を実行してよい。また、トランザクション要求は、SQL文でもよい。
【0131】
また、例えば、上述の2PLベースのロック手法以外の手法を利用して、strict serializableに半順序に順序付けすることが実現されてもよい。
【0132】
また、上述した実施形態によれば、トランザクション要求毎に、順序付けフェーズにおいて、セカンダリサーバ155Sが、クライアント102からの当該トランザクション要求をstrict serializableな半順序に順序付けする。具体的には、トランザクション要求毎に、セカンダリサーバ155Sが、クライアントからのトランザクション要求に従うトランザクションを仮実行することで当該トランザクションの競合の有無を判定し、競合が無いことが判定された場合に所定の応答をクライアントに返す。
【符号の説明】
【0133】
130:データベースシステム
図1
図2
図3
図4
図5
図6
図7
図8
図9
図10
図11
図12
図13