(57)【要約】【課題】リードキャッシュインバリデート処理にかかるコストを低減し、キャッシュの一貫性を保証するストレージクラスタシステムを提供すること。【解決手段】本発明のストレージクラスタシステムでは、各ブロックデバイス制御装置２のうちの何れかは、ホストコンピュータ１からの仮想記憶デバイスへのアクセス要求を受信するスレーブノードとして機能し、各ブロックデバイス制御装置２のうちの何れかは、アクセス対象範囲を含むディスクアレイを管理するマスタノードとして機能し、各ブロックデバイス制御装置２のうちの何れかは、アクセス対象範囲とスレーブノードとを関連付けたディレクトリエントリを記録したディレクトリを管理するディレクトリ管理ノードとして機能する。ディレクトリ管理ノードは、他のブロックデバイス制御装置２がリード又はライトできるようにディレクトリをディレクトリ仮想記憶デバイスにマップする。【選択図】      図１
2008123198.tif 000002
【特許請求の範囲】
【請求項１】
互いに接続された複数の記憶デバイス制御装置と、前記複数の記憶デバイス制御装置によってそれぞれ管理される物理記憶デバイスとを備えてなり、前記各物理記憶デバイスが統合されることによって、外部装置へ提供される仮想記憶デバイスを形成しているストレージクラスタシステムにおいて、
前記各記憶デバイス制御装置のうちの何れかは、前記外部装置からの前記仮想記憶デバイスへのアクセス要求を受信するスレーブノードとして機能し、前記各記憶デバイス制御装置のうちの何れかは、前記アクセス要求で指定されたアクセス対象範囲を含む物理記憶デバイスを管理するマスタノードとして機能し、前記各記憶デバイス制御装置のうちの何れかは、前記スレーブノードと前記アクセス対象範囲とを関連付けたディレクトリエントリが記録されたディレクトリを管理するディレクトリ管理ノードとして機能し、
前記ディレクトリ管理ノードは、前記ディレクトリをマップしたディレクトリ仮想記憶デバイスを備え、
前記ディレクトリ仮想記憶デバイスの情報は、前記各記憶デバイス制御装置間で共有され、
前記スレーブノードは、前記アクセス要求を受信すると、前記マスタノードへ前記アクセス要求を転送し、前記アクセス要求がリード要求であれば、前記マスタノードから転送されたデータをキャッシュし、前記アクセス要求がライト要求であれば、前記外部装置から転送されたデータをキャッシュし、
前記各記憶デバイス制御装置のうちの何れかが前記ディレクトリ仮想記憶デバイスにライトすることで、前記ディレクトリエントリにおける前記スレーブノードと前記アクセス対象範囲との関連付けを更新し、
前記スレーブノードが前記ディレクトリ仮想記憶デバイスをリードし、前記ディレクトリエントリによって前記スレーブノードと前記アクセス対象範囲とが関連付けられていれば、前記キャッシュデータが有効であると判定するストレージクラスタシステム。
【請求項２】
請求項１に記載のストレージクラスタシステムにおいて、
前記マスタノードは、前記アクセス要求が転送された場合、前記ディレクトリ仮想記憶デバイスをライトし、前記ディレクトリにおけるディレクトリエントリを更新するストレージクラスタシステム。
【請求項３】
請求項１に記載のストレージクラスタシステムにおいて、
前記スレーブノードは、前記アクセス要求を受信した場合、前記ディレクトリ仮想記憶デバイスをライトし、前記ディレクトリにおけるディレクトリエントリを更新するストレージクラスタシステム。
【請求項４】
請求項１に記載のストレージクラスタシステムにおいて、
前記スレーブノードが、前記ディレクトリのコピーをマップしたディレクトリコピー仮想記憶デバイスを備え、
前記ディレクトリコピー仮想記憶デバイスの情報は、前記各記憶デバイス制御装置間で共有され、
前記各記憶デバイス制御装置のうちの何れかが前記ディレクトリコピー仮想記憶デバイスにライトすることで、前記ディレクトリのコピーの前記ディレクトリエントリにおける前記スレーブノードと前記アクセス対象範囲との関連付けを更新し、
前記スレーブノードが前記アクセス要求を受信し、前記アクセス対象範囲のキャッシュデータを保持している場合に、前記ディレクトリコピー仮想記憶デバイスをリードし、前記ディレクトリのコピーに記録されたディレクトリエントリによって前記スレーブノードと前記アクセス対象範囲とが関連付けられていれば、前記キャッシュデータが有効であると判定するストレージクラスタシステム。
【請求項５】
請求項４に記載のストレージクラスタシステムにおいて、
前記マスタノードは、前記アクセス要求が転送された場合、前記ディレクトリ仮想記憶デバイスをライトして前記ディレクトリに記録されたディレクトリエントリを更新するとともに、前記ディレクトリコピー仮想記憶デバイスをライトして前記ディレクトリのコピーに記録されたディレクトリエントリを更新するストレージクラスタシステム。
【請求項６】
請求項４に記載のストレージクラスタシステムにおいて、
前記スレーブノードは、前記アクセス要求を受信した場合、前記ディレクトリ仮想記憶デバイスをライトして前記ディレクトリに記録されたディレクトリエントリを更新するとともに、前記ディレクトリコピー仮想記憶デバイスをライトして前記ディレクトリのコピーに記録されたディレクトリエントリを更新するストレージクラスタシステム。
【請求項７】
請求項４に記載のストレージクラスタシステムにおいて、
前記ディレクトリコピー仮想記憶デバイスにマップされる前記ディレクトリのコピーを、コピー元のディレクトリ管理ノードの仮想記憶領域の仮想番地と同じ仮想番地にマップするストレージクラスタシステム。
【請求項８】
請求項４又は請求項７に記載のストレージクラスタシステムにおいて、
互いに同期しているタイマを前記各記憶デバイス制御装置にそれぞれ備え、
前記ディレクトリエントリにおいて、自己が備えるタイマによって計時された時刻に、予め定めた時間を加えた時刻を示すタイムスタンプを、前記アクセス要求で指定されたアクセス対象範囲に更に関連付け、
前記スレーブノードが前記アクセス要求を受信した場合に、アクセス対象範囲のキャッシュデータを保持していれば、前記ディレクトリコピー仮想記憶デバイスをリードし、前記ディレクトリのコピーに記録されたディレクトリエントリによって前記スレーブノードと前記アクセス対象範囲とが関連付けられており、前記ディレクトリエントリによって前記アクセス対象範囲に関連付けられたタイムスタンプによって示される時刻が、自己が備えるタイマによって計時された時刻よりも過去ではない場合には、このアクセス対象範囲からのキャッシュされたデータは有効であると判定し、過去である場合には、このアクセス対象範囲からのキャッシュされたデータは無効であると判定するストレージクラスタシステム。
【請求項９】
請求項８に記載のストレージクラスタシステムにおいて、
前記スレーブノードは、前記ディレクトリのコピーに記録されたディレクトリエントリにおいて、前記アクセス対象範囲に関連付けられたタイムスタンプによって示される時刻が、自己が備えるタイマによって計時された時刻よりも過去である場合、このアクセス対象範囲からのキャッシュされたデータの有効性を、前記ディレクトリ仮想記憶デバイスをリードすることにより問い合わせるストレージクラスタシステム。
【発明の詳細な説明】
【技術分野】
【０００１】
本発明は、一般に、ストレージクラスタシステムに関し、特に、複数のブロックデバイス制御装置を統合した仮想的なブロックデバイスを外部に提供するストレージクラスタシステムに関する。
【背景技術】
【０００２】
近年、ユーザの使用するシステムデータ、ユーザデータの増加に伴い、複数のストレージを統合して仮想的な大容量ストレージとして運用することにより、システム構築および運用に関するコストの削減を可能とするストレージクラスタシステムのニーズが高まっている。特に、クラスタシステムのインタコネクトとして標準化されたインフィニバンド等ではなく、イーサネット（登録商標）やＦＣ（Fibre Channel）等をインタコネクトとして複数のブロックデバイス制御装置(ノード)を疎結合した低コストなストレージクラスタシステムが存在する。
【０００３】
ストレージクラスタシステムでは複数のノードにデータが分散するため、ホストコンピュータからリード／ライト要求を受信するノードにおいてデータをキャッシュすることがスループットを向上させるために不可欠であり、同時に各ノード内のキャッシュの一貫性を保証することが非常に重要となる。
【０００４】
分散したキャッシュの一貫性保証については、並列計算機やマルチプロセッサシステムにおいて発展した技術であり、例えば、特許文献１のように、様々な方法が提案されている。
【０００５】
前記の疎結合したストレージクラスタシステムにおいては、あるノードに対するホストコンピュータからのリード／ライト要求を他の全ノードが検知してキャッシュを制御するバススヌーピング方式は適さず、データがどのノードのキャッシュに分散しているかをディレクトリによって管理しノード間通信を介してキャッシュを制御するディレクトリ方式が一般的に採用される。ディレクトリはあるノードで集中管理されることもあるし、複数のノードに分散していることもある。
【０００６】
各ノードは、リード要求を受信してリードデータをキャッシュするとき、ディレクトリによって該リード領域に対して該ノードを関連付けておく。また各ノードは、ライト要求を受信したとき、ディレクトリを探索し、該ライト対象領域をキャッシュしているノードに対するリードキャッシュインバリデート処理を完了してから、ライト要求受信処理を完了する。リードキャッシュインバリデート処理はノード間通信の要求／応答メッセージ送受信処理によって行われ、要求メッセージを受信したノードはメッセージを解釈してキャッシュを探索／破棄した後に応答メッセージを送信する。
【特許文献１】特開平６−２７４４６１号公報
【発明の開示】
【発明が解決しようとする課題】
【０００７】
しかしながら、上記従来技術においては、リードキャッシュインバリデート要求を受信したノードがキャッシュデータの探索を常に行う必要がある。そのため、他ノードへのライト要求に伴ってリードキャッシュインバリデート要求を受信したとき、たとえば該キャッシュデータに対する次のリード要求を受信するまでの間にリソース枯渇等を理由に該キャッシュデータが破棄されていた場合、本来は不要であるリードキャッシュインバリデート処理のコストを強いられることになる。
【０００８】
また、リードキャッシュインバリデート処理を行うために、ストレージ装置のＩ／Ｏ処理の延長でノード間通信処理が発生し、ストレージ装置として例外的な処理であるノード間通信処理を行うことで招くプロセッサの命令キャッシュミス等によるオーバヘッドが無視できない。ＲＤＭＡ（RemoteDirect Memory Access）転送方式を利用して、受信ノードにおけるソフトウェア処理に起因するオーバヘッドを低減することも可能であるが、専用ハードウェア（以下、「Ｈ／Ｗ」とも称する）が必要となると共に、受信ノード上のプロセッサとの排他制御が必要となる。また、ノード間通信を行うインタコネクトの信頼性および可用性を高めるために、インタコネクトを二重化したり、ソフトウェアで管理するコストがかかる。
【０００９】
本発明はこのような事情に鑑みてなされたものであり、ストレージ装置が本来持つ、ブロックデバイス用インタフェースを介して仮想的なブロックデバイスを外部に提供する機能を利用し、専用Ｈ／Ｗが不要でありながらリードキャッシュインバリデート処理にかかるコストを低減し、キャッシュの一貫性を保証するストレージクラスタシステムを提供することを目的とする。
【００１０】
また、限られたディレクトリ領域を有効に活用して、小さなディレクトリ領域でも柔軟に管理できるストレージクラスタシステムを提供することも目的とする。
【００１１】
さらに、キャッシュを時間管理することにより、リードキャッシュインバリデート処理を行う頻度を低減しつつ、キャッシュの一貫性を保証するストレージクラスタシステムを提供することも目的とする。
【課題を解決するための手段】
【００１２】
上記の目的を達成するために、本発明では、以下のような手段を講じる。
【００１３】
すなわち、請求項１の発明は、互いに接続された複数の記憶デバイス制御装置と、複数の記憶デバイス制御装置によってそれぞれ管理される物理記憶デバイスとを備えてなり、各物理記憶デバイスが統合されることによって、外部装置へ提供される仮想記憶デバイスを形成しているストレージクラスタシステムである。
【００１４】
このストレージクラスタシステムでは、各記憶デバイス制御装置のうちの何れかは、外部装置からの仮想記憶デバイスへのアクセス要求を受信するスレーブノードとして機能し、各記憶デバイス制御装置のうちの何れかは、アクセス要求で指定されたアクセス対象範囲を含む物理記憶デバイスを管理するマスタノードとして機能し、各記憶デバイス制御装置のうちの何れかは、スレーブノードとアクセス対象範囲とを関連付けたディレクトリエントリが記録されたディレクトリを管理するディレクトリ管理ノードとして機能する。また、ディレクトリ管理ノードはディレクトリをマップしたディレクトリ仮想記憶デバイスを備え、ディレクトリ仮想記憶デバイスの情報は、各記憶デバイス制御装置間で共有される。スレーブノードは、アクセス要求を受信すると、マスタノードへアクセス要求を転送し、アクセス要求がリード要求であれば、マスタノードから転送されたデータをキャッシュし、アクセス要求がライト要求であれば、外部装置から転送されたデータをキャッシュする。
【００１５】
各記憶デバイス制御装置のうちの何れかがディレクトリ仮想記憶デバイスにライトすることで、ディレクトリエントリにおけるスレーブノードとアクセス対象範囲との関連付けを更新する。さらにスレーブノードがディレクトリ仮想記憶デバイスをリードし、ディレクトリエントリによってスレーブノードとアクセス対象範囲とが関連付けられていれば、キャッシュデータが有効であると判定する。
【００１６】
請求項２の発明は、請求項１の発明のストレージクラスタシステムにおいて、マスタノードは、アクセス要求が転送された場合、ディレクトリ仮想記憶デバイスにライトし、ディレクトリにおけるディレクトリエントリを更新する。
【００１７】
請求項３の発明は、請求項１の発明のストレージクラスタシステムにおいて、スレーブノードは、アクセス要求を受信した場合、ディレクトリ仮想記憶デバイスにライトし、ディレクトリにおけるディレクトリエントリを更新する。
【００１８】
請求項４の発明は、請求項１の発明のストレージクラスタシステムにおいて、スレーブノードがディレクトリのコピーをマップしたディレクトリコピー仮想記憶デバイスを備えている。そして、ディレクトリコピー仮想記憶デバイスの情報は、各記憶デバイス制御装置間で共有される。
【００１９】
各記憶デバイス制御装置のうちの何れかが前記ディレクトリコピー仮想記憶デバイスにライトすることで、ディレクトリのコピーのディレクトリエントリにおけるスレーブノードとアクセス対象範囲との関連付けを更新する。スレーブノードがアクセス要求を受信し、アクセス対象範囲のキャッシュデータを保持している場合に、ディレクトリコピー仮想記憶デバイスをリードし、ディレクトリのコピーに記録されたディレクトリエントリによってスレーブノードとアクセス対象範囲とが関連付けられていれば、キャッシュデータが有効であると判定する。
【００２０】
請求項５の発明は、請求項４の発明のストレージクラスタシステムにおいて、マスタノードは、アクセス要求が転送された場合、ディレクトリ仮想記憶デバイスをライトしてディレクトリに記録されたディレクトリエントリを更新するとともに、ディレクトリコピー仮想記憶デバイスをライトしてディレクトリのコピーに記録されたディレクトリエントリを更新する。
【００２１】
請求項６の発明は、請求項４の発明のストレージクラスタシステムにおいて、スレーブノードは、アクセス要求を受信した場合、ディレクトリ仮想記憶デバイスをライトしてディレクトリに記録されたディレクトリエントリを更新するとともに、ディレクトリコピー仮想記憶デバイスをライトしてディレクトリのコピーに記録されたディレクトリエントリを更新する。
【００２２】
請求項７の発明は、請求項４の発明のストレージクラスタシステムにおいて、ディレクトリコピー仮想記憶デバイスにマップされるディレクトリのコピーを、コピー元のディレクトリ管理ノードの仮想記憶領域の仮想番地と同じ仮想番地にマップする。
【００２３】
請求項８の発明は、請求項４又は請求項７の発明のストレージクラスタシステムにおいて、互いに同期しているタイマを各記憶デバイス制御装置にそれぞれ備えている。そして、ディレクトリエントリにおいて、自己が備えるタイマによって計時された時刻に、予め定めた時間を加えた時刻を示すタイムスタンプを、アクセス要求で指定されたアクセス対象範囲に更に関連付けている。更に、スレーブノードがアクセス要求を受信した場合に、アクセス対象範囲のキャッシュデータを保持していれば、ディレクトリコピー仮想記憶デバイスをリードし、ディレクトリのコピーに記録されたディレクトリエントリによってスレーブノードとアクセス対象範囲とが関連付けられており、ディレクトリエントリによってアクセス対象範囲に関連付けられたタイムスタンプによって示される時刻が、自己が備えるタイマによって計時された時刻よりも過去ではない場合には、このアクセス対象範囲からのキャッシュされたデータは有効であると判定し、過去である場合には、このアクセス対象範囲からのキャッシュされたデータは無効であると判定する。
【００２４】
請求項９の発明は、請求項８の発明のストレージクラスタシステムにおいて、スレーブノードは、ディレクトリのコピーに記録されたディレクトリエントリにおいて、アクセス対象範囲に関連付けられたタイムスタンプによって示される時刻が、自己が備えるタイマによって計時された時刻よりも過去である場合、このアクセス対象範囲からのキャッシュされたデータの有効性を、ディレクトリ仮想記憶デバイスをリードすることにより問い合わせる。
【発明の効果】
【００２５】
本発明によれば、ストレージ装置が本来持つ、ブロックデバイス用インタフェースを介して仮想的なブロックデバイスを外部に提供する機能を利用し、専用Ｈ／Ｗが不要でありながらリードキャッシュインバリデート処理にかかるコストを低減し、キャッシュの一貫性を保証するストレージクラスタシステムを実現することができる。
【００２６】
また、限られたディレクトリ領域を有効に活用して、小さなディレクトリ領域でも柔軟に管理できるストレージクラスタシステムを実現することができる。
【００２７】
さらに、キャッシュを時間管理することにより、リードキャッシュインバリデート処理を行う頻度を低減しつつ、キャッシュの一貫性を保証するストレージクラスタシステムを実現することができる。
【発明を実施するための最良の形態】
【００２８】
以下に、本発明を実施するための最良の形態について図面を参照しながら説明する。
【００２９】
（第１の実施の形態）
図１は、本発明の第１の実施の形態に係るストレージクラスタシステムの構成例を示す簡略ブロック図である。
【００３０】
Ｎ台のホストコンピュータ１（＃１）〜１（＃Ｎ）が、スイッチ３を介してＭ台のブロックデバイス制御装置２（＃１）〜２（＃Ｍ）と接続する。各ブロックデバイス制御装置２にはそれぞれ配下にディスクアレイ４（＃１）〜４（＃Ｍ）が接続されている。
【００３１】
ホストコンピュータ１とブロックデバイス制御装置２間を接続するインタコネクトとして、ＳＣＳＩプロトコルに基づくブロックデバイス用インタフェース（Ｉ／Ｆ）であるＦＣやｉＳＣＳＩを想定している。ＦＣの場合、スイッチ３の部分がファブリックスイッチとなり、ｉＳＣＳＩの場合はイーサネットのスイッチングハブとなる。
【００３２】
Ｍ台のブロックデバイス制御装置（以降、「ノード」とも称する）２（＃１）〜２（＃Ｍ）が提供するストレージを組み合わせて、各ホストコンピュータ１（＃１）〜１（＃Ｎ）に対して仮想的な一つの大容量ブロックデバイスを提供している。ホストコンピュータ１からのリード／ライト要求は、予め設定された１台のブロックデバイス制御装置（代表ノード）２に対して発行される。また、各ホストコンピュータ１（＃１）〜１（＃Ｎ）に対して異なる代表ノードを割り当てて、マルチポートストレージとして使用することも可能である。
【００３３】
このように構成されてなるストレージクラスタシステムは、ホストコンピュータ１に対して提供する仮想的なブロックデバイスのＬＵＮ（Logical Unit Number）とその仮想ブロックデバイスがマップされた実際のノードのアドレスとを対応付けたテーブルであるルーティングテーブルを管理している。ルーティングテーブルは、各ノードが提供している固定サイズの領域（エクステント）毎のエントリによって構成され、各エクステントを提供しているノード（マスタノード）と対応付けられている。また、ルーティングテーブルはストレージクラスタシステム内の全てのノードによって共有される。
【００３４】
ホストコンピュータ１に対して割り当てられた代表ノードは、ホストコンピュータ１からのＬＵＮへのリード／ライト要求を、そのブロックアドレスからエクステントを特定し、ルーティングテーブルで指定されたマスタノードのＬＵＮへの要求に変換する。その後、変換したリード／ライト要求を上記インタコネクトであるスイッチ３経由で転送し、指定されたリード／ライトデータをホストコンピュータ１とマスタノード間で中継する。この一連の中継処理を行うノードをスレーブノードと呼ぶ。
【００３５】
つまり、各ノードはホストコンピュータ１あるいは他ノードからのエクステントへのリード／ライト要求に対して、そのエクステントが配下のディスクアレイ４に存在する場合はマスタノードとして動作し、存在しない場合はスレーブノードとして動作する。
【００３６】
図２は、ノード内部の構成例を示すブロック図である。
【００３７】
ノードはＩ／Ｏプロセッサ２０３上で動作するソフトウェアにより制御される。ソフトウェアはＲＯＭ２０２に格納され、起動時にメモリ２０４にロードされＩ／Ｏプロセッサ２０３上で実行される。メモリ２０４は、バッテリ２０５により停電時もバックアップされ、ホストコンピュータ１に提供するブロックデバイスのディスクキャッシュとしても使用される。
【００３８】
Ｉ／Ｏプロセッサ２０３とホストコンピュータ１間はホストＩ／Ｆ２０１を介して接続し、Ｉ／Ｏプロセッサ２０３とディスクアレイ４間はディスクＩ／Ｆ２０６を介して接続する。ホストＩ／Ｆ２０１としてはＦＣやｉＳＣＳＩ、ディスクＩ／Ｆ２０６としてはＦＣ、パラレルＳＣＳＩ、ＳＡＳ（Serial Attached SCSI）、ＳＡＴＡ（Serial ATA）等の通常のブロックデバイス用Ｉ／Ｆコントローラを想定している。Ｉ／Ｏプロセッサ２０３、ホストＩ／Ｆ２０１、ディスクＩ／Ｆ２０６間はＰＣＩバスなどのインタコネクトで接続する。また、Ｉ／Ｏプロセッサ２０３内には、割り込みコントローラ、ＲＡＩＤ５用のパリティ計算モジュール、ＤＭＡコントローラ等のＨ／Ｗがある。
【００３９】
ソフトウェアでは、これらの内部Ｈ／ＷとホストＩ／Ｆコントコーラ、ディスクＩ／Ｆコントローラ等の外部Ｈ／Ｗを制御し、複数のＨＤＤで構成するディスクアレイを仮想的なブロックデバイス制御装置２としてホストコンピュータ１に提供する。
【００４０】
またブロックデバイス制御装置２のディスクキャッシュは、スレーブノードとして動作するエクステントに対してはリードキャッシュ／ライトスルーキャッシュとして使用され、その他の場合においてはリードキャッシュ／ライトバックキャッシュとして使用されるようにソフトウェアで制御される。
【００４１】
また、ノード内のキャッシュブロックが枯渇したとき等には、ソフトウェアによってキャッシュブロックの選定／破棄処理が行われ、効率的にディスクデータがキャッシュされる。
【００４２】
次に、マスタノードとスレーブノード間でエクステントのキャッシュの状態を共有するためのデータ構造（マスタディレクトリ／スレーブディレクトリ）について説明する。
【００４３】
マスタディレクトリはエクステント毎のキャッシュの状態を管理するデータ構造であり、マスタノードのみが管理する。スレーブディレクトリは、マスタディレクトリのコピーであり、そのエクステントにリード／ライトを実行する全てのスレーブディレクトリが持つ。これらは、スレーブノードにおけるリード／ライト要求転送処理やマスタノードにおけるリード／ライト処理において参照／更新される。各エクステントとマスタディレクトリおよびスレーブディレクトリはディレクトリ管理テーブルによって対応付けられている。
【００４４】
各エクステントに対する一つのマスタディレクトリと複数のスレーブディレクトリは全ノードにおいて、Ｉ／Ｏプロセッサ２０３のＭＭＵ（Memory Management Unit）によって同一仮想番地にマップされ、その仮想番地は後述のディレクトリ管理テーブルによって、全ノードで共有される。各ノードのＩ／Ｏプロセッサ２０３はマップされた仮想番地においてマスタディレクトリ／スレーブディレクトリを参照するが、マスタディレクトリに対してのみ更新を行う。スレーブディレクトリの更新は、後述する外部からのディレクトリアクセス手段を用いてマスタノードが行う。
【００４５】
図３は、エクステントとマスタディレクトリ／スレーブディレクトリの関係を示す図であり、ホストコンピュータ１へ提供されるＬＵ（Logical Unit）の一部であるエクステントｋがノードｘにマップされ、エクステント（ｋ＋１）がノード（ｘ＋１）にマップされている。ノードｘは、エクステントｋに対してはマスタノードとして動作し、エクステント（ｋ＋１）に対してはスレーブノードとして動作する。また、ノード（ｘ＋１）はエクステント（ｋ＋１）に対してはマスタノード、エクステントｘに対してはスレーブノードとして動作する。
【００４６】
エクステントｋに関するリード／ライト処理に伴うキャッシュの状態を管理するマスタディレクトリｋ／スレーブディレクトリｋに関しては、それぞれ各ノードにおいて仮想アドレス空間の０ｘＡ０００００００番地にマップされ、同様にマスタディレクトリ（ｋ＋１）／スレーブディレクトリ（ｋ＋１）は０ｘＡ０１０００００番地にマップされている。ノードｘにおいては、マスタディレクトリｋに対しては参照／更新を行うが、スレーブディレクトリ（ｋ＋１）に対しては参照のみ行う。スレーブディレクトリ（ｋ＋１）の更新は、外部からのディレクトリアクセス手段を用いてノード（ｘ＋１）が行う。
【００４７】
次に、外部からのディレクトリアクセス手段について説明する。
【００４８】
各ノードにおけるマスタディレクトリ／スレーブディレクトリは配下のディスクアレイ４にマップされ、ディレクトリ別のＬＵを構成する。このマスタディレクトリ／スレーブディレクトリのデータを含むＬＵは、エクステント毎に定められた個別のＬＵＮ（ディレクトリＬＵＮ）が割り当てられ、そのＬＵＮはディレクトリ管理テーブルによって全ノードで共有される。つまり、ノードｘがマスタディレクトリｋをＬＵＮ １０で提供しているのであれば、ノード（ｘ＋１）はスレーブディレクトリｋをＬＵＮ １０で提供する。
【００４９】
つまり、各ノードの外部からのディレクトリアクセス手段は、ブロックデバイス制御装置２が本来備えるディスクアレイ４のデータをＬＵとして提供する機能により、そのＬＵに対するリード／ライト処理によって実現されている。当然のことながら、リード／ライト処理はターゲットとなるノードのキャッシュメモリを仲介して行われ、ターゲットの処理の前後においてキャッシュブロックのアクセス対象範囲の排他的使用権獲得／放棄がなされる。また、このＬＵへのリード／ライト処理によってキャッシュされたデータを決められた仮想番地にマップすることで、全ノードにおけるＩ／Ｏプロセッサ２０３が同一エクステントに対応するディレクトリが同一仮想番地で参照することが可能となる。
【００５０】
本実施の形態では、ディレクトリ内のデータが各ノードにおいてディスクアレイ４に書き込まれてメモリ２０４上にキャッシュされていない状況も想定しているが、処理の高速化のためにディレクトリ用のキャッシュをロックしてディスクアレイ４への書き込みを行わない方式も考えられる。
【００５１】
図４は、マスタディレクトリおよびスレーブディレクトリのデータ構造を示す図である。スレーブディレクトリはマスタディレクトリのコピーであるため、以下ではマスタディレクトリに関してのみ説明する。また、本実施の形態ではエクステントのサイズを３２Ｍバイト、キャッシュブロックサイズを８Ｋバイト、ノード識別子長を１バイトとし、１キャッシュブロックに最大３２のノードが関連付けられることとする。
【００５２】
マスタディレクトリは基数木（Radix Tree）と呼ばれる公知のデータ構造により構成される。３段の基数木であり、上段４０１と中段４０２のデータ構造は、要素数が１６の配列であり、それぞれの配列の要素は中段４０２のデータ構造へのポインタ、下段４０３のデータ構造へのポインタである。下段４０３のデータ構造は要素数が１６の配列であり、配列の要素は、要素数が３２のノード識別子の配列である。各データ構造のサイズはいずれも５１２バイトである。
【００５３】
エクステントのサイズが３２Ｍ（２＾２５）バイトであるため、エクステントのアクセス範囲は２＾１６セクタであり、エクステント内のオフセット値は１６ビットで表現される。エクステント内のオフセット値のビット１２〜１５の値を上段４０１のデータ構造内の配列のインデックスとし、ビット８〜１１の値を中段４０２のデータ構造内の配列のインデックスとし、ビット４〜７の値を下段４０３のデータ構造内の配列のインデックスとする。これにより、エクステント内のキャッシュブロック（２＾４セクタ）毎に下段４０３のデータ構造の配列の１要素（ディレクトリエントリ）が割り当てられ、そのキャッシュブロックに最大で３２のノードが関連付けられていることを表している。
【００５４】
例えば、オフセット値０ｘＦＦ２４に相当するディレクトリエントリは、上段４０１のデータ構造のインデックス１５の要素に関連付けられた、中段４０２のデータ構造のインデックス１５に関連付けられた、下段４０３のデータ構造のインデックス２の要素である。
【００５５】
基数木の根となる上段４０１のデータ構造はエクステント用のディレクトリ領域の先頭番地にマップされており、中段４０２／下段４０３のデータ構造に対してはポインタを辿って参照する。全くノードが関連付けられていない部分木のデータ構造は存在する必要は無く、必要になったときにエクステント用のディレクトリ領域の空き領域から５１２バイト単位で割り当てられる。
【００５６】
次に、ディレクトリのリード／ライト処理について説明する。
【００５７】
他ノードに対するディレクトリのリード／ライトは基数木を構成するデータ構造単位で行い、アクセス対象のデータ構造の仮想番地と根のデータ構造の仮想番地の差分（オフセット）をセクタサイズで割った値をブロックアドレスとし、セクタ単位のリード／ライト要求処理を該ディレクトリのディレクトリＬＵＮに対して発行する。
【００５８】
ノード内におけるＩ／Ｏプロセッサ２０３によるディレクトリ探索／更新処理においては、外部からのディレクトリに対するリード／ライト処理との競合における一貫性の保証が必要となる。このため、Ｉ／Ｏプロセッサ２０３が各節のデータ構造にアクセスする場合も、ディレクトリＬＵＮに対する内部リード／ライト処理を行う。内部リード／ライト処理は、ディスクアレイ４に書き出されているかもしれないデータをキャッシュメモリにロードして仮想アドレス空間にマップし、そのアクセス領域に該当するキャッシュの排他的使用権を獲得するために行う。内部リード／ライト処理が完了したときは、アクセス領域に該当するキャッシュの排他的使用権は獲得したままとし、ディレクトリ探索／更新処理が完了してから一括してキャッシュの排他的使用権を放棄する。
【００５９】
これにより、Ｉ／Ｏプロセッサ２０３によるディレクトリ／更新処理が行われている途中で、外部からのディレクトリＬＵＮに対するリード／ライト処理が発生しても、キャッシュメモリへのアクセスする時点で排他されるために、ディレクトリのデータの一貫性は損なわれない。
【００６０】
上記の通り、ディレクトリに対する全てのリード／ライト処理は、ディレクトリＬＵＮに対するセクタ単位のリード／ライト処理によって実現される。
【００６１】
図５は、ディレクトリＬＵＮに対するリード／ライト処理における、ディレクトリ領域をマップしたキャッシュブロック探索のフローチャートである。
【００６２】
まず、該ディレクトリＬＵＮのアクセス領域に該当するキャッシュブロックが存在するか否かを判定する（ステップ５０１）。ステップ５１０の結果が真のときは、キャッシュブロック内のアクセス領域の排他的使用権を獲得する（ステップ５０４）。ステップ５０１の結果が偽であるときは、新たにキャッシュブロックを獲得し（ステップ５０２）、ディレクトリ管理テーブルを走査することにより該ディレクトリＬＵＮがマップされる先頭の仮想番地を取得し、先頭番地とブロックアドレスを加算してマップされるべき仮想番地を求める。その後、該仮想番地にマップあるいは再マップ処理を行う（ステップ５０３）。
【００６３】
キャッシュブロック内のアクセス領域の排他的使用権を獲得し（ステップ５０４）、リード処理且つキャッシュミスであることを判定する（ステップ５０５）。ステップ５０５の結果が偽であるときは処理を完了する。ステップ５０５の結果が真であるときは、ディスクアレイ４へリード要求を発行し（ステップ５０６）、ディスクアレイ４へのリード処理が完了するまで待機する（ステップ５０７）。
【００６４】
上記のように処理を行うことによって、ディレクトリのデータがキャッシュメモリ上に読み込まれたときには、常に決められた仮想番地にマップされる。
【００６５】
次に、マスタノードにおけるライト要求処理におけるリードキャッシュインバリデート処理を例にして、ディレクトリ更新手順について説明する。
【００６６】
図６（ａ）は、ノードｘにおけるマスタディレクトリｋを示す図であり、エクステント内のあるキャッシュブロック（オフセット値０ｘＦＦ２０〜０ｘＦＦ３０）に対して、過去にノードｙと（ｙ＋１）からリード要求を受信したことを示している。図６（ｂ）は、その後にノード（ｙ＋２）から該キャッシュブロックに対してライト要求を受信した後のマスタディレクトリｋを示す図である。
【００６７】
ノードｘにおいて、ノード（ｙ＋２）からのエクステントｋに対するライト要求を受信したとき、まずディレクトリ管理テーブルからエクステントｋに対応するマスタディレクトリｋの仮想番地（０ｘＡ０００００００）、ディレクトリＬＵＮを獲得する。マスタディレクトリｋの基数木の上段のデータ構造を参照するため、ディレクトリＬＵＮのブロックアドレス０に対して５１２バイトの内部リード要求を発行する。
【００６８】
ライト対象範囲のオフセット値からインデックス１５の配列要素を参照し、中段のデータ構造の仮想番地（０ｘＡ００００２００）を求める。中段のデータ構造を参照するため、ディレクトリＬＵＮのブロックアドレス１に対して５１２バイトの内部リード要求を発行する。
【００６９】
ライト対象範囲のオフセット値からインデックス１５の配列要素を参照し、下段のデータ構造の仮想番地（０ｘＡ００００４００）を求める。下段のデータ構造を参照するため、ディレクトリＬＵＮのブロックアドレス２に対して５１２バイトの内部リード要求を発行する。
【００７０】
ライト対象範囲のオフセット値からインデックス２の配列要素を参照し、該ライト対象範囲にノードｙと（ｙ＋１）が関連付けられていることを記憶し、ｙと（ｙ＋１）を消去して（ｙ＋２）を関連付けた後、ディレクトリＬＵＮのブロックアドレス２に対して内部ライト要求を発行する。
【００７１】
その後、各段のデータ構造に対するリード／ライト処理で獲得した、ディレクトリデータを含むキャッシュの排他的使用権を放棄する。
【００７２】
次に、関連付けを消去したノードに対してマスタディレクトリｋの更新を反映させる。ノードｙとノード（ｙ＋１）のディレクトリＬＵＮのブロックアドレス２に対して、５１２バイトのライト要求を発行して完了まで待機し、リードキャッシュインバリデート処理を完了する。
【００７３】
【表１】
2008123198.tif 000003
【００７４】
表１は、ディレクトリ管理テーブルのデータ構造を示す図である。ディレクトリ管理テーブルはエクステント単位のエントリで構成され、各エントリはエクステント識別子、マスタノード識別子、ディレクトリの仮想番地、及びディレクトリＬＵＮによって構成される。エクステント識別子は、ホストコンピュータ１へ提供するＬＵＮや開始ブロックアドレス、サイズ等、エクステントを一意に特定できる情報と関連付けられる。
【００７５】
ディレクトリ管理テーブルは、ルーティングテーブルあるいは構成情報の一部として全てのブロックデバイス制御装置２（＃１）〜（＃Ｍ）で共有されることを想定している。
【００７６】
本実施の形態では、ディレクトリ管理テーブルを用いてエクステントとディレクトリの仮想番地、及びディレクトリＬＵＮを関連付けているが、エクステント識別子によって仮想番地、ディレクトリＬＵＮが一意に特定できるのであれば、他のデータ構造を用いても良い。また、計算によって線形的に求めることができるような仮想番地の配置／ディレクトリＬＵＮの番号付けのルールを用いても良い。
【００７７】
次に、ノードにおけるリード要求受信処理について説明する。
【００７８】
ノードでは、受信したリード要求におけるＬＵＮ、ブロックアドレス、サイズからエクステントを特定し、ルーティングテーブルから該エクステントのマスタノードを特定する。特定されたマスタノードが自ノードのときはマスタノードのリード要求受信処理が実行され、マスタノードが他ノードのときはスレーブノードのリード要求受信処理が実行され、ルーティングテーブルに存在しないときは自ノードが単体で提供しているＬＵＮに対するリード要求処理が実行される。
【００７９】
図７はスレーブノードにおける、データサイズがキャッシュブロックサイズ以下のリード要求受信処理のフローチャートである。
【００８０】
まず、該エクステントのリード対象領域に該当するキャッシュブロックを特定し、キャッシュヒットの判定を行う（ステップ７０１）。このとき、キャッシュブロック内のリード対象領域の排他的使用権を獲得する。
【００８１】
ステップ７０１の結果が偽であれば、キャッシュブロックを獲得してリード対象領域の排他的使用権を獲得し（ステップ７０２）、マスタノードへリード要求を転送する（ステップ７０５）。
【００８２】
ステップ７０１の結果が真であれば、ディレクトリ管理テーブルを走査することにより該エクステントに対応するスレーブディレクトリを特定し、スレーブディレクトリからリード対象領域に該当するディレクトリエントリを特定する（ステップ７０３）。このとき、ディレクトリのデータ構造は内部リード処理によって参照されるため、図５に示したフローチャートに従ってディレクトリのデータ構造はキャッシュメモリ上にロードされ、当該領域の排他的使用権を獲得している。
【００８３】
該ディレクトリエントリが存在し、且つ該ディレクトリエントリに自ノードが関連付けられていることを判定する（ステップ７０４）。判定後にディレクトリのデータ構造に割り当てられたキャッシュ領域の排他的使用権を放棄する。
【００８４】
ステップ７０４の結果が真であれば、該リード対象領域のキャッシュデータが有効であると判断できるため、イニシエータに対してデータとステータスの転送を行い（ステップ７０７）、キャッシュブロック内のリード対象領域の排他的使用権を放棄して（ステップ７０８）、処理を完了する。
【００８５】
ステップ７０４の結果が偽であれば、該キャッシュデータがマスタノードによってインバリデートされたと判断し、マスタノードへリード要求を転送する（ステップ７０５）。その後、マスタノードでのリード受信処理が完了するまで待機し（ステップ７０６）、イニシエータに対してデータとステータスの転送を行い（ステップ７０７）、キャッシュブロック内のリード対象領域の排他的使用権を放棄して（ステップ７０８）、処理を完了する。
【００８６】
図８は、マスタノードにおける、データサイズがキャッシュブロックサイズ以下のリード要求受信処理のフローチャートである。
【００８７】
まず、該エクステントのリード対象領域に該当するキャッシュブロックを特定し、キャッシュヒットの判定を行う（ステップ８０１）。このとき、キャッシュブロック内のリード対象領域の排他的使用権を獲得する。
【００８８】
ステップ８０１の結果が真であれば、イニシエータに対してデータとステータスの転送を行い（ステップ８０５）、キャッシュブロック内のリード対象領域の排他的使用権を放棄する（ステップ８０６）。
【００８９】
ステップ８０１の結果が偽であれば、キャッシュブロックを獲得して該リード対象領域のキャッシュの排他的使用権を獲得し（ステップ８０２）、ディスクアレイ４へのリード要求を発行し（ステップ８０３）、処理が完了するまで待機した後に（ステップ８０４）、イニシエータに対してデータとステータスの転送を行い（ステップ８０５）、キャッシュブロック内のリード対象領域の排他的使用権を放棄する（ステップ８０６）。
【００９０】
イニシエータのアドレスと構成情報から、イニシエータがストレージクラスタシステム内のスレーブノードであるか否かを判定する（ステップ８０７）。ステップ８０７の結果が偽であれば、ホストコンピュータ１からのリード要求であると判断して処理を完了する。
【００９１】
ステップ８０７の結果が真であるとき、ディレクトリ管理テーブルを走査することにより該エクステントに対応するマスタディレクトリの仮想番地、ディレクトリＬＵＮを特定し、マスタディレクトリからリード対象領域に該当するディレクトリエントリを特定する。このとき、ディレクトリのデータ構造は内部リード処理によって探索されるため、図５に示したフローチャートに従ってディレクトリのデータ構造はキャッシュメモリ上にロードされ、当該領域の排他的使用権を獲得している。ディレクトリエントリが存在しなければ内部ライト処理によって新設する。その後、該ディレクトリエントリに対してイニシエータのノード識別子を内部ライト処理によって関連付ける（ステップ８０８）。その後、ディレクトリ領域のデータ構造に割り当てられたキャッシュ領域の排他的使用権を放棄する。
【００９２】
さらにイニシエータのスレーブディレクトリを更新するために、マスタディレクトリ内における更新部分に関して、イニシエータのディレクトリＬＵＮに対するライト要求を発行する（ステップ８０９）。
【００９３】
なお、ステップ８０７からステップ８０９に至るマスタディレクトリおよびスレーブディレクトリの更新処理は、ステップ８０１からステップ８０６に至るリードデータ／ステータス転送処理との実行順序に依存関係は無く、並行して実行されても良い。
【００９４】
次に、ノードにおけるライト要求受信処理について説明する。
【００９５】
ノードでは、受信したライト要求におけるＬＵＮ、ブロックアドレス、サイズからエクステントを特定し、ルーティングテーブルから該エクステントのマスタノードを特定する。特定されたマスタノードが自ノードのときはマスタノードのライト要求受信処理が実行され、マスタノードが他ノードのときはスレーブノードのライト要求受信処理が実行され、ルーティングテーブルに存在しないときは自ノードが単体で提供しているＬＵＮに対するライト要求処理が実行される。
【００９６】
図９は、スレーブノードにおける、データサイズがキャッシュブロックサイズ以下のライト要求受信処理のフローチャートである。
【００９７】
まず、該エクステントのライト対象領域に該当するキャッシュブロックを特定し、キャッシュヒットの判定を行う（ステップ９０１）。このとき、キャッシュブロック内のライト対象領域の排他的使用権を獲得する。
【００９８】
ステップ９０１の結果が偽であれば、キャッシュブロックを獲得してライト対象領域の排他的使用権を獲得する（ステップ９０２）。キャッシュ内のライト対象領域に対して、イニシエータからのデータ転送を行う（ステップ９０３）。続いて、マスタノードへライト要求を転送し（ステップ９０４）、マスタノードでのライト受信処理が完了するまで待機する（ステップ９０５）。マスタノードのライト受信処理が完了すると、イニシエータに対してステータスを転送して（ステップ９０６）、キャッシュブロック内のライト対象領域の排他的使用権を放棄して（ステップ９０７）、処理を完了する。
【００９９】
ステップ９０１の結果が真であれば、ステップ９０２をパスしてステップ９０３に進む。
【０１００】
図１０は、マスタノードにおける、データサイズがキャッシュブロックサイズ以下のライト要求受信処理のフローチャートである。
【０１０１】
まず、該エクステントのライト対象領域に該当するキャッシュブロックを特定し、キャッシュヒットの判定を行う（ステップ１００１）。このとき、キャッシュブロック内のライト対象領域の排他的使用権を獲得する。
【０１０２】
ステップ１００１の結果が偽であれば、キャッシュブロックを獲得してライト対象領域の排他的使用権を獲得する（ステップ１００２）。キャッシュ内のライト対象領域に対して、イニシエータからのデータ転送を行う（ステップ１００３）。次に、ディレクトリ管理テーブルを走査することにより該エクステントに対応するマスタディレクトリの仮想番地、ディレクトリＬＵＮを特定し、マスタディレクトリからライト対象領域に該当するディレクトリエントリを特定する。このとき、ディレクトリのデータ構造は内部リード処理によって参照されるため、図５に示したフローチャートに従ってディレクトリのデータ構造はキャッシュメモリ上にロードされ、当該領域の排他的使用権を獲得している。ディレクトリエントリが存在しなければ内部ライト処理によって新設する。該ディレクトリエントリに関連付けられたスレーブノードのうち、イニシエータを除いた全てのスレーブノードの関連付けを内部ライト処理によって削除する（ステップ１００４）。
【０１０３】
関連付けを削除された全てのスレーブノードに対して、マスタディレクトリ内における更新部分に関して、各スレーブノードのディレクトリＬＵＮに対するライト要求を発行する。ライト要求を発行した全てのスレーブノードからのステータスを受信するまで待機する（ステップ１００５）。
【０１０４】
ステップ１００５の完了をもって各スレーブノードのキャッシュのインバリデート処理が完了したと判断できるため、イニシエータに対してステータスを転送し（ステップ１００６）、キャッシュブロック内のライト対象領域の排他的使用権を放棄する（ステップ１００７）。また、イニシエータのアドレスと構成情報から、イニシエータがストレージクラスタシステム内のスレーブノード且つ該ディレクトリエントリに関連付けられていないことを判定する（ステップ１００８）。その後、ディレクトリのデータ構造に割り当てられたキャッシュ領域の排他的使用権を放棄する。
【０１０５】
ステップ１００８の結果が偽であれば、ホストコンピュータ１からのライト要求であるか、または以前に該ライト対象領域に対してリード／ライト要求を受信したためスレーブディレクトリの更新が必要ないと判断して処理を完了する。
【０１０６】
ステップ１００８の結果が真であるとき、該ディレクトリエントリに対してイニシエータのノード識別子を関連付ける（ステップ１００９）。さらにイニシエータのスレーブディレクトリを更新するために、マスタディレクトリ内における更新部分に関して、イニシエータのディレクトリＬＵＮに対するライト要求を発行する（ステップ１０１０）。
【０１０７】
なお、ステップ１００８からステップ１０１０に至るマスタディレクトリおよびスレーブディレクトリの更新処理は、ステップ１００１からステップ１００７に至るライトデータ受信処理との実行順序に依存関係は無く、並行して実行されても良い。
【０１０８】
ステップ１００１の結果が真であれば、ステップ１００２をパスしてステップ１００３に進む。
【０１０９】
本実施の形態では、マスタノード／スレーブノードのリード要求受信処理およびライト要求受信処理はデータサイズがキャッシュブロック以下の場合の処理のみを説明しているが、リード／ライト対象領域が複数のキャッシュブロックに跨る場合は、同様の処理が各キャッシュブロック単位で行われる。当然のことながら、複数のキャッシュブロックに対する処理をまとめて上記処理を行うことも可能である。
【０１１０】
また、本実施の形態におけるリードキャッシュインバリデート処理はマスタノードがスレーブディレクトリをライトする方式で実現されるが、スレーブノードがマスタディレクトリをリードする方式でも実現することが可能である。
【０１１１】
上記の構成、作用により、キャッシュ操作に伴う不要な処理を行わず、専用Ｈ／Ｗを用いずにストレージクラスタシステムにおいてキャッシュの一貫性を保証することができる。また、各ノードにおけるリードキャッシュインバリデート処理におけるキャッシュ制御処理は、ストレージ装置として最適化が施された仮想ブロックデバイスへのリード／ライト要求受信処理によって実行され、キャッシュデータやディレクトリの探索処理が発生せず、処理コストは低減される。
【０１１２】
また、各ノードにおけるディレクトリは同一仮想番地にマップされるために、動的に必要な領域を確保してポインタで指定することができ、限られたディレクトリ領域を有効に利用することができる。
【０１１３】
（第２の実施の形態）
図１１は、本発明の第２の実施の形態に係るストレージクラスタシステムの構成例を示す簡略ブロック図である。
【０１１４】
図１１に示すように、本実施の形態に係るストレージクラスタシステムの構成は、各ノードがハートビートチャネル５によって接続されていることを除けば、第１の実施の形態に係るストレージクラスタシステムの構成と同様である。
【０１１５】
各ノードは、ストレージクラスタシステム内の特定のノードＨ（ハートビートノード）からのハートビート確認メッセージを受信して、ハートビート応答メッセージを送信している。ハートビートノードから送信されるハートビート確認メッセージにはタイムスタンプが付与されており、各ノードは受信したタイムスタンプ値を使用してノード内の時刻を調整して、ノードＨと時刻を同期させている。
【０１１６】
【表２】
2008123198.tif 000004
【０１１７】
上記表２は、ディレクトリの下段のデータ構造の１要素であるディレクトリエントリのデータ構造を示す表である。第１の実施の形態とは、１キャッシュブロックに関連付けられる最大ノード数が２８に変更されている点と、タイムスタンプが付与されている点が異なる。タイムスタンプは、マスタノードにおいて該キャッシュブロックに対するリード／ライト要求を受信したときに付与される。
【０１１８】
図１２は、スレーブノードにおけるデータサイズがキャッシュブロックサイズ以下のリード要求受信処理のフローチャートである。図１２のフローチャートでは、図７のフローチャートに示す処理と同一の処理については、図７と同一のステップ番号を付している。すなわち、図１２のフローチャートは、図７のフローチャートにおけるステップ７０４の処理と、ステップ７０５の処理との間に、新たな処理であるステップ７０９乃至７１１を追加したものである。したがって、ここでは、図７のフローチャートと異なる点について説明し、重複説明を避ける。
【０１１９】
すなわち、ステップ７０４の結果が真であったとき、該ディレクトリエントリのタイムスタンプが現在時刻よりも古い値であることを検査する（ステップ７０９）。ステップ７０９の結果が偽であるとき、該アクセス領域に対応するキャッシュデータが有効であると判断して、ステップ７０７を実行する。
【０１２０】
ステップ７０９の結果が真であるとき、該ディレクトリエントリから自ノードの関連付けが削除されている可能性があるため、該ディレクトリエントリに関してマスタノードのディレクトリＬＵＮに対するリード要求を発行し、そのリードデータによって該ディレクトリエントリを上書きする（ステップ７１０）。その後、該ディレクトリエントリに自ノードが関連付けられていて、かつ該ディレクトリエントリのタイムスタンプが現在時刻よりも新しい値であることを判定する（ステップ７１１）。
【０１２１】
ステップ７１１の結果が真であるときはステップ７０７を実行し、ステップ７１１の結果が偽であるときはステップ７０５を実行する。
【０１２２】
図１３は、マスタノードにおける、データサイズがキャッシュブロックサイズ以下のリード要求受信処理のフローチャートである。図１３のフローチャートでは、図８のフローチャートに示す処理と同一の処理については、図８と同一のステップ番号を付している。すなわち、図１３のフローチャートは、図８のフローチャートにおけるステップ８０８の処理に代えて、新たな処理であるステップ８１０を行うようにしたものである。したがって、ここでは、図８のフローチャートと異なる点について説明し、重複説明を避ける。
【０１２３】
すなわち、ステップ８０７の結果が真のとき、ディレクトリ管理テーブルを走査することにより該エクステントに対応するマスタディレクトリの仮想番地、ディレクトリＬＵＮを特定し、マスタディレクトリからリード対象領域に該当するディレクトリエントリを特定する。このとき、ディレクトリのデータ構造は内部リード処理によって参照されるため、図５に示したフローチャートに従ってディレクトリのデータ構造はキャッシュメモリ上にロードされ、当該領域の排他的使用権を獲得している。ディレクトリエントリが存在しなければ内部ライト処理によって新設する。その後、内部ライト処理によって、マスタノードにおける現在時刻に時間tを加算した値（キャッシュ有効期限）をタイムスタンプとしてディレクトリエントリに記録し、イニシエータのノード識別子を関連付ける（ステップ８１０）。その後、ディレクトリのデータ構造に割り当てられたキャッシュ領域の排他的使用権を放棄して、ステップ８０９を実行する。
【０１２４】
図１４は、マスタノードにおける、データサイズがキャッシュブロックサイズ以下のライト要求受信処理のフローチャートである。図１４のフローチャートでは、図１０のフローチャートに示す処理と同一の処理については、図１０と同一のステップ番号を付している。すなわち、図１４のフローチャートは、図１０のフローチャートにおけるステップ１００４とステップ１００５との間にステップ１０１１を追加し、ステップ１００９の代わりにステップ１０１２を設けたものである。したがって、ここでは、図１０のフローチャートと異なる点について説明し、重複説明を避ける。
【０１２５】
すなわち、ステップ１００４を実行した後、該ディレクトリエントリのタイムスタンプが現在時刻よりも古い値であることを検査する（ステップ１０１１）。ステップ１０１１の結果が偽であるときはステップ１００５を実行し、ステップ１０１１の結果が真であるときはステップ１００６を実行する。
【０１２６】
また、ステップ１００８の結果が真であるとき、マスタノードにおける現在時刻と時間tによってキャッシュ有効期限を算出してディレクトリエントリのタイムスタンプとして記録し、イニシエータのノード識別子を関連付ける（ステップ１０１２）。その後、ディレクトリ領域の排他的使用権を放棄して、ステップ１０１０を実行する。
【０１２７】
第１の実施の形態と同様に、ステップ１００８からステップ１０１０に至るマスタディレクトリおよびスレーブディレクトリの更新処理は、ステップ１００１からステップ１００７に至るライトデータ受信処理との実行順序に依存関係は無く、並行して実行されても良いが、ステップ１０１１のタイムスタンプ判定に用いられる値がステップ１０１２において更新される前のタイムスタンプ値である必要がある。
【０１２８】
本実施の形態に係るストレージクラスタシステムは、上記以外は、全て第１の実施の形態に係るストレージクラスタシステムと同様である。
【０１２９】
以上説明したように、本実施の形態では、マスタノードではキャッシュブロック単位で、スレーブノードにおけるキャッシュ有効期限（直近のリード／ライト要求を受信した時刻から時間tが経過した時刻）をマスタディレクトリに記録し、リード／ライト要求を受信するたびに更新する。キャッシュ有効期限を経過したキャッシュブロックに対するライト要求受信処理では、既にスレーブノードのキャッシュデータは有効ではないためスレーブノードに対するリードキャッシュインバリデート処理を行わない。
【０１３０】
また、スレーブノードでは、スレーブディレクトリに記録されているキャッシュ有効期限を経過したキャッシュブロックに対するリード要求受信処理では、キャッシュデータが有効ではないためにマスタノードからディレクトリエントリのリードを行う。その後、リードされたディレクトリエントリに対して自ノードが関連付けられてない、あるいはリードしたキャッシュブロック有効期限が現在時刻よりも過去の値であれば、マスタノードに対してリード要求を転送する。時間tは固定値でも良いし、様々なパラメータで変動する値でも良く、マスタノードが任意の値を選択することが可能である。
【０１３１】
よって本実施の形態では、第１の実施の形態と全く同様の効果が得られることに加えて、マスタノードにおけるライト要求受信処理でのリードキャッシュインバリデート処理を行う頻度を低減することができる。
【０１３２】
以上、本発明を実施するための最良の形態について、添付図面を参照しながら説明したが、本発明はかかる構成に限定されない。特許請求の範囲の発明された技術的思想の範疇において、当業者であれば、各種の変更例及び修正例に想到し得るものであり、それら変更例及び修正例についても本発明の技術的範囲に属するものと了解される。
【図面の簡単な説明】
【０１３３】
【図１】第１の実施の形態に係るストレージクラスタシステムの構成例を示す簡略ブロック図。
【図２】第１の実施の形態におけるノード内部の構成例を示すブロック図。
【図３】第１の実施の形態におけるエクステントとマスタディレクトリ／スレーブディレクトリの関係を示す図。
【図４】第１の実施の形態におけるマスタディレクトリおよびスレーブディレクトリのデータ構造を示す図。
【図５】第１の実施の形態におけるディレクトリＬＵＮに対するリード／ライト処理における、ディレクトリ領域をマップしたキャッシュブロック探索のフローチャート。
【図６】第１の実施の形態におけるノードｘにおけるマスタディレクトリｋを示す図（図６（ａ））と、ノード（ｙ＋２）から該キャッシュブロックに対してライト要求を受信した後のマスタディレクトリｋを示す図（図６（ｂ））。
【図７】第１の実施の形態におけるスレーブノードにおける、データサイズがキャッシュブロックサイズ以下のリード要求受信処理のフローチャート。
【図８】第１の実施の形態におけるマスタノードにおける、データサイズがキャッシュブロックサイズ以下のリード要求受信処理のフローチャート。
【図９】第１の実施の形態におけるスレーブノードにおける、データサイズがキャッシュブロックサイズ以下のライト要求受信処理のフローチャート。
【図１０】第１の実施の形態におけるマスタノードにおける、データサイズがキャッシュブロックサイズ以下のライト要求受信処理のフローチャート。
【図１１】第２の実施の形態に係るストレージクラスタシステムの構成例を示す簡略ブロック図。
【図１２】第２の実施の形態におけるスレーブノードにおけるデータサイズがキャッシュブロックサイズ以下のリード要求受信処理のフローチャート。
【図１３】第２の実施の形態におけるマスタノードにおける、データサイズがキャッシュブロックサイズ以下のリード要求受信処理のフローチャート。
【図１４】第２の実施の形態におけるマスタノードにおける、データサイズがキャッシュブロックサイズ以下のライト要求受信処理のフローチャート。
【符号の説明】
【０１３４】
１…ホストコンピュータ、２…ブロックデバイス制御装置、３…スイッチ、４…ディスクアレイ、５…ハートビートチャネル、２０１…ホストインタフェース、２０２…ＲＯＭ、２０３…Ｉ／Ｏプロセッサ、２０４…メモリ、２０５…バッテリ
【図１】
2008123198.tif 000005
【図２】
2008123198.tif 000006
【図３】
2008123198.tif 000007
【図４】
2008123198.tif 000008
【図５】
2008123198.tif 000009
【図６】
2008123198.tif 000010
【図７】
2008123198.tif 000011
【図８】
2008123198.tif 000012
【図９】
2008123198.tif 000013
【図１０】
2008123198.tif 000014
【図１１】
2008123198.tif 000015
【図１２】
2008123198.tif 000016
【図１３】
2008123198.tif 000017
【図１４】
2008123198.tif 000018