EhCache分散キャッシュ/キャッシュクラスター



Ehcache Distributed Cache Cache Cluster



開発環境:

システム:Windows



JavaEEサーバー:tomcat5.0.2.8、tomcat6

JavaSDK:jdk6 +



IDE:Eclipse、MyEclipse 6.6

依存ライブラリを開発する:

JDK6、JavaEE5、ehcache-core-2.5.2.jar



メール:root @ xxxxx

ブログ: http://blog.csdn.net/IBM_hoojo

http://hoojo.cnblogs.com/

http://hoojo.blogjava.net

前の2つの記事では、EhcacheとSpringの使用ページ、オブジェクトキャッシングとの統合について紹介しました。 http://www.cnblogs.com/hoojo/archive/2012/07/12/2587556.html

Spring、HibernateでEhcacheキャッシュを使用する http://www.cnblogs.com/hoojo/archive/2012/07/12/2587941.html

まず、キャッシュシステムの導入

EhCacheは、高速で無駄のない機能などを備えた純粋なJavaインプロセスキャッシングフレームワークです。これは、HibernateのデフォルトのCacheProviderです。

EhCacheアプリケーションアーキテクチャ図。次の図は、アプリケーション内のEhCacheの場所です。

EhCache 主な機能は次のとおりです。

1.速くて無駄のない

2.シンプル

3.複数のキャッシュ戦略

4.キャッシュされたデータには、メモリとディスクの2つのレベルがあるため、容量の問題について心配する必要はありません。

5.キャッシュされたデータは、仮想マシンの再起動プロセス中にディスクに書き込まれます

6.分散キャッシュは、RMI、プラグ可能なAPIなどを介して実行できます。

7.キャッシュとキャッシュマネージャーを備えたリスニングインターフェイス

8.複数のキャッシュマネージャーインスタンス、およびインスタンスの複数のキャッシュ領域をサポートします

9.Hibernateのキャッシュ実装を提供します

EhCacheはプロセス内のキャッシュシステムであるため、アプリケーションがクラスター環境にデプロイされると、各ノードは独自のキャッシュデータを維持します。ノードがキャッシュされたデータを更新する場合、更新されたデータを他のノード間で共有することはできません。ノード操作の効率が低下し、データの同期がとれなくなります。たとえば、Webサイトは、クラスター展開として2つのノードAとBを採用しています。 Aノードのキャッシュが更新され、Bノードのキャッシュが更新されていない場合、ユーザーはページを閲覧でき、しばらくするとデータが更新されます。更新されていないデータ。SessionStickyテクノロジーを使用してユーザーをノードにロックすることもできますが、よりインタラクティブまたは非Webの一部のシステムでは、SessionStickyは明らかに適していません。

したがって、EhCacheのクラスターソリューションを使用する必要があります。

バージョン1.2以降、Ehcacheは分散キャッシュを使用できます。 EhCache 1.7から このバージョンは、次の5つのクラスタリングシナリオで始まります。

•テラコッタ

•RMI

•JMS

•JGroups

•EhCacheサーバー

最も一般的な3つのクラスタリング手法は、RMI、JGroups、およびEhCacheServerです。この記事では、RMIの使用方法に焦点を当てています。

分散機能はプラグインとして実装されています。 Ehcacheには、ほとんどのアプリケーションで使用できるデフォルトの分散キャッシュプラグイン実装がいくつか付属しています。他のプラグインを使用する必要がある場合は、自分で開発する必要があります。開発者は、配布パッケージとJavaDocのソースコードを確認することで実装できます。必須ではありませんが、分散キャッシングを使用する場合は、ehcahceの設計アイデアのいくつかを理解しておくと役立ちます。これは、分散キャッシュ設計のページで確認できます。次のセクションでは、分散プラグインをehcacheで機能させる方法を示します。

以下にリストされているのは、分散キャッシュのより重要な側面のいくつかです。

•クラスター環境の他のキャッシュについてどのように知っていますか?

•分散配信メッセージの形式は何ですか。

•どのような条件をコピーする必要がありますか?追加(プット)、更新(更新)または期限切れ(期限切れ)?

•レプリケーションにはどのような方法が使用されますか?同期または非同期?

分散キャッシュをインストールするには、PeerProvider、CacheManagerPeerListener、を構成する必要があります。

それらはCacheManagerに対してグローバルです。分散操作を実行する各キャッシュは、メッセージを配信するためにcacheEventListenerを追加します。

次に、クラスターキャッシュの概念とその構成

正しい要素タイプ

シリアル化可能な要素のみをコピーできます。削除などの一部の操作では、そのような操作で要素全体ではなく要素のキー値のみが必要です。要素がシリアル化できない場合でもキー値をコピーできますが、キー値はシリアル化可能です。

メンバーディスカバリー(ピアディスカバリー)

Ehcacheには、クラスタリング時のキャッシュグループの概念があります。各キャッシュは別のキャッシュのピアであり、メインキャッシュはありません。ちょうど今、私たちは質問をしました:クラスター環境の他のキャッシュをどうやって知るのですか?この問題は、ピアディスカバリーと名付けることができます。

Ehcacheは、車と同じように、手動と自動の2つのメンバー検出メカニズムを提供します。組み込みのメンバー検出メカニズムを使用するには、ehcache構成ファイルでcacheManagerPeerProviderFactory要素のクラス属性を指定します。

net.sf.ehcache.distribution.RMICacheManagerPeerProviderFactory。

メンバーの自動検出

自動検出方法は、TCPブロードキャストメカニズムを使用して、ブロードキャストグループを決定および維持します。グループにメンバーを自動的に追加およびグループから削除するには、単純な構成のみが必要です。また、クラスター内のサーバーの知識を最適化する必要はありません。これはデフォルトで推奨されています。

メンバーは毎秒「ハートビート」をグループに送信します。メンバーが5秒間信号を送信しない場合、グループによって削除されます。新しいメンバーが「ハートビート」を送信すると、グループに追加されます。

この構成でレプリケーションがインストールされているキャッシュはすべて、他のメンバーが使用できるものとして検出および識別されます。

自動メンバー検出を設定するには、次のように、ehcache構成ファイルでcacheManagerPeerProviderFactory要素のプロパティプロパティを指定する必要があります。
peerDiscovery =自動

multicastGroupAddress =マルチキャストアドレス|マルチキャストホスト名

multicastGroupPort = port

timeToLive = 0-255(timeToLiveプロパティはFAQセクションで説明されています)

クラスター内に2つのサーバーがあるとします。 sampleCache1とsampleCache2を同期する必要があります。すべての個別のサーバーには、次の構成が必要です。
server1とserver2を構成します

 
class='net.sf.ehcache.distribution.RMICacheManagerPeerProviderFactory'
properties='peerDiscovery=automatic, multicastGroupAddress=230.0.0.1,
multicastGroupPort=4446, timeToLive=32'/>

手動メンバー発見

メンバーを手動で構成するには、各リスナーのIPアドレスとポートを知っている必要があります。実行時にメンバーを動的に追加および削除することはできません。ブロードキャストを使用して手動で検出することは技術的に困難です。たとえば、クラスター内のサーバー間に、ブロードキャストメッセージを送信できないルーターがあります。手動のメンバー検出を使用して一方向のデータ複製を行うこともできます。server2のみがserver1を認識し、server1はserver2を認識しません。

手動メンバー検出を構成するには、次のように、ehcache構成ファイルでcacheManagerPeerProviderFactoryのプロパティプロパティを指定する必要があります。
peerDiscovery = manual rmiUrls = // server:port / cacheName、// server:port / cacheName .. ..
rmiUrlsは、サーバーキャッシュピアのリストで構成されます。 設定を繰り返さないように注意してください。

クラスター内に2つのサーバーがあるとします。 sampleCache1とsampleCache2を同期する必要があります。各サーバーに必要な構成は次のとおりです。
server1の構成

 
class='net.sf.ehcache.distribution.RMICacheManagerPeerProviderFactory'
properties='peerDiscovery=manual,
rmiUrls=//server2:40001/sampleCache11|//server2:40001/sampleCache12'/>

server2の構成

 
class='net.sf.ehcache.distribution.RMICacheManagerPeerProviderFactory'
properties='peerDiscovery=manual,
rmiUrls=//server1:40001/sampleCache11|//server1:40001/sampleCache12'/>

CacheManagerPeerListenerの構成

各CacheManagerPeerListenerは、メンバーから現在のCacheManagerに送信されたメッセージをリッスンします。 CacheManagerPeerListenerを構成するには、CacheManagerPeerListenerFactoryを指定する必要があります。これは、CacheManagerPeerListenerを作成するためのプラグインメカニズムとして実装されます。

cacheManagerPeerListenerFactoryのプロパティは次のとおりです。
クラス–完全なファクトリクラス名。
プロパティ–このファクトリにのみ意味のあるプロパティで、コンマで区切られています。

Ehcacheには、RMIベースの配布システムが組み込まれています。そのリスナーはRMICacheManagerPeerListenerであり、このリスナーを使用できます

構成するRMICacheManagerPeerListenerFactory。

 
class='net.sf.ehcache.distribution.RMICacheManagerPeerListenerFactory'
properties='hostName=localhost, port=40001,
socketTimeoutMillis=2000'/>

有効な属性は次のとおりです。
ホスト名(オプション)–リスナーが実行されているサーバーの名前。クラスターグループのメンバーのアドレスと、クラスターからメッセージを受信するために制御するインターフェイスを示します。

CacheManagerが初期化されると、ホスト名が使用可能かどうかがチェックされます。

hostNameが使用できない場合、CacheManagerは開始を拒否し、接続が拒否された状態で例外をスローします。

指定した場合、ホスト名はInetAddress.getLocalHost()。getHostAddress()を使用して取得されます。

警告:ローカルホストをローカルアドレス127.0.0.1として構成しないでください。ローカルホストはネットワーク上に表示されず、リモートサーバーから情報を受信できないため、コピーできません。同じマシンに複数のCacheManagerがある場合は、localhostのみを使用してそれらを構成する必要があります。

ポート–リスナーがリッスンしているポート。
socketTimeoutMillis(オプション)–ソケットがタイムアウトした時間。デフォルトは2000msです。ソケット同期キャッシュ要求アドレスが遠くにある場合、それはローカルエリアネットワークではありません。この時間を大きくするように構成する必要がある場合があります。そうしないと、遅延によって同期キャッシュが失敗する可能性があります。

CacheReplicatorsの構成

同期する各キャッシュは、CacheManagerrのメンバーにメッセージをコピーするようにキャッシュイベントリスナーを設定する必要があります。これは、各キャッシュの構成にcacheEventListenerFactory要素を追加することによって行われます。

 
 
maxElementsInMemory='10'
eternal='false'
timeToIdleSeconds='100'
timeToLiveSeconds='100'
overflowToDisk='false'>
 
properties='replicateAsynchronously=true,replicatePuts=true, replicateUpdates=true, replicateUpdatesViaCopy=false, replicateRemovals=true '/>

クラス–net.sf.ehcache.distribution.RMICacheReplicatorFactoryを使用します

このファクトリは、次のプロパティをサポートしています。
ReplicaPuts = true | false –新しい要素がキャッシュに追加されたときに新しいピアにコピーするかどうか。デフォルトはtrueです。
ReplicaUpdates = true | false –キャッシュにすでに存在する要素が上書きされたときにコピーするかどうか。デフォルトはtrueです。
ReplicaRemovals = true | false –要素が削除されたときにコピーするかどうか。デフォルトはtrueです。
ReplicaAsynchronously = true | false –コピーモードが非同期(trueとして指定されている場合)または同期(falseとして指定されている場合)のどちらであるか。デフォルトはtrueです。
ReplicaPutsViaCopy = true | false –新しい要素が別のキャッシュにコピーされるときにコピーがtrueとして指定されているかどうか。デフォルトはtrueです。
ReplicaUpdatesViaCopy = true | false –要素が別のキャッシュにコピーされたときにコピーするかどうか(trueとして指定された場合にコピー)、デフォルトはtrueです。

ehcacheのデフォルトの動作を使用して、構成作業の量を減らすことができます。デフォルトの動作では、すべてを非同期でコピーします。次の例のように、RMICacheReplicatorFactoryプロパティの構成を減らすことができます。

 
 
maxElementsInMemory='10'
eternal='true'
overflowToDisk='false'
memoryStoreEvictionPolicy='LFU'>
 

一般的な問題

Windows上のTomcat

TomcatまたはJDKにバグがあります。 Tomcatの起動時にtomcatのインストールパスにスペースがあると、RMIリスナーは起動時に失敗します。 http://archives.java.sun.com/cgi-bin/wa?A2=ind0205&L=rmi-users&P=797および http://www.ontotext.com/kim/doc/sys-doc/faq-howto-bugs/known-bugs.html

WindowsへのTomcatのインストールは、デフォルトで「プログラムファイル」フォルダにインストールされているため、この問題が頻繁に発生します。

ブロードキャストブロッキング

自動ピア検出は、ブロードキャストと密接に関連しています。ブロードキャストはルーティングによってブロックされる可能性があり、XenやVMWareなどの仮想化テクノロジーもブロードキャストをブロックできます。これらがすべて開いている場合でも、ネットワークカードの関連する構成を開くことをお勧めします。ブロードキャストが有効かどうかを判断する簡単な方法は、

つまり、ehcacheリモートデバッガーを使用して、「ハートビート」が使用可能かどうかを確認します。

放送が足りない、または遠すぎる

誤った名前のライブ時間を設定することで、ブロードキャストの移動距離を制御できます。ブロードキャストIPプロトコルを使用する場合、timeToLiveの値は、パケットが通過できるドメインまたは範囲を指します。合意は次のとおりです。

0は同じサーバーに制限されています

1は同じサブネットに制限されています

32は同じウェブサイトに限定されています

64は同じ地域に限定されています

128は同じ大陸に限定されています

255は制限されていません

翻訳者注:上記の情報の翻訳は十分に正確ではありません。読者に元の理解を見つけてください。

Java実装では、デフォルト値は1で、同じサブネットに分散されています。 timeToLiveプロパティを変更すると、伝播の範囲が制限または拡張される可能性があります。

第三に、RMIモードのキャッシュクラスター/構成分散キャッシュ

RMIは、Javaからのリモートメソッド呼び出し手法であり、ピアツーピアのJavaオブジェクトベースの通信メソッドです。 EhCacheは、バージョン1.2以降のRMIスタイルのキャッシュクラスタリングをサポートしています。クラスター環境では、EhCacheにキャッシュされたすべてのオブジェクトのキーと値がシリアル化可能である必要があります。つまり、java.io.Serializableインターフェースを実装する必要があります。これは、他のクラスタリング方法でも必要です。

次の図は、RMIクラスターモードのブロック図です。

RMIクラスターモードを使用する場合、クラスター内の各ノードはピアツーピアの関係になります。マスターノードまたはスレーブノードの概念はありません。したがって、ノード間に相互に知るメカニズムが必要です。ホストを含​​む他のノードの情報を知っている必要があります。アドレス、ポート番号など。EhCacheは、手動構成と自動検出の2種類のノードを検出する方法を提供します。手動構成では、他のすべてのノードの接続情報を各ノードで構成する必要があります。クラスタ内のノードが変更されたら、キャッシュを再構成する必要があります。

RMIはJavaに組み込まれたサポート技術であるため、RMIクラスターモードを使用するときに他のJarパッケージを導入する必要はありません。 EhCache自体には、RMIクラスターをサポートする機能があります。 RMIクラスターモードを使用するには、ehcache.xml構成ファイルでcacheManagerPeerProviderFactoryノードを定義する必要があります。

こちら側を作るための分散同期キャッシュ キャッシュ お互いを知っている キャッシュ と呼ばれる ピアディスカバリー (メンバーが見つかりました) EHCache メンバー検出を実装するには、次の2つの方法があります。

1、 手動検索

A.ehcache.xmlでPeerDiscoveryメンバー検出オブジェクトを構成します

Server1構成、ローカルhostNameの構成、ポートは400001、192.168.8.32:400002のmobileCacheと192.168.5.231:400003のmobileCacheをリッスンします。ここでのmobileCacheはキャッシュの名前であり、server2とserver3のキャッシュの構成に対応していることに注意してください。

 
 
 
 
 
 
 
  
 class='net.sf.ehcache.distribution.RMICacheManagerPeerProviderFactory' 
 properties='hostName=localhost,
 port=400001,
 socketTimeoutMillis=2000,
 peerDiscovery=manual,
 rmiUrls=//192.168.8.32:400002/mobileCache|//192.168.5.231:400003/mobileCache'
 />

cacheManagerPeerProviderFactory要素の場所がdiskStoreの下に表示されることに注意してください

また、他の2台のサーバーに構成を追加します

Server2、ローカルホストを構成し、ポートは400002で、192.168.8.9:400001 mobileCacheと192.168.5.231:400003mobileCacheを同期します

 
 
 class='net.sf.ehcache.distribution.RMICacheManagerPeerProviderFactory' 
 properties='hostName=localhost,
 port=400002,
 socketTimeoutMillis=2000,
 peerDiscovery=manual,
 rmiUrls=//192.168.8.9:400001/mobileCache|//192.168.5.231:400003/mobileCache'
/>

Server3、ローカルホストを構成し、ポートは400003で、192.168.8.9:400001 mobileCacheキャッシュと192.168.8.32:400002mobileCacheキャッシュをそれぞれ同期します。

 
 
 class='net.sf.ehcache.distribution.RMICacheManagerPeerProviderFactory' 
 properties='hostName=localhost,
 port=400003,
 socketTimeoutMillis=2000,
 peerDiscovery=manual,
 rmiUrls=//192.168.8.9:400001/mobileCache|//192.168.8.32:400002/mobileCache'
/>

これにより、3つの異なるサーバーでキャッシュを手動で検索するPeerProviderメンバーによって検出された構成が構成されます。 rmiUrlsを構成するときは、URLを繰り返すことができず、ポートとアドレスが正しいという事実に特に注意する必要があることに注意してください。

指定した場合、ホスト名はInetAddress.getLocalHost()。getHostAddress()を使用して取得されます。

警告:ローカルホストをローカルアドレス127.0.0.1として構成しないでください。ローカルホストはネットワーク上に表示されず、リモートサーバーから情報を受信できないため、コピーできません。同じマシンに複数のCacheManagerがある場合は、localhostのみを使用してそれらを構成する必要があります。

B、次の構成キャッシュとキャッシュ同期の監視では、各サーバーのehcache.xmlファイルにキャッシュ構成とcacheEventListenerFactory、cacheLoaderFactory構成を追加する必要があります

 
 
 
 maxElementsInMemory='10000'
 eternal='false'
 overflowToDisk='true'
 timeToIdleSeconds='1800'
 timeToLiveSeconds='3600'
 memoryStoreEvictionPolicy='LFU'>
 
 
  
 class='net.sf.ehcache.distribution.RMICacheReplicatorFactory'
 properties='replicateAsynchronously=true, 
 replicatePuts=true, 
 replicateUpdates=true,
 replicateUpdatesViaCopy=false, 
 replicateRemovals=true '/>
 
 

C、これで3台のサーバーの構成が完了します。以下は、server1の完全なehcache.xml構成です。

 
 
 
 
 
 
 
  
 class='net.sf.ehcache.distribution.RMICacheManagerPeerProviderFactory' 
 properties='hostName=localhost,
 port=400001,
 socketTimeoutMillis=2000,
 peerDiscovery=manual,
 rmiUrls=//192.168.8.32:400002/mobileCache|//192.168.5.231:400003/mobileCache'
 />
 
 
 
  
 maxElementsInMemory='10000'
 eternal='false'
 overflowToDisk='true'
 timeToIdleSeconds='1800'
 timeToLiveSeconds='3600'
 memoryStoreEvictionPolicy='LFU'>
 
 
  
 class='net.sf.ehcache.distribution.RMICacheReplicatorFactory'
 properties='replicateAsynchronously=true, 
 replicatePuts=true, 
 replicateUpdates=true,
 replicateUpdatesViaCopy=false, 
 replicateRemovals=true '/>
 
 
 

二、 自動検出

自動検出の構成は手動ルックアップとは少し異なり、他のすべては基本的に同じです。また、ehcache.xmlに構成を追加します。構成は次のとおりです。

 
 
 class='net.sf.ehcache.distribution.RMICacheManagerPeerProviderFactory'
 properties='peerDiscovery=automatic, multicastGroupAddress=192.168.0.1,
 multicastGroupPort=400004, timeToLive=32'
/>

その他の構成は手動ルックアップ構成と同じであるため、ここでは詳しく説明しません。 ehcacheの他のキャッシュ構成方法はここでは紹介されないので、自分で調べることができます。参照できます:

公式ドキュメント: http://www.ehcache.org/documentation/user-guide/cache-topologies#using-a-cache-server

IBMdeveloperworksのドキュメント: http://www.ibm.com/developerworks/cn/java/j-lo-ehcache/index.html

JGroupsクラスターモード

EhCacheは、バージョン1.5以降、JGroupsの分散クラスタリングモデルを追加しました。 RMIモードと比較して、JGroupsは、非常に柔軟なプロトコルスタック、信頼性の高いユニキャストおよびマルチキャストメッセージ送信を提供します。主な欠点は、構成が複雑で、一部のプロトコルスタックがサードパーティのパッケージに依存していることです。

JGroupsは、RMIの手動構成と自動検出に対応するTCPベースのユニキャスト(ユニキャスト)とUDPベースのマルチキャスト(マルチキャスト)も提供します。ユニキャストモードを使用するには、他のノードのホストアドレスとポートを指定する必要があります。以下は2つのノードであり、ユニキャスト構成を使用します。

次のようにマルチキャストモード構成を使用します。

上記の構成から、JGroups構成はRMIよりもはるかに複雑ですが、キャッシュデータレプリケーションのパフォーマンスを向上させるのに役立つより多くの微調整パラメーターも提供します。詳細なJGroups構成パラメーターの具体的な意味は、JGroupsの構成マニュアルに記載されています。

キャッシュノードに対応するJGroupsモードの構成情報は次のとおりです。

 

マルチキャストモードの使用に関する考慮事項

JGroupsは、JGroupsJarパッケージとEhCacheJGroupsパッケージehcache-jgroupsreplication-xxx.jarを導入する必要があります。

一部のIPv6対応コンピューターでは、頻繁に起動すると次のエラーメッセージが報告されます。

java.lang.RuntimeException:スタックのタイプ(IPv6)とユーザー指定のアドレス(IPv4)が一致しません:/231.12.21.132。

解決策は、JVM引数を増やすことです:-Djava.net.preferIPv4Stack = true。 Tomcatサーバーの場合は、catalina.batまたはcatalina.shに次の環境変数を追加できます。

 SET CATALINA_OPTS=-Djava.net.preferIPv4Stack=true

実際のテスト後、クラスターモードでキャッシュされたデータは、1秒以内にそのノードに複製できます。

EhCacheサーバー

上記の2つのクラスタリングソリューションとは異なり、EhCacheサーバーは独立したキャッシュサーバーであり、キャッシュシステムとしてEhCacheを使用します。内部クラスタリングには、上記の2つの方法を使用できます。言語に依存しないHTTPベースのRESTfulまたはSOAPデータキャッシュ操作インターフェイスを提供します。

EhCacheサーバーがキャッシュされたデータに対する操作を提供する方法は次のとおりです。

オプション/ {cache}}

キャッシュで使用可能な操作に関する情報を取得します。

HEAD / {cache} / {element}

キャッシュ内の要素のHTTPヘッダー情報を取得します。次に例を示します。

curl --head http://localhost:8080/ehcache/rest/sampleCache2/2

EhCacheサーバーから返される情報は次のとおりです。

HTTP/1.1 200 OK X-Powered-By: Servlet/2.5 Server: GlassFish/v3 Last-Modified: Sun, 27 Jul 2008 08:08:49 GMT ETag: '1217146129490' Content-Type: text/plain charset=iso-8859-1 Content-Length: 157 Date: Sun, 27 Jul 2008 08:17:09 GMT

GET / {cache} / {element}

キャッシュ内のデータの値を読み取ります。

PUT / {cache} / {element}

キャッシュを書き込みます。

これらの操作はHTTPプロトコルに基づいているため、Perl、PHP、Rubyなどの任意のプログラミング言語で使用できます。

次の図は、アプリケーションのEhCacheサーバーのアーキテクチャを示しています。

図3.EhCacheサーバーアプリケーションのアーキテクチャ図

EhCacheサーバーは、強力なセキュリティおよび監視機能も提供します。データストレージに関しては、最大のEhcacheシングルインスタンスは20GBをメモリにキャッシュできます。最大のディスクは100GBをキャッシュできます。ノードを統合することにより、キャッシュされたデータはノードにまたがって容量を増やすことができます。 50ノードを20GBのキャッシュで統合するのは1TBです。

総括する

上記では、EhCacheの3つのクラスタリングスキームを紹介しました。 3番目のクロスプログラミング言語スキームに加えて、EhCacheクラスターはアプリケーションコードに対して透過的であり、プログラマーはキャッシュされたデータが他のノードにどのようにコピーされるかを考慮する必要はありません。コードを軽量に保ち、巨大なデータクラスターをサポートします。 EhCacheは人々の心に深く根ざしています。

2009年半ば、TerracottaはEhCache製品の買収を発表しました。 Terracottaの製品Terracottaは、分散アプリケーションの調整のために、HTTPセッションレプリケーション、分散キャッシング、POJOクラスタリング、およびクラスター全体のJVMを提供するJVMクラスのオープンソースクラスタリングフレームワークです。最近のEhCacheの主な改善点は、真のエンタープライズクラスのキャッシングソリューションであるTerracottaフレームワークとの統合に焦点を合わせています。

================================================= = ====================

Ehcacheは、クラスタリングを実装するための3つのネットワーク接続戦略、rmi、jgroup、およびjmsを提供します。同時に、ehcacheはマルチキャスト方式でマルチキャストを実装することも、クラスターホストシーケンスを手動で指定してクラスタリングを実装することもできます。

EhcacheでサポートされているRMI、JGroups、JMSには3種類あります。 MRIとJGrpupsを使用する2つの方法があります。 Ehcacheのバージョンは1.5.0です。 ehcacheのその他の情報については、を参照してください。 http://ehcache.sourceforge.net/EhcacheUserGuide.html

jgroupsの詳細については、http://www.jgroups.org/manual/html_single/index.htmlを参照してください。

環境は2台のマシンですserver1ip:192.168.2.154、server2 ip:192.168.2.23

1. RMIモード:

Rmiウェイ構成ポイント(以下はserver1の構成です。server2はIPを交換するだけで済みます)

a。 PeerProviderを構成します。

<cacheManagerPeerProviderFactory class='net.sf.ehcache.distribution.RMICacheManagerPeerProviderFactory' properties='peerDiscovery=manual,rmiUrls=//192.168.2.23:40001/userCache|//192.168.2.23:40001/resourceCache' />

sever2のuserCacheとresourceCacheは、構成で手動で同期されます。

b。 CacheManagerPeerListenerを構成します。

<cacheManagerPeerListenerFactory class='net.sf.ehcache.distribution.RMICacheManagerPeerListenerFactory' properties='hostName=192.168.2.154, port=40001,socketTimeoutMillis=2000' />

構成では、server1はホスト40001ポートをリッスンします。

c。次の例に示すように、cacheEventListenerを各キャッシュに追加します。

<cache name='userCache' maxElementsInMemory='10000' eternal='true' overflowToDisk='true' timeToIdleSeconds='0' timeToLiveSeconds='0'diskPersistent='false' diskExpiryThreadIntervalSeconds='120'> <cacheEventListenerFactory class='net.sf.ehcache.distribution.RMICacheReplicatorFactory' properties='replicateAsynchronously=true, replicatePuts=true, replicateUpdates=true,replicateUpdatesViaCopy= false, replicateRemovals= true ' /> cache>

プロパティの説明:

必須属性:

名前:キャッシュをマークするために使用される、唯一のキャッシュの名前を設定します

maxElementsInMemory:メモリ内のオブジェクトの最大数

maxElementsOnDisk:DiskStore内のオブジェクトの最大数(0など)。制限はありません。

Eternal:要素が永続的であるかどうかを設定します。永続的な場合、タイムアウトは無視されます。

overlayToDisk:メモリ数が制限に達したときにディスクに保存するかどうか

オプションの属性:

timeToIdleSeconds:要素が期限切れになるまでのアイドル時間を設定します

timeToLiveSeconds:要素が期限切れになるまでのアクティビティ時間を設定します

diskPersistent:仮想マシンの起動時にディスクストアを永続化するかどうか。デフォルトはfalseです

diskExpiryThreadIntervalSeconds:ディスク終了スレッドを実行する時間。デフォルトは120秒です。

memoryStoreEvictionPolicy:エビクションに関するポリシー

子要素をキャッシュします:

cacheEventListenerFactory:put、remove、update、expireなどのキャッシュイベントを処理するための対応するキャッシュリスナークラスを登録します

bootstrapCacheLoaderFactory:キャッシュを初期化して自動的に設定するための対応するBootstrapCacheLoaderを指定します。

別の研究ノートを参照してください http://wozailongyou.javaeye.com/blog/230252 、クラスターの説明もあります

2. JGroupsモード:

ehcacheバージョン1.5.0でサポートされている方法で、構成は比較的単純です。主なポイントは次のとおりです。

a。 PeerProviderを構成し、tcpを使用します。例は次のとおりです。

<cacheManagerPeerProviderFactory class='net.sf.ehcache.distribution.jgroups.JGroupsCacheManagerPeerProviderFactory' properties='connect=TCP(start_port=7800): TCPPING(initial_hosts=192.168.2.154[7800],192.168.2.23[7800]port_range=10timeout=3000 num_initial_members=3up_thread=truedown_thread=true): VERIFY_SUSPECT(timeout=1500down_thread=falseup_thread=false): pbcast.NAKACK(down_thread=trueup_thread=truegc_lag=100retransmit_timeout=3000): pbcast.GMS(join_timeout=5000join_retry_timeout=2000shun=false print_local_addr=falsedown_thread=trueup_thread=true)' propertySeparator='::' />

b。キャッシュごとにcacheEventListenerを追加します。

<cache name='userCache' maxElementsInMemory='10000' eternal='true' overflowToDisk='true' timeToIdleSeconds='0' timeToLiveSeconds='0' diskPersistent='false' diskExpiryThreadIntervalSeconds='120'> <cacheEventListenerFactory class='net.sf.ehcache.distribution.jgroups.JGroupsCacheReplicatorFactory' properties='replicateAsynchronously=true, replicatePuts=true, replicateUpdates=true, replicateUpdatesViaCopy=false, replicateRemovals=true'/> cache>

JGroupモードで構成された2つのサーバーの構成ファイルは同じです。複数のサーバーがある場合は、サーバーIPをinitial_hostsに追加できます。

完全なehcache.xmlファイル:

xml version='1.0' encoding='UTF-8'?> <ehcache xmlns:xsi='http://www.w3.org/2001/XMLSchema-instance' xsi:noNamespaceSchemaLocation='http://ehcache.sf.net/ehcache.xsd'> <diskStore path='java.io.tmpdir' /> <cacheManagerPeerProviderFactory class='net.sf.ehcache.distribution.jgroups.JGroupsCacheManagerPeerProviderFactory' properties='connect=TCP(start_port=7800): TCPPING(initial_hosts=192.168.2.154[7800],192.168.2.23[7800]port_range=10timeout=3000 num_initial_members=3up_thread=truedown_thread=true): VERIFY_SUSPECT(timeout=1500down_thread=falseup_thread=false): pbcast.NAKACK(down_thread=trueup_thread=truegc_lag=100retransmit_timeout=3000): pbcast.GMS(join_timeout=5000join_retry_timeout=2000shun=false print_local_addr=falsedown_thread=trueup_thread=true)' propertySeparator='::' /> <defaultCache maxElementsInMemory='10000' eternal='true' overflowToDisk='true' timeToIdleSeconds='0' timeToLiveSeconds='0' diskPersistent='false' diskExpiryThreadIntervalSeconds='120'> <cacheEventListenerFactory class='net.sf.ehcache.distribution.jgroups.JGroupsCacheReplicatorFactory' properties='replicateAsynchronously=true, replicatePuts=true, replicateUpdates=true, replicateUpdatesViaCopy=false, replicateRemovals=true'/> defaultCache> <cache name='velcroCache' maxElementsInMemory='10000' eternal='true' overflowToDisk='true' timeToIdleSeconds='0' timeToLiveSeconds='0' diskPersistent='false' diskExpiryThreadIntervalSeconds='120'> <cacheEventListenerFactory class='net.sf.ehcache.distribution.jgroups.JGroupsCacheReplicatorFactory' properties='replicateAsynchronously=true, replicatePuts=true, replicateUpdates=true, replicateUpdatesViaCopy=false, replicateRemovals=true'/> cache> <cache name='userCache' maxElementsInMemory='10000' eternal='true' overflowToDisk='true' timeToIdleSeconds='0' timeToLiveSeconds='0' diskPersistent='false' diskExpiryThreadIntervalSeconds='120'> <cacheEventListenerFactory class='net.sf.ehcache.distribution.jgroups.JGroupsCacheReplicatorFactory' properties='replicateAsynchronously=true, replicatePuts=true, replicateUpdates=true, replicateUpdatesViaCopy=false, replicateRemovals=true'/> cache> <cache name='resourceCache' maxElementsInMemory='10000' eternal='true' overflowToDisk='true' timeToIdleSeconds='0' timeToLiveSeconds='0' diskPersistent='false' diskExpiryThreadIntervalSeconds='120'> <cacheEventListenerFactory class='net.sf.ehcache.distribution.jgroups.JGroupsCacheReplicatorFactory' properties='replicateAsynchronously=true, replicatePuts=true, replicateUpdates=true, replicateUpdatesViaCopy=false, replicateRemovals=true'/> cache> ehcache>

転載:https://www.cnblogs.com/duanxz/p/4919132.html