ヘッダーをスキップ
Oracle® Fusion Middleware Oracle Coherenceでのアプリケーションの開発
12c (12.1.2)
B70741-02
  ドキュメント・ライブラリへ移動
ライブラリ
製品リストへ移動
製品
目次へ移動
目次

前
 
次
 

12 Coherenceキャッシュの概要

この章では、Coherenceで提供される基本的なキャッシュのタイプの概要を説明し、それぞれのタイプを比較します。

この章には次の項が含まれます:

12.1 分散キャッシュ

分散キャッシュ(パーティション・キャッシュ)は、線形スケーラビリティを持つクラスタ化されたフォルト・トレラント・キャッシュです。データはクラスタ内のすべてのコンピュータ間でパーティション化されます。フォルト・トレランスを実現するため、パーティション・キャッシュでは、各データをクラスタ内の1つ以上の個別コンピュータに保持するように構成できます。分散キャッシュはCoherenceで最もよく使用されるキャッシュです。

Coherenceでは、分散キャッシュは、複数のクラスタ・ノードに分散(パーティション化)されたデータのコレクションとして定義されるため、クラスタ内の1つのノードがキャッシュ内の各データに対応し、その対応がクラスタ・ノード間で分散(ロード・バランシング)されます。

分散キャッシュには、いくつかの重要な留意事項があります。

分散キャッシュにアクセスするには、ネットワークを介して別のクラスタ・ノードに接続する必要があります。他の条件がすべて同じであるとして、n個のクラスタ・ノードがある場合は、(n-1)/nの操作がネットワークを経由することになります。

図12-1 パーティション・キャッシュ環境でのget操作

図12-1の説明が続きます
「図12-1 パーティション・キャッシュ環境でのget操作」の説明

各データは1つのクラスタ・ノードのみで管理されるため、ネットワーク経由のアクセスは単一ホップ操作になります。このタイプのアクセスは、Point-to-Point通信を使用できるためスイッチド・ネットワークを最大限に活用できます。そのため、スケーラビリティに非常に優れています。

同様に、キャッシュの更新操作にも同じ単一ホップのPoint-to-Point方式を使用できます。この方法を使用すると、すべてのクラスタ・ノードにキャッシュの更新をプッシュする必要があるという、レプリケート・キャッシュの既知の制限に対応できます。

図12-2 パーティション・キャッシュ環境でのput操作

図12-2の説明が続きます
「図12-2 パーティション・キャッシュ環境でのput操作」の説明

上の図では、データはプライマリ・クラスタ・ノードとバックアップ・クラスタ・ノードに送信されています。これはフェイルオーバーを目的としたものであり、この場合のバックアップ回数は1になります(デフォルトのバックアップ回数は1に設定されています)。(デフォルトのバックアップ回数の設定は1です)。キャッシュのデータがクリティカルでない(ディスクから再ロードできる)場合は、バックアップ回数をゼロに設定できますが、クラスタ・ノードに障害が発生したときに分散キャッシュ・データの一部が失われる可能性があります。キャッシュがきわめてクリティカルな場合は、バックアップ回数を2などの高い値に設定します。バックアップ回数は、キャッシュ・エントリの追加、変更、削除などによるキャッシュの変更パフォーマンスにのみ影響します。

キャッシュに対する変更は、すべてのバックアップが変更を受信したことを認識するまで完了したとは見なされません。分散キャッシュのバックアップを使用する場合は、キャッシュの変更パフォーマンスが若干低下します。しかし、クラスタ・ノードに予期しない障害が発生しても、データの整合性が維持されることが保証され、データが損失することはありません。

分散キャッシュのフェイルオーバーでは、バックアップ・データがプライマリ記憶域に昇格されます。あるクラスタ・ノードに障害が発生すると、残りのすべてのクラスタ・ノードは、障害が発生したクラスタ・ノードがプライマリ記憶域で停止時に管理していたデータを各自のバックアップ記憶域から判別します。これらのデータの管理は、それをバックアップ記憶域に保持していたクラスタ・ノードに引き継がれます。

図12-3 パーティション・キャッシュ環境のフェイルオーバー

図12-3の説明が続きます
「図12-3 パーティション・キャッシュ環境のフェイルオーバー」の説明

バックアップに複数のレベルがある場合は、最初のバックアップでデータがバックアップされ、2番目以降のバックアップでは前のバックアップがバックアップされるようになります。レプリケート・キャッシュ・サービスとまったく同じように、サーバーの障害時にはロック情報も維持されます。ただし、唯一の例外として、障害が発生したクラスタ・ノードのロックは自動的に解除されます。

分散キャッシュ・サービスでは、データを格納するクラスタ・ノードと格納しないクラスタ・ノードを構成できます。この設定はローカル記憶域の有効化と呼ばれています。ローカル記憶域を有効化するオプションで構成されたクラスタ・ノードは、分散キャッシュのキャッシュ記憶域とバックアップ記憶域を提供します。この設定にかかわらず、位置の透過性により、データはすべてのクラスタ・ノードでまったく同じように表示できます。

図12-4 パーティション・キャッシュ環境のローカル記憶域

図12-4の説明が続きます
「図12-4 パーティション・キャッシュ環境のローカル記憶域」の説明

「ローカル記憶域の有効化」オプションには、次のような利点があります。

12.2 レプリケート・キャッシュ

レプリケート・キャッシュはクラスタ化されたフォルト・トレラントなキャッシュで、そこではデータがクラスタ内のすべてのメンバーに完全にレプリケートされます。このキャッシュは、読取りに対して線形パフォーマンスのスケーラビリティで最速の読取りパフォーマンスを示しますが、書込みのスケーラビリティは優れていません(クラスタ内のすべてのメンバーに書込み処理が必要なため)。データがすべてのサーバーにレプリケートされるので、サーバーを追加しても、キャッシュの合計容量は増加しません。

信頼性のあるレプリケート・キャッシュを構築するには、いくつかの課題があります。その1つは、どのような方法で高いスケーラビリティとパフォーマンスを得るかということです。キャッシュに対する更新はすべてのクラスタ・ノードに送信する必要があり、たとえ同じデータへの更新が同時に複数行われても、最終的にはすべてのクラスタ・ノードのデータが一致している必要があります。また、あるクラスタ・ノードがロックをリクエストしても、すべてのクラスタ・ノードがそれに従う必要はありません。そうしないと、スケーラビリティがきわめて低くなります。さらに、クラスタ・ノードに障害が発生した場合は、すべてのデータおよびロック情報が安全に維持される必要があります。Coherenceは、このようなシナリオをすべて透過的に処理し、Javaアプリケーションに対応する最もスケーラブルで可用性の高いレプリケート・キャッシュの実装を実現します。

レプリケート・キャッシュはアクセス速度が非常に高速です。データがそれぞれのクラスタ・ノードにレプリケートされるため、待機せずにデータを利用できます。これをゼロ待機時間アクセスといい、アプリケーションに最高速のデータ・アクセスが要求される状況においては、まさに理想的な機能です。各クラスタ・ノード(JVM)は、自身のメモリーからデータにアクセスします。

図12-5 レプリケート・キャッシュ環境でのget操作

図12-5の説明が続きます
「図12-5 レプリケート・キャッシュ環境でのget操作」の説明

一方で、レプリケートされたキャッシュの更新には、他のすべてのクラスタ・ノードに新しいバージョンのデータをプッシュすることが要求されます。

図12-6 レプリケート・キャッシュ環境でのput操作

図12-6の説明が続きます
「図12-6 レプリケート・キャッシュ環境でのput操作」の説明

Coherenceにおけるレプリケート・キャッシュ・サービスの実装は、読取り専用操作をすべてローカルで実行する、並行処理制御操作に使用する他のクラスタ・ノードは最大1つとする、他のすべてのクラスタ・ノードとの通信が要求される操作を更新にのみ制限する、という方法で行われます。これにより、スケーラビリティに優れたパフォーマンスが実現し、すべてのCoherenceサービスと同様に、レプリケート・キャッシュ・サービスからも透過的で完全なフェイルオーバーおよびフェイルバックが提供されます。

次のレプリケート・キャッシュ・サービスの制限事項にも十分な留意が必要です。

12.3 オプティミスティック・キャッシュ

オプティミスティック・キャッシュは、レプリケート・キャッシュと同様のクラスタ化されたキャッシュの実装になりますが、並行処理制御は行われません。この実装では、レプリケート・キャッシュより、書込みのスループットが高くなります。また、MRU/MFUベースのキャッシュなどのキャッシュ・データの格納に、代替の基礎となるストアを使用できます。ただし、2つのクラスタ・メンバーが基礎となるローカル・ストアの削除やパージを個別に実行すると、それぞれのメンバーが保持しているストア・コンテンツが異なる可能性があります。

12.4 ニア・キャッシュ

ニア・キャッシュはハイブリッドなキャッシュであり、一般に分散キャッシュまたはリモート・キャッシュとローカル・キャッシュを組み合せた役割を果たします。ニア・キャッシュでは、構成済の無効化戦略を使用してフロント・キャッシュ・エントリを無効にし、優れたパフォーマンスおよび同期化を実現します。パーティション・キャッシュによってバッキングされたニア・キャッシュでは、反復的なデータ・アクセスにおいて0ミリ秒のローカル・アクセスが可能になります。同時実行性が可能になり、整合性およびフェイルオーバーが保証されるのみでなく、レプリケーション・キャッシュとパーティション・キャッシュの長所が効率的に結合されます。

ニア・キャッシュの目的は、最後に使用した(MRU: Most Recently Used)データと最も頻繁に使用する(MFU: Most Frequently Used)データの読取りアクセスの速度を上げて、レプリケート・キャッシュの長所である最大のパフォーマンスと分散キャッシュの長所である最大のスケーラビリティの両方を最大限に実現することです。そのため、ニア・キャッシュの実装にはフロント・キャッシュとバック・キャッシュの2つのキャッシュが含まれています。これらはリードスルー/ライトスルー方式を使用することにより、互いに自動的および透過的に通信します。

フロント・キャッシュは、ローカル・キャッシュ・アクセスを提供します。高速でサイズも限られていることから、低コストといえます。バック・キャッシュは、ローカル・キャッシュが使用不能な場合に必要に応じてロードできる、集中型のキャッシュまたは複数層構成のキャッシュにすることができます。バック・キャッシュは、非常に容量が大きいという点で完璧かつ適切ですが、アクセス速度の点では割高といえます。ニア・キャッシュの使用はCoherence*Extendのみに制限されず、TCMPでも使用できます。

この設計により、ニア・キャッシュでは、最も基本的な有効期間ベースのキャッシュや無効化ベースのキャッシュから、データのバージョニングおよび整合性の保証が可能な高度なキャッシュまでの、キャッシュの整合性を様々に構成できます。その結果、ローカル・メモリー・リソースを維持するという点と、真のローカル・キャッシュのパフォーマンス上の利点を活用するという点のバランスを調整することができます。

一般的なデプロイメントでは、フロント・キャッシュにローカル・キャッシュが使用されます。ローカル・キャッシュは、スレッド・セーフである、並行性が高い、サイズ制限がある、自動的に失効する、データがオブジェクト形式で保存される、などの点から妥当な選択といえます。バック・キャッシュには、リモートのパーティション・キャッシュが使用されます。

次の図は、ニア・キャッシュのデータ・フローを示しています。クライアントがオブジェクトDをグリッドに書き込むと、このオブジェクトは、ローカルJVM内のローカル・キャッシュ、およびそれをバックアップする(バックアップ・コピーを含む)パーティション・キャッシュに配置されます。クライアントがオブジェクトをリクエストすると、オブジェクトはローカル、すなわちフロント・キャッシュからオブジェクト形式で待機することなく取得されます。

図12-7 ニア・キャッシュ環境でのput操作

図12-7の説明が続きます
「図12-7 ニア・キャッシュ環境でのput操作」の説明

フロント・キャッシュで失効しているオブジェクトまたは無効化されているオブジェクトがクライアントからリクエストされた場合、Coherenceは自動的にパーティション・キャッシュからそのオブジェクトを取得します。フロント・キャッシュは、クライアントに配信される前にオブジェクトが保存される場所です。

図12-8 ニア・キャッシュ環境でのget操作

図12-8の説明が続きます
「図12-8 ニア・キャッシュ環境でのget操作」の説明

12.5 ローカル・キャッシュ

クラスタ・サービスではありませんが、ローカル・キャッシュ実装は、各種クラスタ・キャッシュ・サービスと組み合せてニア・キャッシュの一部として使用されることがよくあります。


注意:

ニア・キャッシュの一部としてローカル・キャッシュを使用するアプリケーションでは、キーが不変である必要があります。可変であるキーが原因で、スレッドがハングしたり、デッドロックが発生する可能性があります。

特に、ニア・キャッシュの実装ではキー・オブジェクトを使用してローカル・キャッシュ(フロント・マップ)の同期化を行うため、キーが内部マップにキャッシュされることもあります。そのため、get()メソッドに渡されたキー・オブジェクトはロックして使用されます。スレッドがロックを維持している間にキー・オブジェクトが変更された場合、スレッドはキーのロック解除に失敗する可能性があります。さらに、ロックされているキー・オブジェクトの解放を待機している他のスレッドが存在したり、変更されたキーのロックを取得しようとするスレッドが存在した場合、スレッドがハングしてデッドロックが発生する可能性があります。キーの使用の詳細は、java.util.Map APIのドキュメントを参照してください。


ローカル・キャッシュは、特定のクラスタ・ノード内に完全に含まれます。ローカル・キャッシュの特に興味深い属性について、次に示します。

Coherenceのニア・キャッシュ・テクノロジの一部として機能したり、モジュールで構成されたバッキング・マップ・アーキテクチャで使用されるなど、ローカル・キャッシュはクラスタ・キャッシュ・サービスにおいて重要な役割を果たします。

12.6 リモート・キャッシュ

リモート・キャッシュは、Coherence*Extendクライアントによりアクセスされるアウトオブプロセス・キャッシュを表します。キャッシュ・リクエストはすべてCoherenceプロキシに送られ、そこでキャッシュ(レプリケーション、オプティミスティック、パーティション)に委任されます。リモート・キャッシュの使用方法の詳細は、『Oracle Coherenceリモート・クライアントの開発』を参照してください。

12.7 キャッシュ・タイプのサマリー

数値に関する用語

表12-1 キャッシュのタイプと特性のサマリー


レプリケート・キャッシュ オプティミスティック・キャッシュ パーティション・キャッシュ ニア・キャッシュ(パーティション・キャッシュによるバッキング) ローカル・キャッシュ(非クラスタ)

トポロジ

レプリケーション

レプリケーション

パーティション・キャッシュ

ローカル・キャッシュ+パーティション・キャッシュ

ローカル・キャッシュ

読取りパフォーマンス

即時5

即時5

ローカル・キャッシュ: 即時5 リモート: ネットワーク速度 1

ローカル・キャッシュ: 即時5 リモート: ネットワーク速度 1

即時5

フォルト・トレランス性

非常に高い

非常に高い

構成可能 4 (0から非常に高い)

構成可能 4 (0から非常に高い)

0

書込みパフォーマンス

高速 2

高速 2

非常に高速 3

非常に高速 3

即時5

メモリー使用量(JVM別)

DataSize

DataSize

DataSize/JVMs x Redundancy

LocalCache + [DataSize / JVMs]

DataSize

整合性

完全な整合性あり

完全な整合性あり

完全な整合性あり

完全な整合性あり6

N/A

メモリー使用量(合計)

JVMs x DataSize

JVMs x DataSize

Redundancy x DataSize

[Redundancy x DataSize] + [JVMs x LocalCache]

N/A

ロック機能

完全に機能

なし

完全に機能

完全に機能

完全に機能

一般的な用途

メタデータ

N/A(ニア・キャッシュを参照)

読取り/書込みキャッシュ

アクセス・アフィニティのある読取り頻度の高いキャッシュ

ローカル・データ


注意:

  1. 概算では、100Mbイーサネットの場合、ネットワークで100KBのオブジェクトを1つ読み取るのに最大20ミリ秒を通常必要とします。ギガビット・イーサネットでは一般に、1KBの複数オブジェクトのネットワークでの読取りが1ミリ秒未満になります。

  2. JVMの数に応じて、UDPマルチキャスト操作、またはいくつかのUDPユニキャスト操作が必要です。

  3. 冗長性のレベルに応じて、いくつかのUDPユニキャスト操作が必要です。

  4. パーティション・キャッシュでは、バックアップのレベルを必要な数だけ構成することも、まったく構成しないこともできます。ほとんどのインストールでは、バックアップ・コピーを1つ使用します(合計で2コピー)。

  5. ごくわずかな処理を必要とする(一般にはミリ秒未満のパフォーマンス)、ローカルのCPUまたはメモリーのパフォーマンスによって制限されます。

  6. リスナーベースのニア・キャッシュには整合性が確保されています。失効ベースのニア・キャッシュでは、非トランザクション読取りについては部分的な整合性が確保され、トランザクション・アクセスについては整合性が確保されています。