他のストレージ装置と同一のデータを記憶するストレージ装置に、前記データを記憶する他のストレージ装置である第1の装置またはクライアント装置のいずれか一方から前記データについて更新データの書き込み要求を受け付け、前記データを記憶する他のストレージ装置であって前記第1の装置とは異なる第2の装置に前記更新データの書き込みを要求し、前記第2の装置から所定の時間内に応答がない場合または前記第2の装置から障害発生による書き込み失敗を通知された場合に、前記更新データの書き込み要求を行った第1の装置またはクライアント装置に障害発生による書き込み失敗を通知し、前記データを記憶する他のストレージ装置との間で前記データについて同期をとる処理を実行させることを特徴とするデータ管理プログラム。前記同期をとる処理が完了するまでは、クライアント装置からの前記データの読み出し要求に対して再要求を該クライアント装置に依頼する処理をさらに前記コンピュータに実行させることを特徴とする請求項1に記載のデータ管理プログラム。前記更新データの書き込み要求を前記クライアント装置から受け付け、前記第2の装置から所定の時間内に応答がない場合または前記第2の装置から障害発生による書き込み失敗を通知された場合に、前記更新データの書き込み要求を行ったクライアント装置に障害発生による書き込み失敗を通知し、前記同期をとる処理が完了するまでは、前記データに関する他の書き込み要求を待たせる処理をさらに前記コンピュータに実行させることを特徴とする請求項1または2に記載のデータ管理プログラム。前記第2の装置から所定の時間内に応答がない場合または前記第2の装置から障害発生による書き込み失敗を通知された場合に、前記データを識別するデータ識別子をストレージ装置間でのデータ再配置の単位であるスロット単位で記憶し、スロット単位で記憶したデータ識別子を用いて他のストレージ装置との間で前記データについて同期をとる処理を前記コンピュータに実行させることを特徴とする請求項1、2または3に記載のデータ管理プログラム。他のストレージ装置と同一のデータを記憶するストレージ装置によって実行されるデータ管理方法において、前記データを記憶する他のストレージ装置である第1の装置またはクライアント装置のいずれか一方から前記データについて更新データの書き込み要求を受け付け、前記データを記憶する他のストレージ装置であって第1の装置とは異なる第2の装置に前記更新データの書き込みを要求し、前記第2の装置から所定の時間内に応答がない場合または前記第2の装置から障害発生による書き込み失敗を通知された場合に、前記更新データの書き込み要求を行った第1の装置またはクライアント装置に障害発生による書き込み失敗を通知し、前記データを記憶する他のストレージ装置との間で前記データについて同期をとることを特徴とするデータ管理方法。他のストレージ装置と同一のデータを記憶するストレージ装置において、前記データを記憶する他のストレージ装置である第1の装置またはクライアント装置のいずれか一方から前記データについて更新データの書き込み要求を受け付ける受付部と、前記データを記憶する他のストレージ装置であって前記第1の装置とは異なる第2の装置に前記更新データの書き込みを要求する要求部と、前記第2の装置から所定の時間内に応答がない場合または前記第2の装置から障害発生による書き込み失敗を通知された場合に、前記更新データの書き込み要求を行った第1の装置またはクライアント装置に障害発生による書き込み失敗を通知する通知部と、前記データを記憶する他のストレージ装置との間で前記データについて同期をとる同期部とを有することを特徴とするストレージ装置。しかしながら、図12aおよび図12bに示した従来方式には、各ノードが保持するデータ間に矛盾が生じる可能性があるという問題がある。図13は、従来方式で問題が発生する3つのケースを示す図である。ケース1は、セカンダリ20がターシャリ30にPut要求を送信した後、ターシャリ30から返答を受け取る前、もしくは、ターシャリ30から返答を受け取ったがプライマリ10に返答を返す前に、セカンダリ20で故障が発生した場合である。この場合、プライマリ10がタイムアウトを検出し、タイムアウト時にはデータの書き込みが行われないとすると、プライマリ10には古いデータが記憶され、ターシャリ30には更新された新しいデータが記憶される。また、ケース2は、ターシャリ30がセカンダリ20に返答する際に、ネットワークに一時的な通信障害が起こり、セカンダリ20でタイムアウトが発生した場合である。この場合、タイムアウト時には、データの書き込みは行われないとすると、プライマリ10およびセカンダリ20には古いデータが記憶され、ターシャリ30には更新された新しいデータが記憶される。また、ケース3は、セカンダリ20がプライマリ10に返答する際に、ネットワークに一時的な通信障害が起こり、プライマリ10でタイムアウトが発生した場合である。この場合、タイムアウト時には、データの書き込みは行われないとすると、プライマリ10には古いデータが記憶され、セカンダリ20およびターシャリ30には更新された新しいデータが記憶される。本願に開示の技術は、1つの側面では、各ノードが保持するデータ間における矛盾の発生を抑制することを目的とする。第1の案では、データ管理プログラムは、他のストレージ装置と同一のデータを記憶するストレージ装置に以下の処理を実行させる。すなわち、データ管理プログラムは、前記データを記憶する他のストレージ装置である第1の装置またはクライアント装置のいずれか一方から前記データについて更新データの書き込み要求を受け付ける。そして、データ管理プログラムは、前記データを記憶する他のストレージ装置であって前記第1の装置とは異なる第2の装置に前記更新データの書き込みを要求する。そして、データ管理プログラムは、前記第2の装置から所定の時間内に応答がない場合に前記更新データの書き込み要求を行った第1の装置またはクライアント装置に障害発生による書き込み失敗を通知する。また、データ管理プログラムは、前記第2の装置から障害発生による書き込み失敗を通知された場合に、前記更新データの書き込み要求を行った第1の装置またはクライアント装置に障害発生による書き込み失敗を通知する。そして、データ管理プログラムは、前記データを記憶する他のストレージ装置との間で前記データについて同期をとる。本願に開示の技術は、1つの側面では、各ノードが保持するデータ間における矛盾の発生を抑制することができる。以下に、本願の開示するデータ管理プログラム、データ管理方法およびストレージ装置の実施例を図面に基づいて詳細に説明する。まず、実施例に係る分散ストレージシステムの構成について説明する。図1は、実施例に係る分散ストレージシステムの構成を示す機能ブロック図である。図1に示すように、分散ストレージシステム100は、プライマリ1、セカンダリ2、ターシャリ3および制御ノード4を有する。プライマリ1はプライマリの役割を有するノードであり、セカンダリ2はセカンダリの役割を有するノードであり、ターシャリ3はターシャリの役割を有するノードである。プライマリ1、セカンダリ2、ターシャリ3および制御ノード4は、ネットワークに接続され、ネットワークを介して相互に通信することができる。また、プライマリ1、セカンダリ2、ターシャリ3はネットワークを介してクライアント5に接続される。プライマリ1、セカンダリ2、ターシャリ3は、同一のデータを記憶する。クライアント5は、分散ストレージシステム100へのデータのPut、分散ストレージシステム100からのデータのGetを行う装置である。クライアント5は、プライマリ1、セカンダリ2、ターシャリ3のいずれに対してもデータのGetを要求することができるが、データのPutはプライマリ1に対してだけ要求することができる。Put要求はクライアント5→プライマリ1→セカンダリ2→ターシャリ3の順に伝達され、Put要求に対する応答は、ターシャリ3→セカンダリ2→プライマリ1→クライアント5の順に伝達される。クライアント5は、PutGet要求部51を有し、PutGet要求部51が分散ストレージシステム100へデータのPutおよびGetを要求する。なお、ここでは説明の便宜上、1台のクライアント5のみを示したが、プライマリ1、セカンダリ2、ターシャリ3は、ネットワークを介して複数のクライアント5に接続される。また、Put要求には書き込みを要求するデータおよびデータ名が含まれ、Get要求には読み出しを要求するデータ名が含まれる。プライマリ1およびセカンダリ2は、データ記憶部11、多重化情報保持部12、PutGet実行部13、ノード間Put要求部14、多重化情報変更実行部15、Put失敗データ名保持部16、Put失敗データ同期部17を有する。ターシャリ3は、データ記憶部11、多重化情報保持部12、PutGet実行部13、多重化情報変更実行部15を有する。データ記憶部11は、クライアント5がプライマリ1に対してPutしたデータを記憶するディスク装置である。クライアント5がプライマリ1に対してPutしたデータは、プライマリ1、セカンダリ2およびターシャリ3のデータ記憶部11に多重化されて記憶される。多重化情報保持部12は、多重化情報を保持する。ここで、多重化情報とは、データの多重化に関する情報であり、多重化チェーン情報を含む。多重化チェーン情報は、Put要求およびPut要求に対する応答が伝達される多重化チェーンにおいてノードの順序を示す情報であり、例えば、プライマリ1が最初で、セカンダリ2が2番目で、ターシャリ3が最後という順序を示す情報である。PutGet実行部13は、クライアント5が分散ストレージシステム100に送信するGet要求およびPut要求を実行する。Get要求については、PutGet実行部13は、クライアント5から直接受信し、データ記憶部11に記憶されたデータをクライアント5に送信する。一方、Put要求については、プライマリ1のPutGet実行部13だけがクライアント5から直接受信し、他のノードのPutGet実行部13は、多重化チェーン情報で順序が1つ前のノードから受信する。例えば、セカンダリ2のPutGet実行部13はプライマリ1からPut要求を受信し、ターシャリ3のPutGet実行部13はセカンダリ2からPut要求を受信する。また、PutGet実行部13は、Put要求されたデータをデータ記憶部11に書き込む。また、PutGet実行部13は、自装置が多重化チェーン情報で最後のノードでない場合には、多重化情報保持部12を参照し、ノード間Put要求部14に対して多重化チェーン情報で順序が次のノードにPut要求を送信するように指示する。例えば、プライマリ1のPutGet実行部13はセカンダリ2にPut要求を送信するようにノード間Put要求部14に指示し、セカンダリ2のPutGet実行部13はターシャリ3にPut要求を送信するようにノード間Put要求部14に指示する。また、PutGet実行部13は、多重化チェーン情報で順序が次のノードからノード間Put要求部14を介してPutの結果を受け取ると、データ記憶部11にデータを書き込む。そして、PutGet実行部13は、多重化チェーン情報で順序が前のノードまたはクライアント5にPutの結果を通知する。ただし、PutGet実行部13は、ノード間Put要求部14からPut要求に対するタイムアウトによるPut失敗を通知されると、Put失敗データ名保持部16にPutが失敗したデータ名を格納し、Put失敗データ同期部17にPutが失敗したデータの同期を指示する。なお、ターシャリ3のPutGet実行部13は、ノード間Put要求部14を備えないため、Put要求の送信を指示することはなく、Put要求に対するタイムアウトによるPut失敗を通知されることもない。また、PutGet実行部13は、多重化チェーン情報で順序が前のノードのPut失敗データ同期部17からタイムアウトによりPutが失敗したデータの同期のためのGet要求を受信し、自装置のPut失敗データ同期部17に渡す。ただし、ターシャリ3のPutGet実行部13は、Put失敗データ同期部17を備えず、データ記憶部11に記憶したデータをセカンダリ2のPut失敗データ同期部17に送信する。また、PutGet実行部13は、Put失敗データ同期部17から同期用のデータを受け取ると、受け取ったデータをデータ記憶部11に書き込むとともに多重化チェーン情報で順序が前のノードに同期用のデータを送信する。ただし、プライマリ1のPutGet実行部13は、受け取ったデータをデータ記憶部11に書き込んで同期処理を終了する。ノード間Put要求部14は、PutGet実行部13の指示に基づいて多重化チェーン情報で順序が次のノードにPut要求を送信する。そして、ノード間Put要求部14は、多重化チェーン情報で順序が次のノードからPut要求に対する応答を受信すると、PutGet実行部13に通知する。また、ノード間Put要求部14は、多重化チェーン情報で順序が次のノードへ送信したPut要求に対する応答が所定の時間内に得られない場合に、タイムアウトによるPut失敗をPutGet実行部13に通知する。このように、ノード間Put要求部14がタイムアウトによるPut失敗をPutGet実行部13に通知することによって、分散ストレージシステム100はPut処理中に発生するネットワークおよびノードの障害に対応することができる。多重化情報変更実行部15は、制御ノード4から多重化情報の変更要求を受信し、多重化情報保持部12が保持する多重化情報を更新する。多重化情報の変更は、ノードの障害、ノードの障害からの回復、ノードの再配置などによりノード間でのデータの移動や各ノードの有する役割の変更があったときに行われる。Put失敗データ名保持部16は、Putに失敗し、非同期状態にあるデータのデータ名をPut失敗データ名として保持する。PutGet実行部13は、Put失敗データ名保持部16がデータ名を保持するデータに対するクライアント5からのGet要求をロックし、クライアント5にエラーすなわち障害発生によるPut失敗を返信する。したがって、分散ストレージシステム100は、非同期状態にあるデータがクライアント5に送信されることを防ぐことができる。Put失敗データ同期部17は、Put失敗データ名保持部16を参照して、Putに失敗したデータを同期する処理を行う。すなわち、Put失敗データ同期部17は、多重化チェーン情報で順序が次のノードのPutGet実行部13にデータ名を指定して同期用データの送信を要求し、送信された同期用データを自装置のPutGet実行部13に渡す。また、Put失敗データ同期部17は、自装置のPutGet実行部13により同期用データのデータ記憶部11への書き込みが完了するとPut失敗データ名からデータ名を削除する。なお、同期処理は、多重化チェーン情報で順序が先頭のノードのPut失敗データ同期部17により開始される。他のノードのPut失敗データ同期部17は、多重化チェーン情報で順序が前のノードのPut失敗データ同期部17による同期用データの取得要求を受けて同期処理を行う。制御ノード4は、分散ストレージシステム100を制御するノードであり、多重化情報変更要求部41を有する。多重化情報変更要求部41は、多重化チェーン情報などに変更があった場合に、保持する多重化情報の変更を各ノードに要求する。次に、実施例に係る分散ストレージシステム100の正常時の処理手順について図2~図3を用いて説明する。図2は、実施例に係る分散ストレージシステム100による正常時のPut処理の処理手順を示すフローチャートである。図2に示すように、プライマリ1のPutGet実行部13は、クライアント5からPut要求を受信するステップS1と、多重化情報保持部12からセカンダリ情報を取得するステップS2。そして、PutGet実行部13は、受信したPut要求と同じPut要求をセカンダリ2に発行するようにノード間Put要求部14に指示し、ノード間Put要求部14は、セカンダリ2に対してPut要求を発行するステップS3。すると、セカンダリ2のPutGet時実行部13は、プライマリ1からPut要求を受信しステップS4、多重化情報保持部12からターシャリ情報を取得するステップS5。そして、PutGet実行部13は受信したPut要求と同じPut要求をターシャリ3に発行するようにノード間Put要求部14に指示し、ノード間Put要求部14はターシャリ3に対してPut要求を発行するステップS6。すると、ターシャリ3のPutGet実行部13は、セカンダリ2からPut要求を受信しステップS7、セカンダリ2にOKを返信するステップS8とともに、データをデータ記憶部11に書き込むステップS9。そして、セカンダリ2のノード間Put要求部14はターシャリ3からOKを受信しステップS10、PutGet実行部13に成功を通知する。すると、PutGet実行部13は、プライマリ1にOKを返信するステップS11とともに、データをデータ記憶部11に書き込むステップS12。そして、プライマリ1のノード間Put要求部14はセカンダリ2からOKを受信しステップS13、PutGet実行部13に成功を通知する。すると、PutGet実行部13は、クライアント5にOKを返信するステップS14とともに、データをデータ記憶部11に書き込むステップS15。このように、分散ストレージシステム100は、クライアント5→プライマリ1→セカンダリ2→ターシャリ3→セカンダリ2→プライマリ1→クライアント5、といったようなチェーン型の書き込みを行う。また、各ノードは、Put処理中、すなわち、Put処理を開始してから通信処理等を行ってデータ記憶部11への書き込みが完了するまでの間、同じデータに対する他のPut要求やGet要求はブロックする。図3は、実施例に係る分散ストレージシステム100による正常時のGet処理の処理手順を示すフローチャートである。図3に示すように、プライマリ1、セカンダリ2およびターシャリ3は、それぞれGet要求をクライアント5から受信するステップS21、S31、S41と、データをデータ記憶部11から読み出すステップS22、S32、S42。そして、クライアント5に読み出したデータを送信するステップS23、S33、S43。このように、クライアント5は、プライマリ1、セカンダリ2、ターシャリ3のどこからでもデータを取得することができる。また、あるノードがGet処理中に他のノードが同一データに対するGet処理を行うことができる。なお、あるデータのPut処理中は、そのデータに対する他のPut要求およびGet要求はブロックされ、最初のPut処理が完了した後に、後から来たPut要求およびGet要求に対する処理が行われる。図4は、Put処理中にセカンダリ2にGet要求が来た場合の処理の流れを示す図である。図4において、○で囲まれたWは、データ記憶部11へのデータの書き込みを示し、○で囲まれたRはデータ記憶部11からのデータの読み出しを示す。また、長方形は、Put処理を示す。図4に示すように、Get要求は、セカンダリ2においてPut処理が完了するまでブロックされ、Put処理が完了した後、すなわち、セカンダリ2がプライマリ1に返答を返してデータ記憶部11に書き込みを行った後に、処理される。これにより、正常時におけるデータの一貫性を保持することができる。次に、実施例に係る分散ストレージシステム100の異常時の処理手順について図5~図7を用いて説明する。図5は、実施例に係る分散ストレージシステム100による異常時のPut処理の処理手順を示す第1のフローチャートである。なお、図5は、図13に示したケース1の障害が発生した場合の処理手順を示す。また、図5において、ステップS1~ステップS9の処理は図2の処理と同様であるので、ここでは説明を省略する。図5に示すように、ターシャリ3がセカンダリ2にOKを返信した時点でセカンダリ2に障害が発生している場合には、プライマリ1のノード間Put要求部14は、Put要求に対する応答がないので、タイムアウトを検出するステップS51。すると、プライマリ1において、ノード間Put要求部14は、失敗をPutGet実行部13に通知する。すると、PutGet実行部13は、クライアント5にタイムアウトによるエラーを返信するステップS52とともに、Putを要求されたデータの書き込みをデータ記憶部11に行うステップS53。そして、プライマリ1において、PutGet実行部13は、Putを要求されたデータのデータ名をPut失敗データ名保持部16に書き込みステップS54、Put失敗データ同期部17にデータの同期を指示する。そして、プライマリ1において、Put失敗データ同期部17が、Put失敗データ名保持部16を参照し、ターシャリ3と連携してデータの同期処理を行うステップS55。なお、プライマリ1による同期処理は、障害発生直後はセカンダリ2に障害が発生しているため失敗するが、しばらくするとセカンダリ2の故障が検出され、ターシャリ3がセカンダリ2に昇格する。すると、新たにセカンダリとなった旧ターシャリに対してプライマリ1が同期処理を開始する。また、同期処理が完了するまで、プライマリ1は、該当データに対する他のPut要求は待たせ、Get要求はリトライを要求するエラーを返す。エラーを受け取ったクライアント5は、多重化チェーンの最後尾に対してGet要求を発行する。多重化チェーンの最後尾へのGetはブロックされないため、最後尾のノードはGet処理を実行することができる。このように、セカンダリ2がPut要求をターシャリ3に発行した後でセカンダリ2に障害が発生すると、プライマリ1がタイムアウトを検出して同期処理を開始するので、分散ストレージシステム100はデータの一貫性を保持することができる。なお、ここでは、ターシャリ3がセカンダリ2にOKを返信した時点でセカンダリ2に障害が発生している場合について説明した。しかし、セカンダリ2がターシャリ3からOKを受信してプライマリ1にOKを送信する前にセカンダリ2に障害が発生した場合にも同様に、プライマリ1がタイムアウトを検出し、同期処理を行うことができる。図6は、実施例に係る分散ストレージシステム100による異常時のPut処理の処理手順を示す第2のフローチャートである。なお、図6は、図13に示したケース2の障害が発生した場合の処理手順を示す。また、図6において、ステップS1~ステップS9の処理は図2の処理と同様であるので、ここでは説明を省略する。図6に示すように、ターシャリ3がセカンダリ2に返答する際に、ネットワークに一時的な通信障害が起こると、セカンダリ2のノード間Put要求部14は、Put要求に対する応答がないので、タイムアウトを検出するステップS61。すると、セカンダリ2において、ノード間Put要求部14は、失敗をPutGet実行部13に通知する。すると、セカンダリ2において、PutGet実行部13は、プライマリ1にタイムアウトによるエラーを返信するステップS62とともに、Putを要求されたデータの書き込みをデータ記憶部11に行うステップS63。そして、セカンダリ2において、PutGet実行部13は、Putを要求されたデータのデータ名をPut失敗データ名保持部16に書き込むステップS64。そして、プライマリ1のノード間Put要求部14は、タイムアウトによるエラーを受信するステップS65と、PutGet実行部13に通知する。すると、プライマリ1において、PutGet実行部13は、クライアント5にタイムアウトによるエラーを返信するステップS66とともに、Putを要求されたデータの書き込みをデータ記憶部11に行うステップS67。そして、プライマリ1において、PutGet実行部13は、Putを要求されたデータのデータ名をPut失敗データ名保持部16に書き込みステップS68、Put失敗データ同期部17にデータの同期を指示する。そして、Put失敗データ同期部17が、Put失敗データ名保持部16を参照し、セカンダリ2およびターシャリ3と連携してデータの同期処理を行うステップS69。このように、ターシャリ3がセカンダリ2に返答する際にネットワークに一時的な通信障害が起きると、セカンダリ2がタイムアウトを検出してプライマリ1に返信する。そして、タイムアウトの通知を受信したプライマリ1が同期処理を開始するので、分散ストレージシステム100はデータの一貫性を保持することができる。図7は、実施例に係る分散ストレージシステム100による異常時のPut処理の処理手順を示す第3のフローチャートである。なお、図7は、図13に示したケース3の障害が発生した場合の処理手順を示す。また、図7において、ステップS1~ステップS12の処理は図2の処理と同様であるので、ここでは説明を省略する。図7に示すように、セカンダリ2がプライマリ1に返答する際に、ネットワークに一時的な通信障害が起こると、プライマリ1のノード間Put要求部14は、Put要求に対する応答がないので、タイムアウトを検出するステップS71。すると、プライマリ1において、ノード間Put要求部14は、失敗をPutGet実行部13に通知する。すると、PutGet実行部13は、クライアント5にタイムアウトによるエラーを返信するステップS72とともに、Putを要求されたデータの書き込みをデータ記憶部11に行うステップS73。そして、プライマリ1において、PutGet実行部13は、Putを要求されたデータのデータ名をPut失敗データ名保持部16に書き込みステップS74、Put失敗データ同期部17にデータの同期を指示する。そして、プライマリ1において、Put失敗データ同期部17が、Put失敗データ名保持部16を参照し、セカンダリ2およびターシャリ3と連携してデータの同期処理を行うステップS75。このように、セカンダリ2がプライマリ1に返答する際にネットワークに一時的な通信障害が起きると、セカンダリ1がタイムアウトを検出して同期処理を開始するので、分散ストレージシステム100はデータの一貫性を保持することができる。次に、同期処理の処理手順について説明する。図8は、同期処理の処理手順を示すフローチャートである。なお、図8では、プライマリ1およびセカンダリ2がPut失敗データ名保持部16にPutが失敗したデータのデータ名としてaを記憶し、プライマリ1、セカンダリ2およびターシャリ3がデータの同期を行う。図8に示すように、プライマリ1のPut失敗データ同期部17は、セカンダリ2に対してデータ名aのGet要求を発行するステップS81。すると、セカンダリ2のPutGet実行部13がセカンダリ2のPut失敗データ同期部17に対してターシャリ3へのGet要求の発行を指示し、セカンダリ2のPut失敗データ同期部17がターシャリ3に対してデータ名aのGet要求を発行するステップS82。すると、ターシャリ3のPutGet実行部13がデータ名aのデータをデータ記憶部11から読み出してセカンダリ2に対して返信するステップS83。すると、セカンダリ2のPut失敗データ同期部17がデータを受け取ってセカンダリ2のPutGet実行部13に渡し、セカンダリ2のPutGet実行部13がデータ記憶部11へのデータ書き込み処理を実行するステップS84。また、セカンダリ2のPut失敗データ同期部17は、Put失敗データ名保持部16が保持するPut失敗データ名からデータ名aを削除しステップS85、データ名aに対するGetロックを解除するステップS86。そして、セカンダリ2のPutGet実行部13が、プライマリ1に対してデータ名aのデータを返信するステップS87。すると、プライマリ1のPut失敗データ同期部17がデータを受け取ってプライマリ1のPutGet実行部13に渡し、プライマリ1のPutGet実行部13がデータ記憶部11へのデータ書き込み処理を実行するステップS88。また、プライマリ1のPut失敗データ同期部17は、Put失敗データ名保持部16が保持するPut失敗データ名からデータ名aを削除しステップS89、データ名aに対するGetロックを解除するステップS90。このように、プライマリ1、セカンダリ2およびターシャリ3が同期処理を行うことによって、分散ストレージシステム100は、Putに失敗したデータの一貫性を保持することができる。上述してきたように、実施例では、ノード間Put要求部14が多重化チェーンの順序が次のノードに発行したPut要求に対するタイムアウトを検出してPutGet実行部13に通知する。すると、PutGet実行部13は、多重化チェーンの順序が前のノードまたはクライアント5にエラーを返信するとともにPut失敗データ同期部17にPutに失敗したデータの同期を指示し、Put失敗データ同期部17が同期処理を行う。したがって、分散ストレージシステム100は、Put処理中に一部のノードに障害やネットワークに一時的な通信障害が発生した場合にも、データの一貫性を保持することができる。なお、プライマリ1は、同期処理が完了するまでは他のPut要求を待たせ、Get要求はエラーを返す。また、Get要求でエラーを受け取ったクライアント5は、多重化チェーンの最後尾に対してGet要求を発行する。したがって、分散ストレージシステム100は、各ノードに余計なデータを保持させることなく、常に矛盾しないデータをクライアント5に返すことができる。なお、実施例では、各ノードがプライマリ、セカンダリ、ターシャリのいずれかの役割を有する場合について説明した。しかしながら、各ノードは複数の役割を有することが可能であり、データごとに異なる役割を果たすことが可能である。そこで、各ノードが複数の役割を有する場合の同期処理について図9および図10を用いて説明する。図9は、各ノードが複数の役割を有する場合に保持するデータの一例を示す図である。図9で、スロットとは、データ名の名前空間を分割したものであり、データがどのスロットに属するかはデータ名から一意に決定される。図9では名前空間は3つのスロット-1、スロット-2およびスロット-3に分割されている。そして、ノードAはスロット-1に属するデータに対してはプライマリの役割を果たし、スロット-2に属するデータに対してはターシャリの役割を果たし、スロット-3に属するデータに対してはセカンダリの役割を果たす。また、ノードBはスロット-1に属するデータに対してはセカンダリの役割を果たし、スロット-2に属するデータに対してはプライマリの役割を果たし、スロット-3に属するデータに対してはターシャリの役割を果たす。また、ノードCはスロット-1に属するデータに対してはターシャリの役割を果たし、スロット-2に属するデータに対してはセカンダリの役割を果たし、スロット-3に属するデータに対してはプライマリの役割を果たす。また、ノードの障害、ノードの障害からの回復、ノードの再配置などによりノード間でのデータの移動や各ノードの有する役割の変更が発生した場合、データの移動や役割の変更はスロット単位で行われる。例えば、スロット-1に対するプライマリの役割は、ノード再配置によりノードAの役割から新たなノードDの役割に変更されることがある。また、このような、ノードの障害、ノードの障害からの回復、ノードの再配置などによるノード間でのデータの移動や各ノードの有する役割の変更は、同期処理中にも発生する。したがって、Put失敗データ名の移動も同期処理中に発生する。そこで、各ノードのPut失敗データ名保持部16は、スロット単位でPut失敗データ名を保持する。例えば、図9に示すように、ノードAは、スロット-1に属するデータに関してはa、b、c、y、zをPut失敗データ名として保持し、スロット-3に属するデータに関してはmogeをPut失敗データ名として保持する。ただし、ノードAは、スロット-2に属するデータに対してはターシャリすなわち多重化チェーンの最後尾の役割を果たすので、スロット-2に関してはPut失敗データ名を保持しない。ここで、スロット-1に対するプライマリの役割が、ノード再配置によりノードAの役割から新たなノードDの役割に変更され、ノードAからノードDにスロット-1のデータがコピーされたとすると、ノードAのスロット-1に属するPut失敗データ名はノードDに移動され、ノードAから削除される。また、図9に示すスロット-2の状況において、ターシャリであるノードAで障害が発生し、セカンダリであるノードCが多重化チェーンの最後尾となると、データ名aaはPut失敗データ名から削除される。その理由は、多重化チェーンの最後尾にあるデータを正しいデータとみなすためである。このように、Put失敗データ名保持部16が、スロット単位でPut失敗データ名を保持することによって、分散ストレージシステム100は、ノード再配置時等に発生する同期対象データの変更を効率良く行うことができる。図10は、各ノードが複数の役割を有する場合の同期処理の処理手順を示すフローチャートである。なお、図10では、スロット-3に属するデータ名xyzに対してノードCがプライマリ1として動作し、ノードAがセカンダリ2として動作し、ノードBがターシャリ3として動作する。また、ノードCだけがPut失敗データ名保持部16にPutが失敗したデータ名としてxyzを保持する。図10に示すように、プライマリ1であるノードCのPut失敗データ同期部17は、セカンダリ2であるノードAに対してデータ名xyzのGet要求を発行するステップS91。すると、ノードAのPutGet実行部13がノードAのPut失敗データ同期部17に対してターシャリ3であるノードBへのGet要求の発行を指示し、ノードAのPut失敗データ同期部17がノードBに対してデータ名xyzのGet要求を発行するステップS92。すると、ノードBのPutGet実行部13がデータ名xyzのデータをデータ記憶部11から読み出してノードAに対して返信するステップS93。すると、ノードAのPut失敗データ同期部17がデータを受け取ってノードAのPutGet実行部13に渡し、ノードAのPutGet実行部13がノードCに対してデータ名xyzのデータを返信するステップS94。すると、ノードCのPut失敗データ同期部17がデータを受け取ってノードCのPutGet実行部13に渡し、ノードCのPutGet実行部13がデータ記憶部11へのデータ書き込み処理を実行するステップS95。また、ノードCのPut失敗データ同期部17はPut失敗データ名保持部16が保持するPut失敗データ名からスロット-3に含まれるデータ名xyzを削除しステップS96、データ名xyzに対するGetロックを解除するステップS97。このように、各ノードはスロットごとに異なる役割を果たすため、スロットごとに異なるノードが同期処理を開始する。また、実施例では、ストレージ装置としてのノードについて説明したが、ノードが有する構成をソフトウェアによって実現することで、同様の機能を有するデータ管理プログラムを得ることができる。そこで、データ管理プログラムを実行するコンピュータについて説明する。図11は、実施例に係るデータ管理プログラムを実行するコンピュータの構成を示す機能ブロック図である。図11に示すように、コンピュータ200は、RAM210と、CPU220と、HDD230と、LANインタフェース240と、入出力インタフェース250と、DVDドライブ260とを有する。RAM210は、プログラムやプログラムの実行途中結果などを記憶するメモリであり、CPU220は、RAM210からプログラムを読み出して実行する中央処理装置である。HDD230は、プログラムやデータを格納するディスク装置であり、クライアント5からPutされたデータを記憶する。LANインタフェース240は、コンピュータ200をLAN経由で他のコンピュータに接続するためのインタフェースである。入出力インタフェース250は、マウスやキーボードなどの入力装置および表示装置を接続するためのインタフェースであり、DVDドライブ260は、DVDの読み書きを行う装置である。そして、コンピュータ200において実行されるデータ管理プログラム211は、DVDに記憶され、DVDドライブ260によってDVDから読み出されてコンピュータ200にインストールされる。あるいは、データ管理プログラム211は、LANインタフェース240を介して接続された他のコンピュータシステムのデータベースなどに記憶され、これらのデータベースから読み出されてコンピュータ200にインストールされる。そして、インストールされたデータ管理プログラム211は、HDD230に記憶され、RAM210に読み出されてCPU220によって実行される。また、実施例では、同期処理においてターシャリ3が記憶するデータをプライマリ1まで転送する場合について説明した。しかしながら、同期処理において他の方法を用いることもできる。例えば、各データにバージョン番号などを付与し、まずターシャリ3が記憶するバージョン番号をプライマリ1まで転送する。そして、バージョン番号で特定されるデータをプライマリ1が有しない場合にのみデータをターシャリ3からプライマリ1まで転送する。このように、同期処理を2段階にすることで、分散ストレージシステムは、同期処理時のデータ転送量を削減することができる。また、実施例では、PutGet実行部13は、Putの要求元に返答を返してからデータ記憶部11への書き込みを実行している。しかしながら、PutGet実行部13は、返答を返す前にデータ記憶部11への書き込みを実行することもできる。データ記憶部11への書き込みタイミングは、静的に決められこともあれば、ストレージ装置故障に伴う多重度の変化等に応じて動的に決められることもある。例えば、PutGet実行部13は、正常時には返答を返してからデータ記憶部11への書き込みを実行し、多重度が1となってしまった場合のみ、返答を返す前にデータ記憶部11への書き込みを実行することもできる。また、実施例では、分散ストレージシステム100が3台のノードを有する場合について説明したが、本発明はこれに限定されるものではなく、分散ストレージシステムが4台以上のノードを有する場合にも同様に適用することができる。すなわち、プライマリ1とターシャリ3の間に複数のセカンダリ2がある場合にも本発明を同様に適用することができる。この場合、複数のセカンダリ2のいずれかに障害が発生したときには、多重化チェーンで順番が前のノードによってタイムアウトが検出され、多重化チェーンを逆にたどってプライマリ1にタイムアウトによるエラーが通知される。そして、プライマリ1は、障害が発生したノード以外のノードとの間で同期処理を行う。また、複数のセカンダリ2のうちの2つのセカンダリ間を接続するネットワークに一時的な通信障害が発生した場合には、Put要求を発行したセカンダリ2によってタイムアウトが検出される。そして、タイムアウトを検出したセカンダリ2から多重化チェーンを逆にたどってプライマリ1にタイムアウトによるエラーが通知される。そして、プライマリ1は、一時的な通信障害が復旧すると他のノードとの間で同期処理を行う。また、実施例では、分散ストレージシステム100が3台のノードを有する場合について説明したが、本発明はこれに限定されるものではなく、分散ストレージシステムが2台のノードを有する場合にも同様に適用することができる。すなわち、分散ストレージシステムがプライマリ1とターシャリ3を有し、プライマリ1とターシャリ3を接続するネットワークに一時的な通信障害が発生した場合には、Put要求を発行したプライマリ1によってタイムアウトが検出される。そして、タイムアウトを検出したプライマリ1は、一時的な通信障害が復旧するとターシャリ3との間で同期処理を行う。