[実施の形態1]
図7乃至図15を用いて、第1の実施の形態について説明する。図7に第1の実施の形態に係るシステムの構成図を示す。例えばインターネットであるネットワーク1には、複数のノード装置(図7では、ノード装置A乃至C)を含む分散処理システム100と、複数のユーザ端末(図7では、ユーザ端末A及びB)とが接続されている。なお、分散処理システム100は、結果整合性及び分散型のkey−valueストア方式を採用したシステムであり、分散処理システム100に含まれる各ノード装置には、結果整合性及び分散型のkey−valueストア方式を実現するための分散フレームワーク(図示せず)が実装されているものとする。図7では、ノード装置が3台、ユーザ端末が2台の例を示しているが、ノード装置及びユーザ端末の台数は、これに限定されない。
図8に、第1の実施の形態に係るノード装置の機能ブロック図を示す。第1の実施の形態に係るノード装置は、メッセージ受信部11と、メッセージ処理部12と、メッセージ送信部13と、コマンドリスト管理部14と、確定クロック処理部15と、データベース16とを有する。なお、コマンドリスト管理部14は、自ノード装置が受け付けたコマンド(例えばgetコマンド、setコマンドなど)の識別子と、当該コマンドを受け付けた時点の論理クロック値との対を含むコマンドリストを格納するコマンドリスト格納部141を管理する。また、確定クロック処理部15は、クロックリスト受信部151と、確定クロック管理部153と、クロックリスト送信部155と、確定クロック値格納部157とを有する。データベース16には、自ノード装置が担当するキー(以下、担当キーと呼ぶ)及び当該担当キーに対応するデータ値が格納される。
メッセージ受信部11は、ユーザ端末からのコマンドや、分散処理システム100内の他のノード装置からのメッセージを受信する。なお、メッセージ受信部11は、ユーザ端末から新たなコマンドを受け付けた場合には、コマンドの情報を、メッセージ処理部12又はコマンドリスト管理部14に出力する。メッセージ処理部12は、データベース16に格納されているデータを用いて、メッセージ受信部11が受信したコマンドやメッセージに応じた処理を実施し、必要に応じて処理結果をデータベース16に格納する。また、メッセージ処理部12は、処理完了時には、処理完了通知をコマンドリスト管理部14に出力する。メッセージ送信部13は、メッセージ処理部12の処理結果をコマンド要求元のユーザ端末に送信したり、分散処理システム100内の他のノード装置にメッセージを送信したりする。
コマンドリスト管理部14は、メッセージ受信部11及びメッセージ処理部12からの通知に応じて、コマンドリスト格納部141内のコマンドリストを更新したり、コマンドリストから自ノード装置における確定クロック値(以下、第1の確定クロック値と呼ぶ場合もある)を計算したりする。例えば、論理クロック値が10の時にgetコマンドを受け付け、論理クロック値が14の時にsetコマンドを受け付け、論理クロック値が16の時にgetコマンドを受け付けており、これらのコマンドの処理が未だ完了していない場合には、コマンドリスト={10:get,14:set,16:get}といったようなデータがコマンドリスト格納部141に格納される。なお、コマンドリストに含まれる最小の論理クロック値から1減じた値が第1の確定クロック値となる。例えば上記のようなコマンドリストであれば、コマンドリストに含まれる最小の論理クロック値は10であり、第1の確定クロック値は9(=10−1)となる。なお、コマンドリストが空の場合には、現時点における自ノード装置の論理クロック値が第1の確定クロック値となる。
また、確定クロック処理部15のクロックリスト受信部151は、分散処理システム100内の他のノード装置からクロックリストを受信する。クロックリストは、分散処理システム100内のノード装置の間で回覧されるデータである。なお、クロックリストには、ノード装置の識別情報と、当該ノード装置の第1の確定クロック値との対が含まれる。例えば、ノード装置Aの第1の確定クロック値が10であり、ノード装置Bの第1の確定クロック値が5であり、ノード装置Cの第1の確定クロック値が7であった場合、クロックリスト={ノードA:10,ノードB:5,ノードC:7}となる。
確定クロック処理部15の確定クロック管理部153は、コマンドリスト管理部14によって計算された第1の確定クロック値を用いて、クロックリスト受信部151が受信したクロックリストを更新し、更新後のクロックリストから分散処理システム100全体における確定クロック値(以下、系全体の確定クロック値又は第2の確定クロック値と呼ぶ場合もある)を特定し、確定クロック値格納部157に格納する。クロックリスト送信部155は、確定クロック管理部153によって更新されたクロックリストを、分散処理システム100内の他のノード装置に送信する。
次に、図9及び図10を用いて、分散処理システム100全体の処理について説明する。例えば、分散処理システム100の起動時にクロックリストを生成するノード装置が予め決められており、システムが正常に起動した後、そのノード装置が、分散処理システム100内のノード装置の情報(例えば、ノード装置の総数やノード装置の識別情報など)を取得する。そして、取得した情報を用いてクロックリストを生成し、クロックリストの回覧を開始する。なお、ここでは、「ノード装置A−>ノード装置B−>ノード装置C」の順でクロックリストが回覧されるものとし、ノード装置Cの後、再びノード装置Aに戻るものとする。なお、図9(a)に示すように、分散処理システム100において、ノード装置Aの第1の確定クロック値が10であり、ノード装置Bの第1の確定クロック値が8であり、ノード装置Cの第1の確定クロック値が12であるものとする。ここで、例えば、クロックリスト={ノードA:5,ノードB:4,ノードC:7}がノード装置Aに回ってきたとすると、ノード装置Aは、自ノード装置の第1の確定クロック値(=10)に従って、クロックリストを更新する。なお、図9(a)における太枠の丸印は、クロックリストを所持しているノード装置を示している(以下、同じ)。そうすると、図9(b)に示すように、クロックリストは、{ノードA:10,ノードB:4,ノードC:7}といった内容に更新される。そして、更新後のクロックリストに含まれる最小の第1の確定クロック値(=4)を、系全体の確定クロック値として特定する。なお、特定された系全体の確定クロック値(=4)は、ノード装置Aの確定クロック値格納部157に格納される。その後、クロックリストは、ノード装置Bへ送信される。
そして、ノード装置Bは、クロックリスト={ノードA:10,ノードB:4,ノードC:7}を受信すると、自ノード装置の第1の確定クロック値(=8)に従って、クロックリストを更新する。そうすると、図9(c)に示すように、クロックリストは、{ノードA:10,ノードB:8,ノードC:7}といった内容に更新される。そして、更新後のクロックリストに含まれる最小の第1の確定クロック値(=7)を、系全体の確定クロック値として特定する。なお、特定された系全体の確定クロック値(=7)は、ノード装置Bの確定クロック値格納部157に格納される。その後、クロックリストは、ノード装置Cへ送信される。
そして、ノード装置Cは、クロックリスト={ノードA:10,ノードB:8,ノードC:7}を受信すると、自ノード装置の第1の確定クロック値(=12)に従って、クロックリストを更新する。そうすると、図10(a)に示すように、クロックリストは、{ノードA:10,ノードB:8,ノードC:12}といった内容に更新される。そして、更新後のクロックリストに含まれる最小の第1の確定クロック値(=8)を、系全体の確定クロックとして特定する。なお、特定された系全体の確定クロック値(=8)は、ノード装置Cの確定クロック値格納部157に格納される。その後、クロックリストは、ノード装置Aへ送信される。
そして、図10(b)に示すように、ノード装置Aは、クロックリスト={ノードA:10,ノードB:8,ノードC:12}を受信すると、自ノード装置の第1の確定クロック値に従って、クロックリストを更新する。ここでは、ノード装置Aの第1の確定クロック値は10のままであったものとする。従って、クロックリストの内容は、更新前と変わらない。なお、このような場合には、クロックリストの更新処理を省略してもよい。その後、クロックリストに含まれる最小の第1の確定クロック値(=8)を、系全体の確定クロック値として特定する。なお、特定された系全体の確定クロック値(=8)は、ノード装置Aの確定クロック値格納部157に格納される。
このように、分散処理システム100内の各ノード装置は、クロックリストが自ノード装置に回ってきた時に、クロックリストを最新の状態に更新し、分散処理システム100における系全体の確定クロック値を特定する。そして、クロックリストを次のノード装置に渡す。
なお、図9及び図10では、ノード装置A乃至Cにおいて、第1の確定クロック値が変化しない例を示したが、分散処理システム100では、並行してコマンドの処理も行われているので、コマンドリストが順次更新され、第1の確定クロック値も徐々に変化することになる。例えば図11を用いて、第1の確定クロック値が変化する場合について説明する。なお、図11の例では説明を簡単にするために、ノード装置A及びBのみが存在するものとする。
まず、ノード装置Aが、ノード装置Bからクロックリスト={ノードA:1,ノードB:1}を受信する(図11のT1)。このとき、ノード装置Aの第1の確定クロック値は3であり、ノード装置Aがクロックリストを更新すると、クロックリスト={ノードA:3,ノードB:1}となる。そうすると、ノード装置Bの第1の確定クロック値(=1)が、クロックリスト内の第1の確定クロック値の中で最小のものとなる。よって、T1の段階では「1」が系全体の確定クロック値として特定される。その後、クロックリストは、ノード装置Aからノード装置Bへ送信される。
そして、ノード装置Bが、ノード装置Aからクロックリスト={ノードA:3,ノードB:1}を受信する(図11のT2)。このとき、ノード装置Bの第1の確定クロック値は4であり、ノード装置Bがクロックリストを更新すると、クロックリスト={ノードA:3,ノードB:4}となる。そうすると、ノード装置Aの第1の確定クロック値(=3)が、クロックリスト内の第1の確定クロック値の中で最小のものとなる。よって、T2の段階では「3」が系全体の確定クロック値として特定される。その後、クロックリストは、ノード装置Bからノード装置Aへ送信される。
そして、ノード装置Aが、ノード装置Bからクロックリスト={ノードA:3,ノードB:4}を受信する(図11のT3)。このとき、ノード装置Aの第1の確定クロック値は6になっているので、ノード装置Aがクロックリストを更新すると、クロックリスト={ノードA:6,ノードB:4}となる。そうすると、ノード装置Bの第1の確定クロック値(=4)が、クロックリスト内の第1の確定クロック値の中で最小のものとなる。よって、T3の段階では「4」が系全体の確定クロック値として特定される。その後、クロックリストは、ノード装置Aからノード装置Bへ送信される。
そして、ノード装置Bが、ノード装置Aからクロックリスト={ノードA:6,ノードB:4}を受信する(図11のT4)。このとき、ノード装置Bの第1の確定クロック値は8になっているので、ノード装置Bがクロックリストを更新すると、クロックリスト={ノードA:6,ノードB:8}となる。そうすると、ノード装置Aの第1の確定クロック値(=6)が、クロックリスト内の第1の確定クロック値の中で最小のものとなる。よって、T4の段階では「6」が系全体の確定クロック値として特定される。その後、クロックリストは、ノード装置Bからノード装置Aへ送信される。
そして、ノード装置Aが、ノード装置Bからクロックリスト={ノードA:6,ノードB:8}を受信する(図11のT5)。このとき、ノード装置Aの第1の確定クロック値は6のままであるので、クロックリストの内容は変わらない。但し、T3の段階では最小の第1の確定クロック値は4であったが、T4の段階でノード装置Bによってクロックリストが更新されたことにより、T5の段階では最小の第1の確定クロック値が6に変わっている。よって、T5の段階では「6」が系全体の確定クロック値として特定される。その後、クロックリストは、ノード装置Aからノード装置Bへ送信される。
そして、ノード装置Bは、ノード装置Aからクロックリスト={ノードA:6,ノードB:8}を受信する(図11のT6)。このとき、ノード装置Bの第1の確定クロック値は12になっているので、ノード装置Bがクロックリストを更新すると、クロックリスト={ノードA:6,ノードB:12}となる。なお、T6の段階では、最小の第1の確定クロック値(=6)がT4の時と変わっていないため、系全体の確定クロック値は「6」のままである。その後、クロックリストは、ノード装置Bからノード装置Aへ送信される。
そして、ノード装置Aは、ノード装置Bからクロックリスト={ノードA:6,ノードB:12}を受信する(図11のT7)。このとき、ノード装置Aの第1の確定クロック値は13になっているので、ノード装置Aがクロックリストを更新すると、クロックリスト={ノードA:13,ノードB:12}となる。そうすると、ノード装置Bの第1の確定クロック値(=12)が、クロックリスト内の第1の確定クロック値の中で最小のものとなる。よって、T7の段階では「12」が系全体の確定クロック値として特定される。
このように第1の確定クロック値の変化に応じて、系全体の確定クロック値も変化していく。なお、図11では、ノード装置A及びBの2台のみが存在する例を示したが、ノード装置が3台以上存在する場合も、各ノード装置の処理は同じである。
以上のような処理を実施することにより、分散処理システム100における系全体の確定クロック値を特定することができ、分散処理システム100全体として、どこまでデータが確定しているのかを把握できるようになる。
次に、第1の実施の形態に係るノード装置の処理フローについて説明する。最初に、図12を用いて、コマンド受信時の処理フローを説明する。まず、メッセージ受信部11が、ユーザ端末から新たなコマンドを受信し(図12:ステップS1)、コマンド受信時の論理クロック値を特定する。そして、メッセージ受信部11は、コマンドの識別子やコマンド受信時の論理クロック値などを含むコマンド情報を、メッセージ処理部12及びコマンドリスト管理部14に通知する。
そして、コマンドリスト管理部14は、メッセージ受信部11からコマンド情報を受信すると、コマンドの識別子とコマンド受信時の論理クロック値との対をコマンドリストに登録する(ステップS3)。すなわち、コマンドを受信する毎に、コマンドの識別子とコマンド受信時の論理クロック値との対がコマンドリストに登録されていく。
また、メッセージ処理部12は、メッセージ受信部11からコマンド情報を受信すると、受信コマンドに応じた処理を実施する。メッセージ処理部12については、従来と変わらないため、これ以上説明しない。そして、処理を終了する。
次に、図13を用いて、コマンドの処理完了時の処理フローを説明する。例えば、コマンドリスト管理部14は、コマンドリスト格納部141に格納されているコマンドリストを検索し、処理中のコマンドがあるか判断する(図13:ステップS11)。例えば、コマンドリストが空の場合には処理中のコマンドはないと判断し、コマンドリストに、コマンドの識別子とコマンド受信時の論理クロック値との対が1つでも登録されている場合には処理中のコマンドがあると判断する。なお、コマンドリストが空の場合、すなわち処理中のコマンドがないと判断された場合には(ステップS11:Noルート)、処理を終了する。
一方、処理中のコマンドがあると判断された場合(ステップS11:Yesルート)、コマンドリスト管理部14は、いずれかのコマンドの処理が完了したか判断する(ステップS13)。例えば、図13の処理フローと並行して、メッセージ処理部12がコマンドに応じた処理を実施しており、処理が完了した場合には、処理が完了したコマンドの識別子などの情報を含む処理完了通知がコマンドリスト管理部14に対して送信される。従って、コマンドリスト管理部14は、処理完了通知を受信した場合、処理が完了したと判断する。なお、処理完了通知を受信していなければ(ステップS13:Noルート)、処理完了通知を受信するまで待つ。
そして、いずれかのコマンドの処理が完了したと判断された場合(ステップS13:Yesルート)、コマンドリスト管理部14は、処理が完了したコマンドの識別子と当該コマンド受信時の論理クロック値との対のデータをコマンドリスト格納部141内のコマンドリストから削除する(ステップS15)。
また、メッセージ処理部12による処理が完了した場合には、メッセージ送信部13が、処理結果をコマンド要求元へ送信する(ステップS17)。その後、ステップS11の処理に戻り、コマンドリストが空になるまで処理を繰り返す。なお、図13の処理フローにおいて、ステップS15及びS17については順番の入れ替えが可能であり、また並列に実施するようにしてもよい。
以上、図12及び図13に示したような処理を実施することにより、処理中のコマンドの情報を適切に管理することができる。
次に、図14及び図15を用いて、クロックリスト受信時の処理フローを説明する。まず、クロックリスト受信部151が、分散処理システム100内の他のノード装置からクロックリストを受信し(図14:ステップS21)、受信したクロックリストを、確定クロック管理部153に出力する。
そして、確定クロック管理部153は、クロックリスト受信部151からクロックリストを受信すると、確定クロック値特定処理を実施する(ステップS23)。この確定クロック値特定処理については図15を用いて説明する。
まず、確定クロック管理部153は、コマンドリスト管理部14に、現時点における自ノード装置の第1の確定クロック値を算出するよう指示する。コマンドリスト管理部14は、確定クロック管理部153からの指示に応じて、コマンドリスト格納部141に格納されているコマンドリストから、現時点における第1の確定クロック値を算出する(図15:ステップS31)。具体的には、コマンドリストに含まれる最小の論理クロック値から1減じた値を、現時点における第1の確定クロック値として算出する。論理クロック値は、増えていく一方であるという性質があるため、コマンドリストに含まれる最小の論理クロック値の1つ前のところまでは、確定しているものとみなすことができる。例えば、コマンドリストに含まれる最小の論理クロック値が10であった場合には、第1の確定クロック値として9(=10−1)が算出される。なお、全ての処理が完了し、コマンドリストが空の場合もある。コマンドリストが空の場合には、現時点における論理クロック値を第1の確定クロック値として算出する。例えば背景技術の欄で述べたように、各ノード装置は論理クロック値を交換しながら処理を行う。すなわち、コマンドリストが空の状態でも、他のノード装置からメッセージを受信することで、論理クロック値は進んでいくことになる。そのため、コマンドリストが空の場合には、現時点における論理クロック値を第1の確定クロック値とする。その後、コマンドリスト管理部14は、算出した第1の確定クロック値を確定クロック管理部153に出力する。
そして、確定クロック管理部153は、コマンドリスト管理部14から第1の確定クロック値を受信すると、その第1の確定クロック値を用いてクロックリストを更新する(ステップS33)。すなわち、ステップS31において算出された第1の確定クロック値で、クロックリストに含まれる自ノード装置の第1の確定クロック値を書き換える。
その後、確定クロック管理部153は、更新後のクロックリストから系全体の確定クロック値を特定し、確定クロック値格納部157に格納する(ステップS35)。具体的には、更新後のクロックリストに含まれる第1の確定クロック値のうち、最小のものを系全体の確定クロック値として特定する。
そして、確定クロック管理部153は、更新後のクロックリストを送信するようクロックリスト送信部155に指示する。クロックリスト送信部155は、確定クロック管理部153からの指示に応じて、更新後のクロックリストを、分散処理システム100内の次のノード装置へ送信する(ステップS37)。そして、処理を終了する。なお、クロックリストの回し方としては、例えば、予め回す順番が決定されているような場合(例えばノード識別番号の昇順又は降順など)もあれば、ランダムに回すような場合もある。また、例えば、分散処理システム100内の他のノード装置のうち、第1の確定クロック値が最も小さいノード装置をクロックリストから特定し、特定したノード装置へ送信するような場合もある。系全体の確定クロック値は、クロックリストに含まれる最小の第1の確定クロック値であるから、第1の確定クロック値が最小であるノード装置へ優先的に回すようにすれば、当該ノード装置の第1の確定クロック値が更新された場合には直ぐに系全体の確定クロック値に反映されるようになる。
また、クロックリストの数は、1個である必要はなく、複数のクロックリストを回覧するようにしてもよい。例えばクロックリストの数を増やせば、クロックリストの受信間隔が短くなるので、図14及び図15に示した処理の実行間隔も短くなる。従って、系全体の確定クロック値をより細かく把握できるようになる。さらに、複数のクロックリストを回覧する際には、クロックリストの回し方は自由である。
以上のような処理を実施することにより、分散処理システム100における系全体の確定クロック値を特定することができる。そして、系全体の確定クロック値が分かることによって、システム全体としてどこまでデータが確定しているのか把握できるようになる。
[実施の形態2]
次に、第2の実施の形態について説明する。まず、第2の実施の形態に係るノード装置の機能ブロック図を図16に示す。なお、本実施の形態に係るノード装置は、複数のキーの各々に対応するデータ値を複数のノード装置に分散して管理する分散処理システム(例えば分散型のkey−valueストア方式を実装した分散処理システム)に含まれるノード装置である。そして、本実施の形態に係るノード装置は、履歴要素登録部1501と、マーカ登録部1503と、第1記憶部1505と、第2記憶部1507と、データ特定部1509とを有する。履歴要素登録部1501は、担当キーに係る所定のコマンドを受け付けた場合に、そのコマンドに係る履歴要素を第1記憶部1505に登録する。マーカ登録部1503は、複数レコードの参照要求を受け付けた場合、参照要求の情報などを含むマーカを第1記憶部1505又は第2記憶部1507に登録する。データ特定部1509は、第1記憶部1505及び第2記憶部1507に格納されているデータを用いて処理を行う。
次に、図16に示したノード装置の処理内容を図17を用いて説明する。まず、担当キーに係るコマンドを受け付けた場合、履歴要素登録部1501が、当該所定のコマンドを受け付けた時点の論理クロック値と当該論理クロック値の示す時刻におけるデータ値又は所定のコマンドの情報(例えばコマンドで指定された演算内容の情報など)とを含む履歴要素を第1記憶部1505に登録する(図17:ステップS1001)。また、特定の論理クロック値の示す時刻における複数のデータ値を参照するための参照要求を受け付けた場合、マーカ登録部1503が、当該参照要求を受け付けた時点の論理クロック値又は当該参照要求で指定された論理クロック値を特定の論理クロック値として含み且つ当該参照要求の情報を含む第1マーカを第1記憶部1505又は第2記憶部1507に登録する(ステップS1003)。このように第1マーカを登録しておくことで、分散処理システム全体における確定クロック値が徐々に変化していく中で、どのタイミングでデータ値を求めれば良いかが分かる。なお、分散処理システム全体における確定クロック値は、第1の実施の形態で説明したような処理を実施することによって特定される。
そして、分散処理システム全体における確定クロック値が、第1記憶部1505又は第2記憶部1507内の第1マーカに含まれる特定の論理クロック値以上になった場合に、データ特定部1509が、特定の論理クロック値以下である論理クロック値を含む履歴要素から、特定の論理クロック値の示す時刻における、担当キーに対応するデータ値を特定する(ステップS1005)。分散処理システム全体における確定クロック値が特定の論理クロック値以上であるということは、特定の論理クロック値の示す時刻におけるデータ値が確定していると判断できる。そして、適切な履歴要素から、特定の論理クロック値の示す時刻におけるデータ値が特定されるので、特定の論理クロック値の示す時刻におけるデータ値を把握できるようになる。
[実施の形態3]
次に、第3の実施の形態について説明する。まず、本実施の形態における分散処理システムの全体構成について簡単に説明する。本実施の形態では、例えば図18に示すように、受け付けたコマンド毎に履歴要素を格納するものとする。図18では、分散処理システムは、処理を受け持つノード装置A乃至Cを含み、各ノード装置には、分散フレームワークが実装されている。なお、図18では、ノード装置Bが、キーAのレコード(以下、レコードAと呼ぶ)の担当となっている。例えば図18(a)に示すようにノード装置Aがset(key=A,2)コマンドを受け付けたとすると、分散フレームワークにより、setコマンドに対してタイムスタンプが振られる。ここでは、t=3が振られたものとする。その後、キーAの担当ノードを探索し、分散フレームワークの連携によって、キーAの担当ノードであるノード装置Bにsetコマンドが転送される。そうすると、setコマンドの履歴要素{2,t=3}がノード装置Bのデータベースに登録される。ここで、履歴要素{2,t=3}は、t=3の時点で、キーAのデータ値として2が設定されたことを示している。なお、コマンドを受け付けたノード装置のことを、レセプタと呼び、あるレコードを担当するノード装置のことを、コンテナと呼ぶ場合もある。図18(a)の例では、ノード装置Aは、setコマンドのレセプタであり、ノード装置Cは、getコマンドのレセプタである。また、ノード装置Bは、レコードAのコンテナである。
その後、例えばノード装置Cがget(key=A)コマンドを受け付けたとすると、分散フレームワークが連携して、キーAの担当であるノード装置BのデータベースからキーAのデータ値を取得し、getコマンドの要求元に出力する。ここで、ノード装置Bのデータベースには、履歴要素{2,t=3}が登録されているので、キーAのデータ値として2が取得される。なお、getコマンドについても、getコマンドを受け付けた時点で、分散フレームワークによりタイムスタンプが振られる。
その後、例えば図18(b)に示すようにノード装置Aがinc(key=A)コマンドを受け付けたとすると、同様に、分散フレームワークにより、incコマンドに対してタイムスタンプが振られる。ここでは、t=5が振られたものとする。なお、incコマンドは、キーAのデータ値を1インクリメントさせるためのコマンドであるものとする。その後、キーAの担当ノード装置を探索し、分散フレームワークの連携によって、キーAの担当ノードであるノード装置Bにincコマンドが転送される。そうすると、incコマンドの履歴要素{inc,t=5}がノード装置Bのデータベースに登録される。ここで、履歴要素{inc,t=5}は、t=5の時点で、incコマンドを受け付けたことを示している。
その後、例えばノード装置Cが再びget(key=A)コマンドを受け付けたとすると、分散フレームワークが連携して、キーAの担当であるノード装置BのデータベースからキーAのデータ値を取得し、getコマンドの要求元に出力する。ここで、ノード装置Bのデータベースには、履歴要素として{2,t=3}と{inc,t=5}が登録されているので、t=3の時点のデータ値(=2)を1インクリメントした値(=3)がキーAのデータ値として取得される。なお、上では、incコマンドを例にして説明したが、他の演算についても同様に、コマンドで指定された演算内容の情報とタイムスタンプとを含む履歴要素を登録しておく。このように、レコード単位で、コマンドの履歴要素をタイムスタンプの順に蓄積しておき、例えばgetコマンドを受けた場合には、履歴要素を用いて、現時点におけるデータ値を計算し、計算結果を返すようになっている。
また、本実施の形態では、ある時点における複数のデータ値を参照するための参照要求をユーザ端末から受信した場合には、参照要求の情報(以下、snapshotと記す)と、参照要求受信時の論理クロック値又は参照要求で指定された論理クロック値とを含むマーカを登録するようにする。例えば図19に示すように、t=7の時点における複数のデータ値を参照するための参照要求を受信した場合には、マーカ{snapshot,t=7}を各ノード装置のデータベースに登録する。なお、図19では、ノード装置AがレコードAのコンテナであり、ノード装置BがレコードBのコンテナであり、ノード装置CがレコードCのコンテナであるものとする。そして、各ノード装置では、第1の実施の形態で説明したような処理を実施することによって分散処理システムにおける系全体の確定クロック値を特定し、系全体の確定クロック値が、マーカに含まれる論理クロック値以上になったか判断する。例えば、マーカ{snapshot,t=7}が登録されていた場合には、系全体の確定クロック値が7以上になったか判断する。系全体の確定クロック値が7未満であれば、t=7の時点におけるデータ値は未だ確定していないことになる。一方、系全体の確定クロック値が7以上になっていれば、t=7の時点におけるデータ値は既に確定していることになり、マーカより下に蓄積されている履歴要素から、t=7の時点におけるデータ値を特定する。
例えば図19に示したような状態で、系全体の確定クロック値が7以上になった場合には、レコードAについては、マーカの下に蓄積されている履歴要素のうち最新の履歴要素は{4,t=4}である。履歴要素{4,t=4}は、t=4の時点で、キーAのデータ値として4が設定されたことを示している。そして、t=4の時点からt=7の時点までの間に、キーAに係るコマンドは受けていないので、t=7の時点におけるキーAのデータ値は4となる。また、レコードBについては、マーカの下に蓄積されている履歴要素のうち最新の履歴要素は{14,t=6}である。履歴要素{14,t=6}は、t=6の時点で、キーBのデータ値として14が設定されたことを示している。そして、t=6の時点からt=7の時点までの間に、キーBに係るコマンドは受けていないので、t=7の時点におけるキーBのデータ値は14となる。さらに、レコードCについては、マーカの下に蓄積されている履歴要素のうち最新の履歴要素は{22,t=2}である。履歴要素{22,t=2}は、t=2の時点で、キーCのデータ値として22が設定されたことを示している。そして、t=2の時点からt=7の時点までの間に、キーCに係るコマンドは受けていないので、t=7の時点におけるキーCのデータ値は22となる。なお、演算内容の情報を含む履歴要素があった場合には、上で説明したように、マーカの下に蓄積されている複数の履歴要素を用いて、データ値を計算する。
なお、図20に示すように、レコードAについて、{1,t=0}、{2,t=2}、{3,t=3}、{4,t=4}といった履歴要素が蓄積されている状態において、系全体の確定クロック値が3になった場合には、履歴要素のうち、{1,t=0}、{2,t=2}、{3,t=3}の3つが確定部分となる。そして、この確定部分の履歴要素から、t=3の時点におけるデータ値を特定(もしくは計算)すると、t=3の時点におけるキーAのデータ値は3であることが分かる。この場合、確定部分の履歴要素のうち、t=3の時点におけるキーAのデータ値を含む履歴要素があれば、他の履歴要素を削除しても問題はない。従って、この場合には、{1,t=0}、{2,t=2}の2つの履歴要素は削除することができる。
図21に、本実施の形態に係るノード装置の機能ブロック図を示す。なお、本実施の形態におけるシステム構成は、図7に示したシステム構成と同じである。本実施の形態に係るノード装置は、メッセージ受信部11と、メッセージ送信部13と、コマンドリスト管理部14と、確定クロック処理部15と、メッセージ処理部17と、データベース18と、データ処理部19とを有する。なお、コマンドリスト管理部14は、上で述べたようなコマンドリストを格納するコマンドリスト格納部141を管理する。また、確定クロック処理部15は、クロックリスト受信部151と、確定クロック管理部153と、クロックリスト送信部155と、確定クロック値格納部157とを有する。なお、メッセージ受信部11とメッセージ送信部13とコマンドリスト管理部14と確定クロック処理部15とは、基本的には第1の実施の形態で説明したものと同じである。
また、メッセージ処理部17は、履歴要素をデータベース18に登録する履歴登録部171と、マーカをデータベース18に登録するマーカ登録部173とを有する。この他、メッセージ処理部17は、第1の実施の形態で説明したメッセージ処理部12と同じ機能も有する。なお、マーカを登録する際には、各ノード装置におけるマーカ登録部173が連携して、各ノード装置のデータベース18に同じマーカを登録する。これにより、複数レコードで一貫したデータ値を参照できるようになる。また、データ処理部19は、確定クロック処理部15の確定クロック値格納部157とデータベース18とに格納されているデータとを用いて処理を実施し、データベース18を更新したり、処理結果を送信するようメッセージ送信部13に指示したりする。メッセージ送信部13は、データ処理部19からの指示に応じて、データベース18に格納されているデータをユーザ端末に送信したり、データベース18を更新したりする。
次に、図22及び図23を用いて、本実施の形態における分散処理システム全体の処理について説明する。例えば、分散処理システムにおいて、レコードA乃至Cの各々について、図22(a)に示すような履歴要素が蓄積されているものとする。ここでは、レコードAに対するコマンドに係る履歴要素を格納するための記憶領域を記憶領域A、レコードBに対するコマンドに係る履歴要素を格納するための記憶領域を記憶領域B、レコードCに対するコマンドに係る履歴要素を格納するための記憶領域を記憶領域Cと呼ぶ(以下、同じ)。また、図22(a)において、記憶領域内の1ブロックは、1つの履歴要素を示している(以下、同じ)。なお、これらの記憶領域は、ノード装置のデータベース18に確保される。図22(a)において、記憶領域Aには、下から順に、{1,t=0}、{2,t=2}、{3,t=3}、{4,t=4}といった4つの履歴要素が蓄積されている。また、記憶領域Bは、下から順に、{11,t=0}、{12,t=2}、{13,t=3}、{14,t=6}といった4つの履歴要素が蓄積されている。さらに、記憶領域Cには、下から順に、{21,t=0}、{22,t=2}といった2つの履歴要素が蓄積されている。
例えば図22(a)に示した状態において、t=7の時点における複数のデータ値を参照するための参照要求を受信した場合には、各ノード装置のマーカ登録部173が連携して、データベース18にマーカ{snapshot,t=7}を登録する。マーカの登録位置は、そのマーカに含まれる論理クロック値から特定される。なお、マーカが登録されると、各記憶領域の内容は、図22(b)に示すような内容となる。図22(b)では、マーカに含まれる論理クロック値が、蓄積されている履歴要素内の論理クロック値より大きいため、各記憶領域の一番上にマーカが積まれている。なお、図22(b)において、記憶領域内の網掛けのブロックは、マーカを示している(以下、同じ)。
その後、例えば、いずれかのノード装置が、t=6の時点で、set(key=C,24)コマンドを受け付け、t=8の時点で、set(key=B,15)コマンドを受け付けたものとする。そうすると、履歴登録部171が、データベース18に履歴要素を登録する。例えば図22(c)に示すように、記憶領域Cにおいて、履歴要素{24,t=6}がマーカの下に挿入される。また、記憶領域Bにおいて、履歴要素{15,t=8}がマーカの上に積まれる。
その後、t=4の時点までデータが確定したものとする。すなわち、系全体の確定クロック値が4と特定されたものとする。この場合、データ処理部19が、データベース18に蓄積されている履歴要素から、t=4の時点におけるデータ値を特定(もしくは計算)する。例えば図22(d)に示すように、レコードAについては、記憶領域Aに蓄積されている履歴要素のうち、{1,t=0}、{2,t=2}、{3,t=3}、{4,t=4}の4つが確定部分となり、この確定部分の履歴要素から、t=4の時点におけるキーAのデータ値は4と特定される。また、レコードBについては、記憶領域Bに蓄積されている履歴要素のうち、{11,t=0}、{12,t=2}、{13,t=3}の3つが確定部分となり、この確定部分の履歴要素から、t=4の時点におけるキーBのデータ値は13と特定される。さらに、レコードCについては、記憶領域Cに蓄積されている履歴要素のうち、{21,t=0}、{22,t=2}の2つが確定部分であり、この確定部分の履歴要素から、t=4の時点におけるキーCのデータ値は22と特定される。なお、記憶領域Aにおいて、履歴要素{4,t=4}が保持されていれば、当該履歴要素の下に蓄積されている履歴要素を削除することができる。同様に、記憶領域Bにおいて、履歴要素{13,t=3}が保持されていれば、当該履歴要素の下に蓄積されている履歴要素を削除することができる。さらに、記憶領域Cにおいて、履歴要素{22,t=2}が保持されていれば、当該履歴要素の下に蓄積されている履歴要素を削除することができる。従って、データ処理部19は、記憶領域Aから、{1,t=0}、{2,t=2}、{3,t=3}の3つの履歴を削除し、記憶領域Bから、{11,t=0}、{12,t=2}の2つの履歴要素を削除し、記憶領域Cから、{21,t=0}を削除する。これらの履歴要素が削除されると、各記憶領域の内容は、図23(a)に示すような内容となる。
その後、例えば、いずれかのノード装置が、t=5の時点で、set(key=A,5)コマンドを受け付け、t=9の時点で、set(key=C,25)コマンドを受け付けたものとする。そうすると、履歴登録部171が、データベース18に履歴要素を登録する。例えば図23(b)に示すように、記憶領域Aにおいて、履歴要素{5,t=5}がマーカの下に挿入される。また、記憶領域Cにおいて、履歴要素{25,t=9}がマーカの上に積まれる。
その後、系全体の確定クロック値が、マーカに含まれる論理クロック値以上になったものとする。ここでは、系全体の確定クロック値が7と特定されたものとする。この場合、データ処理部19が、データベース18においてマーカの下に蓄積されている履歴要素から、マーカに含まれる論理クロック値の示す時刻におけるデータ値を特定(もしくは計算)する。図23(c)に示すように、レコードAについては、記憶領域Aにおいてマーカの下に蓄積されている履歴要素は、{4,t=4}、{5,t=5}の2つであり、この2つの履歴要素から、t=7の時点におけるキーAのデータ値は5と特定される。また、レコードBについては、記憶領域Bにおいてマーカの下に蓄積されている履歴要素は、{13,t=3}、{14,t=6}の2つであり、この2つの履歴要素から、t=7の時点におけるキーBのデータ値は14と特定される。さらに、レコードCについては、記憶領域Cにおいてマーカの下に蓄積されている履歴要素は、{22、t=2}、{24,t=6}の2つであり、この2つの履歴要素から、t=7の時点におけるキーCのデータ値は24と特定される。そして、データ処理部19は、マーカ内の参照要求の情報(すなわち、「snapshot」)の代わりに、特定(もしくは計算)した値を設定する。例えば、t=7の時点におけるデータ値が5と特定された際に、このデータ値をマーカ{snapshot,t=7}に設定すると、{5,t=7}といった内容になる。なお、説明の便宜上、以下では、データ値が設定される前のマーカ(すなわち、「snapshot」が設定されているマーカ)を第1のマーカと呼び、データ値が設定された後のマーカを第2のマーカと呼ぶ場合もある。また、データ処理部19は、各記憶領域においてマーカの下に蓄積されている履歴要素を削除する。マーカに含まれる論理クロック値の示す時刻におけるデータ値が特定された後であれば、マーカの下に蓄積されている履歴要素は削除しても問題ないためである。マーカの下に蓄積されている履歴要素を削除すると、各記憶領域の内容は、図23(d)に示すような内容となる。なお、図23(d)において、斜線を付したブロックは、第2のマーカを示している(以下、同じ)。図23(d)において、記憶領域Aには、第2のマーカ{5,t=7}のみが蓄積されている。また、記憶領域Bには、第2のマーカ{14,t=7}と履歴要素{15,t=8}とが蓄積されている。さらに、記憶領域Cには、第2のマーカ{24,t=7}と履歴要素{25,t=9}とが蓄積されている。図23(d)に示した状態において、例えば、get(key=B)コマンドを受け付けた場合には、現時点のデータ値(=15)を返す。一方で、第2のマーカに含まれるデータ値を取得するためのコマンドを受け付けた場合には、第2のマーカに含まれるデータ値(=14)を返すようにする。
このように、系全体の確定クロック値が、第1のマーカに含まれる論理クロック値以上になった場合に、第1のマーカの下に蓄積されている履歴要素から、第1のマーカに含まれる論理クロック値の示す時刻におけるデータ値を特定(もしくは計算)する。
なお、ある時点における複数のデータ値を参照する手法として、例えば図24に示すような手法も考えられる。具体的には、複数のデータ値を参照するための参照要求を受けた場合、分散処理システム全体でロック(ジャイアントロックとも呼ばれる)をかけ、外部からの更新要求を拒否する。例えばt=7の時点で参照要求を受け付けた場合には、図24に示すように、t=8の時点で、外部からset(key=C,23)コマンドがあったとしても、これを拒否する。その後、t=7の時点までデータが確定するのを待ち、確定した場合には、蓄積されている履歴要素からデータ値を特定する。しかしながら、この手法では、分散処理システム全体でロックをかけるため、分散処理システムの性能に対して大きな影響を与えてしまう。これに対し、本実施の形態に係る手法であれば、ロックが不要であるため、分散処理システムの性能に対して影響を与えずに、ある時点における複数のデータ値を参照できるようになる。
次に、図25及び図26を用いて、deleteコマンド(以下、削除コマンドとも呼ぶ)を受け付けた場合の処理について説明する。例えば、分散処理システムにおいて、図25(a)に示すような履歴要素が蓄積されているものとする。図25(a)において、記憶領域Aには、下から順に、{1,t=0}、{2,t=2}、{3,t=3}、{4,t=4}といった4つの履歴要素が蓄積されている。また、記憶領域Bは、下から順に、{11,t=0}、{12,t=2}、{13,t=3}、{14,t=6}といった4つの履歴要素が蓄積されている。さらに、記憶領域Cには、下から順に、{21,t=0}、{22,t=2}といった2つの履歴要素が蓄積されている。
例えば図25(a)に示した状態において、t=7の時点における複数のデータ値を参照するための参照要求を受信した場合には、各ノード装置のマーカ登録部173が連携して、データベース18に第1のマーカ{snapshot,t=7}を登録する。なお、第1のマーカが登録されると、各記憶領域の内容は、図25(b)に示すような内容となる。図25(b)では、第1のマーカに含まれる論理クロック値が、蓄積されている履歴要素内の論理クロック値より大きいため、各記憶領域の一番上に第1のマーカが積まれている。
その後、いずれかのノード装置が、t=8の時点で、delete(key=A)コマンドを受け付けたものとする。そうすると、履歴登録部171が、記憶領域Aに第1のマーカが登録されているか判断し、登録されている場合には、記憶領域A内の履歴要素を削除せずに、deleteコマンドに係る履歴要素{del,t=8}を記憶領域Aに登録する。例えば図25(c)に示すように、記憶領域Aにおいて、履歴要素{del,t=8}が第1のマーカの上に積まれる。
また、例えば、deleteコマンドを受け付けたノード装置とは別のノード装置が、t=6の時点で、set(key=C,24)コマンドを受け付け、t=8の時点で、set(key=B,15)コマンドを受け付けていたものとする。そうすると、履歴登録部171が、データベース18に履歴要素を登録する。例えば図25(d)に示すように、記憶領域Cにおいて、履歴要素{24,t=6}が第1のマーカの下に挿入される。また、記憶領域Bにおいて、履歴要素{15,t=8}が第1のマーカの上に積まれる。
その後、系全体の確定クロック値が、第1のマーカに含まれる論理クロック値以上になったものとする。ここでは、系全体の確定クロック値が7と特定されたものとする。この場合、データ処理部19が、データベース18において第1のマーカの下に蓄積されている履歴要素から、第1のマーカに含まれる論理クロック値の示す時刻におけるデータ値を特定(もしくは計算)する。図26(a)に示すように、レコードAについては、記憶領域Aにおいて第1のマーカの下に蓄積されている履歴要素は、{1,t=0}、{2,t=2}、{3,t=3}、{4,t=4}の4つであり、この4つの履歴要素から、t=7の時点におけるキーAのデータ値は4と特定される。また、レコードBについては、記憶領域Bにおいて第1のマーカの下に蓄積されている履歴要素は、{11,t=0}、{12,t=2}、{13,t=3}、{14,t=6}の4つであり、この4つの履歴要素から、t=7の時点におけるキーBのデータ値は14と特定される。さらに、レコードCについては、記憶領域Cにおいて第1のマーカの下に蓄積されている履歴要素は、{21,t=0}、{22、t=2}、{24,t=6}の3つであり、この3つの履歴要素から、t=7の時点におけるキーCのデータ値は24と特定される。
そして、データ処理部19は、第1のマーカ内の参照要求の情報(すなわち、「snapshot」)の代わりに、特定(もしくは計算)した値を設定し、第2のマーカとして格納する。また、データ処理部19は、各記憶領域において第2のマーカの下に蓄積されている履歴要素を削除する。第1のマーカに含まれる論理クロック値の示す時刻におけるデータ値が特定された後であれば、第2のマーカの下に蓄積されている履歴要素は削除しても問題ないためである。第2のマーカの下に蓄積されている履歴要素を削除すると、各記憶領域の内容は、図26(b)に示すような内容となる。図26(b)において、記憶領域Aには、第2のマーカ{4,t=7}と削除コマンドに係る履歴要素{del,t=8}とが蓄積されている。また、記憶領域Bには、第2のマーカ{14,t=7}と履歴要素{15,t=8}とが蓄積されている。さらに、記憶領域Cには、第2のマーカ{24,t=7}が蓄積されている。
その後、任意のタイミングにて、メッセージ送信部13が、第2のマーカに設定されているデータ値を、参照要求の要求元に通知する。例えば図26(c)に示すように、t=7の時点におけるキーA乃至Cのデータ値として、4、14、24が参照要求の要求元へ通知される。そして、記憶領域Aには削除コマンドに係る履歴要素が蓄積されているので、第2のマーカに設定されているデータ値を参照要求の要求元へ通知した後に、レコードAに係るデータを削除する。具体的には、記憶領域A内のデータを削除する。例えば記憶領域A内のデータを削除すると、各記憶領域の内容は、図26(d)に示すような内容となる。図26(d)において、記憶領域B及びCの内容は、図26(c)と同じであるが、記憶領域Aは、空の状態になっている。
このように、削除コマンドを受け付けたとしても、第1のマーカが登録されている場合には、記憶領域に蓄積されている履歴要素を削除しないようにする。これにより、第1のマーカに含まれる論理クロック値の示す時刻におけるデータ値を特定(もしくは計算)できるようになる。
次に、図27及び図28を用いて、あるレコードが削除された後に参照要求を受信した場合の処理について説明する。例えば、分散処理システムにおいて、図27(a)に示すような履歴要素が蓄積されているものとする。ここでは、削除コマンドによって、レコードAに係るデータが削除され、各記憶領域の内容が、図27(a)に示すような内容になっているものとする。図27(a)において、記憶領域Aは、空の状態となっている。また、記憶領域Bには、下から順に、{11,t=0}、{12,t=2}、{13,t=3}、{14,t=6}といった4つの履歴要素が蓄積されている。さらに、記憶領域Cには、下から順に、{21,t=0}、{22,t=2}といった2つの履歴要素が蓄積されている。
例えば図27(a)に示した状態において、t=7の時点における複数のデータ値を参照するための参照要求を受信した場合には、各ノード装置のマーカ登録部173が連携して、データベース18に第1のマーカ{snapshot,t=7}を登録する。ここで、レコードAに係るデータは削除された後であるため、記憶領域Aには、第1のマーカを登録しない。但し、後で説明するように、レコードAに係るデータが再設定された場合に、第1のマーカを登録することになるので、第1のマーカをデータベース18内の所定の領域に格納し、第1のマーカを保持しておく。なお、記憶領域B及びCに第1のマーカが登録されると、図27(b)に示すような内容となる。図27(b)では、第1のマーカに含まれる論理クロック値が、蓄積されている履歴要素内の論理クロック値より大きいため、記憶領域B及びCの一番上に第1のマーカが積まれている。
その後、いずれかのノード装置が、t=5の時点で、set(key=C,24)コマンドを受け付け、t=6の時点で、set(key=A,1)コマンドを受け付けたたものとする。そうすると、履歴登録部171が、データベース18に履歴要素を登録する。例えば図27(c)に示すように、記憶領域Cにおいて、履歴要素{24,t=5}がマーカの下に挿入される。また、図27(b)では、記憶領域Aは空の状態であったが、図27(c)に示すように、記憶領域Aに履歴要素{1,t=6}が追加される。そして、今回登録した履歴要素が1つ目の履歴要素であるか判断し、1つ目の履歴要素であった場合には、登録すべき第1のマーカがあるか判断する。例えば、第1のマーカが保持されている場合には、登録すべき第1のマーカがあると判断する。そして、登録すべき第1のマーカがある場合には、今回履歴要素を登録した記憶領域に第1のマーカを追加する。ここでは、記憶領域Aに追加した履歴要素{1,t=6}が1つ目の履歴要素であり、且つ、登録すべき第1のマーカ{snapshot,t=7}があるので、例えば図27(d)に示すように、記憶領域Aにおいて、履歴要素{1,t=7}の上に第1のマーカが積まれる。
その後、系全体の確定クロック値が、第1のマーカに含まれる論理クロック値以上になったものとする。ここでは、系全体の確定クロック値が7と特定されたものとする。この場合、データ処理部19が、データベース18において第1のマーカの下に蓄積されている履歴要素から、第1のマーカに含まれる論理クロック値の示す時刻におけるデータ値を特定(もしくは計算)する。図28(a)に示すように、レコードAについては、記憶領域Aにおいて第1のマーカの下に蓄積されている履歴要素は、{1,t=6}のみであり、t=7の時点におけるキーAのデータ値は1と特定される。また、レコードBについては、記憶領域Bにおいて第1のマーカの下に蓄積されている履歴要素は、{11,t=0}、{12,t=2}、{13,t=3}、{14,t=6}の4つであり、この4つの履歴要素から、t=7の時点におけるキーBのデータ値は14と特定される。さらに、レコードCについては、記憶領域Cにおいて第1のマーカの下に蓄積されている履歴要素は、{21,t=0}、{22、t=2}、{24,t=5}の3つであり、この3つの履歴要素から、t=7の時点におけるキーCのデータ値は24と特定される。
そして、データ処理部19は、第1のマーカ内の参照要求の情報(すなわち、「snapshot」)の代わりに、特定(もしくは計算)した値を設定し、第2のマーカとして格納する。また、データ処理部19は、各記憶領域において第2のマーカの下に蓄積されている履歴要素を削除する。第2のマーカの下に蓄積されている履歴要素を削除すると、各記憶領域の内容は、図28(b)に示すような内容となる。図28(b)において、記憶領域Aには、第2のマーカ{1,t=7}が蓄積されている。また、記憶領域Bには、第2のマーカ{14,t=7}が蓄積されている。さらに、記憶領域Cには、第2のマーカ{24,t=7}が蓄積されている。そして、任意のタイミングにて、第2のマーカに設定されているデータ値が、参照要求の要求元に通知される。
次に、第3の実施の形態におけるノード装置の処理フローについて説明する。最初に、図29を用いて、ユーザ端末からコマンド又は参照要求を受信した際の処理フローを説明する。まず、メッセージ受信部11が、ユーザ端末からコマンド又は参照要求を受信する。そして、メッセージ受信部11は、コマンドを受信したか判断する(図29:ステップS51)。コマンドを受信した場合には(ステップS51:Yesルート)、メッセージ受信部11は、受信したコマンドをメッセージ処理部17に出力する。そして、メッセージ処理部17は、受信したコマンドについてコマンド受信処理を実施し(ステップS53)、その後、処理を終了する。このコマンド受信処理については図30を用いて説明する。
まず、メッセージ処理部17が、受信したコマンドが削除コマンドであるか判断する(図30:ステップS61)。受信したコマンドが削除コマンドでなければ(ステップS61:Noルート)、メッセージ処理部17の履歴登録部171が、タイムスタンプに従って、受信したコマンドに係る履歴要素をデータベース18内の該当する記憶領域に登録する(ステップS63)。上で述べたような、レコード別の記憶領域がデータベース18内に確保されており、該当する記憶領域に、受信したコマンドに係る履歴要素を登録する。この際、記憶領域内の履歴要素がタイムスタンプの順に蓄積されるように登録する。なお、上でも説明したが、履歴要素には、コマンド受信時に分散フレームワークによって振られるタイムスタンプと、そのタイムスタンプの示す時刻におけるデータ値又はコマンドの情報(例えばコマンドで指定された演算内容の情報など)とが含まれる。例えば、受信したコマンドがsetコマンドであれば、setコマンドで指定されたデータ値が履歴要素に設定され、受信したコマンドがincコマンドであれば、演算内容(すなわち、インクリメント)を表す情報が履歴要素に設定される。
その後、履歴登録部171は、ステップS63において登録した履歴要素が、記憶領域において1つ目の履歴要素であったか判断する(ステップS65)。1つ目の履歴要素でなければ(ステップS65:Noルート)、処理を終了し、元の処理に戻る。
一方、1つ目の履歴要素であった場合(ステップS65:Yesルート)、マーカ登録部173が、登録すべき第1のマーカがあるかどうか判断する(ステップS67)。上でも述べたように、例えばレコードに係るデータが削除された後で参照要求を受信した場合には、第1のマーカがデータベース18内の所定の領域において保持される。従って、データベース18内の所定の領域で保持されている第1のマーカがあるかどうか判断し、第1のマーカが保持されていれば、登録すべき第1のマーカがあると判断する。登録すべき第1のマーカがなければ(ステップS67:Noルート)、処理を終了し、元の処理に戻る。
一方、登録すべき第1のマーカがある場合には(ステップS67:Yesルート)、マーカ登録部173が、ステップS63において履歴要素を登録した記憶領域に、第1のマーカを登録する(ステップS69)。その後、処理を終了し、元の処理に戻る。
また、ステップS61において、受信したコマンドが削除コマンドであると判断された場合(ステップS61:Yesルート)、履歴登録部171は、データベース18を検索し、削除コマンドで指定されたレコードに対応する記憶領域に第1のマーカが登録されているか判断する(ステップS71)。該当する記憶領域に第1のマーカが登録されていなければ(ステップS71:Noルート)、履歴登録部171は、該当する記憶領域内のデータ(すなわち、履歴要素)を削除する(ステップS73)。その後、処理を終了し、元の処理に戻る。
一方、該当する記憶領域に第1のマーカが登録されている場合には(ステップS71:Yesルート)、履歴登録部171は、削除コマンドに係る履歴要素を該当する記憶領域に登録する(ステップS75)。その後、処理を終了し、元の処理に戻る。
図29の説明に戻って、ステップS51において、コマンドを受信していないと判断された場合(ステップS51:Noルート)、メッセージ受信部11は、複数のデータ値を参照するための参照要求を受信したか判断する(ステップS55)。参照要求を受信していなければ(ステップS55:Noルート)、以下で説明するステップS57をスキップし、処理を終了する。一方、参照要求を受信した場合には(ステップS55:Yesルート)、メッセージ受信部11は、受信した参照要求をメッセージ処理部17に出力する。そして、メッセージ処理部17のマーカ登録部173は、メッセージ受信部11が受信した参照要求を受け取ると、第1のマーカをデータベース18内の各記憶領域に登録する(ステップS57)。第1のマーカには、参照要求の情報(すなわち、「snapshot」)と、当該参照要求を受信した時点の論理クロック値又は参照要求で指定された論理クロック値とが含まれる。また、第1のマーカに、参照要求の要求元の情報(例えば要求元のIPアドレスなど)を含めるようにしてもよい。なお、マーカ登録部173が、他のノード装置におけるマーカ登録部173と連携することによって、同じ論理クロック値を含む第1のマーカが、各ノード装置のデータベース18内の各記憶領域に登録される。その後、処理を終了する。
以上のような処理を実施することによって、コマンドに係る履歴要素及び第1のマーカをデータベース18内の記憶領域に登録することができる。また、削除コマンドを受信したとしても、第1のマーカが登録されている場合には、該当する記憶領域内のデータを削除しないので、第1のマーカに含まれる論理クロック値の示す時刻におけるデータ値を特定(もしくは計算)できるようになる。
次に、図31を用いて、クロックリスト受信時の処理フローを説明する。まず、確定クロック処理部15のクロックリスト受信部151が、他のノード装置からのクロックリストを受信し(図31:ステップS81)、受信したクロックリストを確定クロック管理部153に出力する。そして、確定クロック管理部153は、クロックリスト受信部151からクロックリストを受信すると、確定クロック値特定処理を実施する(ステップS83)。なお、確定クロック値特定処理が実施されると、系全体の確定クロック値が特定され、確定クロック値格納部157に格納される。確定クロック値特定処理は、第1の実施の形態で説明した処理と同じであるため、ここでは、詳細な説明は省略する。
その後、データ処理部19が、確定クロック値格納部157に格納されているデータを用いて、系全体の確定クロック値が、前回処理時から変化しているか判断する(ステップS85)。例えば本ステップ実施時の系全体の確定クロック値を保持するようにし、次回本ステップを実施する際に、保持しておいた系全体の確定クロック値を、前回処理時の系全体の確定クロック値として用いるようにする。すなわち、本ステップ実施時の系全体の確定クロック値と前回処理時の系全体の確定クロック値とを比較することで、系全体の確定クロック値に変化があったかどうか判断する。系全体の確定クロック値が前回処理時から変化していなければ(ステップS85:Noルート)、以下で説明する処理をスキップし、処理を終了する。
一方、系全体の確定クロック値が前回処理時から変化している場合(ステップS85:Yesルート)、データ処理部19は、確定クロック値格納部157とデータベース18とに格納されているデータを用いて、系全体の確定クロック値が第1マーカに含まれる論理クロック値以上になったか判断する(ステップS87)。系全体の確定クロック値が第1マーカに含まれる論理クロック値未満である場合(ステップS87:Noルート)、処理はステップS89に移行する。そして、データ処理部19は、データベース18に格納されているデータを用いて、系全体の確定クロック値の示す時刻におけるデータ値を特定又は計算する(ステップS89)。具体的には、図22(d)で説明したように、データベース18内の記憶領域に蓄積されている確定部分の履歴要素から、系全体の確定クロック値の示す時刻におけるデータ値を特定又は計算する。そして、データ処理部19は、データベース18内の記憶領域から、系全体の確定クロック値の示す時刻におけるデータ値を含む履歴要素より古い履歴要素を削除する(ステップS91)。具体的には、図23(a)で説明したように、系全体の確定クロック値の示す時刻におけるデータ値を含む履歴要素より下に蓄積されている履歴要素を記憶領域から削除する。その後、処理を終了する。
一方、ステップS87において、系全体の確定クロック値が第1のマーカに含まれる論理クロック値以上になったと判断された場合(ステップS87:Yesルート)、処理はステップS93に移行する。そして、データ処理部19は、データベース18に格納されているデータを用いて、第1のマーカに含まれる論理クロック値の示す時刻におけるデータ値を特定又は計算する(ステップS93)。具体的には、図23(c)で説明したように、データベース18内の記憶領域において第1のマーカの下に蓄積されている履歴要素から、第1のマーカに含まれる論理クロック値の示す時刻におけるデータ値を特定又は計算する。そして、データ処理部19は、特定又は計算されたデータ値を第1のマーカに設定し、第2のマーカとして格納する(ステップS95)。具体的には、上で説明したように、第1のマーカ内の参照要求の情報(すなわち、「snapshot」)の代わりに、特定又は計算したデータ値を設定する。そして、データ処理部19は、データベース18に格納されているデータを用いて、系全体の確定クロック値の示す時刻におけるデータ値を特定又は計算する(ステップS97)。例えば、第1のマーカに含まれる論理クロック値が7であった場合に、系全体の確定クロック値が10になったとすると、第1のマーカに含まれる論理クロック値(=7)の示す時刻におけるデータ値と、系全体の確定クロック値(=10)の示す時刻におけるデータ値とを特定又は計算する必要がある。上で説明したステップS93では、第1のマーカに含まれる論理クロック値の示す時刻におけるデータ値を特定又は計算し、ステップS97では、系全体の確定クロック値の示す時刻におけるデータ値を特定又は計算する。ステップS97の処理は、上で説明したステップS89の処理と同じであるため、ここでは、これ以上述べない。なお、第1のマーカに含まれる論理クロック値と系全体の確定クロック値とが同じ場合には、系全体の確定クロック値の示す時刻におけるデータ値は、第1のマーカに含まれる論理クロック値の示す時刻におけるデータ値と同じであるため、ステップS97の処理は省略可能である。
その後、データ処理部19は、データベース18内の記憶領域から、系全体の確定クロック値の示す時刻におけるデータ値を含む履歴要素より古い履歴要素を削除する(ステップS99)。ここでは、第2のマーカはデータベース18内の記憶領域から削除されない。
そして、データ処理部19は、データベース18内の記憶領域に蓄積されている第2のマーカに参照要求の要求元の情報が含まれているか判断する(ステップS101)。第2のマーカに参照要求の要求元の情報が含まれていなければ(ステップS101:Noルート)、以下で説明するステップS103をスキップし、処理を終了する。この場合、第2のマーカは、データ値を参照要求の要求元に送信するまでは少なくとも保持される。
一方、第2のマーカに参照要求の要求元の情報が含まれている場合(ステップS101:Yesルート)、データ処理部19は、その第2のマーカに含まれるデータ値を送信するようメッセージ送信部13に指示する。そして、メッセージ送信部13は、データ処理部19からの指示に応じて、データベース18内の記憶領域において、参照要求の要求元の情報を含む第2のマーカを特定し、特定した第2のマーカに含まれるデータ値を参照要求の要求元に送信し、特定した第2のマーカをデータベース18内の記憶領域から削除する(ステップS103)。なお、ステップS103では、第2のマーカを削除しないようにし、以降の任意のタイミングで削除するようにしてもよい。第2のマーカに含まれるデータ値を参照要求の要求元に送信した後であれば、その第2のマーカをいつ削除しても問題はない。また、データ処理部19は、データベース18内の記憶領域に、削除コマンドに係る履歴要素が蓄積されているか、第1又は第2のマーカが蓄積されているか判断する。削除コマンドに係る履歴要素が蓄積されており、且つ、第1及び第2のマーカのどちらも蓄積されていない場合には、削除コマンドで指定されたレコードに対応する記憶領域内のデータを削除する。その後、処理を終了する。
以上のような処理を実施することによって、系全体の確定クロック値が第1のマーカに含まれる論理クロック値以上になった時点で、第1のマーカに含まれる論理クロック値の示す時刻におけるデータ値を特定(もしくは計算)することができるようになる。なお、各ノード装置のデータベース18内の記憶領域には、同じ論理クロック値を含む第1のマーカが登録されることになるので、上で述べたような処理が各ノード装置で実施されることになる。例えば、各ノード装置によって特定(もしくは計算)されたデータ値を収集することで、特定の時点における複数のデータ値を把握できるようになる。
[実施の形態4]
次に、第4の実施の形態について説明する。上で説明した第3の実施の形態では、履歴要素を蓄積するための記憶領域に第1のマーカも蓄積するようになっていたが、第4の実施の形態では、履歴要素を蓄積するための記憶領域とは別の領域で第1のマーカを保持するような構成を採用する。
図32に、本実施の形態に係るノード装置の機能ブロック図を示す。なお、本実施の形態におけるシステム構成は、図7に示したシステム構成と同じである。本実施の形態に係るノード装置は、メッセージ受信部11と、メッセージ送信部13と、コマンドリスト管理部14と、確定クロック処理部15と、メッセージ処理部17と、データベース18と、データ処理部19と、マーカ格納部20とを有する。なお、マーカ格納部20を有する点以外は、基本的には第3の実施の形態と同じである。但し、本実施の形態では、マーカ登録部173は、第1のマーカをマーカ格納部20に登録するようになる。また、データ処理部19は、確定クロック値格納部157とデータベース18とマーカ格納部20とに格納されているデータを用いて処理を実施するようになる。
図33及び図34を用いて、本実施の形態における分散処理システム全体の処理について説明する。例えば、分散処理システムにおいて、図33(a)に示すような履歴要素が蓄積されているものとする。図33(a)において、記憶領域Aには、下から順に、{1,t=0}、{2,t=2}、{3,t=3}、{4,t=4}といった4つの履歴要素が蓄積されている。また、記憶領域Bは、下から順に、{11,t=0}、{12,t=2}、{13,t=3}、{14,t=6}といった4つの履歴要素が蓄積されている。さらに、記憶領域Cには、下から順に、{21,t=0}、{22,t=2}といった2つの履歴要素が蓄積されている。なお、ここでは、あるノード装置が、レコードA乃至Cの担当になっているもとのする。
例えば図33(a)に示した状態において、t=7の時点における複数のデータ値を参照するための参照要求を受信した場合には、各ノード装置のマーカ登録部173が連携して、図33(b)に示すように、マーカ格納部20に第1のマーカ{snapshot,t=7}を登録する。
そして、例えば、いずれかのノード装置が、t=6の時点で、set(key=C,24)コマンドを受け付け、t=8の時点で、set(key=B,15)コマンドを受け付けたものとする。そうすると、履歴登録部171が、データベース18に履歴要素を登録する。例えば図33(c)に示すように、記憶領域Cにおいて、一番上に履歴要素{24,t=6}が積まれ、記憶領域Bにおいて、一番上に履歴要素{15,t=8}が積まれる。
その後、t=4の時点までデータが確定したものとする。すなわち、系全体の確定クロック値が4と特定されたものとする。この場合、データ処理部19が、データベース18に蓄積されている履歴要素から、t=4の時点におけるデータ値を特定(もしくは計算)する。例えば図33(d)に示すように、レコードAについては、記憶領域Aに蓄積されている履歴要素のうち、{1,t=0}、{2,t=2}、{3,t=3}、{4,t=4}の4つが確定部分となり、この確定部分の履歴要素から、t=4の時点におけるキーAのデータ値は4と特定される。また、レコードBについては、記憶領域Bに蓄積されている履歴要素のうち、{11,t=0}、{12,t=2}、{13,t=3}の3つが確定部分となり、この確定部分の履歴要素から、t=4の時点におけるキーBのデータ値は13と特定される。さらに、レコードCについては、記憶領域Cに蓄積されている履歴要素のうち、{21,t=0}、{22,t=2}の2つが確定部分であり、この確定部分の履歴要素から、t=4の時点におけるキーCのデータ値は22と特定される。なお、記憶領域Aにおいて、履歴要素{4,t=4}が保持されていれば、当該履歴要素の下に蓄積されている履歴要素を削除することができる。同様に、記憶領域Bにおいて、履歴要素{13,t=3}が保持されていれば、当該履歴要素の下に蓄積されている履歴要素を削除することができる。さらに、記憶領域Cにおいて、履歴要素{22,t=2}が保持されていれば、当該履歴要素の下に蓄積されている履歴要素を削除することができる。従って、データ処理部19は、記憶領域Aから、{1,t=0}、{2,t=2}、{3,t=3}の3つの履歴を削除し、記憶領域Bから、{11,t=0}、{12,t=2}の2つの履歴要素を削除し、記憶領域Cから、{21,t=0}を削除する。これらの履歴要素が削除されると、各記憶領域の内容は、図34(a)に示すような内容となる。
そして、例えば、いずれかのノード装置が、t=5の時点で、set(key=A,5)コマンドを受け付け、t=9の時点で、set(key=C,25)コマンドを受け付けたものとする。そうすると、履歴登録部171が、データベース18に履歴要素を登録する。例えば図34(b)に示すように、記憶領域Aにおいて、一番上に履歴要素{5,t=5}が積まれ、記憶領域Cにおいて、一番上に履歴要素{25,t=9}が積まれる。
その後、系全体の確定クロック値が、マーカに含まれる論理クロック値以上になったものとする。この場合、データ処理部19が、確定クロック値格納部157に格納されている系全体の確定クロック値と、マーカ格納部20に格納されている第1のマーカに含まれる論理クロック値とを比較し、系全体の確定クロック値が、マーカに含まれる論理クロック値以上になったものと判断する。ここでは、系全体の確定クロック値が7になったものとする。そうすると、データ処理部19が、データベース18内の記憶領域において、第1のマーカに含まれる論理クロック値以下の論理クロック値を含む履歴要素を特定し、特定した履歴要素から、第1のマーカに含まれる論理クロック値の示す時刻におけるデータ値を特定(もしくは計算)する。図34(c)に示すように、レコードAについては、記憶領域Aにおいて、{4,t=4}、{5,t=5}の2つの履歴要素が特定され、この2つの履歴要素から、t=7の時点におけるキーAのデータ値は5と特定される。また、レコードBについては、記憶領域Bにおいて、{13,t=3}、{14,t=6}の2つの履歴要素が特定され、この2つの履歴要素から、t=7の時点におけるキーBのデータ値は14と特定される。さらに、レコードCについては、記憶領域Cにおいて、{22,t=2}、{24,t=6}の2つの履歴要素が特定され、この2つの履歴要素から、t=7の時点におけるキーCのデータ値は24と特定される。そして、データ処理部19は、第1のマーカに含まれる論理クロック値と、特定(もしくは計算)されたデータ値とを含む第2のマーカをデータベース18内の各記憶領域に登録する。ここでは、記憶領域Aには、第2のマーカ{5,t=7}が登録され、記憶領域Bには、第2のマーカ{14,t=7}が登録され、記憶領域Cには、第2のマーカ{24,t=7}が登録される。そして、データ処理部19は、各記憶領域から、第2のマーカに含まれる論理クロック値以下の論理クロック値を含む履歴要素を削除する。第2のマーカが登録された後であれば、第2のマーカに含まれる論理クロック値以下の論理クロック値を含む履歴要素を削除しても問題ないためである。また、データ処理部19は、マーカ格納部20から第1のマーカを削除する。第2のマーカを各記憶領域に登録し、第2のマーカに含まれる論理クロック値以下の論理クロック値を含む履歴要素を各記憶領域から削除し、マーカ格納部20から第1のマーカを削除すると、各記憶領域の内容は、図34(d)に示すような内容となる。図34(d)において、記憶領域Aには、第2のマーカ{5,t=7}のみが蓄積されている。また、記憶領域Bには、第2のマーカ{14,t=7}と履歴要素{15,t=8}とが蓄積されている。さらに、記憶領域Cには、第2のマーカ{24,t=7}と履歴要素{25,t=9}とが蓄積されている。
なお、本実施の形態におけるノード装置の処理フローは、基本的には第3の実施の形態で説明したものと同じであるが、本実施の形態では、ステップS53(図29)において、図30に示したコマンド受信処理の代わりに、図35に示すような処理(以下、コマンド受信処理2と呼ぶ)を実施する。また、本実施の形態では、図31に示した処理の代わりに、図36に示すような処理を実施する。以下、図35及び図36の処理フローについて説明する。
最初に、コマンド受信処理2(図35)の処理フローについて説明する。まず、メッセージ処理部17が、受信したコマンドが削除コマンドであるか判断する(図35:ステップS111)。受信したコマンドが削除コマンドでなければ(ステップS111:Noルート)、メッセージ処理部17の履歴登録部171が、タイムスタンプに従って、受信したコマンドに係る履歴要素をデータベース18内の該当する記憶領域に登録する(ステップS113)。その後、処理を終了し、元の処理に戻る。なお、ステップS111及びステップS113の処理は、ステップS61及びステップS63(図30)の処理と同じである。
一方、受信したコマンドが削除コマンドであると判断された場合(ステップS111:Yesルート)、履歴登録部171は、第1のマーカがマーカ格納部20に登録されているか判断する(ステップS115)。第1のマーカがマーカ格納部20に登録されていなければ(ステップS115:Noルート)、履歴登録部171は、該当する記憶領域内のデータ(すなわち、履歴要素)を削除する(ステップS117)。すなわち、削除コマンドで指定されたレコードに対応する記憶領域内のデータを削除する。その後、処理を終了し、元の処理に戻る。
一方、マーカ格納部20に第1のマーカが登録されている場合には(ステップS115:Yesルート)、履歴登録部171は、削除コマンドに係る履歴要素を該当する記憶領域に登録する(ステップS119)。その後、処理を終了し、元の処理に戻る。
次に、図36に示す処理フローについて説明する。なお、図36は、クロックリスト受信時の処理フローを示す。まず、確定クロック処理部15のクロックリスト受信部151が、他のノード装置からのクロックリストを受信し(図36:ステップS121)、受信したクロックリストを確定クロック管理部153に出力する。そして、確定クロック管理部153は、クロックリスト受信部151からクロックリストを受信すると、確定クロック値特定処理を実施する(ステップS123)。なお、確定クロック値特定処理が実施されると、系全体の確定クロック値が特定され、確定クロック値格納部157に格納される。確定クロック値特定処理は、第1の実施の形態で説明した処理と同じであるため、ここでは、詳細な説明は省略する。
その後、データ処理部19が、確定クロック値格納部157に格納されているデータを用いて、系全体の確定クロック値が、前回処理時から変化しているか判断する(ステップS125)。例えば本ステップの処理を前回実施した時点における系全体の確定クロック値を保持しておき、現時点の系全体の確定クロック値と前回処理時の系全体の確定クロック値とを比較することで、系全体の確定クロック値に変化があったかどうか判断する。系全体の確定クロック値が前回処理時から変化していなければ(ステップS125:Noルート)、以下で説明する処理をスキップし、処理を終了する。なお、ステップS121乃至ステップS125の処理は、ステップS81乃至ステップS85(図31)の処理と同じである。
一方、系全体の確定クロック値が前回処理時から変化している場合(ステップS125:Yesルート)、データ処理部19は、確定クロック値格納部157とマーカ格納部20とに格納されているデータを用いて、系全体の確定クロック値が第1マーカに含まれる論理クロック値以上になったか判断する(ステップS127)。本ステップの処理は、基本的にはステップS87(図31)の処理と同じであるが、本実施の形態では、マーカ格納部20に第1のマーカが格納されるため、本ステップでは、データベース18ではなく、マーカ格納部20に格納されているデータを用いる。
系全体の確定クロック値が第1マーカに含まれる論理クロック値未満である場合(ステップS127:Noルート)、処理はステップS129に移行する。そして、データ処理部19は、データベース18に格納されているデータを用いて、系全体の確定クロック値の示す時刻におけるデータ値を特定又は計算する(ステップS129)。そして、データ処理部19は、データベース18内の記憶領域から、系全体の確定クロック値の示す時刻におけるデータ値を含む履歴要素より古い履歴要素を削除する(ステップS131)。その後、処理を終了する。なお、ステップS129及びステップS131の処理は、ステップS89及びステップS91(図31)の処理と同じである。
一方、系全体の確定クロック値が第1のマーカに含まれる論理クロック値以上になった場合(ステップS127:Yesルート)、処理はステップS133に移行する。そして、データ処理部19は、データベース18とマーカ格納部20とに格納されているデータを用いて、第1のマーカに含まれる論理クロック値の示す時刻におけるデータ値を特定又は計算する(ステップS133)。具体的には、図34(c)で説明したように、データベース18内の記憶領域において、第1のマーカに含まれる論理クロック値以下の論理クロック値を含む履歴要素を特定し、特定した履歴要素から、第1のマーカに含まれる論理クロック値の示す時刻におけるデータ値を特定又は計算する。なお、ノード装置が担当しているレコードが複数ある場合には、レコード毎に、第1のマーカに含まれる論理クロック値の示す時刻におけるデータ値を特定又は計算する。そして、データ処理部19は、特定又は計算されたデータ値と、第1のマーカに含まれる論理クロック値とを含む第2のマーカを、データベース18内の記憶領域に登録するとともに、その第1のマーカをマーカ格納部20から削除する(ステップS135)。なお、ノード装置が担当しているレコードが複数ある場合には、データベース18内にレコード数分の記憶領域が確保されていることになるので、各記憶領域に第2のマーカを登録する。この場合、ステップS133においてレコード毎にデータ値が特定又は計算されるので、例えばレコードAの記憶領域には、レコードAに係るデータ値を含む第2のマーカを登録し、レコードBの記憶領域には、レコードBに係るデータ値を含む第2のマーカを登録する。そして、データ処理部19は、データベース18に格納されているデータを用いて、系全体の確定クロック値の示す時刻におけるデータ値を特定又は計算する(ステップS137)。そして、データ処理部19は、データベース18内の記憶領域から、系全体の確定クロック値の示す時刻におけるデータ値を含む履歴要素より古い履歴要素を削除する(ステップS139)。
そして、データ処理部19は、データベース18内の記憶領域に蓄積されている第2のマーカに参照要求の要求元の情報が含まれているか判断する(ステップS141)。第2のマーカに参照要求の要求元の情報が含まれていなければ(ステップS141:Noルート)、以下で説明するステップS143をスキップし、処理を終了する。この場合、第2のマーカは、データ値を参照要求の要求元に送信するまでは少なくとも保持される。
一方、第2のマーカに参照要求の要求元の情報が含まれている場合(ステップS141:Yesルート)、データ処理部19は、その第2のマーカに含まれるデータ値を送信するようメッセージ送信部13に指示する。そして、メッセージ送信部13は、データ処理部19からの指示に応じて、データベース18内の記憶領域において、参照要求の要求元の情報を含む第2のマーカを特定し、特定した第2のマーカに含まれるデータ値を参照要求の要求元に送信し、特定した第2のマーカをデータベース18内の記憶領域から削除する(ステップS143)。なお、ステップS143では、第2のマーカを削除しないようにし、以降の任意のタイミングで削除するようにしてもよい。その後、処理を終了する。なお、ステップS137乃至ステップS143の処理は、ステップS97乃至ステップS103(図31)の処理と同じである。
以上のような処理を実施することによって、履歴要素を蓄積するための記憶領域とは別の領域で第1のマーカを管理するようにしても、第3の実施の形態と同様に、特定の論理クロック値の示す時刻におけるデータ値を把握できるようになる。
以上本発明の本実施の形態について説明したが、本発明はこれに限定されるものではない。例えば図8、図16、図21及び図32に示したノード装置の機能ブロック図は一例であって必ずしも実際のプログラムモジュール構成と一致しない場合もある。データ格納部の構成も同様に一例にすぎない。また、処理フローにおいても、処理結果が変わらなければ処理の順番を入れ替えることも可能である。さらに、並列に実行させるようにしてもよい。
なお、上で述べたノード装置は、コンピュータ装置によって実現することもできる。例えば、図37に示すように、メモリ2501とプロセッサ(CPU2503)とハードディスク・ドライブ(HDD)2505と表示装置2509に接続される表示制御部2507とリムーバブル・ディスク2511用のドライブ装置2513と入力装置2515とネットワークに接続するための通信制御部2517とを備え、これらがバス2519を介して接続されたコンピュータを用いてもよい。オペレーティング・システム(OS:Operating System)及び本実施例における処理を実施するためのアプリケーション・プログラムは、HDD2505等の記憶部に格納しておき、CPU2503により実行される際にはHDD2505からメモリ2501に読み出して利用することもできる。必要に応じてCPU2503は、表示制御部2507、通信制御部2517、ドライブ装置2513を制御して、必要な動作を行ってもよい。また、処理途中のデータについては、メモリ2501に格納され、必要があればHDD2505に格納してもよい。実施例では、上で述べた処理を実施するためのアプリケーション・プログラムはコンピュータ読み取り可能なリムーバブル・ディスク2511に格納されて頒布され、ドライブ装置2513からHDD2505にインストールされてもよい。インターネットなどのネットワーク及び通信制御部2517を経由して、HDD2505にインストールされる場合もある。このようなコンピュータ装置は、上で述べたCPU2503、メモリ2501などのハードウエアとOS及び必要なアプリケーション・プログラムとが有機的に協働することにより、上で述べたような各種機能を実現する。なお、図8のデータベース16は、図37におけるメモリ2501やHDD2505等として実現してもよい。図8、図21及び図32のコマンドリスト格納部141及び確定クロック値格納部157と、図16の第1記憶部1505及び第2記憶部1507と、図21及び図32のデータベース18と、図32のマーカ格納部20とについても同様である。図16の履歴要素登録部1501、マーカ登録部1503及びデータ特定部1509は、プロセッサ2503及びプログラムの組み合わせ、すなわち、プロセッサ2503がプログラムを実行することにより実現してもよい。より具体的には、プロセッサ2503は、HDD2505又はメモリ2501に記憶されたプログラムに従った動作を行うことで、上で述べたような処理部として機能してもよい。図8、図21又は図32のメッセージ受信部11、メッセージ処理部12、メッセージ送信部13、コマンドリスト管理部14、確定クロック処理部15、メッセージ処理部17、データ処理部19、クロックリスト受信部151、確定クロック管理部153、クロックリスト送信部155、履歴登録部171及びマーカ登録部173についても同様である。
以上述べた本実施の形態をまとめると、以下のようになる。
本データ管理方法は、複数のキーの各々に対応するデータ値を管理するノード装置により実行されるデータ管理方法である。そして、本データ管理方法は、複数のキーのうち担当するキーである担当キーに係る所定のコマンドを受け付けた場合、当該所定のコマンドを受け付けた時点の論理クロック値と当該論理クロック値の示す時刻におけるデータ値又は所定のコマンドの情報とを含む履歴要素を第1記憶部に登録する履歴要素登録ステップと、特定の論理クロック値の示す時刻におけるデータ値を参照するための参照要求を受け付けた場合、当該参照要求を受け付けた時点の論理クロック値又は当該参照要求で指定された論理クロック値を特定の論理クロック値として含み且つ当該参照要求の情報を含む第1マーカを、第1記憶部又は当該第1記憶部とは異なる第2記憶部に登録するマーカ登録ステップと、ノード装置が属するシステム全体における確定クロック値が、第1記憶部又は第2記憶部内の第1マーカに含まれる特定の論理クロック値以上になった場合には、第1記憶部において特定の論理クロック値以下である論理クロック値を含む履歴要素から、特定の論理クロック値の示す時刻における、担当キーに対応するデータ値を特定するデータ特定ステップとを含む。
このように、第1マーカを登録しておくことで、分散処理システム全体における確定クロック値が、第1マーカに含まれる特定の論理クロック値以上になったか否かによって、特定の論理クロック値の示す時刻におけるデータ値が確定したか否かを判断できるようになる。そして、特定の論理クロック値の示す時刻まで確定した場合には、特定の論理クロック値の示す時刻におけるデータ値が、適切な履歴要素から特定される。これにより、特定の論理クロック値の示す時刻におけるデータ値を把握できるようになる。
また、本データ管理方法において、データ特定ステップの後、第1記憶部から、第1マーカに含まれる特定の論理クロック値以下である論理クロック値を含む履歴要素を削除するステップをさらに含むようにしてもよい。第1マーカに含まれる特定の論理クロック値の示す時刻におけるデータ値を特定した後であれば、特定の論理クロック値以下である論理クロック値を含む履歴要素を削除しても問題ないためである。
さらに、所定のコマンドがデータを削除するための削除コマンドであった場合、第1マーカが第1記憶部又は第2記憶部に登録されているか判断し、登録されている場合には、データ特定ステップにおいて当該第1マーカに含まれる特定の論理クロック値の示す時刻におけるデータ値が特定されるまで、第1記憶部内の履歴要素を保持するようにしてもよい。このようにすれば、削除コマンドを受けた場合であっても、第1マーカが登録されていれば、履歴要素は削除されないため、上で述べたように、第1マーカに含まれる特定の論理クロック値の示す時刻におけるデータ値を特定できる。
また、本データ管理方法において、データ特定ステップの後、データ特定ステップにおいて特定されたデータ値を参照要求の送信元に送信するステップをさらに含むようにしてもよい。このように、各ノード装置が、特定したデータ値を参照要求の送信元に返すようにすれば、特定の論理クロック値の示す時刻における複数のデータ値を容易に収集することができる。
さらに、上で述べたデータ特定ステップが、第1マーカが第1記憶部に登録されている場合には、当該第1マーカに、特定の論理クロック値の示す時刻における、担当キーに対応するデータ値を設定し、第2マーカとして第1記憶部に格納するステップを含むようにしてもよい。そして、所定のタイミングまで第1記憶部内の第2マーカを保持するようにしてもよい。例えば参照要求に対する応答を直ぐに返さないような場合には、データ値の取得指示があるまでは保持しておくようにする。
また、上で述べたデータ特定ステップが、第1マーカが第2記憶部に登録されている場合には、当該第1マーカに含まれる特定の論理クロック値と、特定の論理クロック値の示す時刻における、担当キーに対応するデータ値とを含む第2マーカを第1記憶部に登録するステップを含むようにしてもよい。そして、所定のタイミングまで第1記憶部内の第2マーカを保持するようにしてもよい。なお、第2マーカを登録した後、第1マーカは第1記憶部から削除するようにしてもよい。
さらに、上で述べた履歴要素登録ステップにおいて、第1記憶部において当該担当キーに係る履歴要素を論理クロック値の順に蓄積し、上で述べたマーカ登録ステップにおいて、第1マーカを第1記憶部に登録する際には、第1記憶部において蓄積されている履歴要素に対して、第1マーカに含まれる特定の論理クロック値から特定される位置に当該第1マーカを挿入するようにしてもよい。このように、論理クロック値の順に蓄積しておくことによって、第1マーカに含まれる特定の論理クロック値以下である論理クロック値を含む要素履歴を容易に特定できるようになり、データの管理も容易になる。
本ノード装置は、複数のキーの各々に対応するデータ値を管理するノード装置であって、複数のキーのうち担当するキーである担当キーに係る所定のコマンドを受け付けた場合、当該所定のコマンドを受け付けた時点の論理クロック値と当該論理クロック値の示す時刻におけるデータ値又は所定のコマンドの情報とを含む履歴要素を第1記憶部に登録する履歴要素登録部と、特定の論理クロック値の示す時刻におけるデータ値を参照するための参照要求を受け付けた場合、当該参照要求を受け付けた時点の論理クロック値又は当該参照要求で指定された論理クロック値を特定の論理クロック値として含み且つ当該参照要求の情報を含む第1マーカを、第1記憶部又は当該第1記憶部とは異なる第2記憶部に登録するマーカ登録部と、ノード装置が属するシステム全体における確定クロック値が、第1記憶部又は第2記憶部内の第1マーカに含まれる特定の論理クロック値以上になった場合には、第1記憶部において特定の論理クロック値以下である論理クロック値を含む履歴要素から、特定の論理クロック値の示す時刻における、担当キーに対応するデータ値を特定するデータ特定部とを有する。
なお、上で述べたような処理をコンピュータに実施させるためのプログラムを作成することができ、当該プログラムは、例えばフレキシブル・ディスク、CD−ROM、光磁気ディスク、半導体メモリ(例えばROM)、ハードディスク等のコンピュータ読み取り可能な記憶媒体又は記憶装置に格納される。なお、処理途中のデータについては、RAM等の記憶装置に一時保管される。
以上の実施例を含む実施形態に関し、さらに以下の付記を開示する。
(付記1)
複数のキーの各々に対応するデータ値を管理するノード装置に、
前記複数のキーのうち担当するキーである担当キーに係る所定のコマンドを受け付けた場合、当該所定のコマンドを受け付けた時点の論理クロック値と当該論理クロック値の示す時刻における前記データ値又は前記所定のコマンドの情報とを含む履歴要素を第1記憶部に登録する履歴要素登録ステップと、
特定の論理クロック値の示す時刻における前記データ値を参照するための参照要求を受け付けた場合、当該参照要求を受け付けた時点の前記論理クロック値又は当該参照要求で指定された前記論理クロック値を前記特定の論理クロック値として含み且つ当該参照要求の情報を含む第1マーカを、前記第1記憶部又は当該第1記憶部とは異なる第2記憶部に登録するマーカ登録ステップと、
前記ノード装置が属するシステム全体における確定クロック値が、前記第1記憶部又は前記第2記憶部内の前記第1マーカに含まれる前記特定の論理クロック値以上になった場合には、前記第1記憶部において前記特定の論理クロック値以下である論理クロック値を含む前記履歴要素から、前記特定の論理クロック値の示す時刻における、前記担当キーに対応する前記データ値を特定するデータ特定ステップと、
を実行させるためのデータ管理プログラム。
(付記2)
前記データ特定ステップの後、前記第1記憶部から、前記第1マーカに含まれる前記特定の論理クロック値以下である論理クロック値を含む前記履歴要素を削除するステップ
をさらに含む付記1記載のデータ管理プログラム。
(付記3)
前記所定のコマンドがデータを削除するための削除コマンドであった場合、前記第1マーカが前記第1記憶部又は前記第2記憶部に登録されているか判断し、登録されている場合には、前記データ特定ステップにおいて当該第1マーカに含まれる前記特定の論理クロック値の示す時刻における前記データ値が特定されるまで、前記第1記憶部内の前記履歴要素を保持する
付記1又は2記載のデータ管理プログラム。
(付記4)
前記データ特定ステップの後、前記データ特定ステップにおいて特定された前記データ値を前記参照要求の送信元に送信するステップ
をさらに含む付記1乃至3のいずれか1つ記載のデータ管理プログラム。
(付記5)
前記データ特定ステップが、
前記第1マーカが前記第1記憶部に登録されている場合には、当該第1マーカに、前記特定の論理クロック値の示す時刻における、前記担当キーに対応する前記データ値を設定し、第2マーカとして前記第1記憶部に格納するステップ
を含み、
所定のタイミングまで前記第1記憶部内の前記第2マーカを保持する
付記1乃至3のいずれか1つ記載のデータ管理プログラム。
(付記6)
前記データ特定ステップが、
前記第1マーカが前記第2記憶部に登録されている場合には、当該第1マーカに含まれる前記特定の論理クロック値と、前記特定の論理クロック値の示す時刻における、前記担当キーに対応する前記データ値とを含む第2マーカを前記第1記憶部に登録するステップ
を含み、
所定のタイミングまで前記第1記憶部内の前記第2マーカを保持する
付記1乃至3のいずれか1つ記載のデータ管理プログラム。
(付記7)
前記履歴要素登録ステップにおいて、前記第1記憶部において当該担当キーに係る前記履歴要素を前記論理クロック値の順に蓄積し、
前記マーカ登録ステップにおいて、前記第1マーカを前記第1記憶部に登録する際には、前記第1記憶部において蓄積されている前記履歴要素に対して、前記第1マーカに含まれる前記特定の論理クロック値から特定される位置に当該第1マーカを挿入する
付記5記載のデータ管理プログラム。
(付記8)
複数のキーの各々に対応するデータ値を管理するノード装置により実行されるデータ管理方法であって、
前記複数のキーのうち担当するキーである担当キーに係る所定のコマンドを受け付けた場合、当該所定のコマンドを受け付けた時点の論理クロック値と当該論理クロック値の示す時刻における前記データ値又は前記所定のコマンドの情報とを含む履歴要素を第1記憶部に登録する履歴要素登録ステップと、
特定の論理クロック値の示す時刻における前記データ値を参照するための参照要求を受け付けた場合、当該参照要求を受け付けた時点の前記論理クロック値又は当該参照要求で指定された前記論理クロック値を前記特定の論理クロック値として含み且つ当該参照要求の情報を含む第1マーカを、前記第1記憶部又は当該第1記憶部とは異なる第2記憶部に登録するマーカ登録ステップと、
前記ノード装置が属するシステム全体における確定クロック値が、前記第1記憶部又は前記第2記憶部内の前記第1マーカに含まれる前記特定の論理クロック値以上になった場合には、前記第1記憶部において前記特定の論理クロック値以下である論理クロック値を含む前記履歴要素から、前記特定の論理クロック値の示す時刻における、前記担当キーに対応する前記データ値を特定するデータ特定ステップと、
を含むデータ管理方法。
(付記9)
複数のキーの各々に対応するデータ値を管理するノード装置であって、
前記複数のキーのうち担当するキーである担当キーに係る所定のコマンドを受け付けた場合、当該所定のコマンドを受け付けた時点の論理クロック値と当該論理クロック値の示す時刻における前記データ値又は前記所定のコマンドの情報とを含む履歴要素を第1記憶部に登録する履歴要素登録部と、
特定の論理クロック値の示す時刻における前記データ値を参照するための参照要求を受け付けた場合、当該参照要求を受け付けた時点の前記論理クロック値又は当該参照要求で指定された前記論理クロック値を前記特定の論理クロック値として含み且つ当該参照要求の情報を含む第1マーカを、前記第1記憶部又は当該第1記憶部とは異なる第2記憶部に登録するマーカ登録部と、
前記ノード装置が属するシステム全体における確定クロック値が、前記第1記憶部又は前記第2記憶部内の前記第1マーカに含まれる前記特定の論理クロック値以上になった場合には、前記第1記憶部において前記特定の論理クロック値以下である論理クロック値を含む前記履歴要素から、前記特定の論理クロック値の示す時刻における、前記担当キーに対応する前記データ値を特定するデータ特定部と、
を有するノード装置。