(57)【特許請求の範囲】
【請求項１】
キーおよび値からなるレコードに関する処理の要求が入力される処理要求入力部と、
前記レコードに含まれる値のうち索引作成対象である索引キーと、前記レコードのキーを含むキーリストとからなる索引データに関して、要求された前記処理に応じた更新指示を表す索引更新メッセージを生成するメッセージ生成部と、
要求された前記処理に応じたレコードを生成し、生成したレコードに、前記メッセージ生成部により生成された索引更新メッセージを付加し、前記索引更新メッセージが付加されたレコードを分散ストレージシステムに格納するレコード更新部と、
前記分散ストレージシステムに格納されたレコードに含まれる索引更新メッセージを実行することにより、前記索引更新メッセージが反映された索引データを前記分散ストレージシステムに格納する索引データ更新部と、
を備えた情報処理装置。
【請求項２】
前記レコードに関して要求される処理が、前記分散ストレージシステムに既に格納されているレコードに対する処理であるとき、前記レコード更新部は、前記分散ストレージシステムから前記レコードを取得し、取得したレコードに既に付加されている他の前記索引更新メッセージに加えて、今回の処理に応じた索引更新メッセージを付加することを特徴とする請求項１に記載の情報処理装置。
【請求項３】
複数の前記索引更新メッセージをマージするメッセージマージ部をさらに備え、
前記索引データ更新部は、前記メッセージマージ部によりマージされた索引更新メッセージを実行することを特徴とする請求項１または請求項２に記載の情報処理装置。
【請求項４】
前記レコードに関して要求される処理が、レコードの新規作成処理であるとき、
前記メッセージ生成部は、前記索引キーを含む索引データのキーリストに、新規作成対象のレコードのキーを追加する索引更新メッセージを生成することを特徴とする請求項１から請求項３のいずれか１項に記載の情報処理装置。
【請求項５】
前記レコードに関して要求される処理が、前記分散ストレージシステムに既に格納されているレコードの削除処理であるとき、
前記メッセージ生成部は、前記索引キーを含む索引データのキーリストから、削除対象のレコードのキーを削除する索引更新メッセージを生成することを特徴とする請求項１から請求項４のいずれか１項に記載の情報処理装置。
【請求項６】
前記レコードに関して要求される処理が、前記分散ストレージシステムに既に格納されているレコードの更新処理であるとき、
前記メッセージ生成部は、前記索引作成対象の更新前の値を索引キーとして含む索引データのキーリストから、更新対象のレコードのキーを削除するとともに、前記索引作成対象の更新後の値を索引キーとして含む索引データのキーリストに、更新対象のレコードのキーを追加する索引更新メッセージを生成することを特徴とする請求項１から請求項５のいずれか１項に記載の情報処理装置。
【請求項７】
請求項１から請求項６のいずれか１項に記載の情報処理装置と、
前記分散ストレージシステムと、
を備えた情報処理システム。
【請求項８】
前記分散ストレージシステムを構成する各サーバは、自身に格納されたレコードから前記索引更新メッセージを抽出するメッセージ抽出部を備え、
前記索引データ更新部は、前記メッセージ抽出部によって抽出された索引更新メッセージを実行することを特徴とする請求項７に記載の情報処理システム。
【請求項９】
コンピュータ装置が、
キーおよび値からなるレコードに関する処理の要求が入力されると、
前記レコードに含まれる値のうち索引作成対象である索引キーと、前記レコードのキーを含むキーリストとからなる索引データに関して、要求された前記処理に応じた更新指示を表す索引更新メッセージを生成し、
要求された前記処理に応じたレコードを生成し、
生成したレコードに、前記索引更新メッセージを付加し、
前記索引更新メッセージが付加されたレコードを分散ストレージシステムに格納し、
前記分散ストレージシステムに格納されたレコードに含まれる索引更新メッセージを実行することにより、前記索引更新メッセージが反映された索引データを前記分散ストレージシステムに格納する情報処理方法。
【請求項１０】
キーおよび値からなるレコードに関する処理の要求が入力される処理要求入力ステップと、
前記レコードに含まれる値のうち索引作成対象である索引キーと、前記レコードのキーを含むキーリストとからなる索引データに関して、要求された前記処理に応じた更新指示を表す索引更新メッセージを生成するメッセージ生成ステップと、
要求された前記処理に応じたレコードを生成し、生成したレコードに、前記メッセージ生成ステップで生成された索引更新メッセージを付加し、前記索引更新メッセージが付加されたレコードを分散ストレージシステムに格納するレコード更新ステップと、
前記分散ストレージシステムに格納されたレコードに含まれる索引更新メッセージを実行することにより、前記索引更新メッセージが反映された索引データを前記分散ストレージシステムに格納する索引データ更新ステップと、
をコンピュータ装置に実行させるコンピュータ・プログラム。
【発明の詳細な説明】
【技術分野】
【０００１】
本発明は、分散ストレージシステムに格納されるデータおよび索引を管理する技術に関する。
【背景技術】
【０００２】
データを分散して格納する分散ストレージシステムが知られている。分散ストレージシステムとしては、例えば、キーおよび値からなるデータを分散して格納する分散キーバリューストア（分散ＫＶＳ：Key-Value Store）がある。分散ＫＶＳは、キーおよび値のペア（以下、ＫＶペアと記載する）について、キーのハッシュ値等に基づきその格納先となるサーバを分散させる。分散ＫＶＳでは、ＫＶペアは、各サーバに略均一に分散配置される。
【０００３】
分散ＫＶＳでは、１つのＫＶペアに対する１つのデータ操作については、アトミック性がサポートされている。データ操作には、例えば、作成、更新、削除、または、参照などがある。一方、分散ＫＶＳでは、１つのＫＶペアに対する一連のデータ操作については、アトミック性がサポートされない。例えば「ＧＥＴしたＫＶペアを更新してＰＵＴする」といった一連のデータ操作が複数のアプリケーションからそれぞれ要求される場合、各一連のデータ操作については、アトミック性がサポートされない。そこで、分散ＫＶＳでは、ＣＡＳ（Compare And Swap）機能と呼ばれる排他制御技術が採用される。ＣＡＳ機能により、同一のＫＶペアに対する一連のデータ操作は、アトミックに実行可能となる。ただし、ＣＡＳによる排他制御は、楽観的排他制御のため実行が失敗する場合がある。実行が失敗した一連のデータ操作を要求したアプリケーションは、再度その一連のデータ操作について実行を要求する。
【０００４】
このような分散ＫＶＳ上のデータは、結果整合性（Eventually Consistency）であることが許容されるケースがある。例えば、キーおよび値からなるデータと、それに対する索引との間は、結果整合性であることが許容される。以下に、具体例をあげて説明する。
【０００５】
例えば、図１９に示すような「商品マスタ」および「受注履歴」を想定する。ここでは、「商品マスタ」および「受注履歴」に含まれる各行の情報を、レコードと呼ぶものとする。図１９では、主キーに下線を引き、外部キーに破線の下線を引いている。この場合、分散ＫＶＳでは、商品マスタおよび受注履歴は、図２０に示すＫＶペアとして格納される。以降、「商品マスタ」および「受注履歴」の各レコードに対応するＫＶペアを、「レコードＫＶペア」とも呼ぶものとする。なお、図２０において、「キー→値」は、ＫＶペアを表す。また、｛値１，値２，・・・｝は、レコードＫＶペアの値を表す。また、これらのレコードＫＶペアは、下記の処理１〜３により作成されるものとする。
・処理１：「商品マスタ」に、商品情報に関するレコード（「商品ID」、「在庫数」、「価格」）を登録しておく。
・処理２：商品への受注があると、「受注履歴」に、受注情報に関するレコード（「受注ID」、「商品ID」、「受注日時」）を登録する。
・処理３：受注による商品の引当により、商品マスタの当該商品の在庫数を1つ減らす。
【０００６】
ここで、「受注履歴」の「受注日時」列に、索引を作成することを考える。この場合、分散ＫＶＳでは、索引は、図２１に示す索引ＫＶペアとして格納される。なお、図２１において、［キー１，キー２，・・・］は、索引ＫＶペアの値を表す。索引ＫＶペアの値は、索引ＫＶペアのキーを値に含むレコードＫＶペアのキーのリストを表す。このとき、レコードＫＶペアの更新および索引ＫＶペアの更新を別トランザクションで行ったとする。障害等が発生しなければ、一時的にレコードと索引の間に不整合が発生しても、結果的に、索引ＫＶペアは正しく生成される。つまり、レコードおよび索引は結果整合性を満たす。
【０００７】
しかし、レコードＫＶペアの更新と索引ＫＶペアの更新との間に障害が発生した場合、索引ＫＶペアのデータは失われる。そして、レコードおよび索引間の結果整合性が満たされなくなる。このように、レコードおよび索引間の整合性が満たされないままでは、レコードＫＶペアに含まれる値を索引とする参照・更新・削除が不可能となるケースが出てくる。もし、アクセスしたいＫＶペアのキーが不明であれば、そのＫＶペアへのデータアクセスが失われる。この場合、全サーバの全件スキャンによる索引の再構築が必要となる。しかしながら、全件スキャンによる索引の再構築は、大量データを扱う分散ＫＶＳでは好ましくない。
【０００８】
このような理由により、多くの分散ストレージシステムでは、各サーバが、自身に格納されるデータについて索引を作成して保持する。これにより、システムは、整合性の担保を容易にする。また、各サーバが、自身に格納されるデータについて索引を作成・保持することは、レコードおよび索引間について「結果整合性」よりも強い「整合性」を担保することになる。
【０００９】
しかしながら、分散ストレージシステムにおいて、各サーバが、自身に格納されるレコードについて索引を作成する場合、以下の問題がある。この場合、索引を用いた検索において、全ての各サーバが、自身の索引を用いて該当データが存在するかどうか確認する必要がある。したがって、索引を用いた検索処理が多い場合、サーバ台数が増えるにつれて索引の確認処理も増大する。このため、台数を増やしたスケールアウトで性能改善できないという問題があった。
【００１０】
索引を用いた検索処理が多い場合でも、台数を増やすことで性能をスケールアウトするためには、レコードＫＶペアだけでなく、索引ＫＶペアも複数のサーバに分散配置する必要がある。この場合、各サーバは、検索対象の索引を保持する場合にのみ処理を行えばよい。レコードＫＶペアおよび索引ＫＶペアの分散配置の例を、図２２に示す。図２２では、分散ＫＶＳは、４つのサーバ９００ａ〜９００ｄによって構成されている。サーバ９００ａ〜９００ｄは、それぞれレコードＫＶペアおよび索引ＫＶペアを分散して格納している。この場合、アプリケーションは、例えば、「２０１４−０１−０１」（２０１４年１月１日）に受注した受注履歴のレコードを参照するために、サーバ９００ａ、９００ｂ、および、９００ｃの３つのサーバにアクセスするだけでよい。すなわち、この場合、「２０１４−０１−０１」をキーとする索引ＫＶペアは、サーバ９００ａから取得可能である。そして、それによって得られた「受注１」および「受注２」をキーとするレコードＫＶペアは、サーバ９００ｂおよび９００ｃから取得可能である。このように、索引ＫＶペアを分散配置することにより、分散ＫＶＳを構成するサーバ台数が多いほど、１つの検索処理でアクセスされるサーバ台数の割合は少なくて済む。
【００１１】
このような索引ＫＶペアの分散配置を実現するためには、レコードＫＶペアの更新と索引ＫＶペアの更新との間に不整合を発生させないようにする必要がある。複数のＫＶペアについて不整合を発生させずに更新する技術の一例が、特許文献１に記載されている。
【００１２】
特許文献１に記載された関連技術は、整合性を保持する対象となるＫＶペア群に、各ＫＶペアのキーのうちいずれか１つを代表キーとして設定する。そして、この関連技術は、各ＫＶペアに対する更新情報を、代表キーに対応する代表ログに書き込む。また、この関連技術は、代表ログ以外の従属ログには、処理中であることを表す情報を付加する。代表ログは、トランザクションのＷＡＬ（Write Ahead Log）の役割を持つことになる。そして、この関連技術は、代表ログに書き込まれた更新情報を、各ＫＶペアに反映させる。これにより、この関連技術は、複数のＫＶペア間に不整合を発生させずに更新することを可能としている。例えば、上述した図１９〜図２１の例では、前述の処理２および処理３をアトミックに実行する必要がある。つまり、図２０では、ｉｔｅｍ１をキーとする商品マスタのＫＶペアと、受注１をキーとする受注履歴のＫＶペアとは整合性を保つ必要がある。そこで、この関連技術は、これらのＫＶペアの代表キーとして、例えばｉｔｅｍ１を設定する。これにより、処理２および処理３はアトミックに実行され、商品マスタのＫＶペアと、受注履歴のＫＶペアとは整合性を保つ。
【００１３】
この関連技術を用いて、レコードＫＶペアおよび対応する索引ＫＶペアに代表キーを設定することにより、レコードおよび索引間の整合性を保つことが考えられる。
【先行技術文献】
【特許文献】
【００１４】
【特許文献１】特開２０１２‐２３８０６１号公報
【発明の概要】
【発明が解決しようとする課題】
【００１５】
しかしながら、特許文献１に記載された関連技術を用いても、レコードおよび索引間の整合性を保てない場合がある。
【００１６】
その理由について、図１９〜図２１に示した例を用いて説明する。この具体例に関連技術を適用する場合、整合性を保つ対象となるレコードＫＶペアと索引ＫＶペアとに同一の代表キーを設定する必要がある。ここで、「２０１４−０１−０１」をキーとする索引ＫＶペアに、代表キー「ｉｔｅｍ１」を設定したとする。この場合、この関連技術は、この索引ＫＶペアの更新を、「受注１」をキーとするレコードＫＶペアの作成と同一トランザクションで実行できる。「受注１」には、同一の代表キー「ｉｔｅｍ１」が設定されているからである。しかしながら、この場合、この関連技術は、この索引ＫＶペアの更新を、「受注２」をキーとするレコードＫＶペアの作成と同一トランザクションで実行することはできない。「受注２」には、異なる代表キー「ｉｔｅｍ２」が設定されているからである。
【００１７】
そこで、「２０１４−０１−０１」をキーとする索引ＫＶペアと、「受注１」および「受注２」をキーとする各レコードＫＶペアとに、代表キー「２０１４−０１−０１」を設定したとする。この場合、この関連技術は、受注履歴の各レコードＫＶペアの更新と、索引ＫＶペアの更新とを同一トランザクションで実行可能となる。しかし、この場合、この関連技術は、受注履歴のＫＶペアおよび対応する商品マスタのＫＶペア間で代表キーが異なっているため、これらの更新を同一トランザクションで実行できない。
【００１８】
もし、整合性を保つ必要のあるレコードＫＶペアおよび索引ＫＶペアで同一の代表キーを設定することが可能であれば、関連技術を用いれば不整合は発生しない。しかし、上述したように、この関連技術は、処理によっては、対象のＫＶペア群の代表キーを一致させることができず、同一トランザクションで処理できない。この場合、レコードＫＶペアの更新と、索引ＫＶペアの更新とが、別のトランザクションで実行されることになる。このとき、レコードＫＶペアの更新トランザクションと、索引ＫＶペアの更新トランザクションとの間で障害が発生した場合、索引データの消失につながる。そして、レコードＫＶペアおよび索引ＫＶペア間に不整合が発生したままの状態となる。つまり、このような場合、分散ＫＶＳは、結果整合性を満たさない。
【００１９】
このように、特許文献１に記載された関連技術では、レコードおよび索引間の結果整合性を保てない場合があるという課題があった。
【００２０】
本発明は、上述の課題を解決するためになされたもので、分散ストレージシステムにおけるレコードおよび索引間の結果整合性をより十分にサポートする技術を提供することを目的とする。
【課題を解決するための手段】
【００２１】
本発明の情報処理装置は、キーおよび値からなるレコードに関する処理の要求が入力される処理要求入力部と、前記レコードに含まれる値のうち索引作成対象である索引キーと、前記レコードのキーを含むキーリストとからなる索引データに関して、要求された前記処理に応じた更新指示を表す索引更新メッセージを生成するメッセージ生成部と、要求された前記処理に応じたレコードを生成し、生成したレコードに、前記メッセージ生成部により生成された索引更新メッセージを付加し、前記索引更新メッセージが付加されたレコードを分散ストレージシステムに格納するレコード更新部と、前記分散ストレージシステムに格納されたレコードに含まれる索引更新メッセージを実行することにより、前記索引更新メッセージが反映された索引データを前記分散ストレージシステムに格納する索引データ更新部と、を備える。
【００２２】
また、本発明の情報処理システムは、上述の情報処理装置と、前記分散ストレージシステムと、を備える。
【００２３】
また、本発明の情報処理方法は、キーおよび値からなるレコードに関する処理の要求が入力されると、前記レコードに含まれる値のうち索引作成対象である索引キーと、前記レコードのキーを含むキーリストとからなる索引データに関して、要求された前記処理に応じた更新指示を表す索引更新メッセージを生成し、要求された前記処理に応じたレコードを生成し、生成したレコードに、前記索引更新メッセージを付加し、前記索引更新メッセージが付加されたレコードを分散ストレージシステムに格納し、前記分散ストレージシステムに格納されたレコードに含まれる索引更新メッセージを実行することにより、前記索引更新メッセージが反映された索引データを前記分散ストレージシステムに格納する。
【００２４】
また、本発明のコンピュータ・プログラムは、キーおよび値からなるレコードに関する処理の要求が入力される処理要求入力ステップと、前記レコードに含まれる値のうち索引作成対象である索引キーと、前記レコードのキーを含むキーリストとからなる索引データに関して、要求された前記処理に応じた更新指示を表す索引更新メッセージを生成するメッセージ生成ステップと、要求された前記処理に応じたレコードを生成し、生成したレコードに、前記メッセージ生成ステップで生成された索引更新メッセージを付加し、前記索引更新メッセージが付加されたレコードを分散ストレージシステムに格納するレコード更新ステップと、前記分散ストレージシステムに格納されたレコードに含まれる索引更新メッセージを実行することにより、前記索引更新メッセージが反映された索引データを前記分散ストレージシステムに格納する索引データ更新ステップと、をコンピュータ装置に実行させる。
【発明の効果】
【００２５】
本発明は、分散ストレージシステムにおけるレコードおよび索引間の結果整合性をより十分にサポートする技術を提供することができる。
【図面の簡単な説明】
【００２６】
【図１】本発明の第１の実施の形態としての情報処理システムの機能ブロック図である。
【図２】本発明の第１の実施の形態としての情報処理システムのハードウェア構成の一例を示す図である。
【図３】本発明の第１の実施の形態としての情報処理システムのレコード処理動作を示すフローチャートである。
【図４】本発明の第１の実施の形態としての情報処理システムの索引データ更新動作を示すフローチャートである。
【図５】本発明の第２の実施の形態としての情報処理システムの機能ブロック図である。
【図６】本発明の第２の実施の形態において入力される処理要求と、生成される索引更新メッセージと、実行される処理との対応関係の一例を説明する図である。
【図７】本発明の第２の実施の形態としての情報処理システムのレコード参照動作を説明するフローチャートである。
【図８】本発明の第２の実施の形態としての情報処理システムのレコード処理動作を説明するフローチャートである。
【図９】本発明の第２の実施の形態としての情報処理システムによって処理されるレコードの具体的な例を示す図である。
【図１０】本発明の第２の実施の形態において、図９に示すレコードに対して入力される処理要求と、生成される索引更新メッセージと、実行される処理との対応関係の一例を説明する図である。
【図１１】本発明の第２の実施の形態としての情報処理システムの索引データ更新動作を説明するフローチャートである。
【図１２】本発明の第２の実施の形態において、索引更新前に分散ＫＶＳに格納されている情報の一例を模式的に説明する図である。
【図１３】本発明の第２の実施の形態において、索引更新後に分散ＫＶＳに格納されている情報の一例を模式的に説明する図である。
【図１４】本発明の第３の実施の形態としての情報処理システムの機能ブロック図である。
【図１５】本発明の第３の実施の形態におけるマージルールの一例を示す図である。
【図１６】本発明の第３の実施の形態におけるマージルールの他の一例を示す図である。
【図１７】本発明の第３の実施の形態としての情報処理システムのメッセージ抽出動作を説明するフローチャートである。
【図１８】本発明の第３の実施の形態としての情報処理システムの索引データ更新動作を説明するフローチャートである。
【図１９】関連技術において分散ＫＶＳへの格納対象となる情報の一例を示す図である。
【図２０】関連技術において図１９に示す情報を表すＫＶペアの一例を示す図である。
【図２１】関連技術において図２０に示すＫＶペアに対する索引の一例を示す図である。
【図２２】関連技術において、分散配置された索引ＫＶペアの一例を模式的に説明する図である。
【発明を実施するための形態】
【００２７】
以下、本発明の実施の形態について、図面を参照して詳細に説明する。
【００２８】
（第１の実施の形態）
本発明の第１の実施の形態としての情報処理システム１の構成を図１に示す。図１において、情報処理システム１は、情報処理装置１０と、分散ストレージシステム４０とを含む。情報処理装置１０は、分散ストレージシステム４０と通信可能に接続される。また、情報処理装置１０は、処理要求入力部１１と、レコード更新部１２と、メッセージ生成部１３と、索引データ更新部１４とを含む。分散ストレージシステム４０は、複数のサーバ４００によって構成される。各サーバ４００は、レコード記憶部４０１を有する。
【００２９】
ここで、情報処理システム１を構成する各装置について、そのハードウェア構成の一例を図２に示す。情報処理装置１０は、ＣＰＵ（Central Processing Unit）１００１と、ＲＡＭ（Random Access Memory）１００２と、ＲＯＭ（Read Only Memory）１００３と、ハードディスク等の記憶装置１００４とを含むコンピュータ装置によって構成可能である。また、情報処理装置１０を構成するコンピュータ装置は、さらに、ネットワークインタフェース１００５と、入力装置１００６と、出力装置１００７とを含む。また、分散ストレージシステム４０に含まれる各サーバ４００は、ＣＰＵ４００１と、ＲＡＭ４００２と、ＲＯＭ４００３と、ハードディスク等の記憶装置４００４と、ネットワークインタフェース４００５とを含むコンピュータ装置によって構成可能である。
【００３０】
この場合、処理要求入力部１１は、入力装置１００６と、ＲＯＭ１００３または記憶装置１００４に記憶されたコンピュータ・プログラムをＲＡＭ１００２に読み込んで実行するＣＰＵ１００１とによって構成される。また、レコード更新部１２および索引データ更新部１４は、ネットワークインタフェース１００５と、ＲＯＭ１００３または記憶装置１００４に記憶されたコンピュータ・プログラムをＲＡＭ１００２に読み込んで実行するＣＰＵ１００１とによって構成される。また、メッセージ生成部１３は、ＲＯＭ１００３または記憶装置１００４に記憶されたコンピュータ・プログラムをＲＡＭ１００２に読み込んで実行するＣＰＵ１００１によって構成される。また、分散ストレージシステム４０は、各サーバ４００において、ＣＰＵ４００１が、ＲＯＭ４００３または記憶装置４００４に記憶されたコンピュータ・プログラムをＲＡＭ４００２に読み込んで実行することによりその機能を実現する。また、レコード記憶部４０１は、記憶装置４００４によって構成される。
【００３１】
なお、情報処理装置１０は、サーバ４００のいずれかと同一のコンピュータ装置上に実現されていてもよい。また、情報処理システム１の各装置および各機能ブロックのハードウェア構成は、上述の構成に限定されない。
【００３２】
分散ストレージシステム４０は、キーおよび値からなるレコードを、複数のサーバ４００のレコード記憶部４０１に分散して格納する。分散ストレージシステム４０は、情報処理装置１０からの要求に応じて、処理対象のレコードについて格納先のサーバ４００を特定する。そして、分散ストレージシステム４０は、特定したサーバ４００において、要求された処理を実行する。
【００３３】
次に、情報処理装置１０の各機能ブロックの詳細について説明する。
【００３４】
処理要求入力部１１は、キーおよび値からなるレコードに関する処理の要求を入力として取得する。ここで、レコードに関する処理とは、例えば、レコードの新規生成、更新、または、削除などの処理であってもよい。例えば、処理要求入力部１１は、処理の要求内容を表す情報を、入力装置１００６等から取得してもよい。
【００３５】
レコード更新部１２は、処理要求入力部１１に入力された処理の要求に応じたレコードを生成する。ここで、分散ストレージシステム４０では、レコードの処理に応じて、関連する索引データの更新が必要となる場合がある。そこで、レコード更新部１２は、索引データの更新が必要な場合、後述のメッセージ生成部１３を用いて、レコードの処理に応じた索引データの更新指示を表す索引更新メッセージを生成する。そして、レコード更新部１２は、生成したレコードに索引更新メッセージを付加し、分散ストレージシステム４０に格納する。
【００３６】
メッセージ生成部１３は、レコードの処理内容に応じた索引更新メッセージを生成する。前述のように、索引更新メッセージは、索引データの更新指示を表す。ここで、索引データは、索引キーおよびキーリストからなる。索引キーには、レコードに含まれる値のうち索引作成対象の値が設定される。キーリストは、その索引キーを値に含むレコードのキーのリストである。
【００３７】
索引データ更新部１４は、分散ストレージシステム４０に格納されるレコードに含まれる索引更新メッセージを実行する。そして、索引データ更新部１４は、索引更新メッセージが反映された索引データを、分散ストレージシステム４０に格納する。このように、索引データ更新部１４は、レコード更新部１２によるレコードの処理とは非同期に、索引データの更新を実行する。索引データ更新部１４は、所定のタイミング毎に動作してもよい。または、索引データ更新部１４は、レコード更新部１２によりレコードの処理が行われるタイミングで動作してもよい。
【００３８】
以上のように構成された情報処理システム１の動作について図面を参照して説明する。
【００３９】
まず、情報処理システム１のレコード処理動作の概略を図３に示す。
【００４０】
図３では、まず、処理要求入力部１１は、レコードに関する処理の要求を入力として取得する（ステップＡ１）。
【００４１】
次に、レコード更新部１２は、ステップＡ１で要求された処理に応じたレコードを生成する（ステップＡ２）。
【００４２】
次に、レコード更新部１２は、ステップＡ１で要求された処理に応じた索引更新メッセージを、メッセージ生成部１３を用いて生成する（ステップＡ３）。
【００４３】
次に、レコード更新部１２は、ステップＡ２で生成したレコードに、ステップＡ３で生成した索引更新メッセージを付加する（ステップＡ４）。
【００４４】
次に、レコード更新部１２は、索引更新メッセージを付加したレコードを、分散ストレージシステム４０に格納する（ステップＡ５）。
【００４５】
以上で、情報処理システム１は、レコード処理動作を終了する。
【００４６】
次に、情報処理システム１の索引データ更新動作を図４に示す。
【００４７】
図４では、まず、索引データ更新部１４は、分散ストレージシステム４０に格納されたレコードに含まれる索引更新メッセージを取得する（ステップＢ１）。
【００４８】
次に、索引データ更新部１４は、索引更新メッセージを実行する。そして、索引データ更新部１４は、索引更新メッセージが反映された索引データを、分散ストレージシステム４０に格納する（ステップＢ２）。
【００４９】
以上で、情報処理システム１は、索引データ更新動作を終了する。
【００５０】
なお、情報処理システム１は、図４に示した索引データ更新動作を、定められたタイミング毎に（例えば、所定間隔で）実行してもよい。または、情報処理システム１は、この索引データ更新動作を、図３に示したレコード処理動作の度に続けて実行してもよい。
【００５１】
次に、本発明の第１の実施の形態の効果について述べる。
【００５２】
本発明の第１の実施の形態としての情報処理システムは、分散ストレージシステムにおけるレコードおよび索引間の結果整合性をより十分にサポートすることができる。
【００５３】
その理由は、処理要求部に、キーおよび値からなるレコードに関する処理の要求が入力されると、メッセージ生成部が、要求された処理に応じたレコードの生成に伴う索引データの更新指示を表す索引更新メッセージを生成するからである。そして、レコード更新部が、要求された処理に応じたレコードを生成し、生成したレコードに索引更新メッセージを付加し、索引更新メッセージが付加されたレコードを分散ストレージシステムに格納するからである。また、索引データ更新部が、分散ストレージシステムに格納されたレコードに含まれる索引更新メッセージを実行することにより、索引更新メッセージが反映された索引データを分散ストレージシステムに格納するからである。
【００５４】
このように、本実施の形態は、レコードに、そのレコードの処理に伴う索引データの更新指示を含めて分散ストレージシステムに格納する。そして、本実施の形態は、レコードの処理とは非同期に、レコードに含めた更新指示内容にしたがって索引データの更新処理を実行する。これにより、本実施の形態は、レコードの処理後、索引データの更新が完了する前に障害が発生した場合であっても、索引データの更新指示を表す情報を失うことがなく、レコードおよび索引データ間の結果整合性を満たすことができる。
【００５５】
（第２の実施の形態）
次に、本発明の第２の実施の形態について図面を参照して詳細に説明する。本実施の形態では、本発明の分散ストレージシステムに、分散ＫＶＳ（Key-Value Store）を適用した例について説明する。
【００５６】
まず、本発明の第２の実施の形態としての情報処理システム２の構成を図５に示す。図５において、情報処理システム２は、情報処理装置２０と、分散ＫＶＳ５０とを含む。情報処理装置２０は、分散ＫＶＳ５０と通信可能に接続される。また、情報処理装置２０は、処理要求入力部２１と、レコード更新部２２と、メッセージ生成部２３と、索引データ更新部２４と、レコード参照部２５とを含む。また、索引データ更新部２４は、メッセージ抽出部２４１を含む。また、分散ＫＶＳ５０は、複数のサーバ５００によって構成される。各サーバ５００は、レコード記憶部５０１を有する。分散ＫＶＳ５０は、図示のサーバ５００に加えて、レコードに対するトランザクションを処理するトランザクション処理装置（図示せず）や、分散ＫＶＳ５０の構成を管理する構成管理装置（図示せず）等を含んでいてもよい。
【００５７】
ここで、情報処理システム２の各装置および各機能ブロックは、図２を用いて説明した本発明の第１の実施の形態の各装置および各機能ブロックと同一のハードウェア要素によって構成可能である。なお、情報処理システム２の各装置および各機能ブロックのハードウェア構成は、上述の構成に限定されない。
【００５８】
また、上述のトランザクション処理装置や構成管理装置は、サーバ５００と同様のハードウェア要素を備えるコンピュータ装置によって構成されていてもよい。あるいは、これらの各装置の一部または全部は、いずれかのサーバ５００と同一のコンピュータ装置上に実現されていてもよい。また、情報処理装置２０は、分散ＫＶＳ５０を構成する各装置のいずれかと同一のコンピュータ装置上に実現されていてもよい。また、分散ＫＶＳ５０は、各サーバ５００において、ＣＰＵ４００１が、ＲＯＭ４００３または記憶装置４００４に記憶されたコンピュータ・プログラムをＲＡＭ４００２に読み込んで実行することによりその機能を実現する。
【００５９】
分散ＫＶＳ５０は、キーおよび値からなるＫＶ（Key-Value）ペアを、複数のサーバ５００のレコード記憶部５０１に分散して格納する。分散ＫＶＳ５０が格納するＫＶペアには、レコードＫＶペアと、索引ＫＶペアとがある。レコードＫＶペアは、格納対象のレコードを表す。また、索引ＫＶペアは、レコードＫＶペアに対する索引データを表す。以下、レコードＫＶペアを、単にレコードともいう。また、索引ＫＶペアを、単に索引、または、索引データともいう。分散ＫＶＳ５０は、情報処理装置２０からの要求に応じて、処理対象のＫＶペアについて格納先のサーバ５００を特定する。例えば、分散ＫＶＳ５０は、処理対象のＫＶペアのキーのハッシュ値に応じて、格納先のサーバ５００を特定してもよい。そして、分散ＫＶＳ５０は、特定したサーバ５００においてそのレコードの処理を実行する。
【００６０】
なお、分散ＫＶＳ５０は、ＫＶペアに関して、以下の機能を有するものとする。
・ＰＵＴ処理：ＫＶペアを分散ＫＶＳ５０へ格納する処理。以下、キーＫおよび値ＶのＫＶペアを分散ＫＶＳ５０へ格納する処理を、「ＰＵＴ（Ｋ，Ｖ）」とも記載する。
・ＧＥＴ処理：キーを指定してＫＶペアを分散ＫＶＳ５０から取得する処理。以下、キーＫを持つＫＶペアを分散ＫＶＳ５０から取得して値Ｖを得ることを「ＧＥＴ（Ｋ）→Ｖ」とも記載する。
・ＤＥＬＥＴＥ処理：キーを指定して分散ＫＶＳ５０からＫＶペアを削除する処理。以下、キーＫを持つＫＶペアを分散ＫＶＳ５０から削除することを「Ｄｅｌｅｔｅ（Ｋ）」とも記載する。
・抽出処理：分散ＫＶＳ５０の各サーバ５００に格納されたＫＶペアを全件スキャンにより抽出する処理。
【００６１】
次に、情報処理装置２０の各機能ブロックの詳細について説明する。
【００６２】
処理要求入力部２１は、レコードＫＶペアに関する処理の要求を入力として取得する。ここで、要求される処理は、例えば、レコードの新規生成処理、既存のレコードの更新処理、または、既存のレコードの削除処理などであってもよい。例えば、新規生成処理の要求であれば、処理要求入力部２１は、新規生成するレコードＫＶペアのキーおよび値を入力として取得する。また、更新処理の要求であれば、処理要求入力部２１は、更新対象のレコードＫＶペアのキーおよび更新される値を入力として取得する。また、削除処理の要求であれば、処理要求入力部２１は、削除対象のレコードＫＶペアのキーを入力として取得する。
【００６３】
レコード更新部２２は、処理要求入力部２１に入力された処理の要求に応じたレコードＫＶペアを生成する。ここで、分散ＫＶＳ５０では、レコードＫＶペアの処理（新規作成・更新・削除など）に応じて、関連する索引ＫＶペアの更新が必要となる場合がある。そこで、レコード更新部２２は、索引ＫＶペアの更新が必要な場合、後述のメッセージ生成部２３を用いて、レコードＫＶペアの処理に応じた索引データの更新指示を表す索引更新メッセージを生成する。そして、レコード更新部２２は、生成したレコードＫＶペアに、索引更新メッセージを付加し、分散ＫＶＳ５０に格納（ＰＵＴ）する。
【００６４】
例えば、要求された処理が新規作成または更新であれば、レコード更新部２２は、該当するキーおよび値を含むレコードＫＶペアを生成する。また、要求された処理が削除であれば、レコード更新部２２は、該当するレコードＫＶペアを削除することを表すレコードを生成してもよい。そのようなレコードとは、例えば、削除対象のレコードＫＶペアのキーと、空の値とを含むレコードであってもよい。
【００６５】
また、例えば、要求された処理が新規作成の場合、レコード更新部２２は、該当するキーと、該当する値のうち索引作成対象となる値とを、後述のメッセージ生成部２３に渡すことにより、索引更新メッセージを生成する。また、例えば、要求された処理が更新または削除であれば、レコード更新部２２は、該当するキーのレコードＫＶペアを分散ＫＶＳ５０から取得（ＧＥＴ）する。そして、この場合、レコード更新部２２は、該当するキーと、取得したレコードＫＶペアに含まれる索引作成対象の値と、更新の場合はその更新後の値とを、後述のメッセージ生成部２３に渡すことにより、索引更新メッセージを生成する。
【００６６】
メッセージ生成部２３は、前述の処理要求に対応する索引ＫＶペアの更新指示を、索引更新メッセージとして生成する。ここで、索引ＫＶペアは、索引キーをキーとし、キーリストを値とするＫＶペアである。索引キーには、レコードＫＶペアに含まれる値のうち索引作成対象の値が設定される。キーリストは、索引キーを値に含むレコードＫＶペアのキーのリストである。メッセージ生成部２３は、レコードＫＶペアの処理に応じた索引ＫＶペアの更新指示を、索引更新メッセージとして生成する。
【００６７】
例えば、要求される処理が新規作成であれば、メッセージ生成部２３は、新規作成されるレコードＫＶペアに含まれる索引作成対象の値を索引キーとする索引ＫＶペアに、新規作成されるレコードＫＶペアのキーを追加する索引更新メッセージを生成する。また、例えば、要求される処理が削除であれば、メッセージ生成部２３は、削除対象のレコードＫＶペアに含まれる索引作成対象の値を索引キーとする索引ＫＶペアのキーリストから、削除対象のレコードのキーを削除する索引更新メッセージを生成する。また、例えば、要求される処理が更新であれば、メッセージ生成部２３は、２つの更新指示を含む索引更新メッセージを生成する。１つ目の更新指示は、更新対象のレコードＫＶペアに含まれる索引作成対象の値を索引キーとする索引ＫＶペアのキーリストから、更新対象のレコードのキーを削除する処理である。２つ目の更新指示は、更新後のレコードＫＶペアに含まれる索引作成対象の値を索引キーとする索引ＫＶペアのキーリストに、更新対象のレコードのキーを追加する処理である。
【００６８】
索引更新メッセージは、更新処理の種類、宛先ＫＶペアを特定する情報、および、追加または削除するキーをそれぞれ表す情報を含む。ここで、更新処理の種類とは、キーリストに対するキーの追加であるか削除であるかを表す情報である。ここでは、キーの追加を「Ａｄｄ」と表し、キーの削除を「Ｒｅｍｏｖｅ」と表すとする。また、宛先ＫＶペアとは、操作対象となる索引ＫＶペアを特定する情報である。ここでは、索引ＫＶペアの索引キーが、宛先ＫＶペアを特定する情報として適用される。また、追加または削除するキーは、宛先ＫＶペアのキーリストに対して追加または削除するレコードＫＶペアのキーを表す。このような索引更新メッセージの具体例を以下に示す。ここでは、以下のレコードＫＶペアがあるとする。
受注１→｛ｉｔｅｍ１，２０１４−０１−０１｝
受注２→｛ｉｔｅｍ２，２０１４−０１−０１｝
受注３→｛ｉｔｅｍ３，２０１４−０１−０１｝
なお、「キー→値」は、ＫＶペアを表す。また、｛値１，値２，・・・｝は、レコードＫＶペアの値を表す。このとき、「受注１」をキーとするレコードＫＶペアの値の２つ目の要素に索引が設定されることを想定する。この場合、このレコードＫＶペアの新規生成に伴う索引更新メッセージは、
「Ａｄｄ  受注１  ｔｏ  ２０１４−０１−０１」
と表される。
【００６９】
また、「受注２」とキーとするレコードＫＶペアの値の２つ目の要素に索引が設定されているとする。この場合、このレコードＫＶペアの削除に伴う索引更新メッセージは、
「Ｒｅｍｏｖｅ  受注２  ｆｒｏｍ  ２０１４−０１−０１」
と表される。
【００７０】
また、「受注３」をキーとするレコードＫＶペアの値の２つ目の要素に索引が設定されているとする。そして、このレコードＫＶペアの値の２つ目の要素が、「２０１４−０１−０１」から「２０１４−０１−０２」に更新されるとする。この場合、このレコードＫＶペアの更新に伴う索引更新メッセージは、
「Ｒｅｍｏｖｅ  受注３  ｆｒｏｍ  ２０１４−０１−０１」
「Ａｄｄ  受注３  ｔｏ  ２０１４−０１−０２」
と表される。
【００７１】
また、要求される処理が、分散ＫＶＳ５０に既に格納されているレコードＫＶペアに対する処理（例えば、更新や削除）である場合について説明する。この場合、レコード更新部２２は、分散ＫＶＳ５０に格納されているレコードに既に付加されている索引更新メッセージをまず取得する。そして、レコード更新部２２は、今回要求された処理に応じて生成したレコードＫＶペアに、既に付加されていた索引更新メッセージと、今回の処理に応じて生成された索引更新メッセージとを付加する。
【００７２】
ここで、レコードＫＶペアに対して要求される処理と、生成される索引更新メッセージと、レコード更新部２２によって実行される処理との対応関係の一例を、図６に示す。図６では、「＆」記号は、レコードＫＶペアの値と索引更新メッセージとの区切り、または、複数の索引更新メッセージ間の区切りを表す。また、「・・・」は、レコードＫＶペアの値に含まれる要素の省略を表す。また、「Ｋ」は、レコードＫＶペアのキーを表す。また、「ＩＫ」は、レコードＫＶペアの値のうち、索引作成対象の要素を表す。また、「ＩＫ０」は、更新前のレコードＫＶペアにおける索引作成対象の要素を表す。また、「PreviousMessages」は、分散ＫＶＳ５０からＧＥＴされたレコードＫＶペアに既に含まれている索引更新メッセージを表す。
【００７３】
図６において、例えば、２行目は、キーがＫのレコードＫＶペアにおいて、値に含まれるＩＫ０をＩＫに更新する処理要求「ＰＵＴ（Ｋ，｛．．．，ＩＫ，．．．｝）」に関して説明している。この場合、この更新処理要求に対応する索引更新メッセージの１つは、更新前の索引キーＩＫ０を持つ索引ＫＶペアからキーＫを削除する指示「Ｒｅｍｏｖｅ  Ｋ  ｆｒｏｍ  ＩＫ０」である。また、この更新処理要求に対応する索引更新メッセージのもう１つは、更新後の索引キーＩＫを持つ索引ＫＶペアにキーＫを追加する指示「Ａｄｄ  Ｋ  ｔｏ  ＩＫ」である。そして、この更新処理要求に対応して、レコード更新部２２により実際に実行される処理は、まず、キーＫを持つレコードＫＶペアに含まれる前回までの更新指示メッセージ「PreviousMessages」を取得（ＧＥＴ）する処理を含む。さらに、実際に実行される処理は、更新後のレコードＫＶペアに、「PreviousMessages」および今回の２つの更新指示メッセージを付加して格納（ＰＵＴ）する処理を含む。
【００７４】
また、３行目は、キーがＫのレコードＫＶペアを削除する処理要求「Ｄｅｌｅｔｅ（Ｋ）」について説明している。この場合、この削除処理要求に対応する索引更新メッセージは、索引キーＩＫを持つ索引ＫＶペアからキーＫを削除する指示「Ｒｅｍｏｖｅ  Ｋ  ｆｒｏｍ  ＩＫ」を含む。また、この削除処理要求に対応して、レコード更新部２２により実際に実行される処理は、まず、キーＫを持つレコードＫＶペアに含まれる前回までの更新指示メッセージ「PreviousMessages」を取得する処理を含む。さらに、実際に実行される処理は、削除を表すレコードＫＶペアに、「PreviousMessages」および今回の更新指示メッセージを付加する処理を含んでいる。なお、ここでは、削除を表すレコードＫＶペアは、キーＫおよび空の値のペアによって表されている。
【００７５】
また、１行目は、キーがＫで値がＶのレコードＫＶペアを新規作成する処理要求「ＰＵＴ（Ｋ，｛．．．，ＩＫ，．．．｝）」に関して説明している。この場合、この新規作成処理要求に対応する索引更新メッセージは、索引キーＩＫを持つ索引ＫＶペアにキーＫを追加する指示「Ａｄｄ  Ｋ  ｔｏ  ＩＫ」を含む。また、この場合、このキーＫを有するレコードＫＶペアは分散ＫＶＳ５０に格納されていない。そのため、レコード更新部２２は、既に付加されている索引更新メッセージを取得する処理を行う必要がない。その結果、実際に行われる処理は、新規作成されるレコードＫＶペアに、今回の索引更新メッセージを付加して格納する処理となっている。
【００７６】
なお、図６において、レコード更新部２２は、更新処理や削除処理では、対象のレコードＫＶペアに対するＧＥＴ操作とＰＵＴ操作とをアトミックに実行する必要がある。このため、レコード更新部２２は、ＣＡＳ機能を用いてもよい。
【００７７】
メッセージ抽出部２４１は、各サーバ５００のレコード記憶部５０１に格納されたレコードから、索引更新メッセージを抽出する。例えば、メッセージ抽出部２４１は、分散ＫＶＳ５０の全件スキャン機能を利用して、索引更新メッセージを抽出してもよい。
【００７８】
索引データ更新部２４は、メッセージ抽出部２４１によって抽出された索引更新メッセージを実行することにより、索引更新メッセージが反映された索引データを分散ＫＶＳ５０に格納する。なお、索引更新メッセージの「反映」とは、索引更新メッセージの示す索引ＫＶペアを分散ＫＶＳ５０から取得（ＧＥＴ）し、得られた索引ＫＶペアの値（キーリスト）を更新し、更新した索引ＫＶペアを分散ＫＶＳ５０に格納（ＰＵＴ）することをいう。
【００７９】
また、索引データ更新部２４は、反映済の索引更新メッセージを、そのレコードＫＶペアから削除してもよい。なお、このとき、索引データ更新部２４は、レコードＫＶペアの更新について、排他制御を行うことが望ましい。そのため、索引データ更新部２４は、ＣＡＳ機能を利用してもよい。これにより、例えば、索引データ更新部２４は、「索引更新メッセージ反映前のレコードＫＶペアの読み取り」と、「反映済みの索引更新メッセージを削除したレコードＫＶペアの書き込み」とをアトミックに実行することが可能となる。
【００８０】
レコード参照部２５は、処理要求入力部２１に、レコードＫＶペアの参照要求が入力された場合、次のように動作するよう構成される。具体的には、レコード参照部２５は、分散ＫＶＳ５０から、要求対象のレコードＫＶペアを取得する。そして、取得したレコードＫＶペアに索引更新メッセージが含まれる場合、レコード参照部２５は、索引更新メッセージを含まない部分を出力する。つまり、レコード参照部２５は、索引更新メッセージをフィルタリングしてレコードの内容を出力する。
【００８１】
以上のように構成された情報処理システム２の動作について図面を参照して説明する。
【００８２】
まず、情報処理システム２のレコード参照動作を図７に示す。
【００８３】
図７では、まず、処理要求入力部２１は、レコードＫＶペアの参照要求を入力として取得する（ステップＣ１）。
【００８４】
次に、レコード参照部２５は、分散ＫＶＳ５０から、要求対象のレコードＫＶペアを取得する（ステップＣ２）。
【００８５】
そして、取得したレコードＫＶペアの値に索引更新メッセージが含まれていない場合（ステップＣ３でＮｏ）、レコード参照部２５は、レコードを出力する（ステップＣ５）。
【００８６】
一方、取得したレコードＫＶペアの値に索引更新メッセージが含まれる場合（ステップＣ３でＹｅｓ）、レコード参照部２５は、値に含まれる索引更新メッセージをフィルタリングする（ステップＣ４）。
【００８７】
そして、レコード参照部２５は、フィルタリング後のレコードを出力する（ステップＣ５）。
【００８８】
以上で、情報処理システム２は、レコード参照動作を終了する。
【００８９】
例えば、利用者は、レコード参照動作により出力されたレコードを参照することにより、レコードに対する新規作成、更新、または、削除の処理要求を入力可能である。
【００９０】
次に、情報処理システム２のレコード処理動作を図８に示す。
【００９１】
図８では、まず、処理要求入力部２１は、レコードＫＶペアに関する処理の要求を入力として取得する（ステップＡ１１）。
【００９２】
次に、情報処理システム２は、ステップＡ１１で要求された処理の内容に応じて、処理を分岐させる。
【００９３】
ここで、ステップＡ１１で要求された処理が、レコードＫＶペアの新規作成処理の場合（ステップＡ１２で「新規作成」）について説明する。
【００９４】
この場合、レコード更新部２２は、処理要求入力部２１に入力されたキーおよび値を用いて、新規作成するレコードＫＶペアを生成する（ステップＡ１３）。
【００９５】
次に、レコード更新部２２は、メッセージ生成部２３を用いて、処理要求入力部２１に入力された値のうち索引作成対象の値を索引キーとする索引データに、入力されたキーを追加する索引更新メッセージを生成する（ステップＡ１４）。
【００９６】
次に、レコード更新部２２は、生成したレコードＫＶペアに、生成した索引更新メッセージを付加し（ステップＡ１５）、分散ＫＶＳ５０に格納する（ステップＡ１６）。
【００９７】
一方、ステップＡ１１で要求された処理が、レコードＫＶペアの更新処理の場合（ステップＡ１２で「更新」）について説明する。
【００９８】
この場合、レコード更新部２２は、分散ＫＶＳ５０から、処理要求入力部２１に入力された更新対象のキーを持つレコードＫＶペアを取得する（ステップＡ１７）。
【００９９】
次に、レコード更新部２２は、ステップＡ１７で取得したレコードＫＶペアに、既に付加されている索引更新メッセージがあれば取得する（ステップＡ１８）。
【０１００】
次に、メッセージ生成部２３は、ステップＡ１７で取得したレコードＫＶペアに含まれる索引作成対象の値を索引キーとする索引ＫＶペアから、更新対象のキーを削除する索引更新メッセージを生成する（ステップＡ１９）。
【０１０１】
次に、情報処理システム２は、新規作成処理の場合と同様に、ステップＡ１３〜Ａ１６の処理を実行する。ただし、更新の場合、ステップＡ１５において、レコード更新部２２は、生成したレコードＫＶペアに、ステップＡ１８で取得したそれまでの索引更新メッセージと、ステップＡ１９およびステップＡ１４でそれぞれ生成した索引更新メッセージとを付加する。
【０１０２】
また、ステップＡ１１で要求された処理がレコードＫＶペアの削除処理の場合（ステップＡ１２で「削除」）について説明する。
【０１０３】
この場合、レコード更新部２２は、分散ＫＶＳ５０から、処理要求入力部２１に入力された削除対象のキーを持つレコードＫＶペアを取得する（ステップＡ２０）。
【０１０４】
次に、レコード更新部２２は、ステップＡ２０で取得したレコードＫＶペアに、既に付加されている索引更新メッセージがあれば取得する（ステップＡ２１）。
【０１０５】
次に、メッセージ生成部２３は、ステップＡ２０で取得したレコードＫＶペアに含まれる索引作成対象の値を索引キーとする索引ＫＶペアから、削除対象のキーを削除する索引更新メッセージを生成する（ステップＡ２２）。
【０１０６】
次に、レコード更新部２２は、削除対象のキーを用いて、該当するレコードＫＶペアの削除を表すレコードＫＶペアを生成する（ステップＡ２３）。例えば、レコード更新部２２は、前述のように、該当するキーと、空の値とからなるレコードＫＶペアを生成してもよい。
【０１０７】
次に、情報処理システム２は、ステップＡ１５〜Ａ１６の処理を実行する。ただし、削除の場合、ステップＡ１５において、レコード更新部２２は、ステップＡ２３で生成したレコードＫＶペアに、ステップＡ２１で取得したそれまでの索引更新メッセージと、ステップＡ２２で生成した索引更新メッセージとを付加する。
【０１０８】
以上で、情報処理システム２は、レコード処理動作を終了する。
【０１０９】
このようなレコード処理動作の具体例について説明する。ここでは、図９の受注履歴表に相当するレコードＫＶペアを想定する。この受注履歴表では、「受注ＩＤ」列がキーであり、「商品ＩＤ」および「受注日時」列が値である。また、「受注日時」列が、索引作成対象であるとする。
【０１１０】
＜新規作成処理の具体例＞
処理要求入力部２１に、図９の１行目の受注履歴を表すレコードＫＶペアの新規作成要求が入力されたとする。この新規作成要求は、図１０の１行目「処理要求」に示すように、「ＰＵＴ（受注１，｛ｉｔｅｍ１，２０１４−０１−０１｝）」と表される（ステップＡ１１、Ａ１２で「新規作成」）。
【０１１１】
この場合、レコード更新部２２は、まず、新規作成するレコードＫＶペア（受注１，｛ｉｔｅｍ１、２０１４−０１−０１｝）を生成する（ステップＡ１３）。
【０１１２】
また、この場合、２０１４−０１−０１を索引キーとする索引ＫＶペアのキーリストに、このレコードＫＶペアのキー「受注１」を追加する必要がある。そこで、レコード更新部２２は、メッセージ生成部２３を用いて、索引ＫＶペアへの追加指示を表す索引更新メッセージを生成する。この索引更新メッセージは、図１０の１行目「索引更新メッセージ」に示すように、「Ａｄｄ  受注１  ｔｏ  ２０１４−０１−０１」と表される（ステップＡ１４）。
【０１１３】
そして、レコード更新部２２は、ステップＡ１３で生成したレコードＫＶペアに、ステップＡ１４で生成した索引更新メッセージを追加して、分散ＫＶＳ５０に格納する処理を実行する。具体的には、レコード更新部２２は、図１０の１行目「実行される処理」に示す「ＰＵＴ（受注１，｛ｉｔｅｍ１、２０１４−０１−０１｝＆Ａｄｄ  受注１  ｔｏ  ２０１４−０１−０１）」を実行する。
【０１１４】
＜更新処理の具体例＞
また、処理要求入力部２１に、図９の１行目の受注履歴を表すレコードＫＶペアの更新処理要求が入力されたとする（ステップＡ１１）。この更新処理要求は、図１０の２行目「処理要求」に示すように、「ＰＵＴ（受注１，｛ｉｔｅｍ１，２０１４−０１−０１｝）」と表される（ステップＡ１１、Ａ１２で「更新」）。
【０１１５】
ここでは、「受注１」をキーとするレコードＫＶペアについて、過去に、「受注日時」が「２０１４−０１−０１」から「２０１４−０１−０２」に更新される処理が既に実行されているとする。そして、ここでは、同じレコードＫＶペアについて、再度、「受注日時」を「２０１４−０１−０２」から「２０１４−０１−０１」に更新する処理要求が入力されたものとする。
【０１１６】
この場合、レコード更新部２２は、まず、「受注１」をキーとするレコードＫＶペアを、分散ＫＶＳ５０から取得する。ここでは、実行される処理は、「ＧＥＴ（受注１）」である（ステップＡ１７）。そして、このＧＥＴ処理により、「｛ｉｔｅｍ１、２０１４−０１−０２｝＆Ｒｅｍｏｖｅ  受注１  ｆｒｏｍ  ２０１４−０１−０１＆Ａｄｄ  受注１  ｔｏ  ２０１４−０１−０２」が得られる。得られたこのレコードＫＶペアに付加されている「＆」以降の２つの索引更新メッセージは、このレコードＫＶペアの前回の更新処理に伴い付加されていたものである（ステップＡ１８）。
【０１１７】
そして、今回の更新処理に伴い、「２０１４−０１−０２」を索引キーとする索引ＫＶペアのキーリストから、このレコードＫＶペアのキー「受注１」を削除する必要がある。そこで、レコード更新部２２は、メッセージ生成部２３を用いて、図１０の２行目「索引更新メッセージ」に示す１つ目の索引更新メッセージ「Ｒｅｍｏｖｅ  受注１  ｆｒｏｍ  ２０１４−０１−０２」を生成する（ステップＡ１９）。
【０１１８】
次に、レコード更新部２２は、更新後のレコードＫＶペア（受注１，｛ｉｔｅｍ１、２０１４−０１−０１｝）を生成する（ステップＡ１３）。
【０１１９】
また、さらに、２０１４−０１−０１を索引キーとする索引ＫＶペアのキーリストに、このレコードＫＶペアのキー「受注１」を追加する必要がある。そこで、レコード更新部２２は、メッセージ生成部２３を用いて、図１０の２行目「索引更新メッセージ」に示す２つ目の索引更新メッセージ「Ａｄｄ  受注１  ｔｏ  ２０１４−０１−０１」を生成する（ステップＡ１４）。
【０１２０】
そして、レコード更新部２２は、ステップＡ１３で生成したレコードＫＶペアに、ステップＡ１８で取得された前回の２つの索引更新メッセージと、ステップＡ１９およびＡ１４でそれぞれ生成した今回の２つの索引更新メッセージとを付加する（ステップＡ１５）。
【０１２１】
そして、レコード更新部２２は、これらの索引更新メッセージを付加したレコードＫＶペアを、分散ＫＶＳ５０に格納する（ステップＡ１５、Ａ１６）。
【０１２２】
その結果、この更新処理に伴いレコード更新部２２により実行される処理は、図１０の２行目「実行される処理」に示す通りとなる。
【０１２３】
＜削除処理の具体例＞
また、処理要求入力部２１に、図９の１行目に示すレコードＫＶペアの削除処理要求が入力されたとする。この削除処理要求は、図１０の３行目「処理要求」に示すように、「ＤＥＬＥＴＥ（受注１）」と表される（ステップＡ１１、Ａ１２で「削除」）。
【０１２４】
この場合、レコード更新部２２は、まず、「受注１」をキーとするレコードＫＶペアを、分散ＫＶＳ５０から取得する。ここでは、実行される処理は、「ＧＥＴ（受注１）」である（ステップＡ２０）。そして、このＧＥＴ処理により、｛ｉｔｅｍ１、２０１４−０１−０１｝が得られたものとする。なお、ここでは、「受注１」をキーとするレコードＫＶペアは、それまでの索引更新メッセージを含んでいないものとする。これは、このレコードＫＶペアに、以前に付加されていた索引更新メッセージが反映済であるためとする。
【０１２５】
そして、今回の削除処理に伴い、「２０１４−０１−０１」を索引キーとする索引ＫＶペアのキーリストから、このレコードＫＶペアのキー「受注１」を削除する必要がある。そこで、レコード更新部２２は、メッセージ生成部２３を用いて、図１０の３行目「索引更新メッセージ」に示す索引更新メッセージ「Ｒｅｍｏｖｅ  受注１  ｆｒｏｍ  ２０１４−０１−０１」を生成する（ステップＡ２２）
次に、レコード更新部２２は、このレコードＫＶペアを削除することを表すレコードＫＶペアとして、キー「受注１」および空の値を含む（受注１，）を生成する（ステップＡ２３）。
【０１２６】
次に、レコード更新部２２は、ステップＡ２３で生成したレコードＫＶペアに、ステップＡ２２で生成した索引更新メッセージを追加して（ステップＡ１５）、分散ＫＶＳ５０に格納する処理を実行する（ステップＡ１６）。
【０１２７】
その結果、レコード更新部２２により実行される処理は、図１０の３行目「実行される処理」に示す通りとなる。
【０１２８】
以上で、レコード処理動作の具体例の説明を終了する。
【０１２９】
次に、情報処理システム２の索引データ更新動作を図１１に示す。
【０１３０】
図１１では、まず、メッセージ抽出部２４１は、分散ＫＶＳ５０に格納されたレコードから、索引更新メッセージを抽出する（ステップＢ１１）。
【０１３１】
例えば、前述のように、メッセージ抽出部２４１は、分散ＫＶＳ５０に含まれる各サーバ５００のレコード記憶部５０１に格納された全レコードを確認（全件スキャン）することにより、含まれる索引更新メッセージを抽出してもよい。
【０１３２】
次に、索引データ更新部２４は、ステップＢ１１で抽出された各索引更新メッセージについて、以下のステップＢ１２〜Ｂ１９を実行する。
【０１３３】
ここで、この索引更新メッセージが、索引ＫＶペアへのキーの追加である場合（ステップＢ１２で「追加」）について説明する。
【０１３４】
この場合、索引データ更新部２４は、該当する索引キーを持つ索引ＫＶペアが分散ＫＶＳ５０に格納されているか否かを判断する（ステップＢ１３）。具体的には、索引データ更新部２４は、そのような索引ＫＶペアについて、分散ＫＶＳ５０からの取得を試みればよい。
【０１３５】
ここで、該当する索引キーを持つＫＶペアがまだ無い場合（ステップＢ１３でＮｏ）、索引ＫＶペアを新規作成する必要がある。この場合、索引データ更新部２４は、索引更新メッセージに基づき索引ＫＶペアを生成し（ステップＢ１４）、分散ＫＶＳ５０に格納する（ステップＢ１５）。
【０１３６】
一方、該当する索引キーを持つＫＶペアが既にある場合（ステップＢ１３でＹｅｓ）、索引データ更新部２４は、その索引ＫＶペアを取得する（ステップＢ１６）。
【０１３７】
そして、索引データ更新部２４は、その索引ＫＶペアの値であるキーリストに、該当するキーを追加して（ステップＢ１７）、分散ＫＶＳ５０に格納する（ステップＢ１５）。
【０１３８】
また、この索引更新メッセージが、索引ＫＶペアからのキーの削除である場合（ステップＢ１２で「削除」）について説明する。
【０１３９】
この場合、索引データ更新部２４は、該当する索引キーを持つ索引ＫＶペアを分散ＫＶＳ５０から取得する（ステップＢ１８）。
【０１４０】
次に、索引データ更新部２４は、ステップＢ１８で得られた索引ＫＶペアの値であるキーリストから、該当するキーを削除して（ステップＢ１９）、分散ＫＶＳ５０に格納する（ステップＢ１５）。
【０１４１】
各索引更新メッセージについて上述の処理を完了すると、情報処理システム２は、索引データ更新動作を終了する。
【０１４２】
次に、索引データ更新動作の具体例を図１２および図１３を用いて説明する。
【０１４３】
図１２に示すように、この具体例では、分散ＫＶＳ５０は、４つのサーバ５００（５００ａ、５００ｂ、５００ｃ、および、５００ｄ）から構成される。また、サーバ５００ｂおよび５００ｃには、反映前の索引更新メッセージを含むレコードＫＶペアが格納されている。また、図１２の状態では、分散ＫＶＳ５０には、いずれの索引ＫＶペアもまだ格納されていないものとする。
【０１４４】
このとき、メッセージ抽出部２４１は、４つのサーバ５００をスキャンし、サーバ５００ｂおよび５００ｃから索引更新メッセージを抽出する（ステップＢ１１）。
【０１４５】
まず、サーバ５００ｂから抽出される索引更新メッセージ「Ａｄｄ  受注１  ｔｏ  ２０１４−０１−０１」について説明する。
【０１４６】
この場合、この索引更新メッセージは「追加」である（ステップＢ１２で「追加」）。そこで、索引データ更新部２４は、索引更新メッセージ中の宛先ＫＶペアのキー「２０１４−０１−０１」をもとに、更新対象の索引ＫＶペアの取得を試みる。しかしながら、索引ＫＶペアはまだ格納されておらず、取得されない（ステップＢ１３でＮｏ）。
【０１４７】
そこで、索引データ更新部２４は、新規に索引ＫＶペア「２０１４−０１−０１→［受注１］」を作成し、分散ＫＶＳ５０に格納する（ステップＢ１４、Ｂ１５）。このように、新規作成される索引ペアの索引キーには、索引更新メッセージの宛先ＫＶペアの示す値「２０１４−０１−０１」が適用される。また、キーリストには、索引更新メッセージに含まれる追加のキー「受注１」が適用される。なお、［キー１，キー２，・・・］は、索引ＫＶペアの値（キーリスト）を表す。
【０１４８】
なお、このとき、索引データ更新部２４は、反映が完了したこの索引更新メッセージを、この索引更新メッセージを含んでいたサーバ５００ｂのレコードＫＶペアから削除してもよい。
【０１４９】
次に、サーバ５００ｃから抽出される索引更新メッセージ「Ａｄｄ  受注２  ｔｏ  ２０１４−０１−０１」について説明する。
【０１５０】
この場合も、この索引更新メッセージは「追加」である（ステップＢ１２で「追加」）。そこで、索引データ更新部２４は、索引更新メッセージ中の宛先ＫＶペアのキー「２０１４−０１−０１」をもとに、更新対象の索引ＫＶペアの取得を試みる。ここでは、「２０１４−０１−０１」を索引キーとする索引ＫＶペア「２０１４−０１−０１→［受注１］」が既に格納されているので、取得は成功する（ステップＢ１３でＹｅｓ、ステップＢ１６）。
【０１５１】
次に、索引データ更新部２４は、取得した索引ＫＶペアの値であるキーリスト［受注１］に、索引更新メッセージに含まれる追加のキー「受注２」を追加して［受注１，受注２］とする。そして、索引データ更新部２４は、索引ＫＶペア「２０１４−０１−０１→［受注１，受注２］」を、分散ＫＶＳ５０に格納する（ステップＢ１７、Ｂ１５）。
【０１５２】
なお、このとき、索引データ更新部２４は、反映が完了したこの索引更新メッセージを、この索引更新メッセージを含んでいたサーバ５００ｃのレコードＫＶペアから削除してもよい。
【０１５３】
また、上述の「２０１４−０１−０１」をキーとする索引ＫＶペアがサーバ５００ａに格納されたとする。すると、これらの索引更新メッセージ反映後の分散ＫＶＳ５０に格納されるＫＶペアは、図１３に示す通りとなる。
【０１５４】
なお、本実施の形態において、情報処理装置２０は、複数の索引データ更新部２４を含んでもよい。この場合、複数の索引データ更新部２４は、並列に動作してもよい。また、この場合、複数の索引データ更新部２４は、ＣＡＳ機能によりＫＶペア更新の排他制御を行えばよい。例えば、上記の具体例において、サーバ５００ｂの索引更新メッセージを処理する索引データ更新部２４＿１と、サーバ５００ｃの索引更新メッセージを処理する索引データ更新部２４＿２とが並列して動作したとする。そして、どちらの索引データ更新部２４も、分散ＫＶＳ５０には、索引キー「２０１４−０１−０１」を持つ索引ＫＶペアがないと判断したとする（ステップＢ１３でＮｏ）。そして、索引データ更新部２４＿１が、後続のステップＢ１４、Ｂ１５の処理（この索引ＫＶペアを新規生成してＰＵＴする処理）を索引データ更新部２４＿２よりも先に完了したことを想定する。この場合、索引データ更新部２４＿２の後続のステップＢ１４、Ｂ１５の処理は、失敗することになる。これは、ＣＡＳ機能により、既に同じバージョンのＫＶペアが存在しているためである。このようにして、競合の発生により更新処理が失敗した場合、索引データ更新部２４＿２は、図１１のステップＢ１２からの動作を再度実行すればよい。
【０１５５】
以上で、索引データ更新動作の具体例の説明を終了する。
【０１５６】
次に、本発明の第２の実施の形態の効果について述べる。
【０１５７】
＜結果整合性・データ永続性の担保＞
本発明の第２の実施の形態としての情報処理システムは、分散ＫＶＳにおけるレコードＫＶペアおよび索引ＫＶペア間の結果整合性・データ永続性をより十分にサポートすることができる。
【０１５８】
その理由は、本発明の第１の実施の形態と同様の構成に加えて、レコードに関して要求される処理が、分散ＫＶＳに既に格納されているレコードに対する処理であるとき、レコード更新部が、次のように動作するよう構成されるからである。すなわち、レコード更新部は、分散ＫＶＳからレコードを取得し、取得したレコードに既に付加されている他の索引更新メッセージに加えて、今回の処理に応じた索引更新メッセージを付加するからである。
【０１５９】
具体的には、レコードに関して要求される処理が、レコードの新規作成処理であるとき、メッセージ生成部は、索引キーを含む索引データのキーリストに、新規作成対象のレコードのキーを追加する索引更新メッセージを生成する。そして、レコード更新部が、新規作成したレコードに、索引更新メッセージを加えて、分散ＫＶＳに格納するからである。
【０１６０】
また、レコードに関して要求される処理が、分散ＫＶＳに既に格納されているレコードの削除処理であるとき、メッセージ生成部は、索引キーを含む索引データのキーリストから削除対象のレコードのキーを削除する索引更新メッセージを生成する。そして、レコード更新部が、削除対象のレコードを削除することを表すレコードに、既に付加されていた他の索引更新メッセージと、今回生成した索引更新メッセージとを加えて、分散ＫＶＳに格納するからである。
【０１６１】
また、レコードに関して要求される処理が、分散ＫＶＳに既に格納されているレコードの更新処理であるとき、メッセージ生成部は、次の２つの索引更新メッセージを生成する。1つ目の索引更新メッセージは、索引作成対象の更新前の値を索引キーとして含む索引データのキーリストから、更新対象のレコードのキーを削除する指示を表す。また、２つ目の索引更新メッセージは、更新後の値を索引キーとして含む索引データのキーリストに、更新対象のレコードのキーを追加する指示を表す。そして、レコード更新部が、更新したレコードに、既に付加されていた他の索引更新メッセージと、今回生成した２つの索引更新メッセージとを加えて、分散ＫＶＳに格納するからである。
【０１６２】
このように、本実施の形態は、あるレコードＫＶペアについて、新規作成・更新・削除等の処理と非同期に行う索引データの更新指示を、該当するレコードＫＶペアに既に含まれている更新指示に追記して含めていく。これにより、レコードＫＶペアの更新から、索引ＫＶペアの更新完了までに障害が発生した場合でも、レコードおよび索引の結果整合性を保持することができる。つまり、本実施の形態は、索引データの耐障害性を高めている。そして、本実施の形態は、整合性の担保により、結果的に、データ永続性も担保することができる。
【０１６３】
また、本実施の形態は、レコードＫＶペアに付加されている索引更新メッセージのうち、どの索引更新メッセージが反映済みであるかを記憶しなくても、索引ＫＶペアの更新についての耐障害性を有し、レコードおよび索引の結果整合性を保持することができる。
【０１６４】
その理由について説明する。あるレコードについて付加されている索引更新メッセージを実行中に障害が起きたとする。障害復旧後、索引データ更新部は、既に反映済の索引更新メッセージがどれであるかを判断することは難しい。しかしながら、このような場合、索引データ更新部は、レコードに付加されている索引更新メッセージを全て反映すればよい。このために、再実行されることになる索引更新メッセージがあったとしてもよい。なぜなら、本実施の形態において、各レコードＫＶペアに付加される索引更新メッセージは、冪等性を持つためである。
【０１６５】
例えば、あるレコードＫＶペアに、次の３つの索引更新メッセージが付加されていたとする。
ａ）Ａｄｄ  受注１  ｔｏ  ２０１４−０１−０１
ｂ）Ｒｅｍｏｖｅ  受注１  ｆｒｏｍ  ２０１４−０１−０１
ｃ）Ａｄｄ  受注１  ｔｏ  ２０１４−０１−０１
このとき、索引データ更新部により、下記（１）〜（３）のようにａ）から順にｃ）まで実行された時点で、障害が発生したとする。
（１）ａ）を実行：Ａｄｄ  受注１  ｔｏ  ２０１４−０１−０１
（２）ｂ）を実行：Ｒｅｍｏｖｅ  受注１  ｆｒｏｍ  ２０１４−０１−０１
（３）ｃ）を実行：Ａｄｄ  受注１  ｔｏ  ２０１４−０１−０１
そして、障害復旧後、このレコードＫＶペアに依然として索引更新メッセージａ）〜ｃ）が付加されたままであるため、索引データ更新部が、下記（４）〜（６）のように再度ａ）から順にｃ）まで実行したとする。
（４）ａ）を実行：Ａｄｄ  受注１  ｔｏ  ２０１４−０１−０１
（５）ｂ）を実行：Ｒｅｍｏｖｅ  受注１  ｆｒｏｍ  ２０１４−０１−０１
（６）ｃ）を実行：Ａｄｄ  受注１  ｔｏ  ２０１４−０１−０１
ここで、上記（３）および（４）の索引更新メッセージでは、同一の宛先ＫＶペアに対して、同一の値を追加（Ａｄｄ）する指示が記載されている。しかしながら、（３）の次に（４）が実行されたとしても、既に登録されている値を同じ値で上書きしようとするだけであるため、問題は発生しない。同様に、もし、ｂ）のようなＲｅｍｏｖｅを含む同一の索引更新メッセージが２度以上続けて実行されたとしても、既に削除済みの値を削除しようとするだけであるため、問題は発生しない。つまり、本実施の形態では、索引更新メッセージは、「Ａｄｄされた索引をＲｅｍｏｖｅした後に索引更新のＡｄｄを実行する」という順に実行される。したがって、本実施の形態は、障害発生後、反映されていない可能性のあるＲｅｍｏｖｅメッセージをすべて再反映するため、不整合が発生している索引ＫＶペアのキーリストから、不整合が発生しているキーをすべて削除することになる。そして、そのようなＲｅｍｏｖｅメッセージの後にＡｄｄメッセージを実行することで、本実施の形態は、レコードＫＶペアと整合性のとれた最新の索引更新メッセージを実行可能となる。
【０１６６】
このように、本実施の形態は、任意のタイミングで障害が発生しても、レコードＫＶペアおよび索引ＫＶペアの結果整合性・データ永続性を確実に担保することができる。
【０１６７】
＜スケールアウトによる性能改善＞
さらに、本実施の形態は、分散ＫＶＳに対する検索処理時および更新処理時のスケールアウトを可能とする。
【０１６８】
その理由について述べる。本実施の形態は、レコードＫＶペアと索引ＫＶペアとの結果整合性を満たしながら、索引ＫＶペアを分散ストレージシステムに分散配置することを可能としている。これに対して、索引ＫＶペアが分散配置されず、各サーバが、自装置に格納されるデータに対する索引データを保持している場合を考える。この場合、索引を使用した検索要求があると、全てのサーバが、自身の保持する索引を使用してデータ検索を行う必要がある。そのため、検索処理が多い場合、サーバの追加を行っても処理がスケールアウトしないという問題がある。本実施の形態では、索引ＫＶペアを分散配置するため、索引を使用した検索実行時には、索引ＫＶペアを保持するサーバおよびレコードＫＶペアを保持するサーバが処理を行えばよい。このため、本実施の形態を用いれば、分散ＫＶＳに対する検索処理の負荷が高くなった場合には、サーバを追加することで、スケールアウトによる性能改善が可能となる。
【０１６９】
同様に、レコードＫＶペアの更新についても、本実施の形態は、スケールアウトによる性能改善を可能とする。ここで、分散ＫＶＳは、適切なデータ粒度のＫＶペアを更新・参照することで処理のスケールアウトが可能となっている。本発明の方法においても、データの更新・参照の粒度はＫＶペアである。したがって、本実施の形態は、レコードＫＶペアの更新・参照について、分散ＫＶＳと同等のスケールアウト特性を持つことになる。
【０１７０】
また、仮に、各サーバが自装置に格納されるレコードに関して索引データを保持する場合を考える。この場合、サーバの追加のたびに、レコードの再配置に加えて、索引の再構築処理が必要となってしまう。これに対して、本実施の形態は、索引データを分散配置するため、サーバ追加の際に、索引データの再構築を必要とせず、レコードＫＶペアおよび索引ＫＶペアの再配置を行えばよい。
【０１７１】
＜データ更新の制御に関する処理の効率化＞
さらに、本実施の形態は、データ更新の制御に関する処理を効率化する。
【０１７２】
その理由は、本実施の形態は、データ更新の際に、複数のＫＶペアを同一トランザクションで更新することがない。複数のＫＶペアを同一トランザクションで実行すると、制御が複雑になることから処理の遅延（ＴＡＴ：Turn Around Time）が発生する。しかしながら、本実施の形態は、レコードＫＶペアの処理時も、それに伴う索引ＫＶペアの処理時も、それぞれ、更新対象となるＫＶペアは１つである。したがって、本実施の形態は、トランザクション制御に伴う処理の遅延を少なくすることができる。
【０１７３】
なお、本実施の形態において、索引データ更新部は、キーリストが空になった索引ＫＶペアを、分散ＫＶＳから削除してもよい。また、索引更新メッセージを削除することにより値が空になったレコードＫＶペアを、分散ＫＶＳから削除してもよい。
【０１７４】
また、本実施の形態は、索引更新メッセージを、レコードＫＶペアの値に含めている。したがって、本実施の形態は、索引更新メッセージを含むレコードＫＶペアを通常のＫＶペアであるとみなせば、特許文献１に記載された複数のＫＶペア群をアトミックに更新する技術と組み合わせて実施することも可能である。
【０１７５】
また、本実施の形態は、索引ＫＶペアが肥大化した場合に、「特願２０１３−２０３７９０号公報」に記載の技術を用いて、各索引ＫＶペアを複数のＫＶペアに分割してもよい。そして、この場合、分割された各索引ＫＶペアを、分散ＫＶＳ上に分散配置すればよい。
【０１７６】
（第３の実施の形態）
次に、本発明の第３の実施の形態について図面を参照して詳細に説明する。本実施の形態では、本発明の第２の実施の形態と同様に、本発明の分散ストレージシステムとして、分散ＫＶＳを適用した例について説明する。
【０１７７】
まず、本発明の第３の実施の形態としての情報処理システム３の構成を図１４に示す。図１４において、情報処理システム３は、情報処理装置３０と、分散ＫＶＳ６０とを含む。情報処理装置３０は、分散ＫＶＳ６０と通信可能に接続される。また、情報処理装置３０は、本発明の第２の実施の形態としての情報処理装置２０に対して、索引データ更新部２４に替えて索引データ更新部３４を備え、さらに、メッセージ記憶部３６と、メッセージマージ部３７とを備える点が異なる。なお、メッセージ記憶部３６は、本発明のメッセージマージ部の一部の一実施形態を構成する。分散ＫＶＳ６０は、複数のサーバ６００によって構成される。各サーバ６００は、本発明の第２の実施の形態としてのサーバ５００と同一のレコード記憶部５０１に加えて、メッセージ抽出部６０２を有する。
【０１７８】
ここで、情報処理システム３の各装置および各機能ブロックは、図２を用いて説明した本発明の第１の実施の形態の各装置および各機能ブロックと同一のハードウェア要素によって構成可能である。なお、情報処理システム３の各装置および各機能ブロックのハードウェア構成は、上述の構成に限定されない。
【０１７９】
分散ＫＶＳ６０は、本発明の第２の実施の形態における分散ＫＶＳ５０と同様に、キーおよび値からなるＫＶペアを、複数のサーバ６００のレコード記憶部５０１に分散して格納する。
【０１８０】
各サーバ６００のメッセージ抽出部６０２は、自装置に格納されるレコードＫＶペアから、索引更新メッセージを抽出する。そして、メッセージ抽出部６０２は、抽出した索引更新メッセージを、情報処理装置３０のメッセージ記憶部３６に送信する。
【０１８１】
具体的には、メッセージ抽出部６０２は、所定のタイミングで、自装置に格納されるレコードＫＶペアから索引更新メッセージを抽出する。所定のタイミングとは、例えば、所定間隔毎であってもよい。また、所定のタイミングとは、自装置に対してレコードＫＶペアが格納されるタイミングであってもよい。
【０１８２】
例えば、所定間隔毎に、メッセージ抽出部６０２が動作する場合について説明する。この場合、メッセージ抽出部６０２は、自装置のレコード記憶部５０１に既に格納されているレコードＫＶペアのうち、まだ索引更新メッセージの抽出が済んでいないレコードＫＶペア（未抽出のレコードＫＶペア）から、索引更新メッセージを抽出する。例えば、メッセージ抽出部６０２は、自装置のトランザクションログを参照することにより、ある時点（例えば、前回抽出を行った時点）以降に自装置に格納（ＰＵＴ）された未抽出のレコードＫＶペアを特定可能である。あるいは、メッセージ抽出部６０２は、自装置に対するレコードＫＶペアの格納（ＰＵＴ）時刻に関するローカルな索引を有することにより、ある時点以降に自装置に格納（ＰＵＴ）された未抽出のレコードＫＶペアを特定可能である。メッセージ抽出部６０２は、このようにして特定した未抽出のレコードＫＶペアから、索引更新メッセージを抽出すればよい。この場合、メッセージ抽出部６０２は、索引更新メッセージを抽出後のレコードＫＶペアから、索引更新メッセージを除いたレコードＫＶペアを再構築して、レコード記憶部５０１に格納してもよい。
【０１８３】
あるいは、自装置に対してレコードＫＶペアが格納されるタイミングで、メッセージ抽出部６０２が動作する場合について説明する。この場合、メッセージ抽出部６０２は、自装置にレコードＫＶペアが格納（ＰＵＴ）されるタイミングで、そのレコードＫＶペアから索引更新メッセージを抽出してもよい。この場合、メッセージ抽出部６０２は、格納対象のレコードＫＶペアから索引更新メッセージを抽出後、索引更新メッセージを除いたレコードＫＶペアを再構築してレコード記憶部５０１に格納するようにしてもよい。この場合、レコード記憶部５０１に格納されるレコードＫＶペアは、全て索引更新メッセージが抽出され除かれた後のものとなる。したがって、この場合、レコード参照部２５からの参照要求により分散ＫＶＳ６０から応答するレコードＫＶペアに、索引更新メッセージが含まれることがなくなる。その結果、情報処理装置３０および分散ＫＶＳ６０間のネットワーク負荷が軽減される。
【０１８４】
情報処理装置３０のメッセージ記憶部３６は、分散ＫＶＳ６０の各サーバ６００から送信される索引更新メッセージを記憶する。なお、メッセージ記憶部３６は、同一のレコードＫＶペアに付加されていた索引更新メッセージについては、付加された順序を保持して記憶するものとする。また、メッセージ記憶部３６は、抽出された索引更新メッセージを、該索引更新メッセージが付加されていたレコードＫＶペアを特定する情報（キー等）と共に記憶してもよい。
【０１８５】
メッセージマージ部３７は、メッセージ記憶部３６に記憶されている索引更新メッセージをマージする。マージとは、複数の索引更新メッセージを、より少ない数の索引更新メッセージに簡略化することをいうものとする。メッセージマージ部３７は、マージ後の索引更新メッセージが、マージ前の索引更新メッセージと同等の結果をもたらすようマージを行う。
【０１８６】
例えば、メッセージマージ部３７は、１つのレコードＫＶペアに付加されていた複数の索引更新メッセージをマージしてもよい。また、メッセージマージ部３７は、複数のレコードにそれぞれ付加されていた索引更新メッセージをマージしてもよい。具体的には、メッセージマージ部３７は、複数のレコードＫＶペアにそれぞれ付加されていた索引更新メッセージのうち、同一の索引ＫＶペアに関する索引更新メッセージをマージしてもよい。ここで、メッセージ記憶部３６には、複数のレコードＫＶペアから抽出された索引更新メッセージが記憶されている。そこで、メッセージマージ部３７は、メッセージ記憶部３６に記憶された索引更新メッセージのうち、同一の索引ＫＶペアに関する索引更新メッセージを抽出し、そのうち、マージ可能なものをマージすればよい。
【０１８７】
例えば、メッセージマージ部３７は、以下のようなマージルールにしたがって、索引更新メッセージをマージする。
【０１８８】
＜１つのレコードＫＶペアに含まれる複数の索引更新メッセージのマージルール＞
同一のレコードＫＶペアに含まれる複数の索引更新メッセージのマージルールを、図１５に示す。図１５において、各行は、それぞれマージルールを表す。また、「．．．１」、「．．．２」、および、「．．．３」は、その位置に、０個以上の索引更新メッセージが配置されていることを表す。
【０１８９】
ここで、索引更新メッセージには、以下の種類がある。
・登録メッセージ：ある索引ＫＶペアに、あるレコードのキーを追加（Ａｄｄ）する索引更新メッセージ
・削除メッセージ：ある索引ＫＶペアから、あるレコードのキーを削除（Ｄｅｌｅｔｅ）する索引更新メッセージ
図１５において、１行目のマージルールは、同一の索引ＫＶペアに対する同一キーの登録メッセージが複数回出現する場合に、それらを１つの登録メッセージにマージするルールを表している。これは、ある索引ＫＶペアに対して、同一キーの登録メッセージを何度反映しても、そのキーが１つ登録された状態にしかならないからである。
【０１９０】
また、２行目のマージルールは、同一の索引ＫＶペアに対する同一キーの削除メッセージが複数回出現する場合に、それらを１つの削除メッセージにマージするルールを表している。これは、ある索引ＫＶペアに対して、同一キーの削除メッセージを何度反映しても、そのキーが削除された状態にしかならないからである。
【０１９１】
また、３行目のマージルールは、同一の索引ＫＶペアに対する同一キーの登録メッセージおよび削除メッセージがこの順に出現する場合、その両方の索引更新メッセージを省略するルールを表す。すなわち、このマージルールは、「一度登録した索引データを取り下げる」という処理を、「そもそも何の処理もなかった」という処理に置き換えるルールを表している。
【０１９２】
また、４行目のマージルールは、同一の索引ＫＶペアに対する同一キーの削除メッセージおよび登録メッセージがこの順に出現する場合、１つの登録メッセージにマージするルールを表す。
【０１９３】
これらのマージルールからわかるように、同一の索引ＫＶペアに対する同一キーについての索引更新メッセージの反映では、それらの出現回数や出現順序に関わらず、最終的には、そのキーが「登録」された状態または「削除」された状態にしかならない。そして、その状態は、そのような索引更新メッセージのうち最後に実行された索引更新メッセージにより作り出されるものである。したがって、これらの１〜４行目のマージルールは、同一の索引ＫＶペアに対して同一キーについて複数回出現する登録メッセージおよび削除メッセージを、そのうち最後に出現した索引更新メッセージ１つに簡略化すればよいことを表している。
【０１９４】
＜複数のレコードＫＶペアに含まれる索引更新メッセージのマージルール＞
また、複数のレコードＫＶペアにそれぞれ付加されていた索引更新メッセージのマージルールを、図１６に示す。図１６において、各行は、それぞれマージルールを表す。また、「．．．１」、「．．．２」、および、「．．．３」は、その位置に、０個以上の索引更新メッセージが配置されていることを表す。図１６において、1、２行目の各マージルールは、同一の索引ＫＶペアに対する異なるキーに関する複数の登録メッセージを、１度に複数のキーを登録する１つの登録メッセージにマージすることを表している。また、３、４行目の各マージルールは、同一の索引ＫＶペアに対する異なるキーに関する複数の削除メッセージを、１度に複数のキーを削除する１つの削除メッセージにマージすることを表している。
【０１９５】
索引データ更新部３４は、メッセージマージ部３７によりマージされた索引更新メッセージを実行する。これにより、索引データ更新部３４は、マージされた索引更新メッセージが反映された索引データを、分散ＫＶＳ６０に格納する。
【０１９６】
以上のように構成された情報処理システム３の動作について図面を参照して説明する。なお、情報処理システム３のレコード参照動作およびレコード処理動作については、図７および図８を用いて説明した本発明の第２の実施の形態と同様であるため、本実施の形態における説明を省略する。
【０１９７】
まず、情報処理システム３のメッセージ抽出動作を、図１７に示す。
【０１９８】
図１７では、まず、サーバ６００において、メッセージ抽出部６０２は、自装置に格納されるレコードＫＶペアのうち、まだメッセージ抽出処理が完了していない未抽出のレコードＫＶペアから、索引更新メッセージを抽出する（ステップＢ３１）。
【０１９９】
次に、メッセージ抽出部６０２は、抽出した索引更新メッセージを、情報処理装置３０のメッセージ記憶部３６に送信する（ステップＢ３２）。これにより、情報処理装置３０のメッセージ記憶部３６には、各サーバ６００から抽出された索引更新メッセージが記憶される。
【０２００】
以上の動作を、各サーバ６００のメッセージ抽出部６０２は、所定のタイミングで実行する。例えば、前述のように、各メッセージ抽出部６０２は、所定間隔毎に、または、自装置にレコードＫＶペアが格納されるタイミング等で、上述の動作を行ってもよい。また、前述のように、各メッセージ抽出部６０２は、索引更新メッセージ抽出後、抽出した索引更新メッセージを除いたレコードＫＶペアを再構築して、分散ＫＶＳ６０に格納してもよい。
【０２０１】
次に、情報処理システム３の索引データ更新動作を、図１８に示す。
【０２０２】
図１８では、まず、メッセージマージ部３７は、メッセージ記憶部３６に記憶されている索引更新メッセージをマージする（ステップＢ４１）。
【０２０３】
例えば、メッセージマージ部３７は、同一のレコードＫＶペアから抽出された複数の索引更新メッセージを、図１５に示したマージルールを用いてマージする。この場合、同一の索引ＫＶペアに対して冪等性を有する複数回の索引更新メッセージが簡略化される。また、例えば、メッセージマージ部３７は、複数のレコードＫＶペアから抽出された索引更新メッセージを、図１６に示したマージルールを用いてマージする。この場合、同一の索引ＫＶペアに対する異なるキーに関する複数の索引更新メッセージが、複数キーについて1度に更新を行う１つの索引更新メッセージにマージされる。
【０２０４】
次に、索引データ更新部３４は、ステップＢ４１でマージされた索引更新メッセージを実行する（ステップＢ４２）。なお、このステップにおいて、索引データ更新部３４は、マージ後の各索引更新メッセージについて、図１１を参照して説明した本発明の第２の実施の形態におけるＢ１２〜Ｂ１９と同様に動作すればよい。
【０２０５】
以上で、情報処理システム３は、索引データ更新動作を終了する。
【０２０６】
なお、このような索引データ更新動作を、情報処理装置３０は、定められたタイミング毎に実行する。例えば、情報処理装置３０は、メッセージ記憶部３６に新たに索引更新メッセージが追加される度に、ステップＢ４１からの動作を開始してもよい。あるいは、情報処理装置３０は、所定間隔毎に、ステップＢ４１からの動作を開始してもよい。また、メッセージマージ部３７は、ステップＢ４１を実行後、マージ前の索引更新メッセージをメッセージ記憶部３６から削除してもよい。そして、メッセージマージ部３７は、マージ後の索引更新メッセージをメッセージ記憶部３６に記憶しておけばよい。また、索引データ更新部３４は、メッセージマージ部３７の動作と異なるタイミングで、メッセージ記憶部３６に記憶されたマージ後の索引更新メッセージについて、ステップＢ４２の動作を実行してもよい。また、索引データ更新部３４は、反映済の索引更新メッセージを、メッセージ記憶部３６から削除してもよい。
【０２０７】
以上の動作を、具体例を用いて、本発明の第２の実施の形態と比較しながら説明する。
【０２０８】
例えば、メッセージ記憶部３６に、以下の２つの索引更新メッセージＡおよびＢが記憶されていたとする。
Ａ）＆Ａｄｄ  受注１  ｔｏ  ２０１４−０１−０１
Ｂ）＆Ａｄｄ  受注２  ｔｏ  ２０１４−０１−０１
なお、索引更新メッセージＡは、「受注１」をキーとするレコードＫＶペアに付加されていたものである。また、索引更新メッセージＢは、「受注２」をキーとするレコードＫＶペアに付加されていたものである。
【０２０９】
このとき、本発明の第２の実施の形態では、索引データ更新部２４は、１つの索引ＫＶペアに対して、以下４回のデータ操作（ＧＥＴ／ＰＵＴ２回ずつ）を実行していた。
ＧＥＴ（２０１４−０１−０１）→［  ］
ＰＵＴ（２０１４−０１−０１，［受注１］）
ＧＥＴ（２０１４−０１−０１）→［受注１］
ＰＵＴ（２０１４−０１−０１，［受注１，受注２］）
なお、［キー１，キー２，・・・］は、索引ＫＶペアの値（キーリスト）を表す。
【０２１０】
これに対して、本実施の形態では、メッセージマージ部３７が、上述の２つの索引更新メッセージＡおよびＢを、以下の１つの索引更新メッセージＣにマージする。つまり、同一の宛先ＫＶペアに対する複数の索引更新メッセージが、１つの索引更新メッセージにマージされる。
Ｃ）＆Ａｄｄ  受注１，受注２  ｔｏ  ２０１４−０１−０１
すると、本実施の形態では、索引データ更新部３４は、１つの索引ＫＶペアに対して、以下の２回のデータ操作（ＧＥＴ／ＰＵＴ１回ずつ）を実行すればよい。
ＧＥＴ（２０１４−０１−０１）→［  ］
ＰＵＴ（２０１４−０１−０１，［受注１，受注２］）
このように、メッセージマージ部３７を設けることにより、本実施の形態は、索引ＫＶペアに対するデータ操作回数を削減する。
【０２１１】
次に、本発明の第３の実施の形態の効果について述べる。
【０２１２】
本発明の第３の実施の形態としての情報処理システムは、分散ＫＶＳにおけるレコードＫＶペアおよび索引ＫＶペア間の結果整合性をより十分にサポートしながら、索引データ更新の負荷をより軽減することができる。
【０２１３】
その理由は、本発明の第２の実施の形態と同様の構成に加えて、情報処理装置のメッセージマージ部が、メッセージ記憶部に記憶された索引更新メッセージをマージし、索引データ更新部が、マージされた索引更新メッセージを実行するからである。
【０２１４】
ここで、レコードおよび索引について結果整合性を保持する場合、索引ＫＶペアの更新において、多少の遅延は許容される。そこで、索引データ更新部は、レコード更新の度に索引更新メッセージを実行せずに、非同期に（例えば、レコード更新からある程度の間隔をあけて）、複数の索引更新メッセージを実行する。このとき、本実施の形態は、複数の索引更新メッセージのうちマージ可能なものをマージしてから実行することで、索引ＫＶペアのデータ操作回数を削減し、索引更新の負荷を削減することができる。
【０２１５】
また、他の理由は、分散ＫＶＳの各サーバに配置されたメッセージ抽出部が、レコードＫＶペアに付加された索引更新メッセージを抽出して情報処理装置のメッセージ記憶部に記憶するからである。
【０２１６】
このように、各サーバにメッセージ抽出部を配置することにより、本実施の形態は、索引更新メッセージの抽出の際に、未抽出のレコードＫＶペアを、本発明の第２の実施の形態のように全件スキャンにより特定する必要がない。本実施の形態では、各サーバに配置されたメッセージ抽出部が、自装置に格納されるレコードＫＶペアから索引更新メッセージを抽出すればよい。そのため、本実施の形態は、索引更新メッセージの抽出のために全件スキャンを行う必要がなく、索引データ更新処理を効率化できる。
【０２１７】
ただし、もし、分散ＫＶＳ自体の機能として、メッセージ抽出対象となる未抽出のレコードＫＶペアを特定する効率的な処理を実現する機能が存在する場合、メッセージ抽出部を、各サーバに配置しなくてもよい。そのような分散ＫＶＳの機能とは、例えば、ある時点以降に更新されたレコードＫＶペアのみを抽出する機能であってもよい。その場合、本実施の形態は、そのような機能により実現したメッセージ抽出部を、情報処理装置に配置しても実施可能である。
【０２１８】
なお、上述した本発明の各実施の形態は、複数のメッセージ抽出部、複数のメッセージ記憶部、複数のメッセージマージ部、または、複数の索引データ更新部を備えるように構成してもよい。この場合、複数の各機能ブロックは、分散ＫＶＳで扱われる索引データの件数や、分散ＫＶＳを構成するサーバ台数等に応じて、複数のコンピュータ装置にそれぞれ分散させてもよい。
【０２１９】
また、上述した本発明の各実施の形態において、メッセージ抽出部は、索引更新メッセージが抽出されていないレコードＫＶペア一覧（未抽出一覧）を参照するように構成してもよい。この場合、レコード更新部が、レコードＫＶペアの格納処理に伴って未抽出一覧を更新するよう構成してもよい。また、レコード更新部が、分散ＫＶＳで使用されているトランザクションログ、そのタイムスタンプ、または、ＭＶＣＣ（MultiVersion Concurrency Control）のバージョン等から未抽出一覧を作成・更新してもよい。
【０２２０】
また、上述した本発明の各実施の形態において、本発明の分散ストレージシステムに分散ＫＶＳを適用した例を中心に説明した。この他、各実施の形態における分散ストレージシステムは、１つのデータに対する１つのデータ操作について原子性を保証するシステムであれば、分散ＫＶＳに限らず、他のシステムであってもよい。
【０２２１】
また、上述した本発明の各実施の形態において、１つのレコードに対して１つの索引を作成する例を中心に説明した。この他、各実施の形態は、１つのレコードに対して複数の索引を作成する場合にも適用可能である。その場合、レコード更新部は、１つのレコードに、複数の索引データのそれぞれに関する索引更新メッセージを付加すればよい。
【０２２２】
また、上述した本発明の各実施の形態において、索引データが、ハッシュインデックスを表す例を中心に説明したが、その他のインデックスを表す情報であってもよい。例えば、索引データは、Ｂツリーインデックスを表す情報であってもよい。
【０２２３】
また、上述した本発明の各実施の形態において、情報処理システムを構成する各装置の各機能ブロックが、記憶装置またはＲＯＭに記憶されたコンピュータ・プログラムを実行するＣＰＵによって実現される例を中心に説明した。この他、各機能ブロックの一部、全部、または、それらの組み合わせが専用のハードウェアにより実現されていてもよい。
【０２２４】
また、上述した本発明の各実施の形態において、情報処理装置の機能ブロックは、複数の装置に分散されて実現されてもよい。
【０２２５】
また、上述した本発明の各実施の形態において、各フローチャートを参照して説明した情報処理装置の動作を、本発明のコンピュータ・プログラムとしてコンピュータの記憶装置（記憶媒体）に格納しておいてもよい。そして、係るコンピュータ・プログラムを当該ＣＰＵが読み出して実行するようにしてもよい。そして、このような場合において、本発明は、係るコンピュータ・プログラムのコードあるいは記憶媒体によって構成される。
【０２２６】
また、上述した各実施の形態は、適宜組み合わせて実施されることが可能である。
【０２２７】
また、本発明は、上述した各実施の形態に限定されず、様々な態様で実施されることが可能である。
【０２２８】
また、上述した各実施の形態の一部又は全部は、以下の付記のようにも記載されうるが、以下には限られない。
（付記１）
キーおよび値からなるレコードに関する処理の要求が入力される処理要求入力部と、
前記レコードに含まれる値のうち索引作成対象である索引キーと、前記レコードのキーを含むキーリストとからなる索引データに関して、要求された前記処理に応じた更新指示を表す索引更新メッセージを生成するメッセージ生成部と、
要求された前記処理に応じたレコードを生成し、生成したレコードに、前記メッセージ生成部により生成された索引更新メッセージを付加し、前記索引更新メッセージが付加されたレコードを分散ストレージシステムに格納するレコード更新部と、
前記分散ストレージシステムに格納されたレコードに含まれる索引更新メッセージを実行することにより、前記索引更新メッセージが反映された索引データを前記分散ストレージシステムに格納する索引データ更新部と、
を備えた情報処理装置。
（付記２）
前記レコードに関して要求される処理が、前記分散ストレージシステムに既に格納されているレコードに対する処理であるとき、前記レコード更新部は、前記分散ストレージシステムから前記レコードを取得し、取得したレコードに既に付加されている他の前記索引更新メッセージに加えて、今回の処理に応じた索引更新メッセージを付加することを特徴とする付記１に記載の情報処理装置。
（付記３）
複数の前記索引更新メッセージをマージするメッセージマージ部をさらに備え、
前記索引データ更新部は、前記メッセージマージ部によりマージされた索引更新メッセージを実行することを特徴とする付記１または付記２に記載の情報処理装置。
（付記４）
前記メッセージマージ部は、１つのレコードに付加されている複数の索引更新メッセージをマージすることを特徴とする付記３に記載の情報処理装置。
（付記５）
前記メッセージマージ部は、複数のレコードにそれぞれ付加されている索引更新メッセージをマージすることを特徴とする付記３または付記４に記載の情報処理装置。
（付記６）
前記レコードに関して要求される処理が、レコードの新規作成処理であるとき、
前記メッセージ生成部は、前記索引キーを含む索引データのキーリストに、新規作成対象のレコードのキーを追加する索引更新メッセージを生成することを特徴とする付記１から付記５のいずれか１つに記載の情報処理装置。
（付記７）
前記レコードに関して要求される処理が、前記分散ストレージシステムに既に格納されているレコードの削除処理であるとき、
前記メッセージ生成部は、前記索引キーを含む索引データのキーリストから、削除対象のレコードのキーを削除する索引更新メッセージを生成することを特徴とする付記１から付記６のいずれか１つに記載の情報処理装置。
（付記８）
前記レコードに関して要求される処理が、前記分散ストレージシステムに既に格納されているレコードの更新処理であるとき、
前記メッセージ生成部は、前記索引作成対象の更新前の値を索引キーとして含む索引データのキーリストから、更新対象のレコードのキーを削除するとともに、前記索引作成対象の更新後の値を索引キーとして含む索引データのキーリストに、更新対象のレコードのキーを追加する索引更新メッセージを生成することを特徴とする付記１から付記７のいずれか１つに記載の情報処理装置。
（付記９）
前記処理要求入力部に、前記レコードＫＶペアに対する参照要求が入力された場合、前記分散ストレージシステムから要求対象のレコードＫＶペアを取得し、取得したレコードＫＶペアの前記索引更新メッセージを含まない部分を出力するレコード参照部をさらに備えたことを特徴とする付記１から付記８のいずれか１つに記載の情報処理装置。
（付記１０）
付記１から付記９のいずれか１つに記載の情報処理装置と、
前記分散ストレージシステムと、
を備えた情報処理システム。
（付記１１）
前記分散ストレージシステムを構成する各サーバは、自身に格納されたレコードから前記索引更新メッセージを抽出するメッセージ抽出部を備え、
前記索引データ更新部は、前記メッセージ抽出部によって抽出された索引更新メッセージを実行することを特徴とする付記１０に記載の情報処理システム。
（付記１２）
キーおよび値からなるレコードに関する処理の要求が入力されると、
前記レコードに含まれる値のうち索引作成対象である索引キーと、前記レコードのキーを含むキーリストとからなる索引データに関して、要求された前記処理に応じた更新指示を表す索引更新メッセージを生成し、
要求された前記処理に応じたレコードを生成し、
生成したレコードに、前記索引更新メッセージを付加し、
前記索引更新メッセージが付加されたレコードを分散ストレージシステムに格納し、
前記分散ストレージシステムに格納されたレコードに含まれる索引更新メッセージを実行することにより、前記索引更新メッセージが反映された索引データを前記分散ストレージシステムに格納する情報処理方法。
（付記１３）
キーおよび値からなるレコードに関する処理の要求が入力される処理要求入力ステップと、
前記レコードに含まれる値のうち索引作成対象である索引キーと、前記レコードのキーを含むキーリストとからなる索引データに関して、要求された前記処理に応じた更新指示を表す索引更新メッセージを生成するメッセージ生成ステップと、
要求された前記処理に応じたレコードを生成し、生成したレコードに、前記メッセージ生成ステップで生成された索引更新メッセージを付加し、前記索引更新メッセージが付加されたレコードを分散ストレージシステムに格納するレコード更新ステップと、
前記分散ストレージシステムに格納されたレコードに含まれる索引更新メッセージを実行することにより、前記索引更新メッセージが反映された索引データを前記分散ストレージシステムに格納する索引データ更新ステップと、
をコンピュータ装置に実行させるコンピュータ・プログラム。
【符号の説明】
【０２２９】
１、２、３    情報処理システム
１０、２０、３０    情報処理装置
１１、２１    処理要求入力部
１２、２２    レコード更新部
１３、２３    メッセージ生成部
１４、２４、３４    索引データ更新部
２５    レコード参照部
３６    メッセージ記憶部
３７    メッセージマージ部
４０    分散ストレージシステム
５０、６０    分散ＫＶＳ
２４１、６０２    メッセージ抽出部
４００、５００、６００、９００    サーバ
４０１、５０１    レコード記憶部
１００１、４００１    ＣＰＵ
１００２、４００２    ＲＡＭ
１００３、４００３    ＲＯＭ
１００４、４００４    記憶装置
１００５、４００５    ネットワークインタフェース
１００６    入力装置
１００７    出力装置
【図１】
0006464771.tif 000002
【図２】
0006464771.tif 000003
【図３】
0006464771.tif 000004
【図４】
0006464771.tif 000005
【図５】
0006464771.tif 000006
【図６】
0006464771.tif 000007
【図７】
0006464771.tif 000008
【図８】
0006464771.tif 000009
【図９】
0006464771.tif 000010
【図１０】
0006464771.tif 000011
【図１１】
0006464771.tif 000012
【図１２】
0006464771.tif 000013
【図１３】
0006464771.tif 000014
【図１４】
0006464771.tif 000015
【図１５】
0006464771.tif 000016
【図１６】
0006464771.tif 000017
【図１７】
0006464771.tif 000018
【図１８】
0006464771.tif 000019
【図１９】
0006464771.tif 000020
【図２０】
0006464771.tif 000021
【図２１】
0006464771.tif 000022
【図２２】
0006464771.tif 000023