(57)【特許請求の範囲】
【請求項１】
他のストレージ装置と同一のデータを記憶するストレージ装置に、
前記データを記憶する他のストレージ装置である第１の装置またはクライアント装置のいずれか一方から前記データについて更新データの書き込み要求を受け付け、
前記データを記憶する他のストレージ装置であって前記第１の装置とは異なる第２の装置に前記更新データの書き込みを要求し、
前記第２の装置から所定の時間内に応答がない場合または前記第２の装置から障害発生による書き込み失敗を通知された場合に、前記更新データの書き込み要求を行った第１の装置またはクライアント装置に障害発生による書き込み失敗を通知し、
前記データを記憶する他のストレージ装置との間で前記第２の装置が記憶する前記データに基づいて前記データについて同期をとる
処理を実行させることを特徴とするデータ管理プログラム。
【請求項２】
前記同期をとる処理が完了するまでは、クライアント装置からの前記データの読み出し要求に対して再要求を該クライアント装置に依頼する処理をさらに前記ストレージ装置に実行させることを特徴とする請求項１に記載のデータ管理プログラム。
【請求項３】
前記更新データの書き込み要求を前記クライアント装置から受け付け、
前記第２の装置から所定の時間内に応答がない場合または前記第２の装置から障害発生による書き込み失敗を通知された場合に、前記更新データの書き込み要求を行ったクライアント装置に障害発生による書き込み失敗を通知し、
前記同期をとる処理が完了するまでは、前記データに関する他の書き込み要求を待たせる処理をさらに前記ストレージ装置に実行させることを特徴とする請求項１または２に記載のデータ管理プログラム。
【請求項４】
前記第２の装置から所定の時間内に応答がない場合または前記第２の装置から障害発生による書き込み失敗を通知された場合に、前記データを識別するデータ識別子をストレージ装置間でのデータ再配置の単位であるスロット単位で記憶し、スロット単位で記憶したデータ識別子を用いて他のストレージ装置との間で前記データについて同期をとる処理を前記ストレージ装置に実行させることを特徴とする請求項１、２または３に記載のデータ管理プログラム。
【請求項５】
他のストレージ装置と同一のデータを記憶するストレージ装置によって実行されるデータ管理方法において、
前記データを記憶する他のストレージ装置である第１の装置またはクライアント装置のいずれか一方から前記データについて更新データの書き込み要求を受け付け、
前記データを記憶する他のストレージ装置であって第１の装置とは異なる第２の装置に前記更新データの書き込みを要求し、
前記第２の装置から所定の時間内に応答がない場合または前記第２の装置から障害発生による書き込み失敗を通知された場合に、前記更新データの書き込み要求を行った第１の装置またはクライアント装置に障害発生による書き込み失敗を通知し、
前記データを記憶する他のストレージ装置との間で前記第２の装置が記憶する前記データに基づいて前記データについて同期をとる
ことを特徴とするデータ管理方法。
【請求項６】
他のストレージ装置と同一のデータを記憶するストレージ装置において、
前記データを記憶する他のストレージ装置である第１の装置またはクライアント装置のいずれか一方から前記データについて更新データの書き込み要求を受け付ける受付部と、
前記データを記憶する他のストレージ装置であって前記第１の装置とは異なる第２の装置に前記更新データの書き込みを要求する要求部と、
前記第２の装置から所定の時間内に応答がない場合または前記第２の装置から障害発生による書き込み失敗を通知された場合に、前記更新データの書き込み要求を行った第１の装置またはクライアント装置に障害発生による書き込み失敗を通知する通知部と、
前記データを記憶する他のストレージ装置との間で前記第２の装置が記憶する前記データに基づいて前記データについて同期をとる同期部と
を有することを特徴とするストレージ装置。
【発明の詳細な説明】
【技術分野】
【０００１】
本発明は、データ管理プログラム、データ管理方法およびストレージ装置に関する。
【背景技術】
【０００２】
従来、分散ＫＶＳ（Key  Value  Store）に代表されるＮｏＳＱＬなど、複数のノード間でデータが多重化されている分散ストレージシステムにおいては、データをPutまたはGetする方式として複数の方式がある。ここで、ノードとは、ＣＰＵ、メモリ、ディスク装置などを備えたコンピュータであり、ノード間はネットワークで相互に接続される。また、分散ストレージシステムにおいて、各ノードはデータを分散して記憶するストレージ装置である。また、データをPutするとはデータを分散ストレージシステムに書き込むことであり、データをGetするとはデータを分散ストレージシステムから読み出すことである。
【０００３】
図１２ａはデータをGetする方式の一例を示す図であり、図１２ｂはデータをPutする方式の一例を示す図である。図１２ａおよび図１２ｂでは、データが三重化され、三重化されたデータをそれぞれ記憶するノードには、「プライマリ」→「セカンダリ」→「ターシャリ」という順序関係が存在する。ここで、「プライマリ」、「セカンダリ」、「ターシャリ」は分散ストレージシステムにおけるノードの役割である。プライマリ１０は「プライマリ」の役割を有するノードであり、セカンダリ２０は「セカンダリ」の役割を有するノードであり、ターシャリ３０は「ターシャリ」の役割を有するノードである。また、クライアント５は、データのPutやGetを分散ストレージシステムに要求する装置である。
【０００４】
図１２ａに示すように、クライアント５は、プライマリ１０、セカンダリ２０、ターシャリ３０のいずれからもデータをGetすることができる。すなわち、クライアント５は、プライマリ１０、セカンダリ２０、ターシャリ３０のいずれにGetを要求しても、ＯＫを得ることができる。
【０００５】
一方、図１２ｂに示すように、クライアント５は、プライマリ１０だけにPutを要求することができる。Put要求はクライアント５→プライマリ１０→セカンダリ２０→ターシャリ３０の順に伝達され、「ＯＫ」は逆にターシャリ３０→セカンダリ２０→プライマリ１０→クライアント５の順に伝達される。
【先行技術文献】
【非特許文献】
【０００６】
【非特許文献１】Robbert  van  Renesse,  Fred  B.  Schneider,  “Chain  Replication  for  Supporting  High  Throughput  and  Availability”,  OSDI’04:6th  Symposium  on  Operating  Systems  Design  and  Implementation，P.91.
【非特許文献２】Jeff  Terrace  and  Michael  J.  Freedman,  “Object  Storage  on  CRAQ  High-throughput  chain  replication  for  read-mostly  workloads”,  In  Proc.  USENIX  Annual  Technical  Conference,  San  Diego,  CA,  June  2009.
【発明の概要】
【発明が解決しようとする課題】
【０００７】
しかしながら、図１２ａおよび図１２ｂに示した従来方式には、各ノードが保持するデータ間に矛盾が生じる可能性があるという問題がある。図１３は、従来方式で問題が発生する３つのケースを示す図である。
【０００８】
ケース（１）は、セカンダリ２０がターシャリ３０にPut要求を送信した後、ターシャリ３０から返答を受け取る前、もしくは、ターシャリ３０から返答を受け取ったがプライマリ１０に返答を返す前に、セカンダリ２０で故障が発生した場合である。この場合、プライマリ１０がタイムアウトを検出し、タイムアウト時にはデータの書き込みが行われないとすると、プライマリ１０には古いデータが記憶され、ターシャリ３０には更新された新しいデータが記憶される。
【０００９】
また、ケース（２）は、ターシャリ３０がセカンダリ２０に返答する際に、ネットワークに一時的な通信障害が起こり、セカンダリ２０でタイムアウトが発生した場合である。この場合、タイムアウト時には、データの書き込みは行われないとすると、プライマリ１０およびセカンダリ２０には古いデータが記憶され、ターシャリ３０には更新された新しいデータが記憶される。
【００１０】
また、ケース（３）は、セカンダリ２０がプライマリ１０に返答する際に、ネットワークに一時的な通信障害が起こり、プライマリ１０でタイムアウトが発生した場合である。この場合、タイムアウト時には、データの書き込みは行われないとすると、プライマリ１０には古いデータが記憶され、セカンダリ２０およびターシャリ３０には更新された新しいデータが記憶される。
【００１１】
本願に開示の技術は、１つの側面では、各ノードが保持するデータ間における矛盾の発生を抑制することを目的とする。
【課題を解決するための手段】
【００１２】
第１の案では、データ管理プログラムは、他のストレージ装置と同一のデータを記憶するストレージ装置に以下の処理を実行させる。すなわち、データ管理プログラムは、前記データを記憶する他のストレージ装置である第１の装置またはクライアント装置のいずれか一方から前記データについて更新データの書き込み要求を受け付ける。そして、データ管理プログラムは、前記データを記憶する他のストレージ装置であって前記第１の装置とは異なる第２の装置に前記更新データの書き込みを要求する。そして、データ管理プログラムは、前記第２の装置から所定の時間内に応答がない場合に前記更新データの書き込み要求を行った第１の装置またはクライアント装置に障害発生による書き込み失敗を通知する。また、データ管理プログラムは、前記第２の装置から障害発生による書き込み失敗を通知された場合に、前記更新データの書き込み要求を行った第１の装置またはクライアント装置に障害発生による書き込み失敗を通知する。そして、データ管理プログラムは、前記データを記憶する他のストレージ装置との間で前記第２の装置が記憶する前記データに基づいて前記データについて同期をとる。
【発明の効果】
【００１３】
本願に開示の技術は、１つの側面では、各ノードが保持するデータ間における矛盾の発生を抑制することができる。
【図面の簡単な説明】
【００１４】
【図１】図１は、実施例に係る分散ストレージシステムの構成を示す機能ブロック図である。
【図２】図２は、実施例に係る分散ストレージシステムによる正常時のPut処理の処理手順を示すフローチャートである。
【図３】図３は、実施例に係る分散ストレージシステムによる正常時のGet処理の処理手順を示すフローチャートである。
【図４】図４は、Put処理中にセカンダリにGet要求が来た場合の処理の流れを示す図である。
【図５】図５は、実施例に係る分散ストレージシステムによる異常時のPut処理の処理手順を示す第１のフローチャートである。
【図６】図６は、実施例に係る分散ストレージシステムによる異常時のPut処理の処理手順を示す第２のフローチャートである。
【図７】図７は、実施例に係る分散ストレージシステムによる異常時のPut処理の処理手順を示す第３のフローチャートである。
【図８】図８は、同期処理の処理手順を示すフローチャートである。
【図９】図９は、各ノードが複数の役割を有する場合に保持するデータの一例を示す図である。
【図１０】図１０は、各ノードが複数の役割を有する場合の同期処理の処理手順を示すフローチャートである。
【図１１】図１１は、実施例に係るデータ管理プログラムを実行するコンピュータの構成を示す機能ブロック図である。
【図１２ａ】図１２ａは、データをGetする方式の一例を示す図である。
【図１２ｂ】図１２ｂは、データをPutする方式の一例を示す図である。
【図１３】図１３は、従来方式で問題が発生する３つのケースを示す図である。
【発明を実施するための形態】
【００１５】
以下に、本願の開示するデータ管理プログラム、データ管理方法およびストレージ装置の実施例を図面に基づいて詳細に説明する。
【実施例】
【００１６】
まず、実施例に係る分散ストレージシステムの構成について説明する。図１は、実施例に係る分散ストレージシステムの構成を示す機能ブロック図である。図１に示すように、分散ストレージシステム１００は、プライマリ１、セカンダリ２、ターシャリ３および制御ノード４を有する。
【００１７】
プライマリ１は「プライマリ」の役割を有するノードであり、セカンダリ２は「セカンダリ」の役割を有するノードであり、ターシャリ３は「ターシャリ」の役割を有するノードである。プライマリ１、セカンダリ２、ターシャリ３および制御ノード４は、ネットワークに接続され、ネットワークを介して相互に通信することができる。また、プライマリ１、セカンダリ２、ターシャリ３はネットワークを介してクライアント５に接続される。
【００１８】
プライマリ１、セカンダリ２、ターシャリ３は、同一のデータを記憶する。クライアント５は、分散ストレージシステム１００へのデータのPut、分散ストレージシステム１００からのデータのGetを行う装置である。クライアント５は、プライマリ１、セカンダリ２、ターシャリ３のいずれに対してもデータのGetを要求することができるが、データのPutはプライマリ１に対してだけ要求することができる。Put要求はクライアント５→プライマリ１→セカンダリ２→ターシャリ３の順に伝達され、Put要求に対する応答は、ターシャリ３→セカンダリ２→プライマリ１→クライアント５の順に伝達される。
【００１９】
クライアント５は、Put/Get要求部５１を有し、Put/Get要求部５１が分散ストレージシステム１００へデータのPutおよびGetを要求する。なお、ここでは説明の便宜上、１台のクライアント５のみを示したが、プライマリ１、セカンダリ２、ターシャリ３は、ネットワークを介して複数のクライアント５に接続される。また、Put要求には書き込みを要求するデータおよびデータ名が含まれ、Get要求には読み出しを要求するデータ名が含まれる。
【００２０】
プライマリ１およびセカンダリ２は、データ記憶部１１、多重化情報保持部１２、Put/Get実行部１３、ノード間Put要求部１４、多重化情報変更実行部１５、Put失敗データ名保持部１６、Put失敗データ同期部１７を有する。ターシャリ３は、データ記憶部１１、多重化情報保持部１２、Put/Get実行部１３、多重化情報変更実行部１５を有する。
【００２１】
データ記憶部１１は、クライアント５がプライマリ１に対してPutしたデータを記憶するディスク装置である。クライアント５がプライマリ１に対してPutしたデータは、プライマリ１、セカンダリ２およびターシャリ３のデータ記憶部１１に多重化されて記憶される。
【００２２】
多重化情報保持部１２は、多重化情報を保持する。ここで、多重化情報とは、データの多重化に関する情報であり、多重化チェーン情報を含む。多重化チェーン情報は、Put要求およびPut要求に対する応答が伝達される多重化チェーンにおいてノードの順序を示す情報であり、例えば、プライマリ１が最初で、セカンダリ２が２番目で、ターシャリ３が最後という順序を示す情報である。
【００２３】
Put/Get実行部１３は、クライアント５が分散ストレージシステム１００に送信するGet要求およびPut要求を実行する。Get要求については、Put/Get実行部１３は、クライアント５から直接受信し、データ記憶部１１に記憶されたデータをクライアント５に送信する。一方、Put要求については、プライマリ１のPut/Get実行部１３だけがクライアント５から直接受信し、他のノードのPut/Get実行部１３は、多重化チェーン情報で順序が１つ前のノードから受信する。例えば、セカンダリ２のPut/Get実行部１３はプライマリ１からPut要求を受信し、ターシャリ３のPut/Get実行部１３はセカンダリ２からPut要求を受信する。また、Put/Get実行部１３は、Put要求されたデータをデータ記憶部１１に書き込む。
【００２４】
また、Put/Get実行部１３は、自装置が多重化チェーン情報で最後のノードでない場合には、多重化情報保持部１２を参照し、ノード間Put要求部１４に対して多重化チェーン情報で順序が次のノードにPut要求を送信するように指示する。例えば、プライマリ１のPut/Get実行部１３はセカンダリ２にPut要求を送信するようにノード間Put要求部１４に指示し、セカンダリ２のPut/Get実行部１３はターシャリ３にPut要求を送信するようにノード間Put要求部１４に指示する。
【００２５】
また、Put/Get実行部１３は、多重化チェーン情報で順序が次のノードからノード間Put要求部１４を介してPutの結果を受け取ると、データ記憶部１１にデータを書き込む。そして、Put/Get実行部１３は、多重化チェーン情報で順序が前のノードまたはクライアント５にPutの結果を通知する。
【００２６】
ただし、Put/Get実行部１３は、ノード間Put要求部１４からPut要求に対するタイムアウトによるPut失敗を通知されると、Put失敗データ名保持部１６にPutが失敗したデータ名を格納し、Put失敗データ同期部１７にPutが失敗したデータの同期を指示する。なお、ターシャリ３のPut/Get実行部１３は、ノード間Put要求部１４を備えないため、Put要求の送信を指示することはなく、Put要求に対するタイムアウトによるPut失敗を通知されることもない。
【００２７】
また、Put/Get実行部１３は、多重化チェーン情報で順序が前のノードのPut失敗データ同期部１７からタイムアウトによりPutが失敗したデータの同期のためのGet要求を受信し、自装置のPut失敗データ同期部１７に渡す。ただし、ターシャリ３のPut/Get実行部１３は、Put失敗データ同期部１７を備えず、データ記憶部１１に記憶したデータをセカンダリ２のPut失敗データ同期部１７に送信する。
【００２８】
また、Put/Get実行部１３は、Put失敗データ同期部１７から同期用のデータを受け取ると、受け取ったデータをデータ記憶部１１に書き込むとともに多重化チェーン情報で順序が前のノードに同期用のデータを送信する。ただし、プライマリ１のPut/Get実行部１３は、受け取ったデータをデータ記憶部１１に書き込んで同期処理を終了する。
【００２９】
ノード間Put要求部１４は、Put/Get実行部１３の指示に基づいて多重化チェーン情報で順序が次のノードにPut要求を送信する。そして、ノード間Put要求部１４は、多重化チェーン情報で順序が次のノードからPut要求に対する応答を受信すると、Put/Get実行部１３に通知する。
【００３０】
また、ノード間Put要求部１４は、多重化チェーン情報で順序が次のノードへ送信したPut要求に対する応答が所定の時間内に得られない場合に、タイムアウトによるPut失敗をPut/Get実行部１３に通知する。このように、ノード間Put要求部１４がタイムアウトによるPut失敗をPut/Get実行部１３に通知することによって、分散ストレージシステム１００はPut処理中に発生するネットワークおよびノードの障害に対応することができる。
【００３１】
多重化情報変更実行部１５は、制御ノード４から多重化情報の変更要求を受信し、多重化情報保持部１２が保持する多重化情報を更新する。多重化情報の変更は、ノードの障害、ノードの障害からの回復、ノードの再配置などによりノード間でのデータの移動や各ノードの有する役割の変更があったときに行われる。
【００３２】
Put失敗データ名保持部１６は、Putに失敗し、非同期状態にあるデータのデータ名をPut失敗データ名として保持する。Put/Get実行部１３は、Put失敗データ名保持部１６がデータ名を保持するデータに対するクライアント５からのGet要求をロックし、クライアント５にエラーすなわち障害発生によるPut失敗を返信する。したがって、分散ストレージシステム１００は、非同期状態にあるデータがクライアント５に送信されることを防ぐことができる。
【００３３】
Put失敗データ同期部１７は、Put失敗データ名保持部１６を参照して、Putに失敗したデータを同期する処理を行う。すなわち、Put失敗データ同期部１７は、多重化チェーン情報で順序が次のノードのPut/Get実行部１３にデータ名を指定して同期用データの送信を要求し、送信された同期用データを自装置のPut/Get実行部１３に渡す。また、Put失敗データ同期部１７は、自装置のPut/Get実行部１３により同期用データのデータ記憶部１１への書き込みが完了するとPut失敗データ名からデータ名を削除する。
【００３４】
なお、同期処理は、多重化チェーン情報で順序が先頭のノードのPut失敗データ同期部１７により開始される。他のノードのPut失敗データ同期部１７は、多重化チェーン情報で順序が前のノードのPut失敗データ同期部１７による同期用データの取得要求を受けて同期処理を行う。
【００３５】
制御ノード４は、分散ストレージシステム１００を制御するノードであり、多重化情報変更要求部４１を有する。多重化情報変更要求部４１は、多重化チェーン情報などに変更があった場合に、保持する多重化情報の変更を各ノードに要求する。
【００３６】
次に、実施例に係る分散ストレージシステム１００の正常時の処理手順について図２〜図３を用いて説明する。図２は、実施例に係る分散ストレージシステム１００による正常時のPut処理の処理手順を示すフローチャートである。図２に示すように、プライマリ１のPut/Get実行部１３は、クライアント５からPut要求を受信する（ステップＳ１）と、多重化情報保持部１２からセカンダリ情報を取得する（ステップＳ２）。そして、Put/Get実行部１３は、受信したPut要求と同じPut要求をセカンダリ２に発行するようにノード間Put要求部１４に指示し、ノード間Put要求部１４は、セカンダリ２に対してPut要求を発行する（ステップＳ３）。
【００３７】
すると、セカンダリ２のPut/Get時実行部１３は、プライマリ１からPut要求を受信し（ステップＳ４）、多重化情報保持部１２からターシャリ情報を取得する（ステップＳ５）。そして、Put/Get実行部１３は受信したPut要求と同じPut要求をターシャリ３に発行するようにノード間Put要求部１４に指示し、ノード間Put要求部１４はターシャリ３に対してPut要求を発行する（ステップＳ６）。
【００３８】
すると、ターシャリ３のPut/Get実行部１３は、セカンダリ２からPut要求を受信し（ステップＳ７）、セカンダリ２に「ＯＫ」を返信する（ステップＳ８）とともに、データをデータ記憶部１１に書き込む（ステップＳ９）。
【００３９】
そして、セカンダリ２のノード間Put要求部１４はターシャリ３から「ＯＫ」を受信し（ステップＳ１０）、Put/Get実行部１３に「成功」を通知する。すると、Put/Get実行部１３は、プライマリ１に「ＯＫ」を返信する（ステップＳ１１）とともに、データをデータ記憶部１１に書き込む（ステップＳ１２）。
【００４０】
そして、プライマリ１のノード間Put要求部１４はセカンダリ２から「ＯＫ」を受信し（ステップＳ１３）、Put/Get実行部１３に「成功」を通知する。すると、Put/Get実行部１３は、クライアント５に「ＯＫ」を返信する（ステップＳ１４）とともに、データをデータ記憶部１１に書き込む（ステップＳ１５）。
【００４１】
このように、分散ストレージシステム１００は、クライアント５→プライマリ１→セカンダリ２→ターシャリ３→セカンダリ２→プライマリ１→クライアント５、といったようなチェーン型の書き込みを行う。また、各ノードは、Put処理中、すなわち、Put処理を開始してから通信処理等を行ってデータ記憶部１１への書き込みが完了するまでの間、同じデータに対する他のPut要求やGet要求はブロックする。
【００４２】
図３は、実施例に係る分散ストレージシステム１００による正常時のGet処理の処理手順を示すフローチャートである。図３に示すように、プライマリ１、セカンダリ２およびターシャリ３は、それぞれGet要求をクライアント５から受信する（ステップＳ２１、Ｓ３１、Ｓ４１）と、データをデータ記憶部１１から読み出す（ステップＳ２２、Ｓ３２、Ｓ４２）。そして、クライアント５に読み出したデータを送信する（ステップＳ２３、Ｓ３３、Ｓ４３）。
【００４３】
このように、クライアント５は、プライマリ１、セカンダリ２、ターシャリ３のどこからでもデータを取得することができる。また、あるノードがGet処理中に他のノードが同一データに対するGet処理を行うことができる。
【００４４】
なお、あるデータのPut処理中は、そのデータに対する他のPut要求およびGet要求はブロックされ、最初のPut処理が完了した後に、後から来たPut要求およびGet要求に対する処理が行われる。
【００４５】
図４は、Put処理中にセカンダリ２にGet要求が来た場合の処理の流れを示す図である。図４において、○で囲まれたＷは、データ記憶部１１へのデータの書き込みを示し、○で囲まれたＲはデータ記憶部１１からのデータの読み出しを示す。また、長方形は、Put処理を示す。図４に示すように、Get要求は、セカンダリ２においてPut処理が完了するまでブロックされ、Put処理が完了した後、すなわち、セカンダリ２がプライマリ１に返答を返してデータ記憶部１１に書き込みを行った後に、処理される。これにより、正常時におけるデータの一貫性を保持することができる。
【００４６】
次に、実施例に係る分散ストレージシステム１００の異常時の処理手順について図５〜図７を用いて説明する。図５は、実施例に係る分散ストレージシステム１００による異常時のPut処理の処理手順を示す第１のフローチャートである。なお、図５は、図１３に示したケース（１）の障害が発生した場合の処理手順を示す。また、図５において、ステップＳ１〜ステップＳ９の処理は図２の処理と同様であるので、ここでは説明を省略する。
【００４７】
図５に示すように、ターシャリ３がセカンダリ２に「ＯＫ」を返信した時点でセカンダリ２に障害が発生している場合には、プライマリ１のノード間Put要求部１４は、Put要求に対する応答がないので、タイムアウトを検出する（ステップＳ５１）。
【００４８】
すると、プライマリ１において、ノード間Put要求部１４は、「失敗」をPut/Get実行部１３に通知する。すると、Put/Get実行部１３は、クライアント５にタイムアウトによるエラーを返信する（ステップＳ５２）とともに、Putを要求されたデータの書き込みをデータ記憶部１１に行う（ステップＳ５３）。
【００４９】
そして、プライマリ１において、Put/Get実行部１３は、Putを要求されたデータのデータ名をPut失敗データ名保持部１６に書き込み（ステップＳ５４）、Put失敗データ同期部１７にデータの同期を指示する。そして、プライマリ１において、Put失敗データ同期部１７が、Put失敗データ名保持部１６を参照し、ターシャリ３と連携してデータの同期処理を行う（ステップＳ５５）。
【００５０】
なお、プライマリ１による同期処理は、障害発生直後はセカンダリ２に障害が発生しているため失敗するが、しばらくするとセカンダリ２の故障が検出され、ターシャリ３がセカンダリ２に昇格する。すると、新たにセカンダリとなった旧ターシャリに対してプライマリ１が同期処理を開始する。
【００５１】
また、同期処理が完了するまで、プライマリ１は、該当データに対する他のPut要求は待たせ、Get要求はリトライを要求するエラーを返す。エラーを受け取ったクライアント５は、多重化チェーンの最後尾に対してGet要求を発行する。多重化チェーンの最後尾へのGetはブロックされないため、最後尾のノードはGet処理を実行することができる。
【００５２】
このように、セカンダリ２がPut要求をターシャリ３に発行した後でセカンダリ２に障害が発生すると、プライマリ１がタイムアウトを検出して同期処理を開始するので、分散ストレージシステム１００はデータの一貫性を保持することができる。
【００５３】
なお、ここでは、ターシャリ３がセカンダリ２に「ＯＫ」を返信した時点でセカンダリ２に障害が発生している場合について説明した。しかし、セカンダリ２がターシャリ３から「ＯＫ」を受信してプライマリ１に「ＯＫ」を送信する前にセカンダリ２に障害が発生した場合にも同様に、プライマリ１がタイムアウトを検出し、同期処理を行うことができる。
【００５４】
図６は、実施例に係る分散ストレージシステム１００による異常時のPut処理の処理手順を示す第２のフローチャートである。なお、図６は、図１３に示したケース（２）の障害が発生した場合の処理手順を示す。また、図６において、ステップＳ１〜ステップＳ９の処理は図２の処理と同様であるので、ここでは説明を省略する。
【００５５】
図６に示すように、ターシャリ３がセカンダリ２に返答する際に、ネットワークに一時的な通信障害が起こると、セカンダリ２のノード間Put要求部１４は、Put要求に対する応答がないので、タイムアウトを検出する（ステップＳ６１）。
【００５６】
すると、セカンダリ２において、ノード間Put要求部１４は、「失敗」をPut/Get実行部１３に通知する。すると、セカンダリ２において、Put/Get実行部１３は、プライマリ１にタイムアウトによるエラーを返信する（ステップＳ６２）とともに、Putを要求されたデータの書き込みをデータ記憶部１１に行う（ステップＳ６３）。そして、セカンダリ２において、Put/Get実行部１３は、Putを要求されたデータのデータ名をPut失敗データ名保持部１６に書き込む（ステップＳ６４）。
【００５７】
そして、プライマリ１のノード間Put要求部１４は、タイムアウトによるエラーを受信する（ステップＳ６５）と、Put/Get実行部１３に通知する。すると、プライマリ１において、Put/Get実行部１３は、クライアント５にタイムアウトによるエラーを返信する（ステップＳ６６）とともに、Putを要求されたデータの書き込みをデータ記憶部１１に行う（ステップＳ６７）。そして、プライマリ１において、Put/Get実行部１３は、Putを要求されたデータのデータ名をPut失敗データ名保持部１６に書き込み（ステップＳ６８）、Put失敗データ同期部１７にデータの同期を指示する。そして、Put失敗データ同期部１７が、Put失敗データ名保持部１６を参照し、セカンダリ２およびターシャリ３と連携してデータの同期処理を行う（ステップＳ６９）。
【００５８】
このように、ターシャリ３がセカンダリ２に返答する際にネットワークに一時的な通信障害が起きると、セカンダリ２がタイムアウトを検出してプライマリ１に返信する。そして、タイムアウトの通知を受信したプライマリ１が同期処理を開始するので、分散ストレージシステム１００はデータの一貫性を保持することができる。
【００５９】
図７は、実施例に係る分散ストレージシステム１００による異常時のPut処理の処理手順を示す第３のフローチャートである。なお、図７は、図１３に示したケース（３）の障害が発生した場合の処理手順を示す。また、図７において、ステップＳ１〜ステップＳ１２の処理は図２の処理と同様であるので、ここでは説明を省略する。
【００６０】
図７に示すように、セカンダリ２がプライマリ１に返答する際に、ネットワークに一時的な通信障害が起こると、プライマリ１のノード間Put要求部１４は、Put要求に対する応答がないので、タイムアウトを検出する（ステップＳ７１）。
【００６１】
すると、プライマリ１において、ノード間Put要求部１４は、「失敗」をPut/Get実行部１３に通知する。すると、Put/Get実行部１３は、クライアント５にタイムアウトによるエラーを返信する（ステップＳ７２）とともに、Putを要求されたデータの書き込みをデータ記憶部１１に行う（ステップＳ７３）。そして、プライマリ１において、Put/Get実行部１３は、Putを要求されたデータのデータ名をPut失敗データ名保持部１６に書き込み（ステップＳ７４）、Put失敗データ同期部１７にデータの同期を指示する。そして、プライマリ１において、Put失敗データ同期部１７が、Put失敗データ名保持部１６を参照し、セカンダリ２およびターシャリ３と連携してデータの同期処理を行う（ステップＳ７５）。
【００６２】
このように、セカンダリ２がプライマリ１に返答する際にネットワークに一時的な通信障害が起きると、セカンダリ１がタイムアウトを検出して同期処理を開始するので、分散ストレージシステム１００はデータの一貫性を保持することができる。
【００６３】
次に、同期処理の処理手順について説明する。図８は、同期処理の処理手順を示すフローチャートである。なお、図８では、プライマリ１およびセカンダリ２がPut失敗データ名保持部１６にPutが失敗したデータのデータ名として“ａ”を記憶し、プライマリ１、セカンダリ２およびターシャリ３がデータの同期を行う。
【００６４】
図８に示すように、プライマリ１のPut失敗データ同期部１７は、セカンダリ２に対してデータ名“ａ”のGet要求を発行する（ステップＳ８１）。すると、セカンダリ２のPut/Get実行部１３がセカンダリ２のPut失敗データ同期部１７に対してターシャリ３へのGet要求の発行を指示し、セカンダリ２のPut失敗データ同期部１７がターシャリ３に対してデータ名“ａ”のGet要求を発行する（ステップＳ８２）。
【００６５】
すると、ターシャリ３のPut/Get実行部１３がデータ名“ａ”のデータをデータ記憶部１１から読み出してセカンダリ２に対して返信する（ステップＳ８３）。すると、セカンダリ２のPut失敗データ同期部１７がデータを受け取ってセカンダリ２のPut/Get実行部１３に渡し、セカンダリ２のPut/Get実行部１３がデータ記憶部１１へのデータ書き込み処理を実行する（ステップＳ８４）。
【００６６】
また、セカンダリ２のPut失敗データ同期部１７は、Put失敗データ名保持部１６が保持するPut失敗データ名からデータ名“ａ”を削除し（ステップＳ８５）、データ名“ａ”に対するGetロックを解除する（ステップＳ８６）。そして、セカンダリ２のPut/Get実行部１３が、プライマリ１に対してデータ名“ａ”のデータを返信する（ステップＳ８７）。
【００６７】
すると、プライマリ１のPut失敗データ同期部１７がデータを受け取ってプライマリ１のPut/Get実行部１３に渡し、プライマリ１のPut/Get実行部１３がデータ記憶部１１へのデータ書き込み処理を実行する（ステップＳ８８）。
【００６８】
また、プライマリ１のPut失敗データ同期部１７は、Put失敗データ名保持部１６が保持するPut失敗データ名からデータ名“ａ”を削除し（ステップＳ８９）、データ名“ａ”に対するGetロックを解除する（ステップＳ９０）。
【００６９】
このように、プライマリ１、セカンダリ２およびターシャリ３が同期処理を行うことによって、分散ストレージシステム１００は、Putに失敗したデータの一貫性を保持することができる。
【００７０】
上述してきたように、実施例では、ノード間Put要求部１４が多重化チェーンの順序が次のノードに発行したPut要求に対するタイムアウトを検出してPut/Get実行部１３に通知する。すると、Put/Get実行部１３は、多重化チェーンの順序が前のノードまたはクライアント５にエラーを返信するとともにPut失敗データ同期部１７にPutに失敗したデータの同期を指示し、Put失敗データ同期部１７が同期処理を行う。したがって、分散ストレージシステム１００は、Put処理中に一部のノードに障害やネットワークに一時的な通信障害が発生した場合にも、データの一貫性を保持することができる。
【００７１】
なお、プライマリ１は、同期処理が完了するまでは他のPut要求を待たせ、Get要求はエラーを返す。また、Get要求でエラーを受け取ったクライアント５は、多重化チェーンの最後尾に対してGet要求を発行する。したがって、分散ストレージシステム１００は、各ノードに余計なデータを保持させることなく、常に矛盾しないデータをクライアント５に返すことができる。
【００７２】
なお、実施例では、各ノードが「プライマリ」、「セカンダリ」、「ターシャリ」のいずれかの役割を有する場合について説明した。しかしながら、各ノードは複数の役割を有することが可能であり、データごとに異なる役割を果たすことが可能である。そこで、各ノードが複数の役割を有する場合の同期処理について図９および図１０を用いて説明する。
【００７３】
図９は、各ノードが複数の役割を有する場合に保持するデータの一例を示す図である。図９で、スロットとは、データ名の名前空間を分割したものであり、データがどのスロットに属するかはデータ名から一意に決定される。図９では名前空間は３つのスロット−１、スロット−２およびスロット−３に分割されている。
【００７４】
そして、ノードＡはスロット−１に属するデータに対しては「プライマリ」の役割を果たし、スロット−２に属するデータに対しては「ターシャリ」の役割を果たし、スロット−３に属するデータに対しては「セカンダリ」の役割を果たす。また、ノードＢはスロット−１に属するデータに対しては「セカンダリ」の役割を果たし、スロット−２に属するデータに対しては「プライマリ」の役割を果たし、スロット−３に属するデータに対しては「ターシャリ」の役割を果たす。また、ノードＣはスロット−１に属するデータに対しては「ターシャリ」の役割を果たし、スロット−２に属するデータに対しては「セカンダリ」の役割を果たし、スロット−３に属するデータに対しては「プライマリ」の役割を果たす。
【００７５】
また、ノードの障害、ノードの障害からの回復、ノードの再配置などによりノード間でのデータの移動や各ノードの有する役割の変更が発生した場合、データの移動や役割の変更はスロット単位で行われる。例えば、スロット−１に対する「プライマリ」の役割は、ノード再配置によりノードＡの役割から新たなノードＤの役割に変更されることがある。また、このような、ノードの障害、ノードの障害からの回復、ノードの再配置などによるノード間でのデータの移動や各ノードの有する役割の変更は、同期処理中にも発生する。したがって、Put失敗データ名の移動も同期処理中に発生する。
【００７６】
そこで、各ノードのPut失敗データ名保持部１６は、スロット単位でPut失敗データ名を保持する。例えば、図９に示すように、ノードＡは、スロット−１に属するデータに関しては“ａ”、“ｂ”、“ｃ”、“ｙ”、“ｚ”をPut失敗データ名として保持し、スロット−３に属するデータに関しては“ｍｏｇｅ”をPut失敗データ名として保持する。ただし、ノードＡは、スロット−２に属するデータに対しては「ターシャリ」すなわち多重化チェーンの最後尾の役割を果たすので、スロット−２に関してはPut失敗データ名を保持しない。ここで、スロット−１に対する「プライマリ」の役割が、ノード再配置によりノードＡの役割から新たなノードＤの役割に変更され、ノードＡからノードＤにスロット−１のデータがコピーされたとすると、ノードＡのスロット−１に属するPut失敗データ名はノードＤに移動され、ノードＡから削除される。
【００７７】
また、図９に示すスロット−２の状況において、「ターシャリ」であるノードＡで障害が発生し、「セカンダリ」であるノードＣが多重化チェーンの最後尾となると、データ名“ａａ”はPut失敗データ名から削除される。その理由は、多重化チェーンの最後尾にあるデータを正しいデータとみなすためである。このように、Put失敗データ名保持部１６が、スロット単位でPut失敗データ名を保持することによって、分散ストレージシステム１００は、ノード再配置時等に発生する同期対象データの変更を効率良く行うことができる。
【００７８】
図１０は、各ノードが複数の役割を有する場合の同期処理の処理手順を示すフローチャートである。なお、図１０では、スロット−３に属するデータ名“ｘｙｚ”に対してノードＣがプライマリ１として動作し、ノードＡがセカンダリ２として動作し、ノードＢがターシャリ３として動作する。また、ノードＣだけがPut失敗データ名保持部１６にPutが失敗したデータ名として“ｘｙｚ”を保持する。
【００７９】
図１０に示すように、プライマリ１であるノードＣのPut失敗データ同期部１７は、セカンダリ２であるノードＡに対してデータ名“ｘｙｚ”のGet要求を発行する（ステップＳ９１）。すると、ノードＡのPut/Get実行部１３がノードＡのPut失敗データ同期部１７に対してターシャリ３であるノードＢへのGet要求の発行を指示し、ノードＡのPut失敗データ同期部１７がノードＢに対してデータ名“ｘｙｚ”のGet要求を発行する（ステップＳ９２）。
【００８０】
すると、ノードＢのPut/Get実行部１３がデータ名“ｘｙｚ”のデータをデータ記憶部１１から読み出してノードＡに対して返信する（ステップＳ９３）。すると、ノードＡのPut失敗データ同期部１７がデータを受け取ってノードＡのPut/Get実行部１３に渡し、ノードＡのPut/Get実行部１３がノードＣに対してデータ名“ｘｙｚ”のデータを返信する（ステップＳ９４）。
【００８１】
すると、ノードＣのPut失敗データ同期部１７がデータを受け取ってノードＣのPut/Get実行部１３に渡し、ノードＣのPut/Get実行部１３がデータ記憶部１１へのデータ書き込み処理を実行する（ステップＳ９５）。
【００８２】
また、ノードＣのPut失敗データ同期部１７はPut失敗データ名保持部１６が保持するPut失敗データ名からスロット−３に含まれるデータ名“ｘｙｚ”を削除し（ステップＳ９６）、データ名“ｘｙｚ”に対するGetロックを解除する（ステップＳ９７）。
【００８３】
このように、各ノードはスロットごとに異なる役割を果たすため、スロットごとに異なるノードが同期処理を開始する。
【００８４】
また、実施例では、ストレージ装置としてのノードについて説明したが、ノードが有する構成をソフトウェアによって実現することで、同様の機能を有するデータ管理プログラムを得ることができる。そこで、データ管理プログラムを実行するコンピュータについて説明する。
【００８５】
図１１は、実施例に係るデータ管理プログラムを実行するコンピュータの構成を示す機能ブロック図である。図１１に示すように、コンピュータ２００は、ＲＡＭ２１０と、ＣＰＵ２２０と、ＨＤＤ２３０と、ＬＡＮインタフェース２４０と、入出力インタフェース２５０と、ＤＶＤドライブ２６０とを有する。
【００８６】
ＲＡＭ２１０は、プログラムやプログラムの実行途中結果などを記憶するメモリであり、ＣＰＵ２２０は、ＲＡＭ２１０からプログラムを読み出して実行する中央処理装置である。ＨＤＤ２３０は、プログラムやデータを格納するディスク装置であり、クライアント５からPutされたデータを記憶する。ＬＡＮインタフェース２４０は、コンピュータ２００をＬＡＮ経由で他のコンピュータに接続するためのインタフェースである。入出力インタフェース２５０は、マウスやキーボードなどの入力装置および表示装置を接続するためのインタフェースであり、ＤＶＤドライブ２６０は、ＤＶＤの読み書きを行う装置である。
【００８７】
そして、コンピュータ２００において実行されるデータ管理プログラム２１１は、ＤＶＤに記憶され、ＤＶＤドライブ２６０によってＤＶＤから読み出されてコンピュータ２００にインストールされる。あるいは、データ管理プログラム２１１は、ＬＡＮインタフェース２４０を介して接続された他のコンピュータシステムのデータベースなどに記憶され、これらのデータベースから読み出されてコンピュータ２００にインストールされる。そして、インストールされたデータ管理プログラム２１１は、ＨＤＤ２３０に記憶され、ＲＡＭ２１０に読み出されてＣＰＵ２２０によって実行される。
【００８８】
また、実施例では、同期処理においてターシャリ３が記憶するデータをプライマリ１まで転送する場合について説明した。しかしながら、同期処理において他の方法を用いることもできる。例えば、各データにバージョン番号などを付与し、まずターシャリ３が記憶するバージョン番号をプライマリ１まで転送する。そして、バージョン番号で特定されるデータをプライマリ１が有しない場合にのみデータをターシャリ３からプライマリ１まで転送する。このように、同期処理を２段階にすることで、分散ストレージシステムは、同期処理時のデータ転送量を削減することができる。
【００８９】
また、実施例では、Put/Get実行部１３は、Putの要求元に返答を返してからデータ記憶部１１への書き込みを実行している。しかしながら、Put/Get実行部１３は、返答を返す前にデータ記憶部１１への書き込みを実行することもできる。データ記憶部１１への書き込みタイミングは、静的に決められこともあれば、ストレージ装置故障に伴う多重度の変化等に応じて動的に決められることもある。例えば、Put/Get実行部１３は、正常時には返答を返してからデータ記憶部１１への書き込みを実行し、多重度が１となってしまった場合のみ、返答を返す前にデータ記憶部１１への書き込みを実行することもできる。
【００９０】
また、実施例では、分散ストレージシステム１００が３台のノードを有する場合について説明したが、本発明はこれに限定されるものではなく、分散ストレージシステムが４台以上のノードを有する場合にも同様に適用することができる。
【００９１】
すなわち、プライマリ１とターシャリ３の間に複数のセカンダリ２がある場合にも本発明を同様に適用することができる。この場合、複数のセカンダリ２のいずれかに障害が発生したときには、多重化チェーンで順番が前のノードによってタイムアウトが検出され、多重化チェーンを逆にたどってプライマリ１にタイムアウトによるエラーが通知される。そして、プライマリ１は、障害が発生したノード以外のノードとの間で同期処理を行う。また、複数のセカンダリ２のうちの２つのセカンダリ間を接続するネットワークに一時的な通信障害が発生した場合には、Put要求を発行したセカンダリ２によってタイムアウトが検出される。そして、タイムアウトを検出したセカンダリ２から多重化チェーンを逆にたどってプライマリ１にタイムアウトによるエラーが通知される。そして、プライマリ１は、一時的な通信障害が復旧すると他のノードとの間で同期処理を行う。
【００９２】
また、実施例では、分散ストレージシステム１００が３台のノードを有する場合について説明したが、本発明はこれに限定されるものではなく、分散ストレージシステムが２台のノードを有する場合にも同様に適用することができる。すなわち、分散ストレージシステムがプライマリ１とターシャリ３を有し、プライマリ１とターシャリ３を接続するネットワークに一時的な通信障害が発生した場合には、Put要求を発行したプライマリ１によってタイムアウトが検出される。そして、タイムアウトを検出したプライマリ１は、一時的な通信障害が復旧するとターシャリ３との間で同期処理を行う。
【符号の説明】
【００９３】
１，１０    プライマリ
２，２０    セカンダリ
３，３０    ターシャリ
４    制御ノード
５    クライアント
１１    データ記憶部
１２    多重化情報保持部
１３    Put/Get実行部
１４    ノード間Put要求部
１５    多重化情報変更実行部
１６    Put失敗データ名保持部
１７    Put失敗データ同期部
４１    多重化情報変更要求部
５１    Put/Get要求部
１００    分散ストレージシステム
２００    コンピュータ
２１０    ＲＡＭ
２１１    データ管理プログラム
２２０    ＣＰＵ
２３０    ＨＤＤ
２４０    ＬＡＮインタフェース
２５０    入出力インタフェース
２６０    ＤＶＤドライブ
【図１】
0005862246.tif 000002
【図２】
0005862246.tif 000003
【図３】
0005862246.tif 000004
【図４】
0005862246.tif 000005
【図５】
0005862246.tif 000006
【図６】
0005862246.tif 000007
【図７】
0005862246.tif 000008
【図８】
0005862246.tif 000009
【図９】
0005862246.tif 000010
【図１０】
0005862246.tif 000011
【図１１】
0005862246.tif 000012
【図１２ａ】
0005862246.tif 000013
【図１２ｂ】
0005862246.tif 000014
【図１３】
0005862246.tif 000015