(57)【特許請求の範囲】
【請求項１】
対応する非共有ローカルキャッシュを有する複数ノードと、共有記憶装置とを有するクラスタ内でキャッシュコヒーレンシーを提供する、コンピュータに実装される方法であって、
クラスタの複数のノードがそれぞれ、対応するノードのみアクセス可能な対応するローカルキャッシュを使用して、クラスタの複数ノードによりアクセス可能な共有記憶装置の内容をキャッシュする工程と、
クラスタの複数ノードの少なくとも１つのその他ノードによる、共有記憶装置にアクセスする試みを監視する工程と、
クラスタの複数ノードのローカルキャッシュの最新ステータスに関わる情報を追跡する工程と、
現在追跡中のローカルキャッシュステータス情報を保持する工程と、を含み、現在追跡中のローカルキャッシュステータス情報を保持する工程は、クラスタの各ローカルキャッシュに対して、その関連するノードの共有記憶装置へのアクセスと、クラスタの複数ノードの少なくとも１つのその他ノードの共有記憶装置へのアクセスとの両方に対応して実行される特定のローカルキャッシュのステータスの各更新を追跡する工程と、
現在追跡中のローカルキャッシュステータス情報に基づき、クラスタの複数のノードが、特定の領域から共有記憶装置データを得るため、対応するローカルキャッシュにアクセスするべきか、共有記憶装置にアクセスするべきかを判定する工程と、をさらに含む方法。
【請求項２】
クラスタのノードによる、共有記憶装置にアクセスする試みを監視する工程は、
特定のノードの対応するローカルキャッシュが更新されるように、クラスタの特定のノードにより実行される動作の少なくとも一部を監視する工程をさらに含む、請求項１に記載の方法。
【請求項３】
クラスタのノードによる、共有記憶装置にアクセスする試みを監視する工程は、
クラスタのノードと、共有記憶装置との間で内容を移動する動作を監視する工程をさらに含む、請求項１に記載の方法。
【請求項４】
クラスタのノードのローカルキャッシュのステータスを追跡する工程は、
共有記憶装置にアクセスしようとするノードレベルの試みを監視することから得られた情報を使用して、ローカルキャッシュのステータスを判定する工程をさらに含む、請求項１に記載の方法。
【請求項５】
クラスタのノードのローカルキャッシュのステータスを追跡する工程は、
クラスタのどのノードが、共有記憶装置のどの領域に対して、自身の対応するローカルキャッシュ内に最新の共有記憶装置内容を有するかを追跡する工程をさらに含む、請求項１に記載の方法。
【請求項６】
クラスタのノードのローカルキャッシュのステータスを追跡する工程は、
クラスタのどのノードが、共有記憶装置のどの領域に対して、自身の対応するローカルキャッシュ内に非最新の共有記憶装置内容を有するかを追跡する工程をさらに含む、請求項１に記載の方法。
【請求項７】
現在追跡中のローカルキャッシュステータス情報を保持する工程は、
共有記憶装置の少なくとも１つの領域を対象とした、監視された動作の少なくとも１つに応じて、該共有記憶装置の少なくとも１つの領域に対する、複数のローカルキャッシュのローカルキャッシュステータス変更を示すよう、現在追跡中のローカルキャッシュステータス情報を更新する工程をさらに含む、請求項１に記載の方法。
【請求項８】
現在追跡中のローカルキャッシュステータス情報を保持する工程は、
共有記憶装置の少なくとも１つの領域を対象とした、クラスタの特定のノードによる読み取り動作に応じて、該共有記憶装置の少なくとも１つの領域に対する、特定ノードに対応したローカルキャッシュのローカルキャッシュステータス変更を示すよう、現在追跡中のローカルキャッシュステータス情報を更新する工程をさらに含む、請求項１に記載の方法。
【請求項９】
現在追跡中のローカルキャッシュステータス情報を保持する工程は、
共有記憶装置の少なくとも１つの領域を対象とした、特定ノードによる第１書き込み動作に応じて、前記共有記憶装置特定の少なくとも１つの領域に対して、特定のノードに対応するローカルキャッシュのローカルキャッシュステータス変更を示し、クラスタのさらなるノードに対応するさらなるローカルキャッシュのローカルキャッシュステータス変更を示すよう、現在追跡中のローカルキャッシュステータス情報を更新する工程をさらに含む、請求項１に記載の方法。
【請求項１０】
現在追跡中のローカルキャッシュステータス情報を保持する工程は、
現在追跡中のローカルキャッシュステータス情報をデータ構造に記憶する工程をさらに含み、データ構造の少なくとも一部は、クラスタの複数のノードによりアクセス可能となるよう共有記憶装置に記憶される、請求項１に記載の方法。
【請求項１１】
データ構造は、
共有記憶装置上に存在するビットマップを有し、
ビットマップは、クラスタの各特定のノードに対し、特定のノードに対応するローカルキャッシュの現在追跡中のローカルキャッシュステータスを表す個別のビット群をさらに有し、
各ビット群は、共有記憶装置の各追跡された領域を表す１ビットを有する、請求項１０に記載の方法。
【請求項１２】
現在追跡中のローカルキャッシュステータス情報を保持する工程は、
現在追跡中のローカルキャッシュステータス情報をデータ構造に記憶する工程をさらに含み、データ構造の一部は、クラスタの複数のノードによりアクセス可能となるように共有記憶装置に記憶され、別の一部は、クラスタの各特定のノードに対し、該特定のノードのみがアクセス可能となるようローカルに記憶される、請求項１に記載の方法。
【請求項１３】
データ構造は、
クラスタの各特定のノードに対し、特定のノードに対応するローカルキャッシュの現在追跡中のローカルキャッシュステータスを表すデータ変数群と、
共有記憶装置の現在の内容状態を示す、単一の共有データ変数群と、を有し、
各データ変数群の各特定のデータ変数は、共有記憶装置の特定の領域を表す、請求項１２に記載の方法。
【請求項１４】
現在追跡中のローカルキャッシュステータス情報を保持する工程は、
現在追跡中のローカルキャッシュステータス情報内の、共有記憶装置の特定のデータボリュームを表す工程をさらに含む、請求項１に記載の方法。
【請求項１５】
追跡された全てのローカルキャッシュステータス情報を、クラスタの各特定のノードに対し、特定のノードに対応するローカルキャッシュが、共有記憶装置の全領域に対して最新ではないことを示すよう初期化する工程をさらに含む、請求項１に記載の方法。
【発明の詳細な説明】
【技術分野】
【０００１】
本開示は一般的に、キャッシング、クラスタリング及びストレージ管理に関し、より詳細には、クラスタのような共有記憶装置環境においてローカルキャッシュコヒーレンシーを提供することに関する。
【背景技術】
【０００２】
クラスタは、個別のシステム要素が故障した場合でもサービスを継続できるよう、冗長コンピューティングリソース群を使用するコンピュータ群を指す。具体的には、複数のサーバ、複数のネットワーク接続、冗長データストレージなどを設け、クラスタは単一障害点を排除するのである。クラスタリングなしでは、特定のアプリケーションが動作するサーバが故障した場合、サーバが復旧するまでアプリケーションは使用不能となる。クラスタリングシステムにおいて、サーバ（あるいはネットワークアダプタ、記憶装置などの該サーバで使用される特定のコンピューティングリソース）の故障が検出され、故障したサーバで動作していたアプリケーションは別のコンピューティングシステム（すなわちクラスタの別ノード）で自動的に動作を再開する。このような処理は「フェイルオーバー」と呼ばれる。
【０００３】
クラスタリングシステムは、有用な追加機能を提供するストレージ管理製品と組み合わされることが多い。有用な追加機能とは、ジャーナリングファイルシステム、論理ボリューム管理、マルチパス入出力（Ｉ／Ｏ）機能などである。クラスタがストレージ管理環境と共に実装されている場合、クラスタのコンピュータシステム（ノード）は共有記憶装置にアクセス可能である。共有記憶装置は通常、複数の物理的記憶装置の基づき実装される。複数の物理的記憶装置は、共有記憶装置にアクセスするコンピュータシステムに、単一の記憶装置とみなされるようにクラスタリング及びストレージシステムに管理される。
【０００４】
クラスタの各ノードは、非共有のローカルリードキャッシュを使用可能である。例えば、ローカルキャッシュは、高速集積回路に基づくメモリを使用したソリッドステートドライブ（ＳＳＤ）のような形態であってもよい。ノードは自身のローカルキャッシュを、共有記憶装置のリードキャッシングに使用してもよい。この場合、レイテンシを大幅に削減可能となる。ただし、そのような各キャッシュは、各ノードに対して個別に設けられており、クラスタ内のノードで共有されたものではない。一方、共有記憶装置はクラスタで共通のものであり、複数のノードで共有される。したがって、フェイルオーバーのような共有記憶装置に影響を及ぼすクラスタベースのイベントの後に、共有記憶装置のキャッシュ化ブロックがクラスタの別ノードにより修正された場合、ノードはそのローカルキャッシュから古いデータを読み取ってしまう可能性がある。
【０００５】
この問題に対処することが望ましい。
【発明の概要】
【課題を解決するための手段】
【０００６】
クラスタの複数のノードは、対応する非共有のローカルキャッシュを有する。クラスタのノードは自身に対応するローカルキャッシュを使用して、共有記憶装置の内容をキャッシュする。各ローカルキャッシュは、対応するノードのみがアクセス可能であり、クラスタレベル共有記憶装置は全ノードがアクセス可能である。クラスタのノードによる共有記憶装置にアクセスする試みは監視される。これは、内容をクラスタのノードと、共有記憶装置との間で移動させる監視動作の形態を取り得る。クラスタの特定のノードに実行される監視動作の少なくとも一部により、少なくともあるノードの対応するローカルキャッシュが更新される。クラスタのノードのローカルキャッシュの最新のステータスについての情報が追跡される。すなわち、共有記憶装置に対するノードレベルでアクセスする試みを監視することで得られた情報を使用して、ローカルキャッシュのステータスを判定する。これは、クラスタのどのノードが、共有記憶装置のどの領域（例えばデータボリューム）について最新の共有記憶装置の内容をローカルにキャッシュしているか否かを追跡することを含み得る。
【０００７】
現在追跡中のローカルキャッシュステータス情報は、以下の通り保持される。すなわち、クラスタの各ローカルキャッシュに対して、対応するノードと、クラスタのその他ノードによる共有記憶装置へのアクセスに対して、特定のローカルキャッシュのステータスが更新されることが追跡されるよう保持される。例えば、現在追跡中のローカルキャッシュステータス情報は、共有記憶装置の少なくとも１領域を対象とする監視動作の少なくとも１つに対応した、１つ以上のローカルキャッシュのローカルキャッシュステータス変更を示すよう更新されてもよい。共有記憶装置の少なくとも１領域を対象とするクラスタの特定ノードの読み取り動作に対応して、現在追跡中のローカルキャッシュステータス情報は、その特定のノードに対する対応するローカルキャッシュステータス変更を示すよう更新されてもよい。共有記憶装置の少なくとも１領域を対象とするクラスタの特定ノードの書き込み動作に対応して、現在追跡中のローカルキャッシュステータス情報は、その特定ノードとクラスタのその他ノードに対する、対応するローカルキャッシュステータス変更を示すよう更新されてもよい。
【０００８】
現在追跡中のローカルキャッシュステータス情報は、クラスタの複数ノードがアクセス可能となるよう記憶される。例えば、追跡された情報は、共有記憶装置のデータ構造に記憶されてもよい。一実施形態では、そのようなデータ構造は、クラスタの各特定のノードに対し、特定のノードに対応するローカルキャッシュの、現在追跡中のローカルキャッシュステータスを示す個別のビット群を有するビットマップをさらに有する。各ビット群は、共有記憶装置の各追跡領域を表す１ビットを有する。別の実施形態では、データ構造の一部が、クラスタの複数ノードによりアクセス可能となるよう共有記憶装置に記憶され、データ構造のさらなる一部は、クラスタの各特定のノードに対し、その特定のノードのみがアクセス可能となるよう、ローカルに記憶される。一実施形態では、そのようなデータ構造は、クラスタの各特定のノードに対して、該特定のノードに対応するローカルキャッシュの現在追跡中のローカルキャッシュステータスを表すデータ変数群を有し、さらに共有記憶装置の現在の内容のステータスを示す、単一の共有データ変数群を有する。各データ変数群の各特定のデータ変数は、共有記憶装置の特定の領域を表す。
【０００９】
現在追跡中のローカルキャッシュステータス情報を、キャッシング機能とともに使用することで、クラスタの特定のノードが、共有記憶装置の特定領域に対応するデータを得るため、自身のローカルキャッシュにアクセスするべきか、共有記憶装置にアクセスするべきかが判定される。
【００１０】
この課題を解決するための手段及び以下の発明を実施するための形態に記載される特徴及び利点は、包括的であるわけではなく、具体的には、多くのさらなる特徴及び利点が、この図面、明細書、及び特許請求の範囲に照らして関連分野の技術者に明らかになる。さらに、本明細書で使用する言語は読みやすさ及び指導上の目的で主に選択しており、本発明の主題を線引きし又は制限するために選択されていない場合があり、そうした本発明の主題を決定するには特許請求の範囲に頼ることが必要であることに留意すべきである。
【図面の簡単な説明】
【００１１】
【図１】いくつかの実施形態における、キャッシュコヒーレンシーマネージャを実装可能なネットワークアーキテクチャの一例を示すブロック図である。
【図２】いくつかの実施形態における、キャッシュコヒーレンシーマネージャの実装に適したコンピュータシステムのブロック図である。
【図３】いくつかの実施形態における、共有記憶装置クラスタに対応して動作するキャッシュコヒーレンシーマネージャを示すブロック図である。
【図４】いくつかの実施形態における、キャッシュコヒーレンシーマネージャの動作を示すブロック図である。
【図５Ａ】いくつかの実施形態における、キャッシュコヒーレンシーマネージャの動作の具体例後のデータ構造の状態を示す図である。
【図５Ｂ】いくつかの実施形態における、キャッシュコヒーレンシーマネージャの動作の具体例後のデータ構造の状態を示す図である。
【図５Ｃ】いくつかの実施形態における、キャッシュコヒーレンシーマネージャの動作の具体例後のデータ構造の状態を示す図である。
【図５Ｄ】いくつかの実施形態における、キャッシュコヒーレンシーマネージャの動作の具体例後のデータ構造の状態を示す図である。
【図６Ａ】別の実施形態における、キャッシュコヒーレンシーマネージャの動作の具体例後のデータ構造の状態を示す図である。
【図６Ｂ】別の実施形態における、キャッシュコヒーレンシーマネージャの動作の具体例後のデータ構造の状態を示す図である。
【図６Ｃ】別の実施形態における、キャッシュコヒーレンシーマネージャの動作の具体例後のデータ構造の状態を示す図である。
【図６Ｄ】別の実施形態における、キャッシュコヒーレンシーマネージャの動作の具体例後のデータ構造の状態を示す図である。
【００１２】
これらの図面は、図解のみを目的として様々な実施形態を示す。当業者であれば、本明細書に記載の原理から逸脱することなく、本明細書に図示される構造及び方法のその他の実施形態を用いることができることを以下の考察から容易に理解する。
【発明を実施するための形態】
【００１３】
図１は、キャッシュコヒーレンシーマネージャ１０１を実装可能なネットワークアーキテクチャ１００の一例を示すブロック図である。図示のネットワークアーキテクチャ１００において、クライアントシステム１０３Ａ、１０３Ｂ及び１０３Ｎ並びにサーバ１０５Ａ及び１０５Ｎは、ネットワーク１０７に通信可能に連結されている。キャッシュコヒーレンシーマネージャ１０１は、サーバ１０５Ａ及び１０５Ｎに存在するよう図示されているが、別の実施形態では、キャッシュコヒーレンシーマネージャ１０１はより多くの若しくは少ないコンピュータ、又は異なるコンピュータ２１０に適宜存在してもよい。図１において、サーバ１０５Ａは、直接接続された記憶装置１６０Ａ（１）〜（Ｎ）を有するように図示され、サーバ１０５Ｎは、直接接続された記憶装置１６０Ｂ（１）〜（Ｎ）を有するよう図示されている。サーバ１０５Ａ及び１０５Ｎはさらに、記憶装置１８０（１）〜（Ｎ）に対するサーバ１０５Ａ及び１０５Ｎのアクセス、及びクライアントシステム１０３Ａ〜Ｎのネットワーク１０７を介したアクセスをサポートするＳＡＮファブリック１７０に接続される。インテリジェントストレージアレイ１９０も、ＳＡＮファブリック１７０を介してアクセス可能な特定の記憶装置の一例として図示されている。別の実施形態では、ＳＡＮファブリック１７０の代わりに（又はＳＡＮファブリック１７０と組み合わせて）、共有記憶装置はＦＣ及びｉＳＣＳＩ（図示なし）を使用して実装される。
【００１４】
各クライアントコンピュータシステム１０３Ａ〜Ｎからネットワーク１０７への接続確立のため、多くの異なるネットワーキング技術を使用可能である。該技術の例として、ＬＡＮ、ＷＡＮ、その他多様な無線技術が挙げられる。クライアントシステム１０３Ａ〜Ｎは、例えばウェブブラウザ又はその他クライアントソフトウェア（図示なし）を使用して、サーバ１０５Ａ又は１０５Ｎ上のアプリケーション及び／又はデータにアクセス可能である。これにより、クライアントシステム１０３Ａ〜Ｎは、アプリケーションサーバ１０５からアプリケーションを動作することと、ストレージサーバ１０５、又は記憶装置１６０Ａ（１）〜（Ｎ）、１６０Ｂ（１）〜（Ｎ）、１８０（１）〜（Ｎ）の内のいずれか、又はインテリジェントストレージアレイ１９０にホストされたデータにアクセスすることの少なくとも一方が可能となる。
【００１５】
図１には３つのクライアント１０３Ａ〜Ｎと２つのサーバ１０５Ａ〜Ｎが一例として図示されるが、実際にはより多くの（又は少ない）コンピュータを配置してもよい。一実施形態において、ネットワーク１０７は、インターネットの形態である。他の実施形態において、他のネットワーク１０７又はネットワークベースの環境を使用することができる。
【００１６】
図２は、キャッシュコヒーレンシーマネージャ１０１の実装に適したコンピュータシステム２１０のブロック図である。図１に示すクライアント１０３及びサーバ１０５は、図２に示すようなコンピュータ２１０の形態をとってもよい。図示のように、コンピュータシステム２１０の１つの構成要素がバス２１２である。バス２１２は、コンピュータシステム２１０の他の構成要素、例えば、少なくとも１つのプロセッサ２１４、システムメモリ２１７（例えばランダムアクセスメモリ（ＲＡＭ）、リードオンリーメモリ（ＲＯＭ）、フラッシュメモリ）、入出力（Ｉ／Ｏ）コントローラ２１８、スピーカシステム２２０などの外部音声装置に通信可能に連結された音声出力インターフェース２２２、ディスプレイ画面２２４などの外部ビデオ出力装置に通信可能に連結されたディスプレイアダプタ２２６、１つ以上のインターフェース（例えばシリアルポート２３０、ユニバーサルシリアルバス（ＵＳＢ）のレセプタクル２３０、パラレルポート（図示なし））など、キーボード２３２に通信可能に連結されたキーボードコントローラ２３３、少なくとも１つのハードディスク２４４（又はその他の形態の磁気媒体）に通信可能に連結された記憶装置インターフェース２３４、ファイバーチャネル（ＦＣ）ネットワーク２９０と接続するよう構成されたホストバスアダプタ（ＨＢＡ）インタフェースカード２３５Ａ、ＳＣＳＩバス２３９に接続するよう構成されたＨＢＡインタフェースカード２３５Ｂ、光ディスク２４２を受容するよう構成された光ディスクドライブ２４０、バス２１２に例えばＵＳＢレセプタクル２２８を介して連結されたマウス２４６（又はその他のポインティングデバイス）、バス２１２に例えばシリアルポート２３０を介して接続されたモデム２４７、及び、例えばバス２１２に直接連結されたネットワークインタフェース２４８と、通信可能に連結される。
【００１７】
他の構成要素（図示なし）は、同様の方法で接続され得る（例えばドキュメントスキャナ、デジタルカメラ、プリンタなど）。逆に、図２に示されているすべての構成要素は必ずしも存在する必要はない。構成要素は、図２に示されるものとは異なる手法で相互接続することができる。
【００１８】
バス２１２は、プロセッサ２１４と、上述のように、ＲＯＭ及び／又はフラッシュメモリ並びにＲＡＭを含み得るシステムメモリ２１７との間のデータ通信を可能にする。ＲＡＭは、典型的には、オペレーティングシステム及びアプリケーションプログラムがロードされるメインメモリである。ＲＯＭ及び／又はフラッシュメモリは、他のコードとともに、特定の基本的なハードウェアオペレーションを制御するベーシックインプット・アウトプットシステム（ＢＩＯＳ）を含み得る。アプリケーションプログラムはローカルコンピュータ可読媒体（例えばハードディスク２４４、光ディスク２４２）に格納され、システムメモリ２１７にロードされ、そしてプロセッサ２１４により実行され得る。アプリケーションプログラムは、例えばネットワークインタフェース２４８又はモデム２４７を介して、離れた場所（すなわち、離れたところに配置されたコンピュータシステム２１０）からシステムメモリ２１７にロードすることもできる。図２において、キャッシュコヒーレンシーマネージャ１０１は、システムメモリ２１７に存在するように図示される。キャッシュコヒーレンシーマネージャ１０１の動作は、図３を参照して以下に詳細に説明される。
【００１９】
記憶装置インターフェース２３４は、１つ以上のハードディスク２４４（及び／又は他の標準の記憶媒体）に連結される。複数のハードディスク２４４は、コンピュータシステム２１０の一部であってもよく、又は、物理的に別であってもよく、他のインタフェースシステムを介してアクセスされてもよい。
【００２０】
ネットワークインタフェース２４８及び／又はモデム２４７は、例えばインターネットなどのネットワーク１０７に、直接的又は間接的に、通信可能に連結され得る。そのような連結は、有線又は無線であり得る。
【００２１】
図３は、いくつかの実施形態における、共有記憶装置クラスタ３００に対応したキャッシュコヒーレンシーマネージャ１０１の動作を示す。図３は、クラスタ３００の複数のノード３０３（コンピュータシステム）のそれぞれで動作するキャッシュコヒーレンシーマネージャ１０１の一例を示す。各ノード３０３はコンピュータシステム２１０の形態をとってもよい。キャッシュコヒーレンシーマネージャ１０１の機能は、サーバ１０５やクライアント１０３上に存在してもよい。あるいは該機能は、キャッシュコヒーレンシーマネージャ１０１がネットワーク１０７を介したサービスとして提供される、ファブリック／クラウド型コンピューティング環境を形成する複数のコンピュータシステム２１０間に分散されていてもよい。なお、図３に単一の存在として図示されるキャッシュコヒーレンシーマネージャ１０１は、適宜単一又は複数のモジュールとしてインスタンス化され得る機能の集合を表す。キャッシュコヒーレンシーマネージャ１０１のモジュールは、任意のコンピュータシステム２１０のシステムメモリ２１７（例えばＲＡＭ、ＲＯＭ又はフラッシュメモリ）内にインスタンス（例えばオブジェクトコード又は実行可能画像）化されてもよい。これにより、コンピュータシステム２１０の少なくとも１つのプロセッサ２１４がモジュールを処理すると、コンピュータシステム２１０は関連した機能を実行する。本明細書で使用されるとき、「コンピュータシステム」、「コンピュータ」、「クライアント」、「クライアントコンピュータ」、「サーバ」、「サーバコンピュータ」及び「コンピューティングデバイス」という用語は、記載される機能を実行するように構成及び／又はプログラミングされた１つ以上のコンピュータを意味する。さらに、キャッシュコヒーレンシーマネージャ１０１の機能を実装するためのプログラムコードをコンピュータ可読記憶媒体に記録されてもよい。この場合、コンピュータシステム２１０の少なくとも１つのプロセッサ２１４によりプログラムコードがコンピュータメモリ２１７に展開され実行されると、コンピュータシステム２１０は関連した機能を実行する。この場合、磁気又は光記憶媒体のような任意の形式の非一時的コンピュータ可読媒体を使用してもよい。本明細書で使用されるとき、「コンピュータ可読媒体」という用語は、基となる物理媒体から離れた電気信号を指すものではない。
【００２２】
図３は、共有記憶装置３０５を利用したクラスタリング及びストレージシステム３０１に対応してインスタンス化されたクラスタ３００を示す。図示及び説明を簡潔化するため、ストレージシステム３０１は全ノード３０３外の中心要素として図示される。クラスタリング及びストレージシステム３０１は、実際には、通常、クラスタ３００内に分散された複数要素としてインスタンス化される、機能の集合を表すものであることが理解されよう。図３を参照すると、共有記憶装置３０５は単一の記憶装置１６０であるかのように図示及び説明されるが、実際には共有記憶装置３０５は通常、共有記憶装置３０５にアクセスするコンピュータシステム２１０から見て単一の記憶装置１６０と見えるようにクラスタリング及びストレージシステム３０１に管理される、複数の基となる物理的記憶装置１６０により実装される。
【００２３】
図３ではクラスタ３００がノード３０３を２つのみ有するものとして図示されているが、クラスタ３００が３つ以上のノード３０３（いくつかの実施形態ではそれ以上）を有するものであってもよいことが理解されよう。各ノード３０３は、例えば図２に図示するような物理的コンピュータ２１０のような物理（又は仮想）ホストコンピュータ２１０としてインスタンス化されてもよい。図示のノード３０３はそれぞれローカル非共有キャッシュ３０７を有する。一実施形態では、非共有キャッシュ３０７はそれぞれＳＳＤドライブとしてインスタンス化される。後に詳述するように、別の実施形態では、その他ストレージ技術を使用してローカルキャッシュ３０７を実装してもよい。ローカルキャッシュ３０７は、共有記憶装置３０５内容のキャッシングのため、ノード３０３により使用される。したがって、ノード３０３が個別に共有記憶装置３０５にアクセスすると、クラスタリング及びストレージシステム３０１のクラスタリング機能３１１が使用するあらゆるキャッシングアルゴリズム（例えば、従来の又はカスタマイズされたキャッシングアルゴリズム）に応じて、ローカルキャッシュ３０７を共有記憶装置データのキャッシュをするために使用可能である。なお、共有記憶装置データはすべて共有記憶装置３０５に存在し、共有記憶装置データのサブセットはローカルキャッシュ３０７に保存可能である。これにより、アクセスレイテンシを下げることができる（これを読み取りキャッシングと称する場合もある）。以下に詳細に説明するように、キャッシュコヒーレンシーマネージャ１０１は、図示された各ノード３０３上のシステムメモリ２１７で動作して、共有記憶装置クラスタ３００内でローカルキャッシュコヒーレンシーを得るための各種機能を実装する。
【００２４】
図４は、キャッシュコヒーレンシーマネージャ１０１の具体的モジュールを示し、上位での動作を説明するものである。なお、異なる具体的シナリオでの該モジュールの動作は、図５Ａ〜Ｄ及び図６Ａ〜Ｄを参照して後により詳細に説明する。
【００２５】
キャッシュコヒーレンシーマネージャ１０１の共有記憶装置アクセス監視モジュール４０５は、ノードレベルで試みられた共有記憶装置３０５へのアクセスを監視する。すなわち、キャッシュコヒーレンシーマネージャ１０１のインスタンスが、クラスタ３００の各ノード３０３で動作する（図３に図示）。あるノード３０３上の共有記憶装置アクセス監視モジュール４０５の具体的インスタンスは、共有記憶装置３０５にアクセスしようとしたそのノード３０３の動作を監視する。この動作の結果として、ノードのローカルキャッシュ３０７がクラスタリング及びストレージシステム３０１のキャッシング機能３１１を更新してもよい。そのような動作の例として、ディスク読み取り、ディスク書き込み、及びその他共有記憶装置３０５に対するマウントやフォーマットなどのアクセス動作が挙げられる。クラスタリング及びストレージシステム３０１は共有記憶装置内容のローカルノードレベルキャッシングをサポートするため、あるノード３０３と共有記憶装置３０５との間で内容を移動させる動作の結果として、そのノードのローカルキャッシュ３０７が更新される。該動作を監視するため、共有記憶装置アクセス監視モジュール４０５は対応するコールを傍受若しくはフック及び／又はラップ可能である。監視に使用される具体的な実装原理（例えばシステムコール傍受、ファイルシステムフィルタードライバ、など）は、実施形態毎に異なる。上記機能を監視する正確なレベル（例えばファイルシステムレベル、ブロックレベル、オペレーションシステムレベル、ハードウェアレベル、その他）も実施形態毎に異なってもよい。
【００２６】
このような監視により得られた情報に基づき、キャッシュコヒーレンシーマネージャ１０１のキャッシュステータス追跡モジュール４０１は、そのローカルキャッシュ３０７に最新の共有記憶装置内容を保持するノード３０３と、しないノード３０３を追跡する。共有記憶装置３０５に対するノードレベルのアクセスを監視することで、自身のローカルキャッシュ３０７のステータスに影響を及ぼす動作を実行したノード３０３を特定する情報が得られる。このように、キャッシュステータス追跡モジュール４０１は上記得られた情報を使用してローカルキャッシュ３０７のステータスを判定及び追跡する。追跡は、共有記憶装置３０５の各データボリュームレベル（又は後述のようにより小さな領域）で実行される。すなわち、キャッシュステータス追跡モジュール４０１は、各特定のノードのローカルキャッシュ３０７が持つのは最新データか古いデータかを、共有記憶装置３０５の領域（例えばデータボリューム）毎に追跡する。
【００２７】
キャッシュコヒーレンシーマネージャ１０１のキャッシュステータス保持モジュール４０７は、現在追跡中のローカルキャッシュステータス情報４０３を保持（すなわち記憶）する。これにより、任意のノード３０３が共有記憶装置３０５の領域にアクセスすると、その領域に対する、該ノードのローカルキャッシュ３０７のステータスの変更のみではなく、クラスタ３００のその他すべてのノード３０３のステータス変更を示すよう、追跡中のローカルキャッシュステータス情報４０３が更新可能となる。以下に詳述するように、共有記憶装置にアクセスするいくつかのノードレベルの動作は、該アクセスを行うノードのローカルキャッシュ３０７のステータスのみに影響を及ぼす。例えば、読み取り動作では、その他のノード３０３のローカルキャッシュ３０７のステータスに影響を及ぼすことなく、読み取りを実行するノードのローカルキャッシュ３０７が共有記憶装置３０５の対象領域の現在のデータを保持するよう更新される。しかし、その他動作がクラスタ３００の、アクセスを実行しないノード３０３のローカルキャッシュ３０７のステータスに影響を及ぼす可能性もある。例えば、書き込み動作が行われると、書き込みを実行しないノード３０３のローカルキャッシュ３０７の対応した更新が実行されることなく、共有記憶装置３０５の対象領域が更新され得る。これにより、書き込み動作で更新された共有記憶装置３０５の領域は、書き込みを実行しないノード３０３のローカルキャッシュ３０７にとって古いものとなってしまう。
【００２８】
キャッシュステータス保持モジュール４０７は、追跡されたローカルキャッシュステータス情報４０３を１つ以上のデータ構造として記憶することで、クラスタ３００の各ノード３０３のキャッシュステータスを保持できる。特定の実施形態でこの目的のため使用されるデータ構造の具体例を、図５Ａ〜Ｄと６Ａ〜Ｄを参照して図示及び説明する。追跡されるローカルキャッシュステータス情報４０３の少なくとも一部が、共有記憶装置３０５上に保持される。これにより、クラスタ３００の複数のノード３０３により共通して使用可能となる。
【００２９】
以下により詳しく説明するように、あらゆるキャッシング動作の前に、キャッシュコヒーレンシーマネージャ１０１の初期化モジュール４０９は、すべての追跡されたローカルキャッシュステータス情報４０３を初期化可能である（例えばデータ構造として記憶される）。初期化されると、全ノードのローカルキャッシュ３０７が共有記憶装置３０５の全領域に対し最新ではないことが示される。クラスタ３００のノード３０３が共有記憶装置３０５にアクセスすると、キャッシュステータス保持モジュール４０７は、追跡されたローカルキャッシュステータス情報４０３を更新する。キャッシュコヒーレンシーマネージャ１０１のキャッシュステータス判定モジュール４１１は、キャッシング機能３１１と協働可能であり、保持されている追跡されたローカルキャッシュステータス情報４０３を参照して、あるノード３０３が、特定の領域に対して最新の共有記憶装置内容を該ノードのローカルキャッシュ３０７から取得できるか、あるいは、ローカルキャッシュ３０７から古いデータを取得してしまわないよう、共有記憶装置３０５に直接アクセスして内容を取得するかを判定する。本処理を以下により詳細に説明する。
【００３０】
図５Ａ〜Ｄを参照して説明を行う。一実施形態では追跡されたローカルキャッシュステータス情報４０３は、共有記憶装置３０５上のビットマップ５０１として保持される。ビットマップ５０１は、クラスタ３００の各ノード３０３毎にビット群５０３を有する。各ビットは共有記憶装置３０５の特定の領域を示す。したがって、対象の領域が各データボリュームの形態をとり（図５Ａ〜Ｄに示す具体例シナリオ参照）、各ビット群５０３は、共有記憶装置３０５の各ボリュームに対して１つのビットを有する。各ノード３０３毎にビット群５０３が設けられていることから、ビットマップ５０１内の総ビット数は、クラスタ３００におけるノード３０３の数と共有記憶装置３０５上のボリュームの数の積に等しい。したがって、各ノード３０３は、共有記憶装置３０５の各ボリュームを示す個別のビットを有する。キャッシュステータス保持モジュール４０７は、ノードのローカルキャッシュ３０７が、共有記憶装置３０５の特定のボリュームに対する最新のデータを有するかを示すよう、これらビットの値を設定する。例えば、図５Ａ〜Ｄにおいて、１が設定されたビットは最新を示し、０が設定されたビットは古いことを示す（他の実施形態では、キャッシュステータス保持モジュール４０７はこれらの値を逆に設定する。すなわち０が最新を示し、１が古いことを示す）。
【００３１】
時間の経過とともに、クラスタ３００の複数のノード３０３は個別に、読み取り、書き込み、又はその他目的で共有記憶装置３０５のボリュームにアクセスする。このようなアクセス動作は、各種ノード３０３上のキャッシュコヒーレンシーマネージャ１０１のインスタンスの監視モジュール４０５により監視される。上述のように、特定のノード３０３が共有記憶装置３０５に対してアクセスすることにより、自身のローカルキャッシュ３０７のステータス（最新か否か）が影響を受け、さらにクラスタ３００内のその他ノード３０３のローカルキャッシュ３０７のステータスにも影響を及ぼし得る。そのような特定のノードのアクセス動作によるキャッシュステータス変更は、該特定のノード３０３上のキャッシュステータス追跡モジュール４０１のインスタンスにより追跡され、キャッシュステータス保持モジュール４０７は、影響されたノード３０３それぞれに対し、影響されたボリュームに対応するビットの値を適切な値に設定する。
【００３２】
図５Ａ、５Ｂ、５Ｃ及び５Ｄは、ビットマップ５０１を使用して、クラスタ３００の複数のノード３０３のローカルキャッシュ３０７のステータスを追跡する方法の具体例を示す。図５Ａ〜Ｄは、クラスタ３００が３つのノード３０３を有し、共有記憶装置３０５が個別にキャッシュ可能な４つのボリュームを有するシナリオにおけるビットマップ５０１を示す。図５Ａ〜Ｄは、Ｎ１、Ｎ２及びＮ３の３つの列を示す。これらの列は、クラスタ３００のノード３０３のビット群５０３を含む。具体的には、列はそれぞれ対応するノード３０３（すなわちそれぞれノード３０３Ａ、３０３Ｂ及び３０３Ｃに対応）のローカルキャッシュ３０７を示す。図５Ａの４行はそれぞれＶ１、Ｖ２、Ｖ３及びＶ４の符号が付されており、共有記憶装置３０５の４つのボリュームを示す（ここではそれぞれボリューム１〜４と称する）。したがって、座標Ｎ１、Ｖ１は、ノード３０３Ａのローカルキャッシュ３０７内のボリューム１のステータスを示し、Ｎ２、Ｖ４上のビットは、ノード３０３Ｂのローカルキャッシュ３０７内のボリューム４のステータスを示し、以下同様である。図５Ａ〜Ｄにおいて、値１を有するビットは、対応するノードのローカルキャッシュ３０７内の対応するボリュームが最新であることを示し、値０を有するビットは、対応するノードのローカルキャッシュ３０７内の対応するボリュームが古いことを示す。
【００３３】
図５Ａは、初期化後の状態であって、いかなるキャッシング動作も起きていない状態のビットマップ５０１を示す。通常、キャッシング動作が生じる前に、初期化モジュール４０９は追跡されたすべてのローカルキャッシュステータス情報４０３を初期化して、すべてのノードのローカルキャッシュ３０７が、共有記憶装置３０５の全ボリュームに対して最新でないことを示すようにしてもよい。これは、いかなるキャッシング動作も生じていないためである。図５Ａに図示された実施形態では、ビットマップ５０１の各ビット群５０３の各ビットを０に設定することで初期化が実行される。
【００３４】
次に、図５Ｂを参照して、ノード３０３Ａがボリューム１〜３をマウントする場合を説明する。この場合、これらボリュームの内容をノード３０３Ａのローカルキャッシュ３０７にキャッシュ可能となる。共有記憶装置アクセス監視モジュール４０５はマウント動作を監視し、キャッシュステータス保持モジュール４０７は、ビット群５０３内の、ノード３０３Ａに対応するボリューム１〜３を表すビットを１に設定する。これにより、ビットマップ５０１が、上記ボリュームに対してノード３０３Ａのローカルキャッシュ３０７が最新になったことを示すよう更新される。これは、ノード３０３Ａがこれらボリュームをマウントすると、クラスタリング及びストレージシステム３０１のキャッシング機能３１１は、それに応じてノード３０３Ａのローカルキャッシュを更新するためである。なお、キャッシュコヒーレンシーマネージャ１０１はローカルキャッシュ３０７自体を実際に更新しているわけではない。それはクラスタリング及びストレージシステム３０１に配置されたキャッシング機能３１１と、そのノード３０３により行われるのである。しかし、上述のように、キャッシュコヒーレンシーマネージャ１０１は、各ローカルかつ非共有のキャッシュ３０７のステータスを、共有されたクラスタ全体規模で追跡する。
【００３５】
マウント動作の場合、キャッシュステータス保持モジュール４０７は、上述のようにマウントを実行するノード３０３に対応するビットを更新するが、その他ノード３０３（すなわちマウントを実行していないノード３０３）に対応するビットは更新しない。これは、マウントが読み取り専用動作であり、共有記憶装置３０５に対する読み取りによって、読み取りを実行しないノード３０３のローカルキャッシュ３０７が更新されることはないためである。図５Ｂは、ノード３０３Ａによりボリューム１〜３の上記マウント後のビットマップ５０１の状態を示す。ノード３０３Ａのローカルキャッシュ３０７内のそれら３つのボリュームのみに対応するビットが１に設定され、最新データを保持していることを示す。ノード３０３Ａのローカルキャッシュ３０７のボリューム４に対応するビット並びにその他ノード（ノード３０３Ｂ及び３０３Ｃ）に対応するすべてのビットは、図５Ａの状態から変わっていない。
【００３６】
読み取り専用のマウント動作と同様に、特定のノード３０３が共有記憶装置３０５の特定のボリュームを読み取ると、読み取りを実行するノード３０３に対する読み取りボリュームに対応するビットは最新ステータスを示すよう設定される。一方、その他ノード３０３に対するボリュームに対応するビットは変化しない。上述のマウントの場合で説明したように、ノード３０３がボリュームを読み取ると、自身のローカルキャッシュ３０７はそのボリュームに対する最新のデータを保持する。したがって、その対応するビットは最新でない状態に設定されていたとしても、最新に更新される（読み取り動作前に既に最新に設定されていた場合、その値はそのままとなる）。読み取り動作はその他（読み取りを実行しない）ノード３０７のローカルキャッシュ３０７のステータスに影響を及ぼさないため、ビットマップ５０１における対応するビット群５０３は更新されない。さらに、読み取り動作は、読み取りを実行するノード３０３のローカルキャッシュ３０７内の読み取られていないボリュームのステータスに影響を及ぼすことはないため、該ボリュームに対応するビットも更新されない。
【００３７】
この機能を図５Ｃを参照してさらに説明する。ノード３０３Ａが共有記憶装置３０５のボリューム１を読み取り、ノード３０３Ｂがボリューム３と４を読み取ったものとする。このような読み取り動作の前に、ノード３０３Ａのローカルキャッシュ３０７内のボリューム１を表すビットは既に最新に設定されている（すなわち、ビットＮ１、Ｖ１は、図５Ｂを参照して説明したマウント動作の結果、値１を有している）。したがって、該ビットの値は、ノード３０３Ａの読み取り動作によって変わることはない。一方、ノード３０３Ｂのボリューム３と４に対する読み取り前に、これらボリュームを表すノード３０３Ｂのビット（すなわちビットＮ２、Ｖ３とビットＮ２、Ｖ４）は、ステータスが最新でないことを示す０に設定されている。読み取り動作の結果として、ノード３０３Ｂのローカルキャッシュ３０７が該ボリュームに対して最新となるため、その対応するビットの値も最新ステータスを示すよう更新される。これら２つの読み取り動作後のビットマップ５０１の状態を図５Ｃに示す。
【００３８】
次に、図５Ｄを参照して、書き込み動作の場合を説明する。特定のノード３０３が新たな内容を、共有記憶装置３０５のあるボリュームに書き込むと、書き込みを実行したノードのローカルキャッシュ３０７が該ボリュームに対して最新になるが、他のノード３０３のローカルキャッシュ３０７が最新でなくなってしまう（古くなってしまう）。すなわち、書き込みは共有記憶装置３０５の対象ボリュームに新たな内容を書き込むものである。新たな内容は、書き込みを実行したノード３０３から生じるものであり、書き込みを実行したノード３０３が書き込み動作中に共有記憶装置３０５のボリュームにアクセスすると、キャッシング機能３１１は書き込まれた内容を使用して書き込みを実行したノードのローカルキャッシュ３０７を最新のものとする。しかし、その他ノード３０３のローカルキャッシュ３０７は、書き込みを実行したノード３０３によりアクセス不能であるため、いずれも共有記憶装置３０５の更新されたボリュームに現在存在する内容を保持するよう自動更新されない。したがって、共有記憶装置アクセス監視モジュール４０５が、共有記憶装置３０５の特定のボリュームに書き込みを実行しているあるノード３０３を監視している間、キャッシュステータス保持モジュール４０７は書き込みを実行したノード３０３に対する、影響されたボリュームに対応するビットを、最新のステータスを示すよう設定する（あるいは、書き込み動作前に既にビットが最新に設定されていた場合、その値を維持する）。これは読み取り動作の場合も同様である。しかし、読み取り動作と異なり、書き込みを実行していないノード３０３に対する対象ボリュームに対応するビットが、最新ではないステータスを示すよう更新される（該ビットのいずれかが、書き込み動作前に既に最新でないと設定されていた場合、その値を維持する）。上述したように、書き込みを実行していないノード３０３のローカルキャッシュ３０７は、書き込み動作の後、影響されたボリュームに対しては古いものとなる。この結果は、上述のビットマップ５０１の更新により示される。
【００３９】
例えば、図５Ｄを参照し、ノード３０３Ｂが共有記憶装置３０５のボリューム１に対して書き込みを実行する場合を説明する。ノード３０３Ｂのローカルキャッシュ３０７内のボリューム１を表すビットは最新に更新される（すなわちビットＮ２、Ｖ１が１に設定される）。なお、このビットは書き込み動作の前に最新でない（０）に設定されており、書き込み動作が実行されると更新されるものとする。ノード３０３Ｂによるボリューム１に対する書き込みにより、ノード３０３Ａ及び３０３Ｃのローカルキャッシュ３０７がボリューム１に対して古くなるため、対応するビットが０に設定される。ノード３０３Ａのローカルキャッシュ３０７は書き込み動作の前にボリューム１に対して最新であったため、対応するビット（Ｎ１、Ｖ１）は０に設定され、ステータス変更が起きたことを示す。ノード３０３Ｃのローカルキャッシュ３０７のボリューム１に対応するビットは書き込み動作の前に０に設定されていたため、その値はそのままとなる。
【００４０】
次に、ノード３０３Ｃがボリューム４に書き込みを行うものとする。ノード３０３Ｃのローカルキャッシュ３０７内のボリューム４を示すビット（ビットＮ３、Ｖ４）はそれまでの最新でない（０）から最新（１）に設定される。したがって、書き込み動作の結果としてのノード３０３Ｃのローカルキャッシュ３０７の更新が反映される。この書き込み動作の前に、書き込みを実行していないノード３０３Ａ内のボリューム４に対応するビットは既に最新でないと設定されている。したがって、ノード３０３Ｃのボリューム４に対する書き込みの結果、該ビット（ビットＮ１、Ｖ４）の値が変更することはない。しかし、書き込みを実行していないノード３０３Ｂ内のボリューム４に対応するビット（ビットＮ２、Ｖ４）は最新に設定されていたため、最新でないと更新される。図５Ｄは、上記２つの書き込み動作の後のビットマップ５０１の状態を示す。
【００４１】
いくつかのシナリオでは、クラスタ３００のあるノード３０３はローカルキャッシュ３０７を有さない。共有記憶装置３０５に対するローカルキャッシュ３０７を有さないノード３０３の書き込みに対しても、キャッシュステータス保持モジュール４０７は、ローカルキャッシュ３０７を有さない書き込みを実行していないあらゆるノード３０３に対する、影響されたボリュームに対応するビットを更新する。この場合、書き込みを実行するノード３０３が、書き込み動作に影響されたローカルキャッシュ３０７を有さない場合でも、共有記憶装置３０５上の対象ボリュームの内容は更新される。したがって、クラスタ３００内のその他ノード３０３のローカルキャッシュ３０７が、該ボリュームに対して古くなる。
【００４２】
別の状況では、書き込みを実行するノード３０３がローカルキャッシュ３０７を有しているが、書き込み動作の際に、そのローカルキャッシュ３０７が新たな内容に基づき更新できない。例えば、その理由としては、ローカルキャッシュ３０７を提供するＳＳＤドライブがノード３０３から一時的に切断されていたことが挙げられる。この場合、ビットマップ５０１を、書き込みを実行しないノード３０３のローカルキャッシュ３０７が古いものとなったことを示すよう更新するだけでなく、キャッシュステータス保持モジュール４０７はビットマップ５０１を、書き込みを実行するノード３０３のローカルキャッシュ３０７も、対象ボリュームに対して古いと示すよう更新する。書き込みを実行するノード３０３が共有記憶装置３０５上のボリュームを更新するが、自身のローカルキャッシュ３０７をそれに応じて更新できないため、自身のローカルキャッシュ３０７は影響されたボリュームに対して古いものとなる。したがって、ビットマップ５０１はそのような状態を示すように設定される。
【００４３】
キャッシュステータス保持モジュール４０７は、共有記憶装置３０５の各領域に対する各ノードのローカルキャッシュ３０７のステータスが反映されるようビットマップ５０１を保持するため、キャッシュステータス判定モジュール４１１は、あるノード３０３が特定の共有記憶装置の内容をローカルキャッシュ３０７からアクセス可能なタイミングを正確に判定できる。ローカルキャッシュ３０７が共有記憶装置３０５のある領域に対して最新でない場合、共有記憶装置３０５に直接アクセスする必要がある。具体的には、キャッシング機能３１１が共有記憶装置３０５のある領域を特定のノード３０３からアクセスしようとすると、キャッシュステータス判定モジュール４１１は、ビットマップ５０１内の適切なビットを読み取り、そのノードのローカルキャッシュ３０７が共有記憶装置３０５の領域に対して最新のデータを有するか判定可能である。その結果に応じて、キャッシング機能３１１をローカルキャッシュ３０７と共有記憶装置３０５のいずれかにアクセスするよう指示する。
【００４４】
別の実施形態では、キャッシング機能３１１とキャッシュステータス判定モジュール４１１との間の相互作用は、適宜別の方法で実装可能である。例えば、一実施形態では、キャッシング機能３１１はプログラムでキャッシュステータス判定モジュール４１１を呼び出し、パラメータとしてノード３０３と共有記憶装置の対象領域を送るように構成できる。それに応じて、キャッシュステータス判定モジュール４１１は、ノードのローカルキャッシュ３０７内の所定の領域のステータスをキャッシング機能３１１に返してもよい。別の実施形態では、キャッシュステータス判定モジュール４１１はキャッシング機能３１１をフックし、対象となるノード３０３と共有記憶装置３０５の領域について適切に判定し、適宜対応するローカルキャッシュ３０７又は共有記憶装置３０５にアクセス動作を向け得る。それに関わらず、追跡されたローカルキャッシュステータス情報４０３（図５Ａ〜Ｄに示す実施形態のビットマップ５０１に記憶される）は、クラスタ３００のノード３０３のローカルキャッシュ３０７のステータスを保持する。このステータス情報は、あるノード３０３が、ノードのローカルキャッシュ３０７から、特定の領域に対する最新の共有記憶装置の内容を取得できるか、あるいはノード３０３が自身のローカルキャッシュ３０７から古い内容を取得しないよう共有記憶装置３０５に直接アクセスするべきかを判定するために使用される。
【００４５】
図５Ａ〜Ｄは、ビットマップ５０１を使用して、追跡されたローカルキャッシュステータス情報４０３を記憶する場合を図示するが、その他実施形態では、アレイ、連結リストやその他データ構造を適宜使用してもよい。また、図５Ａ〜Ｄは各ノード３０３につき、ボリューム毎に１ビット使用する例を図示するが、別の実施形態では、例えば管理情報などを記憶するため、さらなるビット（あるいは別のデータ要素）が使用される。
【００４６】
さらに、上記説明ではキャッシングについて説明され、共有記憶装置３０５をデータボリュームレベルで表しているが、別の実施形態では、共有記憶装置３０５の別の領域が使用される。例えば、共有記憶装置３０５はキャッシュされ、データボリュームより詳細な粒度で表されてもよい。例えば、ボリュームのサブセットとしてのブロック群で表されてもよい。例えば、データボリュームが１キロバイト（１Ｋ）のシナリオでは、上述の機能により、Ｘ＜１Ｋ、Ｘ  ＭＯＤ  １Ｋ＝０の条件で、例えばＸ個のブロックの群を処理可能である。
【００４７】
ビットマップ５０１は共有記憶装置３０５上で保持されるものとして説明したが、一実施形態では、各ノード３０３はビットマップ５０１（又はその他データ構造）のコピーをローカルメモリ２１７に保持し、自身のローカルコピーへの更新を定期的（例えば更新が１０回、１００回、１０００回など、実行された後）に共有記憶装置３０５に対しフラッシュする。この実施形態では、あるノード３０３が共有記憶装置３０５に対し自身の更新をフラッシュする前に故障してしまうと、結果として生じるその他のノード３０３に対する未同期を、キャッシュコヒーレンシーマネージャ１０１は少なくとも適正に追跡されたローカルキャッシュステータス情報４０３を使用して修正する。
【００４８】
次に、図６Ａ〜Ｄを参照すると、別の実施形態では、追跡されたローカルキャッシュステータス情報４０３の一部は共有記憶装置３０５上に保持され、一部は各ノード３０３のローカルキャッシュ３０７に保持される。具体的には、各ノードのローカルキャッシュ３０７内に、あるローカルキャッシュ３０７に対応する更新カウンタ群６０１が保持される。さらに、単一の共有更新カウンタ群６０１が共有記憶装置３０５内に保持される。ローカル及び共有更新カウンタ群６０１はそれぞれ、共有記憶装置３０５の特定のボリューム（又はその他領域）毎に更新カウンタを有する。各更新カウンタは、整数のような、初期化点以降に共有記憶装置３０５のある領域に対する更新の追跡に適したデータ変数の形式をとる。
【００４９】
図６Ａ〜６Ｄは、クラスタ３００の複数のノード３０３のローカルキャッシュ３０７のステータスの追跡に使用されたローカル及び共有更新カウンタの特定の状態を示す。上述のように、図６Ａ〜Ｄに示すシナリオでは、クラスタ３００は３つのノード３０３を有し、共有記憶装置３０５は独自にキャッシュ可能な４つのボリュームを有する。図６Ａ〜Ｄは、Ｓ、ＬＮ１、ＬＮ２及びＬＮ３の４列を示す。これらの列は、単一の共有更新カウンタ群６０１と、クラスタ３００の各ノード３０３のローカル更新カウンタ群６０１とを含む。具体的には、列Ｓは全ノード３０３に使用される共有更新カウンタ群６０１を表す。列ＬＮ１、ＬＮ２及びＬＮ３は、それぞれノード３０３Ａ、３０３Ｂ及び３０３Ｃのローカル更新カウンタ群６０１を表す。４行は符号Ｖ１、Ｖ２、Ｖ３及びＶ４が付与され、それぞれ共有記憶装置３０５のボリューム１〜４を表す。下記の具体例でより詳細に説明するように、共有記憶装置３０５の特定のボリュームに対するあるノードのローカル更新カウンタの値が、該ボリュームに対する対応する共有更新カウンタの値に一致する場合、ノードのローカルキャッシュ３０７がそのボリュームに対して最新であることを示す。あるボリュームに対する、ノードのローカル更新カウンタの値が対応する共有更新カウンタの値に一致しない場合、ノードのローカルキャッシュ３０７内のボリュームに対するステータスが最新でない（古い）ことを示す。
【００５０】
図６Ａは、初期化後であって、いかなるキャッシング動作が起きる前の状態の更新群６０１を示す。ここで、初期化モジュール４０９は、全ノードのローカルキャッシュ３０７が、共有記憶装置３０５の全ボリュームに対して最新でないことを示すようすべての更新カウンタを初期化している。これは、いかなるキャッシング動作も生じていないためである。図６Ａに図示された実施形態では、各ノード３０３の各ローカル更新カウンタを０に設定し、各共有更新カウンタを１に設定することで、この初期化が実行される。別の実施形態では、以下に説明される一致ロジックが保たれるという条件で、異なる初期非一致値を使用可能である。
【００５１】
次に、図６Ｂを参照して、ノード３０３Ａがボリューム１と２とをマウントする場合を考える。この動作により、ノード３０３Ａのローカルキャッシュ３０７に、マウントされたボリュームの内容をキャッシング可能となる。それに応じて、キャッシュステータス保持モジュール４０７は、ノード３０３Ａのローカル更新カウンタ群６０１内のボリューム１と２とを表す更新カウンタを、これらボリュームに対する共有更新カウンタの値に設定する。マウント動作では、マウントするノードのローカルキャッシュ３０７を、対象ボリュームに対して最新にする効果があるため、対象ボリュームに対するローカル更新カウンタが対応する共有更新カウンタの値に設定される。これにより、値が一致し、ローカルキャッシュ３０７のステータスが、ノード３０３Ａ上のマウントされたボリュームに対し最新であることを示す。すなわち、マウント動作前には０であったボリューム１と２とに対するノード３０３Ａのローカル更新カウンタが、ボリューム１と２とに対する共有更新カウンタの値である１に設定される。したがって、これらボリュームに対するノード３０３Ａのローカル更新カウンタが、対応する共有更新カウンタに一致するようになる。これにより、ノード３０３Ａのローカルキャッシュ３０７が、これらボリュームに対して最新であることが示される。
【００５２】
その後、ノード３０３Ｂがボリューム３をマウントし、ノード３０３Ｃがボリューム４をマウントするものとする。これらノード３０３とボリュームに対するローカル更新カウンタも、対応する共有更新カウンタの値に設定され、ノード３０３Ｂのローカルキャッシュ３０７がボリューム３に対し最新であり、ノード３０３Ｃのローカルキャッシュ３０７がボリューム４に対して最新であることを示す。図６Ｂは、上記３つのマウント動作後の更新カウンタ群６０１の状態を示す。
【００５３】
マウントの場合同様、ノード３０３がボリュームに対して読み取りを実行すると、自身のローカルキャッシュ３０７が該ボリュームに対して最新のデータを保持する。したがって、読み取り動作の監視に対して、対象ボリュームに対する読み取りを実行するノードのローカル更新カウンタの値は、既に一致していなかった場合、対応する共有更新カウンタの値に設定される。すなわち、ノードのローカル更新カウンタの値と、読み取り対象のボリュームに対する、対応する共有更新カウンタの値とが既に一致していた場合（すなわち、読み取り動作前にノードのローカルキャッシュ３０７が既に最新であった場合）、該ボリュームに対するノードのローカル更新カウンタの値はそのままとなる。一方、読み取り動作前にローカル及び共有更新カウンタの値が一致していない場合、ノード３０３に対する読み取りボリュームに対応するローカル更新カウンタは、対応する共有更新カウンタの値に設定される。したがって、値が一致し、ノードのローカルキャッシュ３０７が、該ボリュームに対し最新となったことを示す。読み取り動作は、読み取りを実行しないノード３０７のローカルキャッシュ３０７に影響を及ぼさないことから、それらのローカル更新カウンタは。読み取りボリュームに対して変更されない。
【００５４】
図６Ｃを参照して、ノード３０３Ａが共有記憶装置のボリューム２を読み取り、ノード３０３Ｂがボリューム１を読み取る場合を考える。このような読み取り動作の前に、ノード３０３Ａのローカル更新カウンタのボリューム２に対する値が、対応する共有更新カウンタの値に既に等しい。これは、図６Ｂを参照して説明したマウント動作の結果、ノード３０３Ａのローカルキャッシュ３０７が、該ボリュームに対して最新になっているためである。したがって、ノード３０３Ａのローカル更新カウンタのボリューム２に対する値は、ノード３０３Ａの読み取り動作の影響を受けない一方、ノード３０３Ｂのボリューム１に対する読み取りの前に、該ボリュームに対するノード３０３Ｂのローカル更新カウンタは初期値０のままであり、ボリューム１に対する共有更新カウンタの値と一致しない。これは、読み取り動作前にノード３０３Ｂのローカルキャッシュ３０７のステータスが、該ボリュームに対して最新でないことを示す。読み取り動作の結果として、ノード３０３Ｂのローカルキャッシュ３０７がボリューム１に対して最新となることから、ボリューム１に対するノード３０３Ｂのローカル更新カウンタは、ボリューム１に対する共有更新カウンタの値に設定される。これにより、値が一致し、該最新ステータスを示すようになる。図６Ｃは、これら２つの読み取り動作後の更新カウンタ群６０１の状態を示す。
【００５５】
次に、図６Ｄを参照して、書き込み動作の場合を説明する。上述のように、特定のノード３０３が共有記憶装置３０５のあるボリュームに新たな内容を書き込んだ後、該ボリュームに対して、書き込みを実行するノードのローカルキャッシュ３０７は最新となるが、その他ノード３０３のローカルキャッシュ３０７は最新ではない（古い）。すなわち、書き込み動作では、共有記憶装置３０５の対象ボリュームに新たな内容を書き込む。新たな内容は書き込みを実行するノード３０３から発生するものであり、書き込みを実行するノード３０３が共有記憶装置３０５上のボリュームにアクセスすると、キャッシング機能３１１は記載の内容を使用して、書き込みを実行するノードのローカルキャッシュを最新にする。一方、書き込みを実行するノード３０３はその他ノード３０３のローカルキャッシュ３０７に対してアクセス不能である。該ローカルキャッシュ３０７は、共有記憶装置３０５の更新されたボリュームに現在存在する新たな内容を含むように自動的に更新されない。
【００５６】
共有記憶装置アクセス監視モジュール４０５が共有記憶装置３０５の特定のボリュームに書き込みを実行するあるノード３０３を監視する場合、そのボリュームに対する第１書き込みに応じて、キャッシュステータス保持モジュール４０７は、対象ボリュームに対する共有更新カウンタを増加させ、共有記憶装置３０５のボリュームが更新されたことを示すようにする。該ボリュームに対する、書き込みを実行するノードのローカル更新カウンタは、増加した共有更新カウンタの値に設定され、書き込みを実行するノードのローカルキャッシュ３０７がボリュームに対して最新であることを示す。なお、共有更新カウンタの値を、更新されたボリュームに対して増加させることで、全書き込みを実行しないノード３０３の対応するローカル更新カウンタが、たとえ書き込み動作前は共有更新カウンタに一致していても、一致しなくなる。これは、書き込み動作を実行したノード３０３以外の全ノード３０３の全ローカルキャッシュ３０７が、該ボリュームに対しては古いことを示す。ボリュームの内容が書き込み動作により更新されたためである。すなわち、上述のように、書き込み動作により、非書き込みを実行するノード３０３のローカルキャッシュ３０７が影響されたボリュームに対して古くなり、これは共有更新カウンタの増加により認識可能である。
【００５７】
例えば、図５Ｄを参照して、ノード３０３Ｂが共有記憶装置３０５のボリューム１に書き込みを行う場合を説明する。ボリューム１に対する共有記憶装置カウンタは、２に増加され、ノード３０３Ｂの対応するローカル更新カウンタは、増加された共有記憶装置カウンタの値に設定される。これは、ボリューム２が更新され、書き込みを実行するノードのローカルキャッシュ３０７がボリューム２に対して最新であり、書き込みを実行しないノード３０３のローカルキャッシュ３０７が該ボリュームに対して最新ではないことを示す。ノード３０３Ｂのボリューム１に対する書き込みにより、ノード３０３Ａと３０３Ｃとのローカルキャッシュ３０７が、ボリューム１に対して古くなる。これはボリューム１に対する共有更新カウンタを増加することにより認識可能であり、ノード３０３Ａと３０３Ｃの対応するローカル更新カウンタが、増加された共有更新カウンタと一致しなくなる図５Ｄは、この書き込み動作の後の更新カウンタ群６０１の状態を示す。
【００５８】
書き込みを実行するノード３０３がローカルキャッシュ３０７を有していなくても、又は書き込み動作中に自身のローカルキャッシュ３０７にアクセスできなくても、対象ボリュームに対する共有更新カウンタは増加させられる。したがって、書き込みによるボリューム更新の結果、その他ノード３０３のローカルキャッシュ３０７（さらに、書き込みを実行するノード３０３が（現在アクセス不能な）ローカルキャッシュ３０７を有する場合、該ローカルキャッシュ３０７）が現在古いことを示すようになる。図５Ａ〜Ｄの実施形態を参照に説明したように、図６Ａ〜Ｄの実施形態では、データボリューム以外の領域サイズで共有記憶装置３０５を処理可能である。
【００５９】
共有記憶装置３０５が、ＳＡＮファブリック（あるいは例えばＦＣ又はｉＳＣＳＩ）のような構造の形態で実装可能であることが理解されよう。その他実施形態では、共有記憶装置３０５はノード間メッセージで実装される。ローカルキャッシュ３０７は対応するノード３０３に対し物理的にローカルであるように図示されているが、いくつかの実施形態では、ローカルキャッシュ３０７は物理的にではなく、論理的にローカルであってもよいことも理解されよう。例えば、ローカルキャッシュ３０７は共有記憶装置３０５上で実装可能だが、例えばキャッシング機能３１１を介して、あるノード３０３に対して論理的にローカルであってもよい。通常、「共有」や「ローカル」とは機能を説明する語であり、適宜論理的及び／又は物理的資源を使用して、ストレージ、キャッシュなどのオブジェクトが共有又はローカルに実装されてもよい。
【００６０】
最後に、上述の通りキャッシュコヒーレンシーマネージャ１０１はキャッシング機能３１１と協働で動作する及び／又はキャッシング機能３１１の性能を向上させるが、キャッシュコヒーレンシーマネージャ１０１はキャッシング機能３１１で使用される具体的なキャッシングアルゴリズムは認識不能である。
【００６１】
該技術分野に精通している者には明らかなように、本発明は、本発明の精神又は本質的特質から逸脱することなく、他の特定の形態で具現化され得る。同様に、部分、モジュール、エージェント、マネージャ、構成要素、機能、手順、処置、階層、特徴、属性、方法論、データ構造及びその他の態様の具体的な名称及び区分は、必須のものでも重要なものでもなく、本発明又はその特徴を実装するメカニズムは、別の名称、区分、及び／又は形式を有し得る。説明のための前述の記載は、特定の実施形態を参照して説明されている。しかしながら、上述の例示の考察は、包括的であること、又は開示される正確な形態に限定することを意図するものではない。上述の教示を考慮して、多くの修正及び変更が可能である。実施形態は、関連する原理及びその実際的な適用を最適に説明するよう選択及び記述されており、これにより、他の当業者が、想到される特定の使用に好適であり得るような様々な改変を行うか行わないかにかかわらず、様々な実施形態を最適に利用できる。
【図１】
0006301445.tif 000002
【図２】
0006301445.tif 000003
【図３】
0006301445.tif 000004
【図４】
0006301445.tif 000005
【図５Ａ】
0006301445.tif 000006
【図５Ｂ】
0006301445.tif 000007
【図５Ｃ】
0006301445.tif 000008
【図５Ｄ】
0006301445.tif 000009
【図６Ａ】
0006301445.tif 000010
【図６Ｂ】
0006301445.tif 000011
【図６Ｃ】
0006301445.tif 000012
【図６Ｄ】
0006301445.tif 000013