(57)【特許請求の範囲】
【請求項１】
第１の記憶領域を含む記憶手段と、
前記第１の記憶領域に対するデータの書き込み要求が取得されると、他の情報処理装置に前記データの書き込みを要求する要求手段と、
前記他の情報処理装置が備える他の記憶手段の、前記第１の記憶領域に対応する第２の記憶領域に対して、前記データの書き込みが正常に行われたことを、前記他の情報処理装置からの応答に基づいて検出した場合、前記第１の記憶領域に対して前記データの書き込みを行い、前記他の情報処理装置から応答が受信されない場合、前記第１の記憶領域に対して前記データの書き込みを行わない書込手段と、
前記他の情報処理装置から応答が受信されない場合に、前記データの書き込みを行わなかった前記第１の記憶領域に記憶されているデータを、前記他の情報処理装置に送信して前記第２の記憶領域に書き込ませる同期手段と、
を有する情報処理装置。
【請求項２】
前記同期手段は、前記データの書き込み要求の後に他のデータの書き込み要求が取得されたときに、前記第１の記憶領域に記憶されているデータを前記他の情報処理装置に送信する、請求項１記載の情報処理装置。
【請求項３】
前記同期手段は、所定周期のタイミングになったときに、前記第１の記憶領域に記憶されているデータを前記他の情報処理装置に送信する、請求項１記載の情報処理装置。
【請求項４】
前記同期手段は、前記第１の記憶領域に記憶されているデータが前記第２の記憶領域に正常に書き込まれたことを検出しない場合、継続的に、前記第１の記憶領域に記憶されているデータを前記他の情報処理装置に送信する、請求項１乃至３の何れか一項に記載の情報処理装置。
【請求項５】
データを記憶する記憶手段を備える複数のノードを含むストレージシステムの中の一のノードが実行するストレージ制御方法であって、
自ノードが備える記憶手段の第１の記憶領域に対するデータの書き込み要求が取得されると、他のノードに前記データの書き込みを要求し、
前記他のノードが備える記憶手段の、前記第１の記憶領域に対応する第２の記憶領域に対して、前記データの書き込みが正常に行われたことを、前記他のノードからの応答に基づいて検出した場合、前記第１の記憶領域に対して前記データの書き込みを行い、
前記他のノードから応答が受信されない場合、前記第１の記憶領域に対して前記データの書き込みを行わず、
前記データの書き込みを行わなかった前記第１の記憶領域に記憶されているデータを、前記他のノードに送信して前記第２の記憶領域に書き込ませる、
ストレージ制御方法。
【請求項６】
データを記憶する記憶手段を備える複数のノードを含むストレージシステムの中の一のノードを制御するプログラムであって、前記一のノードが備えるコンピュータに、
自ノードが備える記憶手段の第１の記憶領域に対するデータの書き込み要求が取得されると、他のノードに前記データの書き込みを要求し、
前記他のノードが備える記憶手段の、前記第１の記憶領域に対応する第２の記憶領域に対して、前記データの書き込みが正常に行われたことを、前記他のノードからの応答に基づいて検出した場合、前記第１の記憶領域に対して前記データの書き込みを行い、
前記他のノードから応答が受信されない場合、前記第１の記憶領域に対して前記データの書き込みを行わず、
前記データの書き込みを行わなかった前記第１の記憶領域に記憶されているデータを、前記他のノードに送信して前記第２の記憶領域に書き込ませる、
処理を実行させるプログラム。
【発明の詳細な説明】
【技術分野】
【０００１】
本発明は情報処理装置、ストレージ制御方法およびプログラムに関する。
【背景技術】
【０００２】
現在、ＨＤＤ（Hard Disk Drive）などの記憶装置を用いてデータを保存するストレージシステムが利用されている。ストレージシステムの中には、記憶装置を備えた複数の物理的ノード（ストレージノードと呼ぶことがある）を有し、ストレージノード間をネットワークで接続したものがある。ストレージノードとして、コンピュータを用いてもよい。ストレージシステムは、同一内容のデータを異なるストレージノードに保存することで、データを冗長化し耐故障性を向上させることができる。その場合、あるストレージノード上のデータと当該データに対応する他のストレージノード上のデータとは、データが更新された後も、内容が整合している（同期している）ことが好ましい。
【０００３】
なお、ローカルストレージと複数のリモートストレージを備え、タイムスタンプ付きビットマップを用いてストレージ間で同期をとるシステムが提案されている。また、ホストが正ストレージと副ストレージの両方にデータを書き込むシステムで、障害が発生したとき、ホストを経由せずにストレージ間でデータ更新履歴（ジャーナル）を伝送して同期をとるシステムが提案されている。また、複数の通信線（物理パス）を用いてストレージ間で複数の論理ボリュームを複製するとき、管理コンピュータが、物理パスと論理ボリュームの関係を管理し、物理パスの障害の影響を特定するシステムが提案されている。
【先行技術文献】
【特許文献】
【０００４】
【特許文献１】特開２００４−２７２８８４号公報
【特許文献２】特開２００７−８６９７２号公報
【特許文献３】特開２０１０−１１３５５９号公報
【発明の概要】
【発明が解決しようとする課題】
【０００５】
ところで、データの冗長化のため、第１のストレージノードに対してデータの書き込み（上書きとなる場合を含む）が要求されたときに、第１のストレージノードに加えて第２のストレージノードにもデータを書き込むストレージシステムを考える。書き込み要求を受け付けた第１のストレージノードは、第２のストレージノードで書き込みが成功したことを確認してから、自ノードの書き込みを行う方法が考えられる。
【０００６】
しかし、データ書き込みのシーケンスの途中でストレージノード間のネットワークに障害が発生すると、第１のストレージノードが、第２のストレージノードで書き込みが成功したか否かわからないという状況が生じ得る。その結果、第１のストレージノードと第２のストレージノードとの間で、データの整合性が失われる可能性がある。例えば、第１のストレージノードが第２のストレージノードに書き込み要求を転送した後、第２のストレージノードが書き込み成功の応答を送信する前に、ネットワーク障害が発生する場合が考えられる。その場合、第２のストレージノードで書き込みが成功していても、第１のストレージノードは、応答を受信しないため書き込み失敗として取り扱う可能性がある。
【０００７】
１つの側面では、本発明は、ストレージステムにおけるデータの整合性を回復できる情報処理装置、ストレージ制御方法およびプログラムを提供することを目的とする。
【課題を解決するための手段】
【０００８】
記憶手段と要求手段と書込手段と同期手段とを有する情報処理装置が提供される。記憶手段は、第１の記憶領域を含む。要求手段は、第１の記憶領域に対するデータの書き込み要求が取得されると、他の情報処理装置にデータの書き込みを要求する。書込手段は、他の情報処理装置が備える他の記憶手段の、第１の記憶領域に対応する第２の記憶領域に対して、データの書き込みが正常に行われたことを、他の情報処理装置からの応答に基づいて検出した場合、第１の記憶領域に対してデータの書き込みを行い、他の情報処理装置から応答が受信されない場合、第１の記憶領域に対してデータの書き込みを行わない。同期手段は、他の情報処理装置から応答が受信されない場合に、データの書き込みを行わなかった第１の記憶領域に記憶されているデータを、他の情報処理装置に送信して第２の記憶領域に書き込ませる。
【０００９】
また、データを記憶する記憶手段を備える複数のノードを含むストレージシステムの中の一のノードが実行するストレージ制御方法が提供される。ストレージ制御方法では、自ノードが備える記憶手段の第１の記憶領域に対するデータの書き込み要求が取得されると、他のノードにデータの書き込みを要求する。他のノードが備える記憶手段の、第１の記憶領域に対応する第２の記憶領域に対して、データの書き込みが正常に行われたことを、他のノードからの応答に基づいて検出した場合、第１の記憶領域に対してデータの書き込みを行う。他のノードから応答が受信されない場合、第１の記憶領域に対してデータの書き込みを行わない。データの書き込みを行わなかった第１の記憶領域に記憶されているデータを、他のノードに送信して第２の記憶領域に書き込ませる。
【００１０】
また、データを記憶する記憶手段を備える複数のノードを含むストレージシステムの中の一のノードに、ストレージ制御方法を実行させるプログラムが提供される。
【発明の効果】
【００１１】
ストレージステムにおけるデータの整合性を回復できる。
【図面の簡単な説明】
【００１２】
【図１】第１の実施の形態のストレージシステムを示す図である。
【図２】第２の実施の形態のストレージシステムを示す図である。
【図３】ストレージノードのハードウェア例を示すブロック図である。
【図４】第２の実施の形態のソフトウェア例を示すブロック図である。
【図５】アクセス処理の例を示すフローチャートである。
【図６】同期処理の例を示すフローチャートである。
【図７】同期処理の他の例を示すフローチャートである。
【図８】データアクセスのシーケンス例を示す図である。
【図９】同期状態の第１の変化例を示す図である。
【図１０】データアクセスのシーケンス例（続き）を示す図である。
【図１１】同期状態の第２の変化例を示す図である。
【図１２】ノード設定変更のシーケンス例を示す図である。
【図１３】同期状態の第３の変化例を示す図である。
【図１４】第３の実施の形態のソフトウェア例を示す図である。
【図１５】同期パトロールのシーケンス例を示す図である。
【図１６】第４の実施の形態のデータ構造例を示す図である。
【発明を実施するための形態】
【００１３】
以下、本実施の形態を図面を参照して説明する。
［第１の実施の形態］
図１は、第１の実施の形態のストレージシステムを示す図である。第１の実施の形態のストレージシステムは、情報処理装置１０，２０を有する。情報処理装置１０と情報処理装置２０とは、ネットワークで接続されている。情報処理装置１０，２０は、ＣＰＵ（Central Processing Unit）やＲＡＭ（Random Access Memory）を備えるコンピュータであってもよい。情報処理装置１０，２０を、ストレージノードと呼んでもよい。
【００１４】
情報処理装置１０は、記憶手段１１、要求手段１２、書込手段１３および同期手段１４を有する。情報処理装置２０は、記憶手段２１を有する。記憶手段１１，２１は、ＲＡＭなどの揮発性の記憶装置でもよく、ＨＤＤやＳＳＤ（Solid State Drive）などの不揮発性の記憶装置でもよい。要求手段１２、書込手段１３および同期手段１４の全部または一部は、ＲＡＭに記憶されＣＰＵにより実行されるプログラムとして実装してもよく、ＡＳＩＣ（Application Specific Integrated Circuit）などの回路として実装してもよい。
【００１５】
記憶手段１１，２１は、データを記憶する。記憶手段１１は、記憶領域１１ａを含む。記憶手段２１は、記憶手段１１の記憶領域１１ａに対応する記憶領域２１ａを含む。例えば、記憶領域１１ａと記憶領域２１ａには、各記憶手段内で同一のアドレスが付与されている。情報処理装置１０，２０の間でデータの整合性が維持されているとき、例えば、記憶領域１１ａと記憶領域２１ａに同一内容のデータが記憶される。
【００１６】
要求手段１２は、記憶領域１１ａに対するデータの書き込み要求が取得されると、ネットワークを介して、情報処理装置２０にデータの書き込みを要求する。記憶領域１１ａに対する書き込み要求は、例えば、図示しない他の情報処理装置（例えば、クライアントコンピュータ）からネットワークを介して受信される。取得する書き込み要求は、例えば、記憶領域１１ａに書き込むデータと、記憶領域１１ａの先頭位置を示すオフセットおよびデータサイズの情報とを含む。情報処理装置２０への要求は、例えば、取得した書き込み要求に含まれるデータと、記憶領域２１ａの先頭位置を示すオフセット（記憶領域１１ａのオフセットと同一でもよい）およびデータサイズの情報とを含む。
【００１７】
情報処理装置２０は、情報処理装置１０からデータの書き込みが要求されると、記憶領域１１ａに対応する記憶領域２１ａにデータを書き込む。そして、情報処理装置２０は、データの書き込みが正常に行われたことを情報処理装置１０に応答する。ただし、データ書き込みのシーケンスの途中で、ネットワーク障害が発生する可能性がある。情報処理装置１０がデータの書き込みを要求した時点でネットワーク障害が発生している場合、要求が情報処理装置２０に到達せず、記憶領域２１ａへのデータ書き込みは行われない。一方で、情報処理装置１０がデータの書き込みを要求した後にネットワーク障害が発生した場合、要求が情報処理装置２０に到達し、記憶領域２１ａへのデータ書き込みは行われるものの、情報処理装置２０から情報処理装置１０に応答が到達しない可能性がある。
【００１８】
書込手段１３は、要求手段１２が情報処理装置２０にデータの書き込みを要求した後、情報処理装置２０からの応答を待つ。そして、書込手段１３は、記憶領域２１ａに対してデータの書き込みが正常に行われたことを、情報処理装置２０からの応答に基づいて検出した場合、取得している書き込み要求に従って、記憶領域１１ａに対してデータの書き込みを行う。また、書込手段１３は、情報処理装置２０から応答が受信されない場合（例えば、要求手段１２が書き込みを要求してから所定時間以内に応答が受信されない場合）、記憶領域１１ａに対してデータの書き込みを行わない。
【００１９】
同期手段１４は、情報処理装置２０から応答が受信されなかった場合、書き込みを行わなかった記憶領域１１ａからデータを読み出し、情報処理装置２０にデータの書き込みを要求する。情報処理装置２０への要求は、例えば、記憶領域１１ａから読み出したデータと、記憶領域２１ａの先頭位置を示すオフセット（記憶領域１１ａのオフセットと同一でもよい）およびデータサイズの情報とを含む。同期手段１４がデータの書き込みを要求した時点でネットワークが復旧していれば、要求が情報処理装置２０に到達し、記憶領域１１ａに記憶されていたデータが記憶領域２１ａに書き込まれる。
【００２０】
ここで、同期手段１４は、記憶領域１１ａに記憶されたデータを情報処理装置２０に送信して記憶領域１１ａ，２１ａを同期させる処理を、情報処理装置１０が他のデータ書き込み要求を取得したことを契機として実行してもよい。また、他のデータ読み出し要求および他のデータ書き込み要求の何れか一方を取得したことを契機として、同期処理を実行してもよい。また、同期手段１４は、情報処理装置２０から応答が受信されないことにより書き込みが行われなかった記憶領域が存在するか周期的に確認し、存在するときに同期処理を実行してもよい。同期手段１４は、ネットワークがまだ復旧していないことにより同期処理が失敗した場合、成功するまで継続的に同期処理を実行してもよい。
【００２１】
例えば、記憶領域１１ａ，２１ａにデータ＃１が記憶されているとする。情報処理装置１０は、データ＃２を記憶領域１１ａに書き込むことを示す書き込み要求を取得すると、情報処理装置２０にデータ＃２を送信する。情報処理装置２０は、記憶領域２１ａに記憶されるデータを、データ＃１からデータ＃２に書き換える。このとき、情報処理装置１０，２０間のネットワークに障害が発生したとする。すると、情報処理装置１０は、情報処理装置２０で書き込みが成功したことを示す応答を情報処理装置２０から受信せず、記憶領域１１ａにデータを＃２を書き込まないことになる。
【００２２】
その結果、記憶領域１１ａ，２１ａに記憶されているデータの整合性が失われる。そこで、情報処理装置１０は、他の書き込み要求を取得したタイミングや所定の周期的タイミングなどのタイミングを待って、同期処理を開始する。情報処理装置１０は、記憶領域１１ａに記憶されたデータ＃１を読み出し、情報処理装置２０に送信する。このとき、情報処理装置１０，２０間のネットワークが復旧しているとする。すると、情報処理装置２０は、記憶領域２１ａに記憶されるデータを、データ＃２から受信したデータ＃１に書き換える。その結果、記憶領域１１ａ，２１ａに記憶されているデータの整合性が回復する。
【００２３】
なお、情報処理装置１０を、データの読み出しや書き込みなどのアクセスを受け付けるプライマリノードに設定し、情報処理装置２０を、バックアップ用のデータを保持するセカンダリノードに設定してもよい。また、記憶手段１１，２１の記憶領域を複数のセグメントに分割し、セグメント毎に、情報処理装置１０，２０の何れか一方をプライマリノードとして選択し他方をセカンダリノードとして選択してもよい。その場合、情報処理装置２０は、要求手段１２、書込手段１３および同期手段１４と同様のモジュールを有し、一部のセグメントについて書き込み要求の受け付けや同期処理を行う。
【００２４】
第１の実施の形態の情報処理装置１０によれば、記憶手段１１の記憶領域１１ａに対するデータの書き込み要求が取得されると、情報処理装置２０にデータの書き込みを要求する。記憶手段２１の記憶領域２１ａに対してデータの書き込みが正常に行われたことを、情報処理装置２０からの応答に基づいて検出した場合、記憶領域１１ａに対してデータの書き込みを行う。一方、情報処理装置２０から応答が受信されない場合、記憶領域１１ａに対してデータの書き込みを行わない。その後、記憶領域１１ａに記憶されているデータを、情報処理装置２０に送信して記憶領域２１ａに書き込ませる。
【００２５】
これにより、ネットワーク障害によって情報処理装置２０から情報処理装置１０に応答が到達せず、その結果として記憶領域１１ａ，２１ａのデータの整合性が失われても、後にデータの整合性を回復することができる。また、例えば、情報処理装置１０が、情報処理装置２０から応答がないことを検出してすぐにデータを再送する方法と比べ、他のデータ書き込み要求の取得などのタイミングを待って同期処理を行うことで、ネットワークが復旧して同期に成功する確率が高くなる。
【００２６】
なお、情報処理装置２０から情報処理装置１０に応答が到達しないとき、記憶領域２１ａに対するデータの書き込みが行われなかったために、データの整合性が失われていない可能性もある。しかし、情報処理装置１０は、情報処理装置２０から応答を受信しないため、データの整合性が失われているか否か直接にはわからない。そのため、情報処理装置１０は、応答を受信しないときは、同期処理を行うことが好ましい。
【００２７】
［第２の実施の形態］
図２は、第２の実施の形態のストレージシステムを示す図である。第２の実施の形態のストレージシステムは、ストレージノード１００，２００、クライアントノード３００および制御ノード４００を含む。各ノードは、ネットワーク３０に接続されている。ネットワーク３０は、有線または無線のＬＡＮ（Local Area Network）を含んでもよい。
【００２８】
ストレージノード１００，２００は、不揮発性の記憶装置にデータを記憶するサーバコンピュータである。同一内容のデータがストレージノード１００，２００の両方に記憶され、データが冗長化されている。ストレージノード１００，２００の一方がプライマリノードに設定され、他方がセカンダリノードに設定される。例えば、ストレージノード１００がプライマリノード、ストレージノード２００がセカンダリノードである。プライマリノードは、クライアントノード３００からアクセスを受け付ける。セカンダリノードは、バックアップ用のデータを保持する。データの読み出しはプライマリノードから行われ、データの書き込みはプライマリノードとセカンダリノードの両方に対して行われる。
【００２９】
クライアントノード３００は、ストレージノード１００，２００に記憶されたデータを使用するコンピュータである。クライアントノード３００は、ユーザが操作する端末装置でもよくサーバ装置でもよい。クライアントノード３００は、ストレージノード１００，２００のうちプライマリノードにアクセスする。何れのストレージノードがプライマリノードであるかは、制御ノード４００に問い合わせて確認してもよい。アクセスには、データの読み出し要求（リード要求）とデータの書き込み要求（ライト要求）とが含まれる。リード要求およびライト要求は、記憶領域の先頭位置を示すオフセットとデータサイズの情報を含む。ライト要求は、更に、当該記憶領域に書き込まれるデータを含む。
【００３０】
制御ノード４００は、ストレージノード１００，２００を管理するためのコンピュータである。制御ノード４００は、端末装置でもよくサーバ装置でもよい。制御ノード４００は、ストレージノード１００，２００の中からプライマリノードを選択し、ストレージノード１００，２００に、プライマリノードとセカンダリノードの何れとして動作するかを指示する。また、制御ノード４００は、ユーザ操作または所定の入れ替えアルゴリズムに従って、プライマリノードとセカンダリノードを入れ替えることを決定し、ストレージノード１００，２００に入れ替えを指示する。
【００３１】
なお、ストレージノード１００は、第１の実施の形態の情報処理装置１０の一例である。ストレージノード２００は、第１の実施の形態の情報処理装置２０の一例である。
図３は、ストレージノードのハードウェア例を示すブロック図である。ストレージノード１００は、ＣＰＵ１０１、ＲＡＭ１０２、ＨＤＤ１０３、画像信号処理部１０４、入力信号処理部１０５、ディスクドライブ１０６および通信部１０７を有する。各ユニットがストレージノード１００のバスに接続されている。ストレージノード２００、クライアントノード３００および制御ノード４００も、図３に示したストレージノード１００と同様
ハードウェア構造によって実現することができる。
【００３２】
ＣＰＵ１０１は、ストレージノード１００における情報処理を制御する演算装置（プロセッサ）である。ＣＰＵ１０１は、ＨＤＤ１０３に記憶されたプログラムやデータの少なくとも一部を読み出し、ＲＡＭ１０２に展開してプログラムを実行する。なお、ストレージノード１００は、複数の演算装置を備えて、情報処理を分散して実行してもよい。
【００３３】
ＲＡＭ１０２は、ＣＰＵ１０１が実行するプログラムやデータを一時的に記憶しておく揮発性メモリである。なお、ストレージノード１００は、ＲＡＭ以外の種類のメモリを備えてもよく、複数個のメモリを備えていてもよい。
【００３４】
ＨＤＤ１０３は、ＯＳ（Operating System）プログラムやアプリケーションプログラムなどのプログラム、および、データを記憶する不揮発性の記憶装置である。ＨＤＤ１０３は、ＣＰＵ１０１の命令に従って、内蔵の磁気ディスクに対する読み書きを行う。なお、ストレージノード１００は、ＨＤＤ以外の種類の不揮発性の記憶装置（例えば、ＳＳＤ）を備えてもよく、複数の記憶装置を備えていてもよい。
【００３５】
画像信号処理部１０４は、ＣＰＵ１０１の命令に従って、ストレージノード１００に接続されたディスプレイ３１に画像を出力する。ディスプレイ３１として、例えば、ＣＲＴ（Cathode Ray Tube）ディスプレイや液晶ディスプレイなどを用いることができる。
【００３６】
入力信号処理部１０５は、ストレージノード１００に接続された入力デバイス３２から入力信号を取得し、ＣＰＵ１０１に出力する。入力デバイス３２として、例えば、マウスやタッチパネルなどのポインティングデバイス、キーボードなどを用いることができる。
【００３７】
ディスクドライブ１０６は、記録媒体３３に記録されたプログラムやデータを読み取る駆動装置である。記録媒体３３として、例えば、フレキシブルディスク（ＦＤ：Flexible Disk）やＨＤＤなどの磁気ディスク、ＣＤ（Compact Disc）やＤＶＤ（Digital Versatile Disc）などの光ディスク、光磁気ディスク（ＭＯ：Magneto-Optical disk）を使用できる。ディスクドライブ１０６は、例えば、ＣＰＵ１０１の命令に従って、記録媒体３３から読み取ったプログラムやデータをＲＡＭ１０２またはＨＤＤ１０３に格納する。
【００３８】
通信部１０７は、ネットワーク３０を介して、ストレージノード２００、クライアントノード３００および制御ノード４００と通信を行う通信インタフェースである。通信部１０７は、有線通信インタフェースでも無線通信インタフェースでもよい。
【００３９】
図４は、第２の実施の形態のソフトウェア例を示すブロック図である。
ストレージノード１００は、データ記憶部１１０、アクセス処理部１２０、ノード間転送部１３０、制御情報記憶部１４０およびノード情報変更部１５０を有する。ストレージノード２００は、データ記憶部２１０、アクセス処理部２２０、ノード間転送部２３０、制御情報記憶部２４０およびノード情報変更部２５０を有する。
【００４０】
データ記憶部１１０，２１０は、データを記憶する。データ記憶部１１０，２１０は、例えば、ＲＡＭまたはＨＤＤを用いて実現される。データの記憶領域は、当該記憶領域の先頭位置を示すオフセット（所定位置からのアドレス距離）と、当該記憶領域のサイズとを用いて指定することができる。ただし、先頭位置は、物理的なアドレスまたは論理的なアドレスを用いて指定してもよい。また、サイズを指定する代わりに、記憶領域の末尾位置を示すアドレスを指定してもよい。データ記憶部１１０とデータ記憶部２１０には、同期が維持されていれば、同一内容のデータが記憶される。同一内容のデータは、好ましくは、同一のオフセットおよびサイズによって特定される記憶領域に記憶される。
【００４１】
アクセス処理部１２０，２２０は、データに対するアクセス（リード要求およびライト要求）を受け付ける。リード要求およびライト要求は、オフセットおよびサイズの情報を含み、ライト要求は、更に書き込むデータを含む。プライマリノードに属するアクセス処理部（例えば、アクセス処理部１２０）は、クライアントノード３００からアクセスを受け付ける。セカンダリノードに属するアクセス処理部（例えば、アクセス処理部２２０）は、プライマリノードが転送するアクセスを受け付ける。
【００４２】
また、アクセス処理部１２０，２２０は、受け付けたアクセスに従って、自ノードのデータ記憶部からのデータの読み出しおよび自ノードのデータ記憶部へのデータの書き込みを行う。そして、アクセス処理部１２０，２２０は、アクセスに対するレスポンスをアクセス元に送信する。リード要求に対するレスポンスには、読み出したデータが含まれる。ライト要求に対するレスポンスには、データの書き込みが成功したこと（ＯＫ）または失敗したこと（ＮＧ）を示す情報が含まれる。ただし、プライマリノードに属するアクセス処理部は、ライト要求のとき、先にセカンダリノードにデータの書き込みを実行させ、セカンダリノードの書き込みが成功したことを確認してから自ノードの書き込みを行う。
【００４３】
また、アクセス処理部１２０，２２０は、ライト要求を処理するとき、ネットワーク３０に障害が発生することによってデータ記憶部１１０，２１０間でデータの整合性が失われる場合に備えて、後述する制御情報を自ノードの制御情報記憶部に書き込んでおく。また、プライマリノードに属するアクセス処理部（例えば、アクセス処理部１２０）は、データ記憶部１１０，２１０間でデータの整合性が失われた可能性があるとき、セカンダリノードをプライマリノードに同期させる同期処理を制御する。
【００４４】
ノード間転送部１３０，２３０は、自ノードがプライマリノードのとき、クライアントノード３００から受け付けられたライト要求をセカンダリノードに転送する。また、ノード間転送部１３０，２３０は、ライト要求に対するレスポンスを、ライト要求を転送してから所定時間以内にセカンダリノードから受信したか監視する。そして、書き込み成功、書き込み失敗またはタイムアウトの何れかを、自ノードのアクセス処理部に報告する。
【００４５】
制御情報記憶部１４０，２４０は、ストレージノード１００，２００の制御に用いられる制御情報を記憶する。制御情報は、ノード情報１４１，２４１、同期状態フラグ１４２，２４２および最終書込情報１４３，２４３を含む。
【００４６】
ノード情報１４１，２４１は、自ノードがプライマリノードとセカンダリノードの何れとして動作しているかを示す。同期状態フラグ１４２，２４２は、データ記憶部１１０，２１０が同期していることを確認したか否かを示す。同期状態フラグ１４２，２４２は、未設定（フラグ値なし）、同期（フラグＯＮ）および非同期（フラグＯＦＦ）の何れかの状態を示す。プライマリノードは、書き込み成功を示すレスポンスをセカンダリノードから受信すると、自ノードの同期状態フラグ（例えば、同期状態フラグ１４２）を「同期」に設定する。また、プライマリノードは、レスポンスを受信しない場合、自ノードの同期状態フラグを「非同期」に設定する。最終書込情報１４３，２４３は、最後に受け付けたライト要求で指定された記憶領域を示し、オフセットおよびサイズを含む。
【００４７】
ノード情報変更部１５０，２５０は、制御ノード４００からの指示に応じて、自ノードの制御情報記憶部に記憶された情報を更新する。ノード情報変更部１５０，２５０は、プライマリノードの入れ替えが指示されると、自ノードをプライマリノードからセカンダリノードに変更し、または、セカンダリノードからプライマリノードに変更する。
【００４８】
クライアントノード３００は、データアクセス部３１０を有する。データアクセス部３１０は、ストレージノード１００，２００のうちプライマリノードに対して、リード要求およびライト要求を送信する。データアクセス部３１０は、リード要求を送信した場合、データを含むレスポンスをプライマリノードから受信する。ライト要求を送信した場合、書き込みの成否を示すレスポンスをプライマリノードから受信する。データアクセス部３１０は、ストレージノード１００，２００の何れがプライマリノードであるか知らない場合、制御ノード４００に問い合わせてもよい。
【００４９】
制御ノード４００は、ノード設定部４１０を有する。ノード設定部４１０は、ユーザ操作または所定のアルゴリズムに従って、ストレージノード１００，２００に対して設定変更を要求する。例えば、制御ノード４００は、ストレージノード１００，２００に対してプライマリノードの入れ替えを指示する。
【００５０】
なお、データ記憶部１１０，２１０は、第１の実施の形態の記憶手段１１，２１の一例である。アクセス処理部１２０は、第１の実施の形態の書込手段１３の一例である。ノード間転送部１３０は、第１の実施の形態の要求手段１２と同期手段１４の一例である。
【００５１】
図５は、アクセス処理の例を示すフローチャートである。図５に示す処理は、ストレージノード１００，２００がアクセスを受け付ける毎に実行する。以下、ストレージノード１００が実行するものとして、図５に示す処理をステップ番号に沿って説明する。
【００５２】
（ステップＳ１１）アクセス処理部１２０は、アクセスを受け付けると、当該アクセスがライト要求であるか判断する。ライト要求の場合、処理をステップＳ１３に進める。ライト要求でない場合（リード要求の場合）、処理をステップＳ１２に進める。
【００５３】
（ステップＳ１２）アクセス処理部１２０は、データ記憶部１１０から、リード要求が指定するオフセットおよびサイズによって特定される記憶領域のデータを読み出す。そして、処理をステップＳ２１に進める。
【００５４】
（ステップＳ１３）アクセス処理部１２０は、ライト要求が指定するオフセットおよびサイズの情報を、最終書込情報１４３として制御情報記憶部１４０に書き込む。
（ステップＳ１４）アクセス処理部１２０は、自ノードがプライマリノードであるか判断する。プライマリノードであるか否かは、例えば、制御情報記憶部１４０に記憶されたノード情報１４１を参照することで判断できる。プライマリノードの場合、処理をステップＳ１５に進める。セカンダリノードの場合、処理をステップＳ２０に進める。
【００５５】
（ステップＳ１５）アクセス処理部１２０は、ノード間転送部１３０にライト要求の転送を指示する。ノード間転送部１３０は、セカンダリノードとしてのストレージノード２０に、アクセス処理部１２０が受け付けたライト要求を転送する。
【００５６】
（ステップＳ１６）ノード間転送部１３０は、ライト要求を転送してから所定時間以内に、セカンダリノードからレスポンスを受信したか判断する。タイムアウトを検出するため、ノード間転送部１３０は、ソフトウェアタイマまたはハードウェアタイマを使用してもよい。所定時間以内にレスポンスを受信した場合（タイムアウトしない場合）、処理をステップＳ１８に進める。所定時間以内にレスポンスを受信しない場合（タイムアウトした場合）、処理をステップＳ１７に進める。
【００５７】
（ステップＳ１７）ノード間転送部１３０は、タイムアウトをアクセス処理部１２０に通知する。アクセス処理部１２０は、制御情報記憶部１４０に記憶された同期状態フラグ１４２を「非同期」に設定する。そして、処理をステップＳ２１に進める。
【００５８】
（ステップＳ１８）ノード間転送部１３０は、セカンダリノードから受信したレスポンスが、書き込み成功（ＯＫ）を示しているか判断する。書き込み成功の場合、処理をステップＳ１９に進める。書き込み失敗（ＮＧ）の場合、処理をステップＳ２１に進める。
【００５９】
（ステップＳ１９）ノード間転送部１３０は、書き込み成功をアクセス処理部１２０に通知する。アクセス処理部１２０は、同期状態フラグ１４２を「同期」に設定する。
（ステップＳ２０）アクセス処理部１２０は、ステップＳ１１で受け付けたライト要求に含まれるデータを、ライト要求が指定するオフセットおよびサイズによって特定されるデータ記憶部１１０の記憶領域に書き込む。
【００６０】
（ステップＳ２１）アクセス処理部１２０は、アクセス元にレスポンスを送信する。アクセス処理部１２０は、データ記憶部１１０からデータを読み出した場合（ステップＳ１２）、データを含むレスポンスを送信する。データ記憶部１１０に対するデータの書き込みに成功した場合（ステップＳ２０）、書き込み成功を示すレスポンスを送信する。それ以外の場合、書き込み失敗を示すレスポンスを送信する。
【００６１】
図６は、同期処理の例を示すフローチャートである。図６に示す処理は、プライマリノードがクライアントノード３００からアクセス（リード要求またはライト要求）を受け付ける毎に、図５に示す処理の前に実行する。以下、ストレージノード１００がプライマリノードであるものとして、図６に示す処理をステップ番号に沿って説明する。
【００６２】
（ステップＳ３１）アクセス処理部１２０は、クライアントノード３００からアクセスを受け付けると、制御情報記憶部１４０に記憶された同期状態フラグ１４２を確認する。同期状態フラグ１４２が「非同期」を示している場合、処理をステップＳ３２に進める。それ以外の場合、同期処理を終了し、図５に示すアクセス処理を実行する。
【００６３】
（ステップＳ３２）アクセス処理部１２０は、制御情報記憶部１４０に記憶された最終書込情報１４３から、前回のライト要求が指定したオフセットおよびサイズを確認する。
（ステップＳ３３）アクセス処理部１２０は、データ記憶部１１０から、ステップＳ３２で確認したオフセットおよびサイズによって特定される記憶領域のデータを読み出す。ノード間転送部１３０は、セカンダリノードであるストレージノード２００に、ライト要求を送信する。このライト要求は、アクセス処理部１２０が読み出したデータと、当該データの記憶領域を示すオフセットおよびサイズの情報とを含む。
【００６４】
（ステップＳ３４）ノード間転送部１３０は、ライト要求を送信してから所定時間以内に、書き込み成功を示すレスポンスをセカンダリノードから受信したか判断する。書き込み成功を示すレスポンスを受信した場合、処理をステップＳ３５に進める。書き込み失敗を示すレスポンスを受信した場合、または、所定時間以内にレスポンスを受信しなかった場合、同期処理を終了する。なお、同期に失敗した場合、図５に示すアクセス処理は実行されず、アクセス失敗を示すレスポンスがクライアントノード３００に送信される。
【００６５】
（ステップＳ３５）ノード間転送部１３０は、書き込み成功をアクセス処理部１２０に通知する。アクセス処理部１２０は、同期状態フラグ１４２を「同期」に設定する。そして、図５に示すアクセス処理を実行する。
【００６６】
このように、ネットワーク障害などが原因でストレージノード２００からストレージノード１００にレスポンスが到達しないと、ストレージノード１００は、データ記憶部１１０，２１０が同期していない状態と判断する。すると、ストレージノード１００は、次にアクセス（リード要求またはライト要求）を受け付けたことを契機として、データ記憶部２１０をデータ記憶部１１０に同期させるよう試みる。
【００６７】
ただし、ストレージノード１００は、ストレージノード２００からレスポンスを受信しなかったときのライト要求と次に受け付けたライト要求とが、同一の記憶領域に対する書き込みを要求している場合、同期処理を省略してもよい。
【００６８】
図７は、同期処理の他の例を示すフローチャートである。図７の同期処理では、図６のステップＳ３２とステップＳ３３の間に、以下のステップＳ３２ａを実行する。
（ステップＳ３２ａ）アクセス処理部１２０は、ステップＳ３１で受け付けたアクセスがライト要求であり、当該ライト要求が指定するオフセットおよびサイズと最終書込情報１４３が示すオフセットおよびサイズとが同一であるか判断する。条件を満たす場合、処理をステップＳ３５に進める。条件を満たさない場合、処理をステップＳ３３に進める。
【００６９】
あるライト要求と次のライト要求とが同一の記憶領域を指定するものであるときは、同期処理によりストレージノード２００にデータを書き込んでも、次のライト要求の処理によって当該データが上書きされることになる。そこで、図７に示すように、ストレージノード１００は、書き込み対象の記憶領域が同一である場合には、データ記憶部１１０からデータ記憶部２１０へのデータコピーを省略してもよい。
【００７０】
図８は、データアクセスのシーケンス例を示す図である。以下、ストレージノード１００がプライマリノードであるとして、図８に示す処理をステップ番号に沿って説明する。
（ステップＳ４１）クライアントノード３００は、ストレージノード１００に、オフセットおよびサイズによって記憶領域を指定したリード要求を送信する。
【００７１】
（ステップＳ４２）ストレージノード１００は、データ記憶部１１０から、リード要求で指定された記憶領域のデータを読み出す。そして、読み出したデータを含むレスポンスを、クライアントノード３００に送信する。
【００７２】
（ステップＳ４３）クライアントノード３００は、ストレージノード１００に、オフセットおよびサイズによって記憶領域を指定したライト要求を送信する。
（ステップＳ４４）ストレージノード１００は、ライト要求が指定する記憶領域を示す最終書込情報１４３を、制御情報記憶部１４０に書き込む。また、ストレージノード１００は、ライト要求をストレージノード２００に転送する。
【００７３】
（ステップＳ４５）ストレージノード２００は、ライト要求が指定する記憶領域を示す最終書込情報２４３を制御情報記憶部２４０に書き込み、データ記憶部２１０内のライト要求で指定された記憶領域にデータを書き込む。そして、書き込みが成功したことを確認し、書き込み成功を示すレスポンスをストレージノード１００に送信する。
【００７４】
（ステップＳ４６）ストレージノード１００は、同期状態フラグ１４２を「同期」に設定し、データ記憶部１１０内のライト要求で指定された記憶領域にデータを書き込む。そして、書き込み成功を示すレスポンスを、クライアントノード３００に送信する。
【００７５】
（ステップＳ４７）クライアントノード３００は、ストレージノード１００に、オフセットおよびサイズによって記憶領域を指定したライト要求を送信する。
（ステップＳ４８）ストレージノード１００は、ライト要求が指定する記憶領域を示す最終書込情報１４３を、制御情報記憶部１４０に書き込む。また、ストレージノード１００は、ライト要求をストレージノード２００に転送する。
【００７６】
（ステップＳ４９）ストレージノード２００は、ライト要求が指定する記憶領域を示す最終書込情報２４３を制御情報記憶部２４０に書き込み、データ記憶部２１０内のライト要求で指定された記憶領域にデータを書き込む。そして、書き込みが成功したことを確認し、書き込み成功を示すレスポンスをストレージノード１００に送信する。しかし、ネットワーク３０に障害が発生し、当該レスポンスがストレージノード１００に到達しない。
【００７７】
（ステップＳ５０）ストレージノード１００は、レスポンスのタイムアウトを検出し、データ記憶部１１０にデータを書き込まず、同期状態フラグ１４２を「非同期」に設定する。そして、書き込み失敗を示すレスポンスを、クライアントノード３００に送信する。
【００７８】
図９は、同期状態の第１の変化例を示す図である。図９の上段は、ステップＳ４６が実行された後のストレージノード１００，２００の状態を示し、図９の下段は、ステップＳ５０が実行された後のストレージノード１００，２００の状態を示している。
【００７９】
ステップＳ４６が実行された後は、ストレージノード１００では、同期状態フラグ１４２が「同期」に設定されている。最終書込情報１４３は、ステップＳ４３のライト要求で指定されたオフセット＝Ｘ１，サイズ＝Ｙ１を示す。データ記憶部１１０の最終書込情報１４３が示す記憶領域には、データ＃１が書き込まれている。ストレージノード２００では、同期状態フラグ２４２は値をもたない。最終書込情報２４３は、最終書込情報１４３と同じオフセット＝Ｘ１，サイズ＝Ｙ１を示す。データ記憶部２１０の最終書込情報２４３が示す記憶領域には、データ記憶領域１１０と同じデータ＃１が書き込まれている。
【００８０】
ステップＳ５０が実行された後は、ストレージノード１００では、同期状態フラグ１４２が「非同期」に設定されている。最終書込情報１４３は、ステップＳ４７のライト要求で指定されたオフセット＝Ｘ１，サイズ＝Ｙ１を示す。データ記憶部１１０の最終書込情報１４３が示す記憶領域には、ステップＳ４７のライト要求で指定されたデータ＃２が書き込まれず、データ＃１が記憶されている。ストレージノード２００では、同期状態フラグ２４２は値をもたない。最終書込情報２４３は、最終書込情報１４３と同じオフセット＝Ｘ１，サイズ＝Ｙ１を示す。データ記憶部２１０の最終書込情報２４３が示す記憶領域には、ステップＳ４７のライト要求で指定されたデータ＃２が記憶されている。
【００８１】
このように、ストレージノード２００からストレージノード２００にレスポンスが到達しないことにより、データの整合性が失われる可能性がある。
図１０は、データアクセスのシーケンス例（続き）を示す図である。
【００８２】
（ステップＳ５１）クライアントノード３００は、ストレージノード１００に、オフセットおよびサイズによって記憶領域を指定したライト要求を送信する。
（ステップＳ５２）ストレージノード１００は、同期状態フラグ１４２が「非同期」に設定されていることを確認し、最終書込情報１４３が示す記憶領域のデータをデータ記憶部１１０から読み出す。そして、読み出したデータと最終書込情報１４３が示す記憶領域とを指定した他のライト要求を、ストレージノード２００に送信する。しかし、ネットワーク３０が復旧しておらず、他のライト要求はストレージノード２００に到達しない。
【００８３】
（ステップＳ５３）ストレージノード１００は、レスポンスのタイムアウトを検出し、同期状態フラグ１４２を「非同期」に維持する。そして、ステップＳ５１のライト要求が失敗であることを示すレスポンスを、クライアントノード３００に送信する。
【００８４】
（ステップＳ５４）クライアントノード３００は、ストレージノード１００に、オフセットおよびサイズによって記憶領域を指定したライト要求を送信する。
（ステップＳ５５）ストレージノード１００は、同期状態フラグ１４２が「非同期」に設定されていることを確認し、最終書込情報１４３が示す記憶領域のデータをデータ記憶部１１０から読み出す。そして、読み出したデータと最終書込情報１４３が示す記憶領域とを指定した他のライト要求を、ストレージノード２００に送信する。
【００８５】
（ステップＳ５６）ストレージノード２００は、データ記憶部２１０内の他のライト要求で指定された記憶領域にデータを書き込む。そして、書き込みが成功したことを確認して、書き込み成功を示すレスポンスをストレージノード１００に送信する。
【００８６】
（ステップＳ５７）ストレージノード１００は、ステップＳ５４のライト要求が指定する記憶領域を示す最終書込情報１４３を、制御情報記憶部１４０に書き込む。また、ステップＳ５４のライト要求をストレージノード２００に転送する。
【００８７】
（ステップＳ５８）ストレージノード２００は、ライト要求が指定する記憶領域を示す最終書込情報２４３を制御情報記憶部２４０に書き込み、データ記憶部２１０内のライト要求で指定された記憶領域にデータを書き込む。そして、書き込みが成功したことを確認して、書き込み成功を示すレスポンスをストレージノード１００に送信する。
【００８８】
（ステップＳ５９）ストレージノード１００は、同期状態フラグ１４２を「同期」に設定し、データ記憶部１１０内のステップＳ５４のライト要求で指定された記憶領域にデータを書き込む。そして、ステップＳ５４のライト要求が成功であることを示すレスポンスを、クライアントノード３００に送信する。
【００８９】
図１１は、同期状態の第２の変化例を示す図である。図１１の上段は、ステップＳ５６が実行された後のストレージノード１００，２００の状態を示し、図１１の下段は、ステップＳ５９が実行された後のストレージノード１００，２００の状態を示している。
【００９０】
ステップＳ５６が実行された後は、ストレージノード１００では、同期状態フラグ１４２が「同期」に設定されている。最終書込情報１４３は、同期状態フラグ１４２が「非同期」に設定されたときのライト要求が指定していたオフセット＝Ｘ１，サイズ＝Ｙ１を示す。データ記憶部１１０の最終書込情報１４３が示す記憶領域には、データ＃１が記憶されている。ストレージノード２００では、同期状態フラグ２４２は値をもたない。最終書込情報２４３は、最終書込情報１４３と同じオフセット＝Ｘ１，サイズ＝Ｙ１を示す。データ記憶部２１０の最終書込情報２４３が示す記憶領域には、データ記憶領域１１０から複製されたデータ＃１が書き込まれている。
【００９１】
ステップＳ５９が実行された後は、ストレージノード１００では、同期状態フラグ１４２が「同期」に設定されている。最終書込情報１４３は、ステップＳ５４のライト要求で指定されたオフセット＝Ｘ２，サイズ＝Ｙ２を示す。データ記憶部１１０の最終書込情報１４３が示す記憶領域には、ステップＳ５４のライト要求で指定されたデータ＃３が書き込まれる。ストレージノード２００では、同期状態フラグ２４２は値をもたない。最終書込情報２４３は、最終書込情報１４３と同じオフセット＝Ｘ２，サイズ＝Ｙ２を示す。データ記憶部２１０の最終書込情報２４３が示す記憶領域には、データ記憶領域１１０と同じデータ＃３が書き込まれている。
【００９２】
このように、ストレージノード１００は、同期状態フラグ１４２が「非同期」に設定されていると、次のアクセスを受け付けたときに、データ記憶部２１０をデータ記憶部１１０に同期させる。ネットワーク３０がまだ復旧しておらず、データ記憶部１１０，２１０の同期に失敗した場合には、更に次のアクセスを受け付けたとき、同期処理を再実行する。
【００９３】
図１２は、ノード設定変更のシーケンス例を示す図である。以下、図１２に示す処理をステップ番号に沿って説明する。図１２では、ストレージノード１００をプライマリノードからセカンダリノードに変更し、ストレージノード２００をセカンダリノードからプライマリノードに変更する場合を考える。
【００９４】
（ステップＳ６１）制御ノード４００は、プライマリノードの入れ替えを、ストレージノード１００，２００に指示する。入れ替えを指示するタイミングとしては、例えば、制御ノード４００が、入れ替え指示のユーザ操作を受け付けたときや、所定の入れ替えアルゴリズムを実行して入れ替えを行った方が好ましいと判断したときが考えられる。
【００９５】
（ステップＳ６２）ストレージノード１００は、ノード情報１４１を書き換え、自ノードをプライマリノードからセカンダリノードに変更する。
（ステップＳ６３）セカンダリノードに移行したストレージノード１００は、同期状態フラグ１４２をリセット（制御情報記憶部１４０から削除）し、値なしとする。
【００９６】
（ステップＳ６４）ストレージノード２００は、ノード情報２４１を書き換え、自ノードをセカンダリノードからプライマリノードに変更する。
（ステップＳ６５）プライマリノードに移行したストレージノード２００は、同期状態フラグ２４２を「非同期」に設定する。
【００９７】
（ステップＳ６６）ストレージノード１００，２００は、ノード設定の変更が完了したことを制御ノード４００に報告する。なお、ストレージノード１００の処理とストレージノード２００の処理（ステップＳ６２〜Ｓ６５）は、任意の順序で実行してよい。
【００９８】
図１３は、同期状態の第３の変化例を示す図である。ここでは、ストレージノード１００がプライマリノードであり、データの整合性が失われているときにプライマリノードの入れ替えが発生する場合を考える。図１３の上段は、前述のステップＳ５０が実行された後のようにデータの整合性が失われた状態を示し、図１３の下段は、ステップＳ６６が実行された後のストレージノード１００，２００の状態を示している。
【００９９】
前述のように、ステップＳ５０が実行された後は、ストレージノード１００では、同期状態フラグ１４２が「非同期」に設定されている。最終書込情報１４３は、ライト要求で指定されたオフセット＝Ｘ１，サイズ＝Ｙ１を示す。データ記憶部１１０の最終書込情報１４３が示す記憶領域には、ライト要求で指定されたデータ＃２が書き込まれず、データ＃１が記憶されている。ストレージノード２００では、同期状態フラグ２４２は値をもたない。最終書込情報２４３は、最終書込情報１４３と同じオフセット＝Ｘ１，サイズ＝Ｙ１を示す。データ記憶部２１０の最終書込情報２４３が示す記憶領域には、ライト要求で指定されたデータ＃２が記憶されている。
【０１００】
ステップＳ６６が実行された後は、ストレージノード１００では、同期状態フラグ１４２はリセットされ値をもたない。最終書込情報１４３は、入れ替え前と同じオフセット＝Ｘ１，サイズ＝Ｙ１を示す。データ記憶部１１０の最終書込情報１４３が示す記憶領域には、入れ替え前と同じデータ＃１が記憶されている。ストレージノード２００では、同期状態フラグ２４２が「非同期」に設定されている。最終書込情報２４３は、入れ替え前と同じオフセット＝Ｘ１，サイズ＝Ｙ１を示す。データ記憶部２１０の最終書込情報２４３が示す記憶領域には、入れ替え前と同じデータ＃２が記憶されている。
【０１０１】
このように、プライマリノードになったストレージノード２００の同期状態フラグ２４２は、「非同期」に書き換えられる。従って、ストレージノード２００は、クライアントノード３００から次のアクセスを受け付けたとき同期処理を実行する。同期処理により、セカンダリノード（ストレージノード１００）に記憶されたデータ＃１が、プライマリノード（ストレージノード２００）に記憶されたデータ＃２によって上書きされ、データの整合性が回復する。
【０１０２】
プライマリノードを入れ替えたとき、新たなプライマリノード（旧セカンダリノード）は、旧プライマリノードの同期状態フラグが「非同期」であるか（データの整合性が失われている可能性があるか）を知らない。そこで、新たなプライマリノードが、入れ替え後に同期処理を行うようにする。なお、プライマリノードを入れ替えた後の同期処理では、旧プライマリノード（ストレージノード１００）に記憶されたデータ＃１を、旧セカンダリノード（ストレージノード２００）に上書きするようにしてもよい。
【０１０３】
第２の実施の形態のストレージシステムによれば、ネットワーク障害によりセカンダリノードからプライマリノードにレスポンスが到達せず、その結果としてデータの整合性が失われても、後にデータの整合性を回復することができる。また、プライマリノードが、次のアクセスを受け付けるタイミングを待って同期処理を行うことで、セカンダリノードからレスポンスがないことを検出してすぐにデータを再送する方法と比べ、ネットワークが復旧して同期に成功する確率が高くなる。また、プライマリノードの入れ替えが発生した後に同期処理が行われるようにすることで、データの整合性が失われた状態が放置されないようにすることができる。
【０１０４】
［第３の実施の形態］
次に、第３の実施の形態を説明する。第２の実施の形態との差異を中心に説明し、同様の事項については説明を省略する。第３の実施の形態のストレージシステムは、データのアクセスがなくても、データの整合性が失われていないかを定期的に確認する。
【０１０５】
図１４は、第３の実施の形態のソフトウェア例を示す図である。第３の実施の形態のストレージシステムは、ストレージノード１００ａ，２００ａ、クライアントノード３００および制御ノード４００ａを有する。
【０１０６】
ストレージノード１００ａは、第２の実施の形態のストレージノード１００のモジュールに加え、同期状態監視部１６０を有する。同期状態監視部１６０は、制御ノード４００ａから要求を受けて、同期状態フラグ１４２が「非同期」に設定されているか判断する。同期状態監視部１６０は、「非同期」に設定されている場合、ノード間転送部１３０に同期処理を指示する。そして、同期処理に成功した場合、同期状態フラグ１４２を「同期」に設定する。同様に、ストレージノード２００ａは、第２の実施の形態のストレージノード２００のモジュールに加え、同期状態監視部２６０を有する。
【０１０７】
制御ノード４００ａは、第２の実施の形態の制御ノード４００のモジュールに加えて、同期要求部４２０を有する。同期要求部４２０は、ストレージノード１００ａ，２００ａのうちプライマリノード（例えば、ストレージノード１００ａ）に対し、所定周期（例えば、数分毎、数時間毎、数日毎など）で同期要求を送信する。
【０１０８】
図１５は、同期パトロールのシーケンス例を示す図である。以下、ストレージノード１００がプライマリノードとして、図１５に示す処理をステップ番号に沿って説明する。
（ステップＳ７１）制御ノード４００ａの同期要求部４２０は、ストレージノード１００ａに同期要求を送信する。同期要求は、所定周期で継続的に送信される。
【０１０９】
（ステップＳ７２）ストレージノード１００ａの同期状態監視部１６０は、同期状態フラグ１４２が「非同期」に設定されていることを確認する。
（ステップＳ７３）ストレージノード１００ａのノード間転送部１３０は、最終書込情報１４３が示す記憶領域のデータをデータ記憶部１１０から読み出す。
【０１１０】
（ステップＳ７４）ストレージノード１００ａのノード間転送部１３０は、ステップＳ７３で読み出したデータと最終書込情報１４３が示す記憶領域を指定したライト要求を、ストレージノード２００ａに送信する。
【０１１１】
（ステップＳ７５）ストレージノード２００ａのアクセス処理部２２０は、ライト要求が指定する記憶領域を示す最終書込情報２４３を制御情報記憶部２４０に書き込み、データ記憶部２１０内のライト要求で指定された記憶領域にデータを書き込む。
【０１１２】
（ステップＳ７６）ストレージノード２００ａのアクセス処理部２２０は、書き込み成功を示すレスポンスをストレージノード１００ａに送信する。
（ステップＳ７７）ストレージノード１００ａの同期状態監視部１６０は、同期状態フラグ１４２を「同期」に設定し、同期完了を制御ノード４００ａに報告する。
【０１１３】
なお、第３の実施の形態の同期方法（パトロール方式）は、第２の実施の形態の同期方法（アクセスを契機とする方式）と組み合わせることも可能である。例えば、プライマリノードが、ライト要求を受け付けたときに同期処理を実行し、また、周期的なタイミングでも同期処理を実行するようにしてもよい。第３の実施の形態のストレージシステムによれば、第２の実施の形態と同様、データの整合性を回復することができる。
【０１１４】
［第４の実施の形態］
次に、第４の実施の形態を説明する。第２および第３の実施の形態との差異を中心に説明し、同様の事項については説明を省略する。第４の実施の形態のストレージシステムでは、記憶領域が複数のセグメントに分割され、セグメント毎に複数のストレージノードの中からプライマリノードを選択することができる。
【０１１５】
図１６は、第４の実施の形態のデータ構造例を示す図である。第４の実施の形態のストレージシステムは、ストレージノード１００ｂ，２００ｂを含む。ストレージノード１００ｂは、データ記憶部１１０ｂを有し、同期状態フラグ１４２ｂおよび最終書込情報１４３ｂを保持する。ストレージノード２００ｂは、データ記憶部２１０ｂを有し、同期状態フラグ２４２ｂおよび最終書込情報２４３ｂを保持する。
【０１１６】
データ記憶部１１０ｂ，２１０ｂの記憶領域は、複数のセグメント（論理的なブロック単位）に分割される。例えば、データ記憶部１１０ｂ，２１０ｂは、セグメントＳ１，Ｓ２，Ｓ３を有する。セグメントＳ１，Ｓ３のプライマリデータはデータ記憶部１１０ｂに記憶され、セグメントＳ１，Ｓ３のセカンダリデータはデータ記憶部２１０ｂに記憶される。セグメントＳ２のプライマリデータはデータ記憶部２１０ｂに記憶され、セグメントＳ２のセカンダリデータはデータ記憶部１１０ｂに記憶される。
【０１１７】
クライアントノード３００からのデータのアクセスは、プライマリデータを記憶するストレージノードに対して行われる。よって、セグメントＳ１，Ｓ３については、ストレージノード１００ｂがプライマリノードとして動作する。セグメントＳ２については、ストレージノード２００ｂがプライマリノードとして動作する。
【０１１８】
同期状態フラグ１４２ｂ，２４２ｂでは、セグメント毎に「同期」や「非同期」が設定される。最終書込情報１４３ｂ，２４３ｂは、セグメント毎のオフセットおよびサイズの情報を含む。ストレージノード１００ｂは、同期状態フラグ１４２ｂおよび最終書込情報１４３ｂを用いて、セグメントＳ１，Ｓ３について、第２および第３の実施の形態で述べたような同期処理を行う。ストレージノード２００ｂは、同期状態フラグ２４２ｂおよび最終書込情報２４３ｂを用いて、セグメントＳ２について、第２および第３の実施の形態で述べたような同期処理を行う。例えば、ストレージノード１００ｂは、セグメントＳ３に対する次のライト要求を受け付けたとき、セグメントＳ３の同期処理を行う。
【０１１９】
第４の実施の形態のストレージシステムによれば、第２の実施の形態と同様、データの整合性を回復することができる。また、第４の実施の形態では、アクセスを複数のストレージノードに分散させることができる。
【０１２０】
なお、前述のように、第２〜第４の実施の形態のストレージ制御方法は、コンピュータとしてのストレージノード１００，１００ａ，１００ｂ，２００，２００ａ，２００ｂ、クライアントノード３００および制御ノード４００，４００ａに、それぞれプログラムを実行させることで実現できる。プログラムは、コンピュータ読み取り可能な記録媒体（例えば、記録媒体３３）に記録しておくことができる。記録媒体としては、例えば、磁気ディスク、光ディスク、光磁気ディスク、半導体メモリなどを使用できる。磁気ディスクには、ＦＤおよびＨＤＤが含まれる。光ディスクには、ＣＤ、ＣＤ−Ｒ（Recordable）／ＲＷ（Rewritable）、ＤＶＤおよびＤＶＤ−Ｒ／ＲＷが含まれる。
【０１２１】
プログラムを流通させる場合、例えば、当該プログラムを記録した可搬記録媒体が提供される。また、プログラムを他のコンピュータの記憶装置に格納しておき、ネットワーク３０経由でプログラムを配布することもできる。コンピュータは、例えば、可搬記録媒体に記録されたプログラムまたは他のコンピュータから受信したプログラムを記憶装置（例えば、ＨＤＤ１０３）に格納し、当該記憶装置からプログラムを読み込んで実行する。ただし、可搬記録媒体から読み込んだプログラムを直接実行してもよく、他のコンピュータからネットワーク３０を介して受信したプログラムを直接実行してもよい。
【符号の説明】
【０１２２】
１０，２０  情報処理装置
１１，２１  記憶手段
１１ａ，２１ａ  記憶領域
１２  要求手段
１３  書込手段
１４  同期手段
【図１】
0005699852.tif 000002
【図２】
0005699852.tif 000003
【図３】
0005699852.tif 000004
【図４】
0005699852.tif 000005
【図５】
0005699852.tif 000006
【図６】
0005699852.tif 000007
【図７】
0005699852.tif 000008
【図８】
0005699852.tif 000009
【図９】
0005699852.tif 000010
【図１０】
0005699852.tif 000011
【図１１】
0005699852.tif 000012
【図１２】
0005699852.tif 000013
【図１３】
0005699852.tif 000014
【図１４】
0005699852.tif 000015
【図１５】
0005699852.tif 000016
【図１６】
0005699852.tif 000017