EhCache 分布式緩存/緩存集群 EhCache提供了很多種解決方案 這里只介紹一種最常用而且簡單的RMI方式分布式緩存決絕方案
Automatic Peer Discovery 自動成員發現方式
自動的發現方式用TCP廣播機制來確定和維持一個廣播組。它只需要一個簡單的配置可以自動的在組中添加和移除成員。在集群中也不需要什么優化服務器的知識,這是默認推薦的。
成員每秒向群組發送一個“心跳”。如果一個成員 5秒種都沒有發出信號它將被群組移除。如果一個新的成員發送了一個“心跳”它將被添加進群組。
任何一個用這個配置安裝了復制功能的cache都將被其他的成員發現並標識為可用狀態。
1 首先配置多播地址 Configuring the Peer Provider 【注意自動成員發現 server1與server2的配置相同】
<cacheManagerPeerProviderFactory class="net.sf.ehcache.distribution.RMICacheManagerPeerProviderFactory" properties="peerDiscovery=automatic, multicastGroupAddress=230.0.0.1, multicastGroupPort=4446, timeToLive=32"/>
2 然后配置CacheManagerPeerListener 用來接收其他集群服務器發來的消息
<cacheManagerPeerListenerFactory class="net.sf.ehcache.distribution.RMICacheManagerPeerListenerFactory" properties="hostName=192.168.1.253, port=40001, socketTimeoutMillis=2000"/>
1 hostName=192.168.1.253 這個需要在每台服務器上配置自己的真實IP
3 在需要緩存的cache上配置 Configuring Cache Replicators 啟動集群
<cache name="MyCache" maxElementsInMemory="50" eternal="true" > <cacheEventListenerFactory class="net.sf.ehcache.distribution.RMICacheReplicatorFactory"/> </cache>
Manual Peer Discovery {#Manual Peer Discovery} 手動成員發現
進行手動成員配置要知道每個監聽器的IP地址和端口。成員不能在運行時動態地添加和移除。在技術上很難使用廣播的情況下就可以手動成員發現,例如在集群的服務器之間有一個不能傳送廣播報文的路由器。你也可以用手動成員發現進行單向的數據復制,只讓server2知道server1,而server1不知道server2。
假設你在集群中有兩台服務器。你要同步sampleCache1和sampleCache2。下面是每個服務器需要的配置:
配置server1
<cacheManagerPeerProviderFactory class="net.sf.ehcache.distribution.RMICacheManagerPeerProviderFactory" properties="peerDiscovery=manual, rmiUrls=//server2:40001/MyCache|//server2:40001/其他緩存的name"/>
配置server2
<cacheManagerPeerProviderFactory class="net.sf.ehcache.distribution.RMICacheManagerPeerProviderFactory" properties="peerDiscovery=manual, rmiUrls=//server1:40001/MyCache|//server1:40001/其他緩存的name"/>
接着配置上面紅色2,3步驟就可以了。
<cacheManagerPeerListenerFactory class="net.sf.ehcache.distribution.RMICacheManagerPeerListenerFactory" properties="hostName=192.168.1.253, port=40001, socketTimeoutMillis=2000"/>
<cache name="MyCache" maxElementsInMemory="50" eternal="true" > <cacheEventListenerFactory class="net.sf.ehcache.distribution.RMICacheReplicatorFactory"/> </cache>
在使用手動發現成員配置的時候有一個特別需要注意的地方。
就是在配置 rmiUrls=//server1:40001/MyCahce|//server1:40001/其他緩存名稱" 這里的時候
需要把你希望參與到集群的緩存名稱配置進去 比如下面用到的MyCache.
CacheManagerPeerListener 上面的步驟2的配置說明
<cacheManagerPeerListenerFactory class="net.sf.ehcache.distribution.RMICacheManagerPeerListenerFactory" properties="hostName=localhost, port=40001, socketTimeoutMillis=2000"/>
properties 有效的屬性是:
hostname (可選) – 運行監聽器的服務器名稱。標明了做為集群群組的成員的地址,同時也是你想要控制的從集群中接收消息的接口。
在CacheManager初始化的時候會檢查hostname是否可用。
如果hostName不可用,CacheManager將拒絕啟動並拋出一個連接被拒絕的異常。
如果指定,hostname將使用InetAddress.getLocalHost().getHostAddress()來得到。
警告:不要將localhost配置為本地地址127.0.0.1,因為它在網絡中不可見將會導致不能從遠程服務器接收信息從而不能復制。在同一台機器上有多個CacheManager的時候,你應該只用localhost來配置。
port – 監聽器監聽的端口。
socketTimeoutMillis (可選) – Socket超時的時間。默認是2000ms。當你socket同步緩存請求地址比較遠,不是本地局域網。你可能需要把這個時間配置大些,不然很可能延時導致同步緩存失敗。
Configuring Cache Replicators 上面配置3的說明
<cache name="sampleCache2" maxEntriesLocalHeap="10" eternal="false" timeToIdleSeconds="100" timeToLiveSeconds="100" overflowToDisk="false"> <cacheEventListenerFactory class="net.sf.ehcache.distribution.RMICacheReplicatorFactory" properties="replicateAsynchronously=true, replicatePuts=true, replicateUpdates=true, replicateUpdatesViaCopy=false, replicateRemovals=true "/> </cache>
class – 使用net.sf.ehcache.distribution.RMICacheReplicatorFactory
這個工廠支持以下屬性:
replicatePuts=true | false – 當一個新元素增加到緩存中的時候是否要復制到其他的peers. 默認是true。
replicateUpdates=true | false – 當一個已經在緩存中存在的元素被覆蓋時是否要進行復制。默認是true。
replicateRemovals= true | false – 當元素移除的時候是否進行復制。默認是true。
replicateAsynchronously=true | false – 復制方式是異步的(指定為true時)還是同步的(指定為false時)。默認是true。
replicatePutsViaCopy=true | false – 當一個新增元素被拷貝到其他的cache中時是否進行復制指定為true時為復制,默認是true。
replicateUpdatesViaCopy=true | false – 當一個元素被拷貝到其他的cache中時是否進行復制(指定為true時為復制),默認是true。
你可以使用ehcache的默認行為從而減少配置的工作量,默認的行為是以異步的方式復制每件事;你可以像下面的例子一樣減少RMICacheReplicatorFactory的屬性配置:
<cache name="sampleCache4" maxEntriesLocalHeap="10" eternal="true" overflowToDisk="false" memoryStoreEvictionPolicy="LFU"> <cacheEventListenerFactory class="net.sf.ehcache.distribution.RMICacheReplicatorFactory"/> </cache>
https://www.ibm.com/developerworks/cn/java/j-lo-ehcache/ 相關文章
http://www.cnblogs.com/hoojo/archive/2012/07/19/2599534.html 相關文章
http://ehcache.org/documentation/replication/rmi-replicated-caching 官方文檔