(57)【要約】【課題】分散ストレージシステムにおけるデータロストの発生要因を抑制する。【解決手段】ストレージ装置３内のデータ３ａのチェック指示を受け取ると、データチェック手段１ｃにより、ストレージ装置３からデータ３ａが読み出され、データ３ａが正常か否かを判断される。データチェック手段１ｃによりデータの異常が検出されると、次に、データ取得手段１ｄにより、管理情報が参照され、異常が検出されたデータに対応する冗長データを格納している二重化相手ストレージノードが判断され、二重化相手ストレージノードから異常が検出されたデータに対応する冗長データが取得される。そして、データ書き込み手段１ｅにより、データ取得手段１ｄが取得した冗長データが、ストレージ装置３内のデータ３ａの記憶領域に対して上書きで書き込まれる。【選択図】図１
2008071209.tif 000002
【特許請求の範囲】
【請求項１】
ネットワーク経由で接続された複数のストレージノードでデータの分散管理を行う分散ストレージシステムを構成する前記ストレージノードにストレージ装置を管理させるためのストレージ管理プログラムにおいて、
コンピュータを、
ローカルの前記ストレージ装置に格納された前記データと同一内容の冗長データを管理する二重化相手ストレージノードが登録された管理情報を記憶する管理情報記憶手段、
前記ストレージ装置内の前記データのチェック指示を受け取ると、前記ストレージ装置から前記データを読み出し、前記データが正常か否かを判断するデータチェック手段、
前記データチェック手段により前記データの異常が検出されると、前記管理情報を参照し、異常が検出された前記データに対応する前記冗長データを格納している前記二重化相手ストレージノードを判断し、前記二重化相手ストレージノードから異常が検出された前記データに対応する前記冗長データを取得するデータ取得手段、
前記データ取得手段が取得した前記冗長データを、前記ストレージ装置内の前記データの記憶領域に対して上書きで書き込むデータ書き込み手段、
として機能させるためのストレージ管理プログラム。
【請求項２】
前記データ取得手段は、前記データが正常か否かを示すフラグおよび前記データを含むチェック要求メッセージを前記二重化相手ストレージノードに送信し、前記二重化相手ストレージノードが前記データに対応する前記冗長データの記憶領域に保存した採用データを示すフラグ、および前記冗長データが採用された場合には前記冗長データを含む応答メッセージを取得することを特徴とする請求項１記載のストレージ管理プログラム。
【請求項３】
前記データ書き込み手段は、前記二重化相手ストレージノードから、前記冗長データが正常か否かを示すフラグおよび前記冗長データを含むチェック要求メッセージが入力されると、前記冗長データが正常であれば、前記冗長データを前記ストレージ装置内の前記データの記憶領域に対して上書きで書き込むことを特徴とする請求項１記載のストレージ管理プログラム。
【請求項４】
ネットワーク経由で接続された複数のストレージノードでデータの分散管理を行う分散ストレージシステムを構成する前記ストレージノードにストレージ装置を管理させるためのストレージ管理装置において、
ローカルの前記ストレージ装置に格納された前記データと同一内容の冗長データを管理する二重化相手ストレージノードが登録された管理情報を記憶する管理情報記憶手段と、
前記ストレージ装置内の前記データのチェック指示を受け取ると、前記ストレージ装置から前記データを読み出し、前記データが正常か否かを判断するデータチェック手段と、
前記データチェック手段により前記データの異常が検出されると、前記管理情報を参照し、異常が検出された前記データに対応する前記冗長データを格納している前記二重化相手ストレージノードを判断し、前記二重化相手ストレージノードから異常が検出された前記データに対応する前記冗長データを取得するデータ取得手段と、
前記データ取得手段が取得した前記冗長データを、前記ストレージ装置内の前記データの記憶領域に対して上書きで書き込むデータ書き込み手段と、
を有することを特徴とするストレージ管理装置。
【請求項５】
ネットワーク経由で接続された複数のストレージノードでデータの分散管理を行う分散ストレージシステムを構成する前記ストレージノードにストレージ装置を管理させるためのストレージ管理方法において、
データチェック手段が、前記ストレージ装置内の前記データのチェック指示を受け取ると、前記ストレージ装置から前記データを読み出し、前記データが正常か否かを判断し、
管理情報記憶手段にローカルの前記ストレージ装置に格納された前記データと同一内容の冗長データを管理する二重化相手ストレージノードが登録された管理情報が記憶されており、前記データチェック手段により前記データの異常が検出されると、データ取得手段が、前記管理情報を参照し、異常が検出された前記データに対応する前記冗長データを格納している前記二重化相手ストレージノードを判断し、前記二重化相手ストレージノードから異常が検出された前記データに対応する前記冗長データを取得し、
データ書き込み手段が、前記データ取得手段が取得した前記冗長データを、前記ストレージ装置内の前記データの記憶領域に対して上書きで書き込む、
ことを特徴とするストレージ管理方法。
【発明の詳細な説明】
【技術分野】
【０００１】
本発明はストレージ管理プログラム、ストレージ管理装置、およびストレージ管理方法に関し、特にデータを複数のストレージノードで分散管理するストレージ管理プログラム、ストレージ管理装置、およびストレージ管理方法に関する。
【背景技術】
【０００２】
ディスクドライブは、バッドブロックや不良セクタなどと呼ばれる不良箇所が、導入時だけではなく稼働中でも出現する。当初は何の問題もなくデータが書き込まれていたディスク上の特定箇所がバッドブロックになってしまうと、悪くすればそこに書かれていたデータを読み出せなくなってしまう。これを「データロスト」と呼ぶ。ここでいうデータロストとは「ストレージシステムに格納されたデータが無くなる」ことを指す。同一のデータを２つの異なるノードに配置した場合に、何らかの要因で片方のノードのデータが失われても、もう一方のノード中にデータが残っていればデータロストではない。
【０００３】
このように、バッドブロックはデータを保全する上で重大なリスク要因である。このバッドブロックを発見するには実際にディスクにアクセスすることが必要となる。ＲＡＩＤ（Redundant Array of Independent Disks）装置によっては、ＲＡＩＤコントローラが定期的にディスクドライブの媒体チェックを行う。ＲＡＩＤコントローラは、チェックの結果バッドブロックを見つければ、他のディスクドライブ上のデータを元に発見したバッドブロックに書かれていたデータを入手し、入手したデータをバッドブロックがあったディスクドライブに書き込む。この書き込みにより交替ブロックと呼ばれる別の領域に書き込まれる。その後、ＲＡＩＤコントローラは、バッドブロックの領域に対するアクセス要求があると、対応する交換ブロックに対してアクセスを行う。これにより、ＲＡＩＤシステムの外部からみれば、バッドブロックがなくなり、データも元の場所に書かれているように認識される（たとえば、非特許文献１参照）。
【０００４】
また、ディスク装置のトラブルにより、本来書き込むべき場所とは異なる場所にデータを書き込んでしまうことも起こりうる。この場合には、バッドブロックとは異なりデータの読み取りには成功するが、データが失われてしまうことには代わりはない。
【０００５】
データロストに対する対応策として、任意のＲＡＩＤレベルによって、複数のコンピュータ（ノード）に冗長データを分散格納するシステムも考えられている。このシステムでは、１つのノードで障害が発生すると、他のノードのデータに基づいて障害が発生したノードのデータを復元することができる（たとえば、特許文献１参照）。
【特許文献１】特開２０００−７６２０７号公報（段落［００４６］）
【非特許文献１】富士通株式会社、“データの信頼性を高めるパトロール機能”、［online］、［平成１８年８月３１日検索］、インターネット〈URL：http://storage-system.fujitsu.com/jp/products/iadiskarray/feature/a01/>
【発明の開示】
【発明が解決しようとする課題】
【０００６】
しかし、特許文献１の技術は、ノードの障害発生後に、そのノードの復旧作業を行うため、復旧作業を行っている間システムの信頼性が落ちてしまう。すなわち、特許文献１の技術は、ノードに障害があると、ノードの復旧処理の間、他のノードに保存されたデータに対してアクセスを行う。これにより、サービスを停止させずに済むが、障害が発生したノードが復旧するまではデータの冗長性が維持されない。そのため、復旧処理を行っている間のシステムの信頼性は低下することとなる。しかも、ノード全体の復旧作業を行うため、信頼性が低下したまま長時間システムを運用しなければならない。
【０００７】
そこで、複数のノードに冗長データを分散格納するシステムにおけるデータロストの予兆を検出し、データが実際にロストする前にデータロストの原因を取り除くことが望まれている。また、データロストが発生したとしても、該当するノードへのアクセスを止めることなく、データ単位の復旧作業を行えることが必要である。
【０００８】
本発明はこのような点に鑑みてなされたものであり、分散ストレージシステムにおけるデータロストの発生要因を抑制できるストレージ管理プログラム、ストレージ管理装置、およびストレージ管理方法を提供することを目的とする。
【課題を解決するための手段】
【０００９】
本発明では上記課題を解決するために、図１に示すようなストレージ管理プログラムが提供される。本発明に係るストレージ管理プログラムは、ネットワーク経由で接続された複数のストレージノード１，２でデータの分散管理を行う分散ストレージシステムを構成するストレージノード１，２にストレージ装置を管理させるために、図１に示す機能をコンピュータに実行させることができる。
【００１０】
管理情報記憶手段１ｂは、ローカルのストレージ装置に格納されたデータと同一内容の冗長データを管理する二重化相手ストレージノードが登録された管理情報を記憶する。データチェック手段１ｃは、ストレージ装置３内のデータ３ａのチェック指示を受け取ると、ストレージ装置３からデータ３ａを読み出し、データ３ａが正常か否かを判断する。データ取得手段１ｄは、データチェック手段１ｃによりデータの異常が検出されると、管理情報を参照し、異常が検出されたデータに対応する冗長データを格納している二重化相手ストレージノードを判断し、二重化相手ストレージノードから異常が検出されたデータに対応する冗長データを取得する。データ書き込み手段１ｅは、データ取得手段１ｄが取得した冗長データを、ストレージ装置３内のデータ３ａの記憶領域に対して上書きで書き込む。
【００１１】
このようなストレージ管理プログラムをコンピュータに実行させることで、ストレージ装置３内のデータ３ａのチェック指示を受け取ると、データチェック手段１ｃにより、ストレージ装置３からデータ３ａが読み出され、データ３ａが正常か否かを判断される。データチェック手段１ｃによりデータの異常が検出されると、次に、データ取得手段１ｄにより、管理情報が参照され、異常が検出されたデータに対応する冗長データを格納している二重化相手ストレージノードが判断され、二重化相手ストレージノードから異常が検出されたデータに対応する冗長データが取得される。そして、データ書き込み手段１ｅにより、データ取得手段１ｄが取得した冗長データが、ストレージ装置３内のデータ３ａの記憶領域に対して上書きで書き込まれる。
【００１２】
また、上記課題を解決するために、ネットワーク経由で接続された複数のストレージノードでデータの分散管理を行う分散ストレージシステムを構成する前記ストレージノードにストレージ装置を管理させるためのストレージ管理装置において、ローカルの前記ストレージ装置に格納された前記データと同一内容の冗長データを管理する二重化相手ストレージノードが登録された管理情報を記憶する管理情報記憶手段と、前記ストレージ装置内の前記データのチェック指示を受け取ると、前記ストレージ装置から前記データを読み出し、前記データが正常か否かを判断するデータチェック手段と、前記データチェック手段により前記データの異常が検出されると、前記管理情報を参照し、異常が検出された前記データに対応する前記冗長データを格納している前記二重化相手ストレージノードを判断し、前記二重化相手ストレージノードから異常が検出された前記データに対応する前記冗長データを取得するデータ取得手段と、前記データ取得手段が取得した前記冗長データを、前記ストレージ装置内の前記データの記憶領域に対して上書きで書き込むデータ書き込み手段と、を有することを特徴とするストレージ管理装置が提供される。
【００１３】
さらに、上記課題を解決するために、ネットワーク経由で接続された複数のストレージノードでデータの分散管理を行う分散ストレージシステムを構成する前記ストレージノードにストレージ装置を管理させるためのストレージ管理方法において、データチェック手段が、前記ストレージ装置内の前記データのチェック指示を受け取ると、前記ストレージ装置から前記データを読み出し、前記データが正常か否かを判断し、管理情報記憶手段にローカルの前記ストレージ装置に格納された前記データと同一内容の冗長データを管理する二重化相手ストレージノードが登録された管理情報が記憶されており、前記データチェック手段により前記データの異常が検出されると、データ取得手段が、前記管理情報を参照し、異常が検出された前記データに対応する前記冗長データを格納している前記二重化相手ストレージノードを判断し、前記二重化相手ストレージノードから異常が検出された前記データに対応する前記冗長データを取得し、データ書き込み手段が、前記データ取得手段が取得した前記冗長データを、前記ストレージ装置内の前記データの記憶領域に対して上書きで書き込む、ことを特徴とするストレージ管理方法が提供される。
【発明の効果】
【００１４】
本発明では、自己の管理するデータをチェックし異常が検出されれば、二重化相手ストレージノードから冗長データを取得し、自己の管理するデータに上書きで書き込むようにした。そのため、データの異常が早期に修復され、データロストの発生を抑制することができる。
【発明を実施するための最良の形態】
【００１５】
以下、本発明の実施の形態を図面を参照して説明する。
図１は、発明の概要を示す図である。図１には、２つのストレージノード１，２が示されている。ストレージノード１とストレージノード２とは、ネットワーク経由で接続されており、データの分散管理を行う。すなわち、ストレージノード１が管理するストレージ装置３と、ストレージノード２が管理するストレージ装置４とには、共通のデータ３ａ，４ａが格納される。
【００１６】
ここで、ストレージノード１，２は、互いに連係した処理により、二重化されたデータ３ａ，４ａの同一性を保つと共に、異常が検出されたデータの修復を行う。なお、以下の説明において、ストレージノード１から見たときのデータ３ａの冗長データは、ストレージノード２が管理するデータ４ａであり、ストレージノード２から見たときのデータ４ａの冗長データは、ストレージノード１が管理するデータ３ａである。
【００１７】
ストレージノード１は、データアクセス手段１ａ、管理情報記憶手段１ｂ、データチェック手段１ｃ、データ取得手段１ｄ、およびデータ書き込み手段１ｅを有している。
データアクセス手段１ａは、データのアクセス要求に応答して、ストレージ装置３に対するデータ３ａの書き込みまたはデータ３ａの読み出しを行う。また、データアクセス手段１ａは、データ３ａを書き込む際には、データ３ａに基づいてチェックコードを生成し、データ３ａに対応付けてチェックコードをストレージ装置３に書き込む。
【００１８】
管理情報記憶手段１ｂは、ローカルのストレージ装置に格納されたデータと同一内容の冗長データを管理する二重化相手ストレージノードが登録された管理情報を記憶する。
データチェック手段１ｃは、ストレージ装置３内のデータ３ａのチェック指示を受け取ると、ストレージ装置３からデータ３ａを読み出し、データ３ａが正常か否かを判断する。チェック指示は、たとえば、ネットワークを介して接続された管理ノードから送られる。また、ストレージノード１に対するユーザの操作入力されたチェック指示をデータチェック手段１ｃが受け取ることもできる。なお、データチェック手段１ｃは、データ３ａのチェック内容として、たとえば、データ３ａの読み出しができたこと、およびデータ３ａに対応するチェックコードとデータ３ａとの整合性が保たれていることを確認する。
【００１９】
データ取得手段１ｄは、データチェック手段１ｃによりデータ３ａの異常が検出されると、管理情報を参照し、異常が検出されたデータ３ａに対応する冗長データ（データ４ａ）を格納している二重化相手となるストレージノード２を判断する。そして、データ取得手段１ｄは二重化相手となるストレージノード２から異常が検出されたデータ３ａに対応する冗長データ（データ４ａ）を取得する。たとえば、データ取得手段１ｄは、データ３ａが正常か否かを示すフラグおよびデータ３ａを含むチェック要求メッセージ５を二重化相手となるストレージノード２に送信する。そして、データ取得手段１ｄは、二重化相手となるストレージノード２がデータ３ａに対応する冗長データ（データ４ａ）の記憶領域に保存した採用データを示すフラグ、および冗長データ（データ４ａ）が採用された場合には冗長データ（データ４ａ）を含む応答メッセージ６を取得する。また、データ取得手段１ｄは、データチェック手段１ｃによるストレージ装置３からのデータ３ａの読み出しが失敗した場合、データ３ａに代えて所定の初期値をチェック要求メッセージ５に含める。
【００２０】
データ書き込み手段１ｅは、データ取得手段１ｄが取得した冗長データ（データ４ａ）を、ストレージ装置３内のデータ３ａの記憶領域に対して上書きで書き込む。なお、データ書き込み手段１ｅは、データ３ａが正常と判断された場合、ストレージ装置３から読み出したデータ３ａをストレージ装置３内のデータ３ａの記憶領域に対して上書きで書き込む。また、データ書き込み手段１ｅは、データ３ａが異常と判断され、かつ応答メッセージ６においてデータ３ａが採用データであることが示された場合（冗長データにも異常がある場合）、異常と判断されたデータ３ａをストレージ装置３内のデータ３ａの記憶領域に対して上書きで書き込む。
【００２１】
ストレージノード２は、データチェック手段２ａ、データ書き込み手段２ｂ、およびデータ送信手段２ｃを有している。
データチェック手段２ａは、チェック要求メッセージ５において、冗長データ（データ３ａ）が異常であれば、ストレージ装置４から冗長データ（データ３ａ）に対応するデータ４ａを読み出し、データ４ａが正常か否かを判断する。
【００２２】
データ書き込み手段２ｂは、チェック要求メッセージ５に含まれた冗長データ（データ３ａ）に対応するデータ４ａが正常であれば、データ４ａをストレージ装置４内のデータ４ａの記憶領域に対して上書きで書き込む。また、冗長データ（データ３ａ）に対応するデータ４ａが異常であれば、データ書き込み手段２ｂは、冗長データ（データ３ａ）をストレージ装置４内のデータ４ａの記憶領域に対して上書きで書き込む。
【００２３】
データ送信手段２ｃは、チェック要求メッセージ５を受け取った際にデータ書き込み手段２ｂが書き込み対象として採用しストレージ装置４に書き込んだ採用データを含む応答メッセージ６を二重化相手となるストレージノード１に対して送信する。
【００２４】
このようなシステムにおいて、ストレージノード１のデータチェック手段１ｃが、ストレージ装置３内のデータ３ａのチェック指示を受け取ると、データチェック手段１ｃにより、ストレージ装置３からデータ３ａが読み出され、データ３ａが正常か否かを判断される。データチェック手段１ｃによりデータの異常が検出されると、データ取得手段１ｄにより、管理情報が参照され、異常が検出されたデータ３ａに対応する冗長データ（データ４ａ）を格納している二重化相手のストレージノード２が判断される。そして、データ取得手段１ｄからストレージノード２に対して、チェック要求メッセージ５が送信される。
【００２５】
チェック要求メッセージ５を受け取ったストレージノード２では、データチェック手段２ａにより、冗長データ（データ３ａ）が異常であることが認識され、ストレージ装置４から冗長データ（データ３ａ）に対応するデータ４ａを読み出され、データ４ａが正常か否かが判断される。データ４ａが正常であれば、データ書き込み手段２ｂにより、データ４ａがストレージ装置４内のデータ４ａの記憶領域に対して上書きで書き込まれる。さらに、データ送信手段２ｃにより、データ書き込み手段２ｂが書き込み対象として採用しストレージ装置４に書き込んだデータ４ａ含む応答メッセージ６が、ストレージノード１に対して送信される。
【００２６】
すると、ストレージノード１のデータ取得手段１ｄは、応答メッセージ６によってストレージノード２からデータ３ａに対応する冗長データ（データ４ａ）を取得する。そして、データ書き込み手段１ｅにより、データ取得手段１ｄが取得したデータ４ａが、ストレージ装置３内のデータ３ａの記憶領域に対して上書きで書き込まれる。
【００２７】
このようにして、ストレージ装置３内のデータ３ａに異常が検出された場合、即座にデータ単位で修復が行われる。その結果、分散ストレージシステムでデータロストの発生を抑えることができる。
【００２８】
また、ストレージ装置３内のデータ３ａが正常な場合にも、そのデータ３ａを含むチェック要求メッセージ５をストレージノード２に送信される。そして、データ３ａがストレージ装置４内のデータ４ａの記憶領域に上書きで書き込まれる。これにより、二重化の関係にあるデータ３ａとデータ４ａとの内容の同一性を保つことができる。
【００２９】
なお、図１の例では、ストレージノード１の機能とストレージノード２の機能とを個別に示したが、分散ストレージシステムを構成する各ストレージノードは、図１に示す２台のストレージノード１，２の機能を併せ持つ。そして、各ストレージノードは、チェック指示が入力された際には、図１のストレージノード１として機能し、他のストレージノードからチェック要求メッセージ５が入力された際には、図１に示すストレージノード２として機能する。
【００３０】
ところで、一般的な分散ストレージシステムでは、同一のデータを二つのノード上に置き、同じデータを持つ領域同士はリンクが張られ、そのリンクを介して更新データが伝播される。その際、同一データを格納する２つの記憶領域の一方をプライマリと定め、他方をセカンダリと定める。
【００３１】
このようにプライマリ領域を持つストレージノードとセカンダリ領域を持つストレージノードが双方の持つデータに基づいて協調することにより、片方の領域でバッドブロックが発生したりデータ異常と思われるブロックがあった場合、正しいデータに修正することができる。以下、そのような分散ストレージシステムの例を、実施の形態として詳細に説明する。
【００３２】
図２は、本実施の形態の分散ストレージシステム構成例を示す図である。本実施の形態では、ネットワーク１０を介して、複数のストレージノード１００，２００，３００，４００、コントロールノード５００、およびアクセスノード６００が接続されている。ストレージノード１００，２００，３００，４００それぞれには、ストレージ装置１１０，２１０，３１０，４１０が接続されている。
【００３３】
ストレージ装置１１０には、複数のハードディスク装置（ＨＤＤ）１１１，１１２，１１３，１１４が実装されている。ストレージ装置２１０には、複数のＨＤＤ２１１，２１２，２１３，２１４が実装されている。ストレージ装置３１０には、複数のＨＤＤ３１１，３１２，３１３，３１４が実装されている。ストレージ装置４１０には、複数のＨＤＤ４１１，４１２，４１３，４１４が実装されている。各ストレージ装置１１０，２１０，３１０，４１０は、内蔵するＨＤＤを用いたＲＡＩＤシステムである。本実施の形態では、各ストレージ装置１１０，２１０，３１０，４１０のＲＡＩＤ５のディスク管理サービスを提供する。
【００３４】
ストレージノード１１０，２１０，３１０，４１０は、たとえば、ＩＡ（Intel Architecture）と呼ばれるアーキテクチャのコンピュータである。ストレージノード１００，２００，３００，４００は、接続されたストレージ装置１１０，２１０，３１０，４１０に格納されたデータを管理し、管理しているデータをネットワーク１０経由で端末装置２１，２２，２３に提供する。また、ストレージノード１００，２００，３００，４００は、冗長性を有するデータを管理している。すなわち、同一のデータが、少なくとも２つのストレージノードで管理されている。
【００３５】
さらに、ストレージノード１００，２００，３００，４００は、二重化したデータの整合性をチェックする二重化保全処理を行う。なお、ストレージノード１００，２００，３００，４００は個々の判断に基づいてデータ二重化保全処理を行ってもよいし、外部からの指示によりデータ二重化保全処理を行ってもよい。本実施の形態では、コントロールノード５００からの指示により二重化保全処理を行うものとする。以下、このデータ二重化保全処理をパトロールと呼ぶ。
【００３６】
パトロールでは、二重化したそれぞれのデータを保持するストレージノード同士が互いに通信し合い、冗長性のあるデータの整合性がチェックされる。その際、あるストレージノードで管理されているデータで不具合が検出されれば、他のストレージノードの対応するデータを用いてデータの復旧が行われる。
【００３７】
コントロールノード５００は、ストレージノード１００，２００，３００，４００を管理する。たとえば、コントロールノード５００は、所定のタイミングで、各ストレージノード１００，２００，３００，４００に対してパトロールの指示を出力する。
【００３８】
アクセスノード６００には、ネットワーク２０を介して複数の端末装置２１，２２，２３が接続されている。アクセスノード６００は、ストレージノード１００，２００，３００，４００それぞれが管理しているデータの格納場所を認識しており、端末装置２１，２２，２３からの要求に応答して、ストレージノード１００，２００，３００，４００へデータアクセスを行う。
【００３９】
図３は、本実施の形態に用いるストレージノードのハードウェア構成例を示す図である。ストレージノード１００は、ＣＰＵ（Central Processing Unit）１０１によって装置全体が制御されている。ＣＰＵ１０１には、バス１０７を介してＲＡＭ（Random Access Memory）１０２、ＨＤＤインタフェース１０３、グラフィック処理装置１０４、入力インタフェース１０５、および通信インタフェース１０６が接続されている。
【００４０】
ＲＡＭ１０２には、ＣＰＵ１０１に実行させるＯＳ（Operating System）のプログラムやアプリケーションプログラムの少なくとも一部が一時的に格納される。また、ＲＡＭ１０２には、ＣＰＵ１０１による処理に必要な各種データが格納される。
【００４１】
ＨＤＤインタフェース１０３には、ストレージ装置１１０が接続されている。ＨＤＤインタフェース１０３は、ストレージ装置１１０に内蔵されたＲＡＩＤコントローラ１１５と通信し、ストレージ装置１１０に対するデータの入出力を行う。ストレージ装置１１０内のＲＡＩＤコントローラ１１５は、ＲＡＩＤ０〜５の機能を有し、複数のＨＤＤ１１１〜１１４をまとめて１台のハードディスクとして管理する。
【００４２】
グラフィック処理装置１０４には、モニタ１１が接続されている。グラフィック処理装置１０４は、ＣＰＵ１０１からの命令に従って、画像をモニタ１１の画面に表示させる。入力インタフェース１０５には、キーボード１２とマウス１３とが接続されている。入力インタフェース１０５は、キーボード１２やマウス１３から送られてくる信号を、バス１０７を介してＣＰＵ１０１に送信する。
【００４３】
通信インタフェース１０６は、ネットワーク１０に接続されている。通信インタフェース１０６は、ネットワーク１０を介して、他のコンピュータとの間でデータの送受信を行う。
【００４４】
以上のようなハードウェア構成によって、本実施の形態の処理機能を実現することができる。なお、図３には、ストレージノード１００とストレージ装置１１０との構成のみを示したが、他のストレージノード２００，３００，４００や他のストレージ装置２１０，３１０，４１０も同様のハードウェア構成で実現できる。
【００４５】
さらに、コントロールノード５００、アクセスノード６００、および端末装置２１〜２３も、ストレージノード１００とストレージ装置１１０との組合せと同様のハードウェア構成で実現できる。ただし、コントロールノード５００、アクセスノード６００、および端末装置２１〜２３については、ストレージ装置１１０のようなＲＡＩＤシステムではなく、単体のＨＤＤがＨＤＤコントローラに接続されていてもよい。
【００４６】
図２に示すように、複数のストレージノード１００，２００，３００，４００がネットワーク１０に接続され、それぞれのストレージノード１００，２００，３００，４００は他のストレージノードとの間で通信を行う。この分散ストレージシステムは、端末装置２１〜２３に対して、仮想的なボリューム（以下、論理ボリュームと呼ぶ）として機能する。
【００４７】
図４は、論理ボリュームのデータ構造を示す図である。論理ボリューム７００には、「ＬＶＯＬ−Ａ」という識別子（論理ボリューム識別子）が付与されている。また、ネットワーク経由で接続された４台のストレージノード１１０，２１０，３１０，４１０には、個々のストレージノードの識別のためにそれぞれ「ＳＮ−Ａ」、「ＳＮ−Ｂ」、「ＳＮ−Ｃ」、「ＳＮ−Ｄ」というノード識別子が付与されている。
【００４８】
各ストレージノード１００，２００，３００，４００が有するストレージ装置１１０，２１０，３１０，４１０それぞれにおいてＲＡＩＤ５の論理ディスクが構成されている。この論理ディスクは５つのスライスに分割され個々のストレージノード内で管理されている。
【００４９】
図４の例では、ストレージ装置１１０内の記憶領域は、５つのスライス１２１〜１２５に分けられている。ストレージ装置２１０内の記憶領域は、５つのスライス２２１〜２２５に分けられている。ストレージ装置３１０内の記憶領域は、５つのスライス３２１〜３２５に分けられている。ストレージ装置４１０内の記憶領域は、５つのスライス４２１〜４２５に分けられている。
【００５０】
なお、論理ボリューム７００は、セグメント７１０，７２０，７３０，７４０という単位で構成される。セグメント７１０，７２０，７３０，７４０の記憶容量は、ストレージ装置１１０，２１０，３１０，４１０における管理単位であるスライスの記憶容量と同じである。たとえば、スライスの記憶容量が１ギガバイトとするとセグメントの記憶容量も１ギガバイトである。論理ボリューム７００の記憶容量はセグメント１つ当たりの記憶容量の整数倍である。セグメントの記憶容量が１ギガバイトならば、論理ボリューム７００の記憶容量は４ギガバイトといったものになる。
【００５１】
セグメント７１０，７２０，７３０，７４０は、それぞれプライマリスライス７１１，７２１，７３１，７４１とセカンダリスライス７１２，７２２，７３２，７４２との組から構成される。同じセグメントに属するスライスは別々のストレージノードに属する。個々のスライスを管理する領域には論理ボリューム識別子やセグメント情報や同じセグメントを構成するスライス情報の他にフラグがあり、そのフラグにはプライマリあるいはセカンダリなどを表す値が格納される。
【００５２】
図４の例では、スライスの識別子を、「Ｐ」または「Ｓ」のアルファベットと数字との組合せで示している。「Ｐ」はプライマリスライスであることを示している。「Ｓ」はセカンダリスライスであることを示している。アルファベットに続く数字は、何番目のセグメントに属するのかを表している。たとえば、１番目のセグメント７１０のプライマリスライスが「Ｐ１」で示され、セカンダリスライスが「Ｓ１」で示される。
【００５３】
このような構造の論理ボリューム７００の各プライマリスライスおよびセカンダリスライスが、ストレージ装置１１０，２１０，３１０，４１０内のいずれかのスライスに対応付けられる。たとえば、セグメント７１０のプライマリスライス７１１は、ストレージ装置４１０のスライス４２４に対応付けられ、セカンダリスライス７１２は、ストレージ装置２１０のスライス２２２に対応付けられている。
【００５４】
そして、各ストレージ装置１１０，２１０，３１０，４１０では、自己のスライスに対応するプライマリスライスまたはセカンダリスライスのデータを記憶する。
図５は、分散ストレージシステムの各装置の機能を示すブロック図である。アクセスノード６００は、論理ボリュームアクセス制御部６１０を有している。論理ボリュームアクセス制御部６１０は、端末装置２１，２２，２３からの論理ボリューム７００内のデータを指定したアクセス要求に応じて、対応するデータを管理するストレージノードに対してデータアクセスを行う。具体的には、論理ボリュームアクセス制御部６１０は、論理ボリューム７００の各セグメントのプライマリスライスまたはセカンダリスライスと、ストレージ装置１１０，２１０，３１０，４１０内のスライスとの対応関係を記憶している。そして、論理ボリュームアクセス制御部６１０は、端末装置２１，２２，２３からセグメント内のデータアクセスの要求を受け取ると、該当するセグメントのプライマリスライスに対応するスライスを有するストレージ装置に対してデータアクセスを行う。
【００５５】
コントロールノード５００は、論理ボリューム管理部５１０とスライス管理情報群記憶部５２０とを有している。
論理ボリューム管理部５１０は、ストレージノード１００，２００，３００，４００が有するストレージ装置１１０，２１０，３１０，４１０内のスライスを管理する。たとえば、論理ボリューム管理部５１０は、システム起動時に、ストレージノード１００，２００，３００，４００に対してスライス管理情報取得要求を送信する。そして、論理ボリューム管理部５１０は、スライス管理情報取得要求に対して返信されたスライス管理情報を、スライス管理情報群記憶部５２０に格納する。
【００５６】
また、論理ボリューム管理部５１０は、論理ボリューム７００におけるセグメントごとに、パトロールを実行するタイミングを管理する。パトロールは、所定の時間間隔で実行したり、あらかじめスケジュールされた時刻に実行したりする。また、分散ストレージシステムの負荷状況を監視し、負荷が少ない時間にパトロールを実行することもできる。論理ボリューム管理部５１０は、パトロールの実行時間になると、実行対象のセグメントのプライマリスライスを管理するストレージノードに対して、パトロール実行指示を送信する。
【００５７】
スライス管理情報群記憶部５２０は、ストレージノード１００，２００，３００，４００から収集されたスライス管理情報を記憶する記憶装置である。たとえば、コントロールノード５００内のＲＡＭの記憶領域の一部がスライス管理情報群記憶部５２０として使用される。
【００５８】
ストレージノード１００は、データアクセス部１３０、データ管理部１４０、およびスライス管理情報記憶部１５０を有している。
データアクセス部１３０は、アクセスノード６００からの要求に応答して、ストレージ装置１１０内のデータにアクセスする。具体的には、データアクセス部１３０は、アクセスノード６００からデータのリード要求を受け取った場合、リード要求で指定されたデータをストレージ装置１１０から取得し、アクセスノード６００に送信する。また、データアクセス部１３０は、アクセスノード６００からデータのライト要求を受け取った場合、ライト要求に含まれるデータをストレージ装置１１０内に格納する。
【００５９】
ところで、前述のように、ストレージノード１００は接続されているストレージ装置１１０をスライスと呼ばれる管理単位で管理されている。ここで、スライスには、実データを格納する領域以外に、ブロックごとのチェックコードを格納する領域が設けられる。そして、データアクセス部１３０は、ストレージ装置１１０内のスライスにデータを書き込む場合、データのチェックコードを計算し、該当するスライスにチェックコードを格納する。
【００６０】
なお、本実施の形態では、チェックコードをスライス内に格納するが、格納場所はスライス外でもよい。ただし、以下の説明においてスライスサイズの記憶容量という場合には、チェックコード分の記憶容量は除外する。
【００６１】
本実施の形態では、１ブロックごとに８バイトのチェックコードが付くものとする。すると、その８バイトのチェックコードを格納する領域はディスクのどこかに確保されるが、スライスの大きさと言った場合にはブロックあたりチェックコード用の格納領域の８バイトは含まれない。
【００６２】
以下に、チェックコード算出の一例を示す。１ブロックが５１２バイトとし、このブロックから８バイトのチェックコードを算出することを考える。Ｃ言語風のプログラムコードで表記すると５１２バイトのデータが配列data[]に格納されているとし、チェックコードは最終的に配列cc[]に格納されるものとする。配列の一要素は１バイトである。
cc[0] = cc[1] = cc[2] = cc[3] = cc[4] = cc[5] = cc[6] = cc[7] = 0;
for(i=0;i<512;i+=8)｛
cc[0] ^= data[i];
cc[1] ^= data[i+1];
cc[2] ^= data[i+2];
cc[3] ^= data[i+3];
cc[4] ^= data[i+4];
cc[5] ^= data[i+5];
cc[6] ^= data[i+6];
cc[7] ^= data[i+7];
｝
この処理の最初の１行は、８バイト分のチェックコードの初期化処理を示している。この例では、全てのチェックコードに０を設定している。２行目の「for」文は、０から始まる変数ｉ（ｉは０以上の整数であり、ブロック内の先頭からのバイト数を示す）に３行目以降の処理を実行するごとに８ずつ加算し、５１２に達するまで３行目以降の処理を繰り返し実行することを示している。３行目以降の処理は、ブロック内のｉ番目から８バイト分のデータを先頭から順次抽出し、８バイト分のチェックコードとの排他的論理和演算を行い、演算結果をチェックコードに設定することを示している。
【００６３】
上記のforループが完了した時点で得られるcc[]をチェックコードとする。データ更新時にはデータとともにチェックコードもストレージ装置１１０に格納される。
データ管理部１４０は、ストレージ装置１１０内のデータを管理する。具体的には、データ管理部１４０はコントロールノード５００からの指示に従って、ストレージ装置１１０内のデータのパトロールを行う。パトロールを行う場合、データ管理部１４０は、チェック対象のプライマリスライスに対応するセカンダリスライスを管理する他のストレージノードに対して、チェック要求メッセージを送信する。また、データ管理部１４０は、他のストレージノードからチェック要求メッセージを受け取ると、指定されたスライス内のデータのパトロールを行う。
【００６４】
さらに、データ管理部１４０は、論理ボリューム管理部５１０からのスライス管理情報取得要求に応答して、スライス管理情報記憶部１５０に記憶されたスライス管理情報を論理ボリューム管理部５１０に対して送信する。
【００６５】
スライス管理情報記憶部１５０は、スライス管理情報を記憶する記憶装置である。たとえば、ＲＡＭ１０２内の記憶領域の一部がスライス管理情報記憶部１５０として使用される。なお、スライス管理情報記憶部１５０に格納されるスライス管理情報は、システム停止時にはストレージ装置１１０内に格納され、システム起動時にスライス管理情報記憶部１５０に読み込まれる。
【００６６】
他のストレージノード２００，３００，４００は、ストレージノード１００と同様の機能を有している。すなわち、ストレージノード２００は、データアクセス部２３０、データ管理部２４０、およびスライス管理情報記憶部２５０を有している。ストレージノード３００は、データアクセス部３３０、データ管理部３４０、およびスライス管理情報記憶部３５０を有している。ストレージノード４００は、データアクセス部４３０、データ管理部４４０、およびスライス管理情報記憶部４５０を有している。ストレージノード２００，３００，４００内の各要素は、ストレージノード１００内の同名の要素と同じ機能を有している。
【００６７】
図６は、スライス管理情報のデータ構造例を示す図である。スライス管理情報記憶部１５０に格納されたスライス管理情報１５１の構成要素は、左側の要素から順に以下の通りである。
・スライス番号
・開始ブロック位置（該当スライスの先頭に当たるブロックの番号）
・ブロック数（スライス内のブロック数）
・フラグ（プライマリ／セカンダリ）
・論理ボリューム識別子
・セグメント番号
・論理ボリューム開始ブロック位置
・論理ボリューム内でのブロック数
・ペアを組むストレージノード識別子
・ペアを組むスライス番号
図６で示したスライス管理情報１５１は、図４で示した論理ボリューム７００を構成している。たとえば、ノード識別子「ＳＮ−Ａ」のスライス管理情報１５１におけるスライス番号「４」のスライスは「ＬＶＯＬ−Ａ」のセグメント番号「４」のプライマリスライスであり、ペアを組んでいるのは「ＳＮ−Ｄ」のセグメント番号「１」のスライスである、ということを意味する。
【００６８】
同様のスライス管理情報が、他のストレージノード２００，３００，４００のスライス管理情報記憶部２５０，３５０，４５０にも格納されている。そして、コントロールノード５００が、システム起動時に各ストレージノード１００，２００，３００，４００からスライス管理情報を収集し、スライス管理情報群記憶部５２０に格納する。
【００６９】
図７は、スライス管理情報群記憶部のデータ構造例を示す図である。スライス管理情報群記憶部５２０には、収集したスライス管理情報１５１，２５１，３５１，４５１が格納されている。スライス管理情報１５１はストレージノード１００（ノード識別子を「ＳＮ−Ａ」とする）から取得したものである。スライス管理情報２５１はストレージノード２００（ノード識別子を「ＳＮ−Ｂ」とする）から取得したものである。スライス管理情報３５１はストレージノード３００（ノード識別子を「ＳＮ−Ｃ」とする）から取得したものである。スライス管理情報４５１はストレージノード４００（ノード識別子を「ＳＮ−Ｄ」とする）から取得したものである。
【００７０】
以上のような構成の分散ストレージシステムにおいて、ストレージノード１００，２００，３００，４００のパトロールが実施される。ストレージノード１００，２００，３００，４００のパトロールは、コントロールノード５００の指示に従って実行される。
【００７１】
図８は、パトロール処理の概略手順を示すシーケンス図である。以下、図８に示す処理をステップ番号に沿って説明する。
なお、パトロール処理は、論理ボリュームのセグメント７１０，７２０，７３０，７４０単位で行われる。そこで、ストレージノード１００がプライマリスライス７４１を管理し、ストレージノード４００がセカンダリスライス７４２を管理しているセグメント７４０（図４参照）のパトロールを行う場合を想定して、各ステップの処理を説明する。
【００７２】
［ステップＳ１１］コントロールノード５００の論理ボリューム管理部５１０は、セグメント７４０をパトロールするタイミングになると、プライマリスライス７４１を管理しているストレージノード１００に対して、該当スライスのパトロールを指示する。
【００７３】
［ステップＳ１２］ストレージノード１００のデータ管理部１４０は、コントロールノード５００からのパトロール指示を受け付ける。その後、プライマリスライス７４１を管理しているストレージノード１００が、プライマリスライス７４１が属するセグメント７４０のパトロールを統括する。
【００７４】
［ステップＳ１３］データ管理部１４０は、まず、プライマリスライス７４１に対応するスライス１２４（図４参照）上の領域からデータを読み出す。このとき、１回で読み出す単位は、スライスの大きさである必要はなくスライスよりも小さいサイズでもよい。本実施の形態では、５１２バイトのブロック単位でデータ読み出しを行うものとする。
【００７５】
［ステップＳ１４］データ管理部１４０は、読み出したデータをチェックする。具体的には、データ管理部１４０は、データを読み出す際に、そのデータに対応するチェックコードもストレージ装置１１０から読み出す。さらに、データ管理部１４０は、読み出したデータを元にしてチェックコードを算出しなおす。そして、データ管理部１４０は、ディスクから読み出したチェックコードと再算出したチェックコードを比較する。データやチェックコードの読み出しに失敗し、データを格納したブロックやチェックコードを格納した領域を含むブロックがバッドブロックとわかった場合やチェックコードが一致しなかった場合には、データ管理部１４０は、該当部分のデータ読み出しを異常と判定する。
【００７６】
［ステップＳ１５］データ管理部１４０は、チェック要求メッセージをセカンダリスライス７４２を管理するストレージノード４００に対して送信する。なお、ステップＳ１３でデータが読み出せなかった場合を除き、データ管理部１４０は、チェック要求メッセージに読み出したデータを含める。
【００７７】
［ステップＳ１６］チェック要求メッセージは、セカンダリスライス７４２を管理するストレージノード４００のデータ管理部４４０が受信する。
［ステップＳ１７］データ管理部４４０は、プライマリスライス７４１に対応するスライス１２４から読み出されたデータのチェックがステップＳ１４でパスしたか否かを判断する。チェックにパスした場合、処理がステップＳ２０に進められる。チェックにパスしなかった場合、処理がステップＳ１８に進められる。
【００７８】
［ステップＳ１８］データ管理部４４０は、ストレージ装置４１０内のセカンダリスライス７４２に対応するスライス４２１からデータを読み出す。
［ステップＳ１９］データ管理部４４０は、読み出したデータの整合性チェックを行う。
【００７９】
［ステップＳ２０］データ管理部４４０は、スライス１２４にデータを書き込む。なおデータを書き込む場合、プライマリスライス側のデータが正常に読み出され、チェックもパスしていれば、そのデータが書き込まれる。プライマリスライス側でデータが読み出せないか、チェックにパスしなかった場合、セカンダリスライスのデータのチェックがパスしていればセカンダリスライスのデータが書き込まれる。また、プライマリスライスとセカンダリデータの双方ともデータの読み出しには成功したがチェックにパスしなかった場合、プライマリスライスのデータが書き込まれる。
【００８０】
［ステップＳ２１］データ管理部４４０は、応答メッセージをプライマリスライス７４１に対応するスライス１２４を管理するストレージノード１００に対して送信する。なお、ステップＳ２０において、セカンダリスライスのデータを書き込んだ場合、応答メッセージには、書き込まれたデータが含まれる。
【００８１】
［ステップＳ２２］ストレージノード１００のデータ管理部１４０は、応答メッセージを受信する。
［ステップＳ２３］データ管理部１４０は、ストレージ装置１１０内のプライマリスライス７４１に対応するスライス１２４にデータを書き込む。書き込まれるデータは、ステップＳ２０においてセカンダリスライス７４２に対応するスライス４２１に書き込まれたデータと同じものである。
【００８２】
［ステップＳ２４］データ管理部１４０は、パトロール処理の結果をコントロールノード５００に送信する。
［ステップＳ２５］コントロールノード５００の論理ボリューム管理部５１０は、パトロール結果を受信する。
【００８３】
以上のような手順でパトロールが行われる。次に、チェック要求メッセージと応答メッセージのデータフォーマットについて説明する。
図９は、チェック要求メッセージのデータフォーマットを示す図である。チェック要求メッセージは、プライマリスライスを持つストレージノードからセカンダリスライスを持つストレージノードへ送られるメッセージである。
【００８４】
チェック要求メッセージデータフォーマット３０には、６個のフィールド３１〜３６が設けられている。
最初のフィールド３１には、データを送るストレージノード（プライマリスライスを管理するストレージノード）のストレージノード識別子が設定される。２番目のフィールド３２には、パトロールの対象となったセグメントのプライマリスライスに対応するスライスの番号（プライマリスライス番号）が設定される。３番目のフィールド３３には、パトロールの対象となったセグメントのセカンダリスライスに対応するスライスの番号（セカンダリスライス番号）が設定される。４番目のフィールド３４には、読み出し処理を行ったブロックの順番（ブロック番号）が設定される。５番目のフィールド３５には、プライマリスライスに対応するスライスからのブロックの読み出しが正常であったか否かを示すフラグが設定される。このフラグは、ブロックの読み出した正常であれば「true」、ブロックの読み出しに異常があれば「false」が設定される。６番目のフィールド３６には、プライマリスライスに対応するスライスから読み出されたデータが設定される。なお、プライマリスライスに対応するスライスからデータが読み出せなかった場合、初期値のデータが設定される。
【００８５】
図９には、具体的なチェック要求メッセージ４１，４２の例が示されている。これらのチェック要求メッセージ４１，４２は、ストレージノード識別子「ＳＮ−Ａ」のストレージノード１００からストレージノード識別子「ＳＮ−Ｄ」のストレージノード４００に送信される。この例では、ブロック番号「５００」のデータ読み出しは正常「true」に行われているが、ブロック番号「５０１」のデータ読み出しでは異常「false」となっている。データ読み出しが異常「false」のチェック要求メッセージ４２のデータのフィールドには、プライマリスライスからの読み出しでチェックコードが一致していないデータかメディアエラーなどによりデータが読み取れなかったため初期値が含まれている。
【００８６】
図１０は、応答メッセージのデータフォーマットを示す図である。応答メッセージデータフォーマット５０には、６個のフィールド５１〜５６が設けられている。
最初のフィールド５１には、データを送るストレージノード（セカンダリスライスを管理するストレージノード）のストレージノード識別子が設定される。２番目のフィールド５２には、パトロールの対象となったセグメントのプライマリスライスに対応するスライスの番号（プライマリスライス番号）が設定される。３番目のフィールド５３には、パトロールの対象となったセグメントのセカンダリスライスに対応するスライスの番号（セカンダリスライス番号）が設定される。４番目のフィールド５４には、読み出し処理を行ったブロックの順番（ブロック番号）が設定される。５番目のフィールド５５には、セカンダリスライスでデータの書き込みに採用したデータを示すフラグが設定される。このフラグは、プライマリスライスの正常と思われるデータを採用したのであれば「true」、プライマリスライスの正常かどうかあやしいデータを採用したのであれば「ＰＲＩＭＡＲＹ」、セカンダリスライスのデータを採用したのであれば「ＳＥＣＯＮＤＡＲＹ」が設定される。６番目のフィールド５６には、セカンダリスライスに対応するスライスへ書き込んだデータが設定される。
【００８７】
図１０には、具体的な応答メッセージ６１〜６３の例が示されている。これらの応答メッセージ６１〜６３は、ストレージノード識別子「ＳＮ−Ｄ」のストレージノード４００からストレージノード識別子「ＳＮ−Ａ」のストレージノード１００に送信される。この例によれば、ブロック番号「５００」にはプライマリスライスの正常なデータが採用され、ブロック番号「５０１」にはセカンダリスライスの正常なデータが採用され、ブロック番号「５１５」には異常と判定されたプライマリスライスのデータが採用されている。
【００８８】
次に、データ管理部がパトロールを実行するための処理機能を説明する。データ管理部のパトロール処理は、プライマリスライス内のデータのパトロール処理と、セカンダリスライス内のデータのパトロール処理とに分けることができる。
【００８９】
以下、プライマリスライスを持つストレージノードと、そのプライマリスライスに対応するセカンダリスライスをもつスライスノードとの観点から、パトロール処理（データ二重化保持機構）の処理について説明する。ここではＳＮ−Ａが、ＳＮ−Ａのスライス番号「４」に対するパトロール処理を行うものと仮定して、処理手順を説明する。
【００９０】
図１１は、プライマリスライス内のデータのパトロール処理手順を示すフローチャートである。以下、図１１に示す処理をステップ番号に沿って説明する。なお、以下の処理は、コントロールノード５００からＳＮ−Ａのスライス番号「４」を指定したパトロール指示が入力された際に実行される。
【００９１】
［ステップＳ３１］データ管理部１４０は、変数ｋ（スライス内でのブロックの順番を示すカウンタ）に０を設定する。変数ｋの値により、処理対象のスライスの位置が指定される。
【００９２】
［ステップＳ３２］データ管理部１４０は、変数ｋが、スライスのブロック数未満か否かを判断する。これは処理を終了させるための条件確認である。この例でのスライスのブロック数は１０００である。変数ｋがスライスのブロック数に達していなければ、処理がステップＳ３３に進められる。変数ｋがスライスのブロック数に達していれば、処理が終了する。
【００９３】
［ステップＳ３３］データ管理部１４０は、ブロックの読み出し処理を行う。この処理の詳細は後述する。
［ステップＳ３４］データ管理部１４０は、読み出した位置に書き戻すデータがあるか否かを判断する。
【００９４】
ここで「書き戻すデータ」について説明する。まず、プライマリスライスとセカンダリスライスとのいずれか一方から正常にデータが読み出せた場合、そのデータが書き戻すデータとなる。プライマリスライスとセカンダリスライスとの両方からデータが正常に読み出せた場合、プライマリスライスから読み出したデータが優先的に採用され、書き戻すデータとなる。
【００９５】
すなわち、ステップＳ３３の処理でプライマリスライスの該当部分のデータが異常なく読み出せれば、そのプライマリスライスから読み出したデータが書き戻すデータとして用いられる。もしプライマリスライスの該当部分の読み出しで異常があって、セカンダリスライスの対応する部分のデータ読み出しが正常であれば、そのセカンダリスライスの対応する部分のデータが書き戻すデータとして用いられる。
【００９６】
プライマリスライスの該当部分の読み出しで異常があって、セカンダリスライスの対応する部分のデータも異常だった場合は、次のような優先順位で書き戻すデータが決定される。もし、プライマリスライスのデータ異常であっても何らかのデータが読み出せていた場合（たとえば、読み出したデータのチェックコードが不一致の場合）、プライマリスライスのデータが採用される。プライマリスライスでデータが読み出せずセカンダリスライスでデータの読み出しが行えていればセカンダリスライスのデータを採用する。
【００９７】
もし、プライマリスライスとセカンダリスライスの両方でデータが読み出せなければ、書き戻すデータがないと判断される。
書き戻すデータがあれば、処理がステップＳ３５に進められる。書き戻すデータがなければ、処理がステップＳ３６に進められる。
【００９８】
［ステップＳ３５］書き戻すデータがある場合、データ管理部１４０は、書き戻すデータをプライマリスライス内のｋ番目のブロックに書き込む。その後、処理がステップＳ３７に進められる。
【００９９】
なお、本実施の形態では、書き込むデータが、プライマリスライスから読み出したデータであっても書き込み処理を行う。それは、ストレージ装置１１０がＲＡＩＤ５のシステム構成であり、リードのみではパリティデータの格納領域にアクセスしないためである。データの書き込みを行うことで、ストレージ装置１１０内においてパリティデータが生成され、パリティデータが書き込まれる。その結果、パリティデータを格納している領域に対してもライトアクセスが行われる。ライトアクセスを行うことで、その領域に書き込みができないといった障害があれば、その障害をパトロール時に検出可能となる。
【０１００】
［ステップＳ３６］書き戻すデータが無い場合、データ管理部１４０は、初期値を書き込みデータとして、書き戻すデータをプライマリスライス内のｋ番目のブロックに書き込む。
【０１０１】
［ステップＳ３７］データ管理部１４０は、変数ｋの値を１増加させ、処理をステップＳ３２に進める。
次に、ブロック読み出し処理の詳細について説明する。
【０１０２】
図１２は、ブロック読み出し処理の手順を示すフローチャートである。以下、図１２に示す処理をステップ番号に沿って説明する。
［ステップＳ４１］データ管理部１４０は、プライマリスライスに対応するストレージ装置１１０内のスライス１２４（スライス番号「４」）からｋ番目のブロックの読み出しを試みる。
【０１０３】
［ステップＳ４２］データ管理部１４０は、ブロックの読み出しが成功したか否かを判断する。読み出しに成功した場合、処理がステップＳ４５に進められる。読み出しに失敗した場合、処理がステップＳ４３に進められる。
【０１０４】
［ステップＳ４３］データ管理部１４０は、ブロックの読み出しに失敗した場合、初期値データを含むチェック要求メッセージをセカンダリスライス７４２を管理するストレージノード４００に送信する。
【０１０５】
［ステップＳ４４］データ管理部１４０は、セカンダリスライス７４２を管理するストレージノード４００から処理結果またはデータを含む応答メッセージを受信する。その後、ブロック読み出し処理が終了する。
【０１０６】
［ステップＳ４５］データ管理部１４０は、ストレージ装置１１０からステップＳ４１で読み出したブロックのチェックコードの読み出しを試みる。
［ステップＳ４６］データ管理部１４０は、チェックコードの読み出しが成功したか否かを判断する。読み出しに成功した場合、処理がステップＳ４７に進められる。読み出しに失敗した場合（たとえばメディアエラーなどでチェックコードを入手できない場合）、処理がステップＳ５０に進められる。
【０１０７】
［ステップＳ４７］データ管理部１４０は、ステップＳ４１で読み出したブロックからチェックコードを算出する。
［ステップＳ４８］データ管理部１４０は、ステップＳ４５で読み出したチェックコードとステップＳ４７で算出したチェックコードとを比較し、チェックコードが一致するか否かを判断する。チェックコードが一致した場合、処理がステップＳ４９に進められる。チェックコードが不一致の場合、処理がステップＳ５０に進められる。
【０１０８】
なお、チェックコードが一致しない場合でも、ｋ番目のブロックのデータの内容が正しいこともある。すなわち、ステップＳ４５で読み出したチェックコードが過っている場合には、ステップＳ４１で読み出したデータは正しくてもチェックコードは不一致となる。ただし、そのデータが正しいという保証ができないため、信頼性が低くなる。
【０１０９】
［ステップＳ４９］比較の結果、チェックコードが一致すれば、データ管理部１４０は、ステップＳ４１で読み出したブロックのデータを正常と判定し、正常データを含むチェック要求メッセージをセカンダリスライスを管理するストレージノード４００に送信する。その後、ブロック読み出し処理が終了する。
【０１１０】
［ステップＳ５０］ステップＳ４６でのチェックコードの読み出しに失敗したか、あるいはステップＳ４８においてチェックコードが不一致と判定された場合、データ管理部１４０は、ステップＳ４１で読み出したブロックのデータを、セカンダリスライスを管理するストレージノードにチェック要求メッセージによって送信する。
【０１１１】
［ステップＳ５１］データ管理部１４０は、セカンダリスライス７４２を管理するストレージノード４００から処理結果またはデータを含む応答メッセージを受信する。その後、ブロック読み出し処理が終了する。
【０１１２】
次に、セカンダリスライスを管理するストレージノード４００の処理について詳細に説明する。
図１３は、セカンダリスライス内のデータのパトロール処理手順を示すフローチャートである。以下、図１３に示す処理をステップ番号に沿って説明する。なお、この処理は、チェック要求メッセージを受信した際に実行される。
【０１１３】
［ステップＳ６１］ストレージノード４００のデータ管理部４４０は、プライマリスライスを管理するストレージノード１００からのチェック要求メッセージを受け取る。その際、データ管理部４４０は、チェック要求メッセージ中のセカンダリスライス番号のスライスが存在し、そのスライスがセカンダリスライスであることをスライス管理情報によって確認する。また、データ管理部４４０は、チェック要求メッセージで示されるストレージノード識別子とプライマリスライス番号とが、スライス管理情報に示される該当スライスに対する「ペアを組むストレージノード識別子」および「ペアを組むスライス番号」と一致することを確認する。
【０１１４】
［ステップＳ６２］データ管理部４４０は、ステップＳ６１における確認が終わった後、チェック要求メッセージ中のフラグをチェックし、「true」か否かを判断する。フラグが「true」であれば、処理がステップＳ６３に進められる。フラグが「false」であれば、処理がステップＳ６５に進められる。
【０１１５】
［ステップＳ６３］データ管理部４４０は、セカンダリスライスに対応するスライスのｋ番目（チェック要求メッセージの４番目のフィールドに示されている）のブロックに、チェック要求メッセージに含まれていたデータを書き込む。
【０１１６】
このように、本実施の形態では、データを受け取ったセカンダリスライスを持つストレージノードは、その受け取ったデータを対応部分に書き込む。これにより、ＲＡＩＤ５で管理されているストレージ装置４１０におけるセカンダリスライスに対応するスライスのｋ番目のブロック内のデータと、ブロックに対応するパリティデータに対してライトアクセスが行われる。
【０１１７】
［ステップＳ６４］データ管理部４４０は、プライマリスライスを管理するストレージノード１００に、フラグ「true」の応答メッセージを送信する。その後、処理が終了する。
【０１１８】
［ステップＳ６５］データ管理部４４０は、プライマリデータ異常時の処理を実行する。その後、処理が終了する。
図１４は、プライマリデータ異常時の処理を示すフローチャートである。以下、図１４に示す処理をステップ番号に沿って説明する。
【０１１９】
［ステップＳ７１］データ管理部４４０は、ストレージ装置４１０からセカンダリスライスに対応するスライスのｋ番目のブロックを読み出すことを試みる。
［ステップＳ７２］データ管理部４４０は、読み出しが成功したか否かを判断する。読み出しに成功した場合、処理がステップＳ７５に進められる。読み出しに失敗した場合、処理がステップＳ７３に進められる。
【０１２０】
［ステップＳ７３］ステップＳ７１でのブロック読み出しに失敗した場合、データ管理部４４０は、プライマリスライスを管理するストレージノード１００から送られたデータを、セカンダリスライスに対応するスライス内のｋ番目のブロックに書き込む。
【０１２１】
［ステップＳ７４］データ管理部４４０は、フラグに「ＰＲＩＭＡＲＹ」と設定した応答メッセージによって、処理結果をストレージノード１００に通知する。その後、プライマリデータ異常時の処理が終了する。
【０１２２】
［ステップＳ７５］データ管理部４４０は、ステップＳ７１でのブロック読み出しに成功した場合、ストレージ装置４１０からブロックに対応するチェックコードの読み出しを試みる。
【０１２３】
［ステップＳ７６］データ管理部４４０は、チェックコードの読み出しに成功したか否かを判断する。チェックコードの読み出しに成功した場合、処理がステップＳ７７に進められる。チェックコードの読み出しに失敗した場合、処理がステップＳ８０に進められる。
【０１２４】
［ステップＳ７７］データ管理部４４０は、ステップＳ７１で読み出したブロックからチェックコードを算出する。
［ステップＳ７８］データ管理部４４０は、ステップＳ７５で読み出したチェックコードとステップＳ７７で算出したチェックコードとを比較し、チェックコードが一致するか否かを判断する。チェックコードが一致した場合、処理がステップＳ７９に進められる。チェックコードが不一致の場合、処理がステップＳ８０に進められる。
【０１２５】
［ステップＳ７９］比較の結果、チェックコードが一致すれば、データ管理部４４０は、ステップＳ７１で読み出したブロックのデータを正常と判定し、そのデータを含む応答メッセージをプライマリスライスを管理するストレージノード１００に送信する。このとき、応答メッセージのフラグには、「ＳＥＣＯＮＤＡＲＹ」と設定される。なお、このとき、ステップＳ７１で読み出したデータを、ストレージ装置４１０に上書きで書き込んでもよい。書き込みを行えば、ＲＡＩＤ５システムのブロックのパリティデータにもデータアクセスが発生し、パリティデータの記憶領域に生じた障害の早期検出が可能となる。その後、プライマリデータ異常時の処理が終了する。
【０１２６】
［ステップＳ８０］ステップＳ７６でのチェックコードの読み出しに失敗したか、あるいはステップＳ７８においてチェックコードが不一致と判定された場合、データ管理部４４０は、プライマリスライスから読み出されたデータがあるか否かを判断する。すなわち、プライマリスライスを管理するストレージノード１００から送られたチェック要求メッセージに含まれるデータが初期値（たとえば、全てのビットが「０」のデータ）以外のデータであれば、プライマリスライスから読み出されたデータであると判断できる。プライマリスライスから読み出したデータがあれば、処理がステップＳ８１に進められる。プライマリスライスから読み出したデータがなければ、処理がステップＳ８３に進められる。
【０１２７】
［ステップＳ８１］データ管理部４４０は、プライマリスライスから読み出されたデータを採用し、そのデータをセカンダリスライスに対応するスライス内のｋ番目のブロックに書き込む。その際、データ管理部４４０は、書き込んだブロックのチェックコードを計算し、ストレージ装置４１０に書き込む。
【０１２８】
［ステップＳ８２］データ管理部４４０は、フラグに「ＰＲＩＭＡＲＹ」と設定した応答メッセージによって、処理結果をストレージノード１００に通知する。その後、プライマリデータ異常時の処理が終了する。
【０１２９】
［ステップＳ８３］データ管理部４４０は、セカンダリスライスに対応するスライスから読み出したデータに基づいてチェックコードを再計算し、そのデータとチェックコードとをストレージ装置４１０に書き込む。
【０１３０】
［ステップＳ８４］データ管理部４４０は、フラグに「ＳＥＣＯＮＤＡＲＹ」と設定した応答メッセージによって、処理結果をストレージノード１００に通知する。その後、プライマリデータ異常時の処理が終了する。
【０１３１】
以上のようにして、パトロール指示に応じてセグメントを構成するプライマリスライスとセカンダリスライスとのデータのチェックが行われる。
ところで、本実施の形態では、プライマリスライスとセカンダリスライスとにおける対応する２つのデータが共に異常（ディスク上に格納されていたチェックコードとデータを読んで再算出したチェックコードが一致しない）であるとき、プライマリスライスのデータを採用し、データを統一する。これは、セカンダリスライスのデータを統一する場合、あるいは異なったデータをそのまま保持する場合と比べ、プライマリスライスのデータで統一した方が、信頼性の面で優れているためである。具体的には、以下のような理由がある。
【０１３２】
データを二重化している場合のＩ／Ｏに対する処理が以下の場合を考える。このようなＩ／Ｏに対する処理を後での参照を考えパターンＡと呼ぶことにする。
［パターンＡ］
二重化されたデータを読み出す場合、プライマリスライスからデータが読み出され、セカンダリスライスからはデータの読み出しは行われない。また、データを二重化して書き込む場合、プライマリスライスとセカンダリスライスとにデータが書き込まれる。
【０１３３】
ここでは読み出す場合に着目する。
図１５は、データ読み出し処理を示す図である。アクセスノード６００の論理ボリュームアクセス制御部６１０は、アクセス用テーブル６１１を有している。
【０１３４】
アクセス用テーブル６１１には、スライス識別子とストレージノード識別子との欄が設けられている。スライス識別子の欄には、各ストレージノード１００，２００，３００，４００が管理しているプライマリスライスまたはセカンダリスライスのスライス識別子が設定される。ストレージノード識別子の欄には、ストレージノードを識別するためのストレージノード識別子が設定される。
【０１３５】
論理ボリュームアクセス制御部６１０は、端末装置２１〜２３からの論理ボリュームに対するアクセス要求を受け取ると、アクセス用テーブル６１１を参照し、アクセス対象のセグメントを構成するプライマリスライスを管理するストレージノードを判断する。図１５には、２番目のセグメントに対するアセス要求を受け付けた場合の例が示されている。この場合、論理ボリュームアクセス制御部６１０は、アクセス用テーブル６１１を参照し、２番目のセグメントのプライマリスライス「Ｐ２」は、ストレージノード識別子「ＳＮ−Ｃ」のストレージノード３００で管理されていることを認識する。そこで、論理ボリュームアクセス制御部６１０は、ストレージノード３００に対して、スライス識別子「Ｐ２」内のデータを指定したアクセス要求を出力する。
【０１３６】
ストレージノード３００では、データアクセス部３３０（図５参照）がアクセス要求を受け取り、スライス管理情報記憶部３５０内のスライス管理情報を参照し、スライス識別子「Ｐ２」に対応するスライス番号「５」を認識する。そして、データアクセス部３３０が、ストレージ装置３１０内のスライス番号「５」のスライスに対してアクセスする。
【０１３７】
ここで、セグメントを構成するプライマリスライスとセカンダリスライスとの配置先の組み合わせが変更されないのであれば、両方のデータに異常があった場合にも、プライマリスライスとセカンダリスライスのデータとをそのまま維持してもよい。すなわち、いずれのデータも信頼できないため、いずれか一方に統一する根拠もない。
【０１３８】
しかしながら、システムの信頼性を高めるには、ストレージノードやストレージ装置が壊れるということと壊れた場合の対処を、ストレージシステムでは考えておかなければならない。
【０１３９】
図１６は、障害発生時のスライスの配置換えを示す図である。図１６には、ストレージノード３００で障害が発生した場合を示している。ストレージノード３００に障害が発生したことにより、ストレージノード１００がセカンダリスライスとして管理していた「Ｓ２」のスライスが、プライマリスライス「Ｐ２」に変更されている。また、ストレージノード２００にセカンダリスライス「Ｓ２」の管理が移されている。
【０１４０】
なお、このようなスライスの配置換えは、コントロールノード５００の論理ボリューム管理部５１０で行われ、配置換えの結果が各ストレージノード１００，２００，３００，４００のデータ管理部１４０とアクセスノード６００の論理ボリュームアクセス制御部６１０とに通知される。
【０１４１】
このようなＩ／Ｏ制御が行われるシステムにおいて、たとえば、図１５の「Ｐ２」と「Ｓ２」の１０００番目のブロックで双方ともデータ異常（チェックコードの不一致）が検出された場合を考える。データ異常と前後して「Ｐ２」の１０００番目のブロックに外部から読み出し要求が来ていて「Ｐ２」を管理するストレージノード３００が自身のデータを要求元に返しているものとする。
【０１４２】
このときに何らかの要因でストレージノード３００が故障してしまった場合、ストレージノード１００の「Ｓ２」がプライマリスライス「Ｐ２」に変更され、別のストレージノード２００に新たなセカンダリスライス「Ｓ２」が確保される。これによって、データの二重化が維持される。
【０１４３】
なお、システムの運用を継続している場合、プライマリスライスの配置先の変更後においても、プライマリスライスに対するデータの読み取りにおけるデータの一貫性を保つ必要がある。すなわち、障害発生前においてプライマリスライスに対応するスライス（ストレージノード３００の５番目のスライス）に格納されていたデータと、障害発生後においてプライマリスライスに対応するスライス（ストレージノード１００の５番目のスライス）に格納されていたデータとが一致していなければならない。そうでないと、たとえば、２番目のセグメントに対する１０００ブロック目の読み出し要求に対し、障害発生前後において異なるデータが返されてしまう。すると、読み出し要求元の端末装置では、受け取るデータが異なるので矛盾が生じてしまうことになる。
【０１４４】
このような矛盾が生じる可能性を下げるために、本実施の形態では、プライマリスライスとセカンダリスライスの同じ箇所でデータ異常が発生した場合には、プライマリスライスのデータを採用することにした。
【０１４５】
たとえば、図１５の障害発生前の状態において、ストレージノード３００の「Ｐ２」のスライス内の１０００番目のブロック７１と、ストレージノード１００の「Ｓ２」のスライス内の１０００番目のブロック７２との双方でデータ異常が検出されたものとする。データ異常が検出されたとしても、ブロック７１は読み出し要求に応じて読み出されている。そのため、データの一貫性を保つためにもブロック７１の内容を変更するのは好ましくない。
【０１４６】
また、図１６に示すように障害発生後は、ストレージノード１００の５番目のスライスがプライマリスライスに対応付けられる。すると、そのスライスの１０００番目のブロック７２と、それ以前にストレージノード３００の５番目のスライス内の１０００番目のブロック７１から読み出されていたデータとが同一であることが望まれる。そこで、パトロール処理において、ブロック７１とブロック７２との両方でデータ異常が見つかった場合、ブロック７１のデータによってブロック７２の内容を更新する。その結果、障害発生後においても、２番目のセグメントに対するデータ読み出しによって読み出されるデータの一貫性が保証され、端末装置でデータの矛盾も回避できる。
【０１４７】
このようなパターンＡとは別のＩ／Ｏ処理として、書き込みは同じだが読み出し方式が異なるものもある。これをパターンＢとパターンＣと呼ぶことにする。
［パターンＢ］
このＩ／Ｏ処理では、データ読み出しを行う場合、プライマリスライスとセカンダリスライスに同時にアクセスを試みる。そして応答の速い方からデータを受け取る。データ書き込み処理の場合、プライマリスライスとセカンダリスライスにデータを書き込む。つまり、データ書き込み処理はパターンＡと同じである。
【０１４８】
［パターンＣ］
このＩ／Ｏ処理では、データ読み出しを行う場合、何らかの基準でアクセスする先をプライマリスライスかセカンダリスライスに決めて、その決まった先にアクセスする。基準の一例として、プライマリスライス→セカンダリスライス→プライマリスライス→・・・と交互にアクセス先を変えるというものがある。データ書き込み処理の場合、プライマリスライスとセカンダリスライスにデータを書き込む。つまり、データ書き込み処理はパターンＡと同じである。
【０１４９】
パターンＢとパターンＣの場合では、プライマリスライスとセカンダリスライスの同じデータを持つべき領域が異なったデータとなっていると、データ矛盾をユーザに示してしまう可能性が高くなる。そのため、パターンＢとパターンＣの場合、プライマリスライスのデータとセカンダリスライスのデータとのいずれかに合わせるべきである。ここでは、パターンＡも含めて共通の処理とするべく、プライマリスライスのデータにあわせることにする。
【０１５０】
以上のように、本実施の形態では、プライマリスライスのデータが正常であれば、そのデータがプライマリスライスとセカンダリスライスとの両方に書き込まれる。
反対に、プライマリスライスからのデータ読み出し時に異常が検出されれば、その異常ブロックに対応する部分のデータがセカンダリスライスを管理するストレージノードから読み出される。セカンダリスライスのデータが異常なく読めれば、プライマリスライスを管理するストレージノードにそのデータが渡される。データを受け取ったプライマリスライスを管理するストレージノードはそのデータをプライマリスライスの該当部分に書き込む。
【０１５１】
一方、セカンダリスライスからのデータの読み出し時にも異常が発生したら、その異常の種類により次のような処理が行われる。もしプライマリスライスとセカンダリスライスとにおけるデータの異常が共にチェックコードの不一致であれば、プライマリスライスから読み出したデータがそのまま採用される。もし一方の異常がチェックコードの不一致でありもう一方の異常がバッドブロック（読み出し失敗）ならば、チェックコードが不一致であっても、読み出されたデータが採用される。そして、採用されたデータが、プライマリスライスとセカンダリスライスとの両方に書き戻される。もし、両方ともバッドブロックであれば、プライマリスライスとセカンダリスライスとの両方が初期値で埋められる。
【０１５２】
これにより、プライマリスライスとセカンダリスライスとのデータをチェックし、できるだけ信頼性の高いデータで、それぞれのデータが統一される。その結果、異常なデータが適宜修復され、データロストが防止される。
【０１５３】
また、プライマリスライスとセカンダリスライスとのデータの信頼性が同じであれば、プライマリスライスが優先的に採用され、それぞれのデータが採用されたデータで統一される。これにより、ユーザからのアクセス対象となっているプライマリスライスのデータの一貫性が維持される。
【０１５４】
以下に、本実施の形態の変形例を示す。
もし、ＲＡＩＤシステムがバッドブロック対策の機構を有していた場合には、そのバッドブロック対策の機構を信頼して、パトロール処理を簡略化することもできる。たとえば、パトロール処理では基本的にはデータの読み出し処理のみとし、プライマリライスとセカンダリスライスのデータ比較を行った結果データが異なっていた場合にのみ書き込みを行うという手法を取ってもよい。この場合、データが正常である限り、データの書き込みを行う必要が無く、処理の効率化が図れる。
【０１５５】
また、ストレージノードが持つストレージ装置はＲＡＩＤシステムであることが望ましいが、ＲＡＩＤシステムではなく普通のディスク（データ冗長性を持たないという意味であり、ＪＢＯＤ（Just a Bunch Of Disks）やＲＡＩＤ０などが含まれる）を使用することもできる。その場合には、プライマリスライスのデータ読み出しで異常がなければ再び同じ箇所に読み出したデータを書くという処理は省略できる。説明が重複するが、読み出したデータを同じ箇所に書くという処理は、ＲＡＩＤシステムでは読み出しではアクセスされない領域（たとえば、パリティデータ）に書き込み処理を行うことによって該当領域にアクセスするためである。一方、普通のディスクでは読み出しと書き込みとでは、アクセスされる領域が同じであり、読み出し後に改めて同一データを書き込む必要がない。
【０１５６】
加えて、分散ストレージシステム中に存在するストレージノードが持つディスク装置は同一である必要はない。あるストレージノードはＲＡＩＤシステムを有し、別のストレージノードは普通のディスクを有していてもよい。この場合、ストレージノードそれぞれにおいて、読み出したデータを同じ箇所に書き戻す処理が必要になったり、不要であったりする。
【０１５７】
さらに、格納するデータに対応したチェックコードを持つことが望ましいが、チェックコードを持たなくてもよい。チェックコードを格納しなければ、ストレージ装置内の記憶容量を有効に利用できる。ただし、チェックコードを持たない場合には、プライマリスライスのデータとセカンダリスライスのデータの比較を常に行わなければならない。そのため、セカンダリスライスを管理するストレージノードでは、チェック要求メッセージのフラグが「true」であっても、セカンダリスライスからのデータの読み出しが必要となる。
【０１５８】
また、上記の処理機能は、コンピュータによって実現することができる。その場合、ストレージノード１００，２００，３００，４００、コントロールノード５００、およびアクセスノード６００それぞれが有すべき機能の処理内容を記述したプログラムが提供される。そのプログラムをコンピュータで実行することにより、上記処理機能がコンピュータ上で実現される。処理内容を記述したプログラムは、コンピュータで読み取り可能な記録媒体に記録しておくことができる。コンピュータで読み取り可能な記録媒体としては、磁気記録装置、光ディスク、光磁気記録媒体、半導体メモリなどがある。磁気記録装置には、ハードディスク装置（ＨＤＤ）、フレキシブルディスク（ＦＤ）、磁気テープなどがある。光ディスクには、ＤＶＤ（Digital Versatile Disc）、ＤＶＤ−ＲＡＭ（Random Access Memory）、ＣＤ−ＲＯＭ（Compact Disc Read Only Memory）、ＣＤ−Ｒ（Recordable）／ＲＷ（ReWritable）などがある。光磁気記録媒体には、ＭＯ（Magneto-Optical disk）などがある。
【０１５９】
プログラムを流通させる場合には、たとえば、そのプログラムが記録されたＤＶＤ、ＣＤ−ＲＯＭなどの可搬型記録媒体が販売される。また、プログラムをサーバコンピュータの記憶装置に格納しておき、ネットワークを介して、サーバコンピュータから他のコンピュータにそのプログラムを転送することもできる。
【０１６０】
プログラムを実行するコンピュータは、たとえば、可搬型記録媒体に記録されたプログラムもしくはサーバコンピュータから転送されたプログラムを、自己の記憶装置に格納する。そして、コンピュータは、自己の記憶装置からプログラムを読み取り、プログラムに従った処理を実行する。なお、コンピュータは、可搬型記録媒体から直接プログラムを読み取り、そのプログラムに従った処理を実行することもできる。また、コンピュータは、サーバコンピュータからプログラムが転送される毎に、逐次、受け取ったプログラムに従った処理を実行することもできる。
【０１６１】
なお、本発明は、上述の実施の形態にのみ限定されるものではなく、本発明の要旨を逸脱しない範囲内において種々の変更を加えることができる。
以上説明した実施の形態の主な技術的特徴は、以下の付記の通りである。
【０１６２】
（付記１）  ネットワーク経由で接続された複数のストレージノードでデータの分散管理を行う分散ストレージシステムを構成する前記ストレージノードにストレージ装置を管理させるためのストレージ管理プログラムにおいて、
コンピュータを、
ローカルの前記ストレージ装置に格納された前記データと同一内容の冗長データを管理する二重化相手ストレージノードが登録された管理情報を記憶する管理情報記憶手段、
前記ストレージ装置内の前記データのチェック指示を受け取ると、前記ストレージ装置から前記データを読み出し、前記データが正常か否かを判断するデータチェック手段、
前記データチェック手段により前記データの異常が検出されると、前記管理情報を参照し、異常が検出された前記データに対応する前記冗長データを格納している前記二重化相手ストレージノードを判断し、前記二重化相手ストレージノードから異常が検出された前記データに対応する前記冗長データを取得するデータ取得手段、
前記データ取得手段が取得した前記冗長データを、前記ストレージ装置内の前記データの記憶領域に対して上書きで書き込むデータ書き込み手段、
として機能させるためのストレージ管理プログラム。
【０１６３】
（付記２）  前記コンピュータを、さらに、
前記データのアクセス要求に応答して、前記ストレージ装置に対する前記データの書き込みまたは前記データの読み出しを行い、前記データを書き込む際には、前記データに基づいてチェックコードを生成し、前記データに対応付けて前記チェックコードを前記ストレージ装置に書き込むデータアクセス手段として機能させ、
前記データチェック手段は、前記ストレージ装置から前記データに対応する前記チェックコードを読み出すと共に、前記データから前記チェックコードを新たに生成し、読み出した前記チェックコードと新たに生成した前記チェックコードとを比較することで、前記データが正常か否かを判断することを特徴とする付記１記載のストレージ管理プログラム。
【０１６４】
（付記３）  前記データ書き込み手段は、前記データが正常と判断された場合、前記ストレージ装置から読み出した前記データを前記ストレージ装置内の前記データの記憶領域に対して上書きで書き込むことを特徴とする付記１記載にストレージ管理プログラム。
【０１６５】
（付記４）  前記データ取得手段は、前記データが正常か否かを示すフラグおよび前記データを含むチェック要求メッセージを前記二重化相手ストレージノードに送信し、前記二重化相手ストレージノードが前記データに対応する前記冗長データの記憶領域に保存した採用データを示すフラグ、および前記冗長データが採用された場合には前記冗長データを含む応答メッセージを取得することを特徴とする付記１記載のストレージ管理プログラム。
【０１６６】
（付記５）  前記データ書き込み手段は、前記データが異常と判断され、かつ前記応答メッセージにおいて前記データが前記採用データであることが示された場合、異常と判断された前記データを前記ストレージ装置内の前記データの記憶領域に対して上書きで書き込むことを特徴とする付記４記載にストレージ管理プログラム。
【０１６７】
（付記６）  前記データ取得手段は、前記データチェック手段による前記ストレージ装置からの前記データの読み出しが失敗した場合、前記データに代えて所定の初期値を前記チェック要求メッセージに含めることを特徴とする付記４記載のストレージ管理プログラム。
【０１６８】
（付記７）  前記データ書き込み手段は、前記二重化相手ストレージノードから、前記冗長データが正常か否かを示すフラグおよび前記冗長データを含むチェック要求メッセージが入力されると、前記冗長データが正常であれば、前記冗長データを前記ストレージ装置内の前記データの記憶領域に対して上書きで書き込むことを特徴とする付記１記載のストレージ管理プログラム。
【０１６９】
（付記８）  前記データチェック手段は、前記チェック要求メッセージにおいて、前記冗長データが異常であれば、前記ストレージ装置から前記冗長データに対応する前記データを読み出し、前記データが正常か否かを判断し、
前記データ書き込み手段は、前記チェック要求メッセージに含まれた前記冗長データに対応する前記データが正常であれば、前記データを前記ストレージ装置内の前記データの記憶領域に対して上書きで書き込み、前記冗長データに対応する前記データが異常であれば、前記冗長データを前記ストレージ装置内の前記データの記憶領域に対して上書きで書き込むことを特徴とする付記７記載のストレージ管理プログラム。
【０１７０】
（付記９）  前記コンピュータを、さらに、
前記チェック要求メッセージを受け取った際に前記データ書き込み手段が書き込み対象として採用し前記ストレージ装置に書き込んだ採用データを含む応答メッセージを前記二重化相手ストレージノードに対して送信するデータ送信手段として機能させることを特徴とする付記８記載のストレージ管理プログラム。
【０１７１】
（付記１０）  ネットワーク経由で接続された複数のストレージノードでデータの分散管理を行う分散ストレージシステムを構成する前記ストレージノードにストレージ装置を管理させるためのストレージ管理装置において、
ローカルの前記ストレージ装置に格納された前記データと同一内容の冗長データを管理する二重化相手ストレージノードが登録された管理情報を記憶する管理情報記憶手段と、
前記ストレージ装置内の前記データのチェック指示を受け取ると、前記ストレージ装置から前記データを読み出し、前記データが正常か否かを判断するデータチェック手段と、
前記データチェック手段により前記データの異常が検出されると、前記管理情報を参照し、異常が検出された前記データに対応する前記冗長データを格納している前記二重化相手ストレージノードを判断し、前記二重化相手ストレージノードから異常が検出された前記データに対応する前記冗長データを取得するデータ取得手段と、
前記データ取得手段が取得した前記冗長データを、前記ストレージ装置内の前記データの記憶領域に対して上書きで書き込むデータ書き込み手段と、
を有することを特徴とするストレージ管理装置。
【０１７２】
（付記１１）  前記データのアクセス要求に応答して、前記ストレージ装置に対する前記データの書き込みまたは前記データの読み出しを行い、前記データを書き込む際には、前記データに基づいてチェックコードを生成し、前記データに対応付けて前記チェックコードを前記ストレージ装置に書き込むデータアクセス手段をさらに有し、
前記データチェック手段は、前記ストレージ装置から前記データに対応する前記チェックコードを読み出すと共に、前記データから前記チェックコードを新たに生成し、読み出した前記チェックコードと新たに生成した前記チェックコードとを比較することで、前記データが正常か否かを判断することを特徴とする付記１０記載のストレージ管理装置。
【０１７３】
（付記１２）  前記データ書き込み手段は、前記データが正常と判断された場合、前記ストレージ装置から読み出した前記データを前記ストレージ装置内の前記データの記憶領域に対して上書きで書き込むことを特徴とする付記１０記載にストレージ管理装置。
【０１７４】
（付記１３）  前記データ取得手段は、前記データが正常か否かを示すフラグおよび前記データを含むチェック要求メッセージを前記二重化相手ストレージノードに送信し、前記二重化相手ストレージノードが前記データに対応する前記冗長データの記憶領域に保存した採用データを示すフラグ、および前記冗長データが採用された場合には前記冗長データを含む応答メッセージを取得することを特徴とする付記１０記載のストレージ管理装置。
【０１７５】
（付記１４）  前記データ書き込み手段は、前記データが異常と判断され、かつ前記応答メッセージにおいて前記データが前記採用データであることが示された場合、異常と判断された前記データを前記ストレージ装置内の前記データの記憶領域に対して上書きで書き込むことを特徴とする付記１３記載にストレージ管理装置。
【０１７６】
（付記１５）  前記データ書き込み手段は、前記データチェック手段による前記ストレージ装置からの前記データの読み出しが失敗した場合、前記データに代えて所定の初期値を前記チェック要求メッセージに含めることを特徴とする付記１３記載のストレージ管理装置。
【０１７７】
（付記１６）  前記データ書き込み手段は、前記二重化相手ストレージノードから、前記冗長データが正常か否かを示すフラグおよび前記冗長データを含むチェック要求メッセージが入力されると、前記冗長データが正常であれば、前記冗長データを前記ストレージ装置内の前記データの記憶領域に対して上書きで書き込むことを特徴とする付記１０記載のストレージ管理装置。
【０１７８】
（付記１７）  前記データチェック手段は、前記チェック要求メッセージにおいて、前記冗長データが異常であれば、前記ストレージ装置から前記冗長データに対応する前記データを読み出し、前記データが正常か否かを判断し、
前記データ書き込み手段は、前記チェック要求メッセージに含まれた前記冗長データに対応する前記データが正常であれば、前記データを前記ストレージ装置内の前記データの記憶領域に対して上書きで書き込み、前記冗長データに対応する前記データが異常であれば、前記冗長データを前記ストレージ装置内の前記データの記憶領域に対して上書きで書き込むことを特徴とする付記１６記載のストレージ管理装置。
【０１７９】
（付記１８）  前記チェック要求メッセージを受け取った際に前記データ書き込み手段が書き込み対象として採用し前記ストレージ装置に書き込んだ採用データ含む応答メッセージを前記二重化相手ストレージノードに対して送信するデータ送信手段をさらに有することを特徴とする付記１７記載のストレージ管理装置。
【０１８０】
（付記１９）  ネットワーク経由で接続された複数のストレージノードでデータの分散管理を行う分散ストレージシステムを構成する前記ストレージノードにストレージ装置を管理させるためのストレージ管理方法において、
データチェック手段が、前記ストレージ装置内の前記データのチェック指示を受け取ると、前記ストレージ装置から前記データを読み出し、前記データが正常か否かを判断し、
管理情報記憶手段にローカルの前記ストレージ装置に格納された前記データと同一内容の冗長データを管理する二重化相手ストレージノードが登録された管理情報が記憶されており、前記データチェック手段により前記データの異常が検出されると、データ取得手段が、前記管理情報を参照し、異常が検出された前記データに対応する前記冗長データを格納している前記二重化相手ストレージノードを判断し、前記二重化相手ストレージノードから異常が検出された前記データに対応する前記冗長データを取得し、
データ書き込み手段が、前記データ取得手段が取得した前記冗長データを、前記ストレージ装置内の前記データの記憶領域に対して上書きで書き込む、
ことを特徴とするストレージ管理方法。
【図面の簡単な説明】
【０１８１】
【図１】発明の概要を示す図である。
【図２】本実施の形態の分散ストレージシステム構成例を示す図である。
【図３】本実施の形態に用いるストレージノードのハードウェア構成例を示す図である。
【図４】論理ボリュームのデータ構造を示す図である。
【図５】分散ストレージシステムの各装置の機能を示すブロック図である。
【図６】スライス管理情報のデータ構造例を示す図である。
【図７】スライス管理情報群記憶部のデータ構造例を示す図である。
【図８】パトロール処理の概略手順を示すシーケンス図である。
【図９】チェック要求メッセージのデータフォーマットを示す図である。
【図１０】応答メッセージのデータフォーマットを示す図である。
【図１１】プライマリスライス内のデータのパトロール処理手順を示すフローチャートである。
【図１２】ブロック読み出し処理の手順を示すフローチャートである。
【図１３】セカンダリスライス内のデータのパトロール処理手順を示すフローチャートである。
【図１４】プライマリデータ異常時の処理を示すフローチャートである。
【図１５】データ読み出し処理を示す図である。
【図１６】障害発生時のスライスの配置換えを示す図である。
【符号の説明】
【０１８２】
１，２  ストレージノード
１ａ  データアクセス手段
１ｂ  管理情報記憶手段
１ｃ，２ａ  データチェック手段
１ｄ  データ取得手段
１ｅ，２ｂ  データ書き込み手段
２ｃ  データ送信手段
３，４  ストレージ装置
３ａ，４ａ  データ
５  チェック要求メッセージ
６  応答メッセージ
【図１】
2008071209.tif 000003
【図２】
2008071209.tif 000004
【図３】
2008071209.tif 000005
【図４】
2008071209.tif 000006
【図５】
2008071209.tif 000007
【図６】
2008071209.tif 000008
【図７】
2008071209.tif 000009
【図８】
2008071209.tif 000010
【図９】
2008071209.tif 000011
【図１０】
2008071209.tif 000012
【図１１】
2008071209.tif 000013
【図１２】
2008071209.tif 000014
【図１３】
2008071209.tif 000015
【図１４】
2008071209.tif 000016
【図１５】
2008071209.tif 000017
【図１６】
2008071209.tif 000018