この章では、Coherenceの概念と機能の概要について説明します。製品の機能、その使用方法および特定機能の実装方法について、簡単にまとめてあります。この章で取り上げた項目に関しては、このガイド全体をとおして詳細に説明しています。
この章には次の項が含まれます:
この項のトピックでは、Coherenceの基本概念について説明し、Coherenceを使用したデータのクラスタ化に関連するいくつかの重要な機能について説明します。
Coherenceの中核をなすのは、クラスタ化されたデータ管理の概念です。この概念を実現するには、次の目標を達成する必要があります。
完全に一貫した、単一システム・イメージ(SSI)
読取りおよび書込みアクセスのスケーラビリティ
高速で透過的なフェイルオーバーおよびフェイルバック
記憶域および処理の線形スケーラビリティ
シングル・ポイント障害(SPOF)の排除
クラスタ全体のロックおよびトランザクション
この基盤の上に、データベース・キャッシング、HTTPセッション管理、グリッド・エージェントの起動、分散問合せなど、Coherenceが提供する様々なサービスが構築されます。これらの機能を詳細に説明する前に、いくつかの基本的なCoherenceの側面について説明します。
Coherenceでは、クラスタ化されたデータを管理するために、多数のトポロジがサポートされています。これらの各トポロジには、パフォーマンスとフォルト・トレランスに関してトレードオフがあります。単一のAPIを使用することで、必要に応じてトポロジの選択をデプロイまで遅延できます。これにより、開発者はCoherenceの一貫した論理表示を確認しながら、チューニング時またはアプリケーションで変更が必要なときの柔軟性を確保できます。
Coherenceは複数のキャッシュ実装を提供しています。
ローカル・キャッシュ: 非クラスタ化キャッシング用のローカルのヒープ上のキャッシング。
レプリケート・キャッシュ: 容量の少ない、頻繁に読取りが実行されるキャッシュに最適です。
分散キャッシュ: 読取りおよび書込みアクセスに対して線形スケーラビリティが実現されます。データはノード間で自動的、動的、および透過的にパーティション化されます。分散アルゴリズムがネットワーク・トラフィックを最小化し、データが徐々に移動されることでサービスの停止が回避されます。
ニア・キャッシュ: 分散キャッシングのスケーラビリティで、ローカル・キャッシングのパフォーマンスが提供されます。パフォーマンスと同期の保証とのトレードオフに応じて、様々な戦略でのニア・キャッシュが可能です。
インプロセス・キャッシングでは、オブジェクトがローカルJVM内で管理されるため、最高レベルのrawパフォーマンスを提供します。この利点は、ローカル、レプリケーション、オプティミスティックおよびニア・キャッシュの実装により最も直接的に実現されます。
アウトオブプロセス(クライアント/サーバー)キャッシングには、専用キャッシュ・サーバーを使用するオプションが用意されています。これは、ワークロードをパーティション化する(アプリケーション・サーバーの負荷を軽減するため)場合に役立ちます。これは、パーティション・キャッシュの実装を使用して、単一のコマンドライン・オプション、またはXML構成の1行のエントリでクライアント・ノードのローカル記憶域を無効化するだけで実行できます。
(ニア・キャッシュ機能を使用した)階層キャッシングにより、アプリケーション・サーバー上のローカル・キャッシュと、より大きなキャッシュ・サーバー上のパーティション・キャッシュを組み合せて、パーティション・キャッシュのスケーラビリティとローカル・キャッシュのrawパフォーマンスを融合できます。これは、専用キャッシュ・サーバーおよび同一の場所に配置されたキャッシング(アプリケーション・サーバーJVM内に保存されたキャッシュ・パーティション)の実装に役立ちます。
キャッシュの構成と使用の詳細は、第III部「キャッシュの使用」を参照してください。
ほとんどのユーザーは、ヒープ上の記憶域を専用キャッシュ・サーバーと組み合せて使用しますが、Coherenceにはデータ記憶域用の複数のオプションがあります。
ヒープ上: 最速のオプション。ただし、JVMガベージ・コレクションの実行時間に影響する場合があります。
NIO RAM: ガベージ・コレクションには影響しません。ただし、シリアライズ/デシリアライズが必要です。
NIOディスク: NIO RAMと類似していますが、メモリー・マップ・ファイルを使用します。
ジャーナル: ジャーナル技術を使用し、ソリッド・ステート・ディスク向けに最適化されたRAM記憶域とディスク記憶域の組合せ。ジャーナルベースの記憶域では、シリアライズおよびデシリアライズが必須です。
ファイルベース: Berkeley Database JEの記憶域システムを使用します。
Coherenceの記憶域は一時的なものであり、ディスクベースの記憶域オプションではキャッシュされたデータのみを管理します。Coherenceには、永続記憶域として、CacheLoaderやCacheStoreのほか、バッキング・マップが用意されています。
詳細は、第14章「記憶域およびバッキング・マップの実装」を参照してください。
シリアライズは、多くの場合、クラスタ化されたデータ管理における最も費用を要する部分になるため、Coherenceではデータのシリアライズ/デシリアライズ用に次のオプションを用意しています。
com.tangosol.io.pof.PofSerializer
- Portable Object Format (POF)は言語に依存しないバイナリ形式です。POFは領域と時間の両面で効率を向上させるように設計された、Coherenceの推奨シリアライズ・オプションです。第20章「Portable Object Formatの使用」を参照してください。
java.io.Serializable
- 最も単純で処理の遅いオプション。
java.io.Externalizable
- 開発者が手動でシリアライズを実装する必要がありますが、パフォーマンスの大幅な向上が見込めます。java.io.Serializable
と比べて、シリアライズされたデータのサイズを2倍以上削減できます(分散キャッシュでは、一般的にデータがシリアライズされた形式でキャッシュされるため特に有用です)。最も重要なのは、CPU使用率が劇的に削減されるということです。
com.tangosol.io.ExternalizableLite
- java.io.Externalizable
と非常によく似ていますが、より効率的なI/Oストリームの実装を使用することで、パフォーマンスの向上とメモリー使用量の削減を図れます。
com.tangosol.run.xml.XmlBean
– ExternalizableLite
のデフォルトの実装です。
CoherenceのAPIでは、Coherenceのすべての機能へのアクセスを提供します。このAPIで最も頻繁に使用されるサブセットは、単純なXMLオプションを介して公開されるため、一般的な使用例での作業が最低限に抑えられます。APIを介した直接の構成と、より簡単なXML構成を組み合せても問題はありません。
Coherenceは、必要に応じてそのモジュールを置換できるように設計されています。たとえば、ローカルのバッキング・マップ(各ノードの実際の物理データ記憶域を提供する)は、必要に応じて簡単に置換できます。これは、ほとんどの場合は不要ですが、万が一のために用意されています。一般的な目安として、作業の80%は簡単に実行できますが、残りの20%(特殊なケース)の作業は多少の労力を要します。ただし、ほとんどの場合、難無く実行できるはずです。
Coherenceは、サービス・セットとして編成されます。その基礎となるのはクラスタ・サービスです。クラスタは、Coherenceインスタンス(各コンピュータの1つ以上のJVMで、JVMごとに1つのインスタンスを持つ)のセットとして定義されます。クラスタは、マルチキャスト・アドレスとポートの組合せとして定義されます。TTL(ネットワーク・パケットのTime-to-Live値、つまりネットワーク・ホップ数)の設定で、クラスタを単一コンピュータまたは単一スイッチに接続するコンピュータに制限できます。
クラスタ・サービスの下には、Coherence APIを構成する各種サービスがあります。これには、様々なキャッシング・サービス(レプリケーション、分散など)および起動サービス(クラスタの様々なノードへのエージェントのデプロイ用)が含まれます。サービスの各インスタンスには名前が付けられ、各タイプには、通常、デフォルトのサービス・インスタンスがあります。
キャッシュ・サービスには、名前付きキャッシュ(com.tangosol.net.NamedCache
)が含まれます。これはデータベース表と似ており、通常は関連するオブジェクトのセットが含まれます。
クラスタ・サービスとCoherenceによって提供されるその他のクラスタベースのサービスの詳細は、第6章「Coherenceクラスタの概要」を参照してください。
この項では、キャッシュ・インスタンスの取得と操作のためにアプリケーションによって使用される主要インタフェースであるNamedCache
APIの概要を示します。また、NamedCache
APIの使用方法についても説明します。
次のソース・コードは、NamedCache
インスタンスへの参照を返します。必要に応じて、基礎となるキャッシュ・サービスが起動されます。NamedCache
インタフェースの詳細は、Oracle Coherence Java APIリファレンスを参照してください。
import com.tangosol.net.*; ... NamedCache cache = CacheFactory.getCache("MyCache");
Coherenceでは、MyCache
の名前マッピング用のキャッシュ構成XMLファイルをスキャンします。これは、Webコンテナのweb.xml
ファイルにおけるサーブレット名のマッピングと似ています。Coherenceのキャッシュ構成ファイルには、最も単純なケースでのキャッシュ名からキャッシュ・スキームへのマッピングのセットと、キャッシュ・スキームのセットが含まれます。
デフォルトで、Coherenceは、coherence.jar
のルートにあるcoherence-cache-config.xml
ファイルを使用します。これは、JVMコマンドライン上で-Dtangosol.coherence.cacheconfig=file.xml
を使用してオーバーライドできます。この引数では、ファイル・システム・パスまたはJavaリソース・パスを参照できます。
com.tangosol.net.NamedCache
インタフェースは、他のいくつかのインタフェースを拡張します。
java.util.Map
: get()
、put()
、remove()
などの基本的なMap
メソッド。
com.tangosol.util.ObservableMap
: キャッシュ・イベントをリスニングするメソッド(第25章「マップ・イベントの使用」を参照してください)。
com.tangosol.net.cache.CacheMap
: キャッシュ内のキーのコレクションを取得(Map
として)するため、およびオブジェクトをキャッシュに入れるためのメソッド。エントリをキャッシュに入れるときに、有効期限の値を追加することもできます。
com.tangosol.util.QueryMap
: キャッシュの問合せ用のメソッド(『Oracle Coherenceでのアプリケーションの開発』の「キャッシュの問合せ」を参照してください)
com.tangosol.util.ConcurrentMap
: lock()
やunlock()
などの同時アクセス用のメソッド。
com.tangosol.util.InvocableMap
: キャッシュ・データのサーバー側の処理用メソッド
キャッシュのキーと値は、シリアライズ可能(たとえば、java.io.Serializable
)である必要があります。さらに、キャッシュ・キーはhashCode()
とequals()
メソッドの実装を提供する必要があり、これらのメソッドはクラスタ・ノード間で一貫性のある結果を返す必要があります。これは、hashCode()
およびequals()
の実装は、オブジェクトのシリアライズ可能な状態(つまり、オブジェクトの一時的でないフィールド)にのみ基づいている必要があることを示しています。String
、Integer
、Date
などのほとんどの組込みのJava型はこの要件を満たしています。一部のキャッシュの実装(特にパーティション・キャッシュ)では、等価の検証にキー・オブジェクトのシリアライズされた形式を使用します。つまり、equals()
でtrueを返すキーは、同様の方法でシリアライズされる必要があります。ほとんどの組込みのJava型はこの要件を満たしています。
NamedCache
の使用方法には、一般的には2つのアプローチがあります。
いくつかの追加機能(問合せ、並行性)を持つが、永続性バッキングは含まないjava.util.Map
のクラスタ化された実装(サイド・キャッシュ)。
外部データ・ソースへのアクセスの切離しの手段(インライン・キャッシュ)。この場合、アプリケーションではNamedCache
インタフェースを使用し、このNamedCache
によって、基礎となるデータベース(または他のリソース)が管理されます。
通常、インライン・キャッシュは、次のデータのキャッシュに使用されます。
データベース: キャッシュの最も直感的な使用方法。単純にデータベース表を(Javaオブジェクトの形式で)キャッシュします。
サービス: メインフレーム、Webサービス、サービス・ビューロ。(計算コストまたは実際のアクセス料金が発生するために)アクセスに多額の費用がかかるリソースを表すサービス。
計算: 財務上の計算、集計、およびデータ変換。インライン・キャッシュを使用すると、計算の重複を容易に回避できます。計算が完了している場合、その結果はキャッシュから容易に取得できます。任意のシリアライズ可能なオブジェクトはキャッシュ・キーとして使用できるため、計算パラメータを含むオブジェクトをキャッシュ・キーとして簡単に使用できます。
インライン・キャッシングの詳細は、第15章「データ・ソースのキャッシュ」を参照してください。
ライトバックの各オプションは次のとおりです。
ライトスルー: 外部データ・ソースに常に最新の情報が含まれるようにします。データをすぐに永続化させる必要がある場合、またはデータ・ソースを他のアプリケーションと共有する場合に使用されます。
ライトビハインド: 書込みを外部データ・ソースにキャッシュすることで、高いパフォーマンスが得られます。書込みをバッファリングしてデータ・ソースの負荷を分散させることができるだけでなく、複数の書込みを組み合せてI/Oをさらに削減できますデータがすぐにはディスクに永続化されないというデメリットがある一方で、クラスタ全体にすぐに配信されるためサーバー障害に強いというメリットがあります。さらに、データ・セット全体がキャッシュされている場合、このオプションを使用すると、アプリケーションはデータ・ソースの完全な障害を一時的に切り抜けることができます。キャッシュの読取りおよび書込みでは、データ・ソースへの同期アクセスが必要ないからです。
読取り専用のインライン・キャッシュを実装するには、com.tangosol.net.cache.CacheLoader
インタフェースで2つのメソッドを実装するだけで済みます。1つはシングルトン読取り用、もう1つはバルク読取り用です。Coherenceでは、抽象クラスcom.tangosol.net.cache.AbstractCacheLoader
が用意されています。これは、バルク・メソッドのデフォルトの実装を提供します。つまり、単一メソッドpublic Object load(Object oKey)
の実装のみが必要であることを意味します。このメソッドは、任意のキャッシュ・キーを受け入れ、適切な値オブジェクトを返します。
読取り/書込みキャッシングを実装する場合、com.tangosol.net.cache.AbstractCacheStore
を拡張する必要があります(またはインタフェースcom.tangosol.net.cache.CacheStore
を実装する)。これにより、次のメソッドが追加されます。
public void erase(Object oKey); public void eraseAll(Collection colKeys); public void store(Object oKey, Object oValue); public void storeAll(Map mapEntries);
メソッドerase()
は、外部データ・ソースから指定されたキーを削除します。メソッドstore()
は、データ・ソースの指定されたアイテムが存在すればそれを更新し、存在しなければそれを挿入します。
CacheLoader
またはCacheStore
を実装したら、coherence-cache-config.xml
ファイルを介してそれに接続できます。
Coherenceには、キャッシュされたデータを問い合せる機能が用意されています。パーティション・キャッシュを使用すると、問合せは索引付けされ、並列化されます。つまり、サーバーをパーティション・キャッシュに追加すると、スループット(1秒当たりの問合せ合計)が向上するのみでなく、待機時間が減少して問合せにかかるユーザー時間が短くなります。NamedCacheに問い合せるには、すべてのオブジェクトで共通のインタフェース(またはベース・クラス)を実装する必要があります。オブジェクトの任意のフィールドを問合せできます。索引はオプションで、パフォーマンスを向上させるために使用されます。レプリケート・キャッシュを使用する場合、問合せはローカルで実行され、索引は使用されません。詳細は、第22章「キャッシュ内のデータの問合せ」を参照してください。
索引をNamedCache
に追加するには、まず値エクストラクタが必要です(入力に値オブジェクトを受け入れ、そのオブジェクトの属性を返します)。索引はいくつでも追加できます(重複した索引は無視されます)。また、キャッシュへのデータの挿入前または挿入後に、いつでも追加できます。
問合せは、キャッシュされたデータにしか適用されないことに注意してください。そのため、データ・セット全体をキャッシュにロードしていない場合は、問合せを使用できません(部分的にロードされたセットを管理するサポートが追加されている場合を除く)。
開発者は問合せ用の追加のカスタム・フィルタを実装して、問合せの並列化を活用できます。特にパフォーマンスを重視する問合せでは、索引に対応したフィルタを実装できます。これにより、Coherenceの内部的な索引構造にアクセスできます。
Coherenceには組込みのオプティマイザがあり、最適な順序で索引を適用します。問合せの対象は限定されるため、オプティマイザは効果的かつ効率的な機能です。オプティマイザを保守する必要はありません。
Coherenceの起動サービスでは、計算エージェントをクラスタ内の様々なノードにデプロイできます。これらのエージェントは、実行スタイル(デプロイして非同期にリスニングする)または問合せスタイル(デプロイして同期的にリスニングする)で実行可能です。起動サービスの使用方法の詳細は、第24章「キャッシュ内のデータの処理」を参照してください。
起動サービスは、com.tangosol.net.InvocationService
インタフェースを通じてアクセスされ、次の2つのメソッドを含みます。
例1-1 InvocationService APIのメソッド
public void execute(Invocable task, Set setMembers, InvocationObserver observer); public Map query(Invocable task, Set setMembers);
サービスのインスタンスは、com.tangosol.net.CacheFactory
クラスから取得できます。
Coherenceでは、タスク指向処理のWorkManager
APIを実装します。
Coherenceでは2つのイベント・プログラミング・モデルがサポートされており、これらのモデルによって、アプリケーションはクラスタ操作の通知を受信して反応を返すことができます。アプリケーションは、どのコンピュータがイベントを発生させたのかに関係なく、イベントを論理概念として監視できます。イベントにより、Coherenceをアプリケーション固有のロジックで拡張する一般的な方法が提供されます。イベント・プログラミング・モデルには、次のものがあります。
ライブ・イベント - ライブ・イベント・プログラミング・モデルでは、様々なタイプのイベントを受信するように登録されたユーザー定義イベント・インターセプタを使用します。アプリケーションは、イベント・タイプに基づいて実行するアクションを決定します。マップ・イベントを使用することで使用可能な数々のイベントも、ライブ・イベントの使用でサポートされます。詳細は、第27章「ライブ・イベントの使用」を参照してください。
マップ・イベント - マップ・イベント・プログラミング・モデルでは、基礎となるマップ実装にアタッチされたユーザー定義マップ・リスナーを使用します。マップ・イベントでは、カスタマイズ可能なサーバーベースのフィルタおよび軽量イベントが提供され、これらによってネットワークのトラフィックおよび処理を最低限に抑えることができます。マップ・リスナーはJavaBeanパラダイムに従っており、システム・キャッシュ・イベント(エビクションなど)やアプリケーション・キャッシュ・イベント(get/put操作など)を区別できます。イベントの使用方法の詳細は、第25章「マップ・イベントの使用」を参照してください。
Coherenceには様々なトランザクション・オプションが用意されています。たとえば、ConcurrentMap
インタフェースおよびEntryProcessor
APIを使用した基本データの同時実行性、暗黙的ロックおよびEntryProcessor
APIを使用したパーティションレベルのトランザクション、トランザクション・フレームワークAPIを使用したアトミック・トランザクション、Coherenceリソース・アダプタを使用したXAの完全サポートなどです。詳細は、第29章「トランザクションの実行」を参照してください。
Coherence*Webは、広範なアプリケーション・サーバーをサポートする、HTTPセッション管理モジュールです。Coherence*Webの詳細は、『Oracle Coherence*WebでのHTTPセッション・マネージメントの管理』を参照してください。
Coherenceセッション管理を使用する場合、アプリケーションを変更する必要はありません。Coherence*Webでは、ニア・キャッシュを使用して、ほぼ無限のスケーラビリティを持つ完全にフォルト・トレラントなキャッシングを提供します(数百個のクラスタ・ノードで問題なく機能します)。
ほとんどのORM製品では、CoherenceがL2キャッシング・プラグインとしてサポートされています。これらのソリューションは、Coherence内のエンティティ・データをキャッシュすることで、複数サーバー上のアプリケーションによるキャッシュされたデータの共有を可能にします。詳細は、『Oracle Coherenceの統合』を参照してください。
Coherenceでは、クロス・プラットフォームのクライアントがサポートされます(TCP/IP上)。すべてのクライアントが、同じワイヤ・プロトコルを使用します(サーバーでは、クライアントのプラットフォームの違いが認識されません)。また、これらのいずれのクライアントにもサード・パーティ・コンポーネント(埋込みJVMや言語ブリッジなど)はありません。ワイヤ・プロトコルでは、すべてのクライアント・プラットフォームでイベント・フィードおよび一貫したインプロセス・キャッシングがサポートされます。Coherence*Extendを使用してリモートのC++クライアントおよび.NETクライアントをサポートするための手順の詳細は、『Oracle Coherenceリモート・クライアントの開発』を参照してください。
Coherenceでは、Java Management Extensions (JMX)を使用して管理機能とモニタリング機能を提供します。CoherenceでのJMXの使用方法の詳細は、『Oracle Coherenceのマネージメント』を参照してください。