ehcache 集群使用 rmi方式 有图有真想
ehcache 有几种方式集群,rmi,jgroup还有jms;这里讲一下ehcache的使用
ehcache 使用rmi方式复制缓存是可取的,原因例如以下:
1、rmi是java 默认的远程机制
2、能够调优tcp选项
3、Elements由于要存到磁盘,所以肯定是早已序列化。所以不须要借助xml格式化什么的
4、通过配置能够通过防火墙
rmi方式集群交互图:
Ehcache的rmi方式是一种点对点的协议。因此它会产生非常多局域网的内部通信。当然Ehcache会通过一种异步批处复制理机制类解决
假设要配置ehcache 须要配置一下元素
PeerProvider
CacheManagerPeerListener
配置Provider,这里有两种方式:自己主动发现、手动配置
自己主动方式:自己主动发现方式使用tcp广播来建立和包括一个广播组,它的特征是最小配置和对成员组的自己主动加入和管理。没有那个server是有优先级的。对等点每一秒中向广播组发送心跳,假设一个对等点在五秒钟内没发送过来,则此对等点将会被删除,假设有新的,则会被加入集群
cacheManagerPeerProviderFactory
的properties有下面配置:
peerDiscovery=automatic
multicastGroupAddress=230.0.0.1
multicastGroupPort=40001
timeToLive=0-255
hostName=hostname
peerDiscovery 方式:atutomatic 为自己主动 ;mulicastGroupAddress 广播组地址:230.0.0.1;mulicastGroupPort 广播组port:40001;timeToLive是指搜索范围:0是同一台server。1是同一个子网。32是指同一网站,64是指同一块地域。128是同一块大陆。还有个256,我就不说了;hostName:主机名或者ip,用来接受或者发送信息的接口
在我这次试验中详细例如以下:
<cacheManagerPeerProviderFactory class="net.sf.ehcache.distribution.RMICacheManagerPeerProviderFactory" properties="peerDiscovery=automatic, multicastGroupAddress=230.0.0.1, multicastGroupPort=4446, timeToLive=32,hostName=192.168.1.101" />
当然另一种方式就是手动配置。贴上样例,但不作叙述了
server1
<cacheManagerPeerProviderFactory class="net.sf.ehcache.distribution.RMICacheManagerPeerProviderFactory" properties="peerDiscovery=manual, rmiUrls=//server2:40001/sampleCache11|//server2:40001/sampleCache12"/>server2
<cacheManagerPeerProviderFactory class="net.sf.ehcache.distribution.RMICacheManagerPeerProviderFactory" properties="peerDiscovery=manual, rmiUrls=//server1:40001/sampleCache11|//server1:40001/sampleCache12"/>
将方式配好之后须要配置listener才会实用,接下来讲讲:Listener
Listener是用来监听从集群发送过来的信息
Listenner有两个属性:class和propertis
class 一个完整的工厂类名
properties 都好切割的对facotory实用的属性
此次实验详细配置例如以下:
<cacheManagerPeerListenerFactory class="net.sf.ehcache.distribution.RMICacheManagerPeerListenerFactory" properties="hostName=192.168.1.101, port=40001, socketTimeoutMillis=2000" />hostName指的是本机,这里注意假设使用的localhost,则仅仅会对本机有效。请使用子网内的ip地址或者主机名,port端口 40001,socketTimeoutMillis是指socket子模块的超时时间。默认是2000ms。注意port两台主机能够同样能够不同。最好同样,个人建议
然后配置缓存的复制 Replicators:
本机配置例如以下:
<cache name="myCache" maxEntriesLocalHeap="10" eternal="false" timeToIdleSeconds="10000" timeToLiveSeconds="10000" overflowToDisk="false"> <cacheEventListenerFactory class="net.sf.ehcache.distribution.RMICacheReplicatorFactory" properties="replicateAsynchronously=true, replicatePuts=true, replicateUpdates=true, replicateUpdatesViaCopy=false, replicateRemovals=true,asynchronousReplicationIntervalMillis=1000" /> <bootstrapCacheLoaderFactory class="net.sf.ehcache.distribution.RMIBootstrapCacheLoaderFactory"/> </cache>name为cache制定名字,maxEntriesLocalHeap:内存中可驻留最大Element数量。timeToLiveSeconds 生存周期 10000s;overflowToDisk:当内存不足。是否启用磁盘:这里为false。给myCache价格监听。然后是异步方式。在put。update,copy,remove操作是否复制。然后同步时间1s。bootstrapCacheLoaderFactory 工厂是指启动是指一启动就同步数据
下面是完整的配置
<?xml version="1.0" encoding="UTF-8"?> <ehcache xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:noNamespaceSchemaLocation="ehcache.xsd" updateCheck="true" monitoring="autodetect" dynamicConfig="true"> <diskStore path="D:/ehcache/diskStore" /> <cacheManagerPeerProviderFactory class="net.sf.ehcache.distribution.RMICacheManagerPeerProviderFactory" properties="peerDiscovery=automatic, multicastGroupAddress=230.0.0.1, multicastGroupPort=4446, timeToLive=32,hostName=192.168.1.101" /> <cacheManagerPeerListenerFactory class="net.sf.ehcache.distribution.RMICacheManagerPeerListenerFactory" properties="hostName=192.168.1.101, port=40001, socketTimeoutMillis=2000" /> <cache name="myCache" maxEntriesLocalHeap="10" eternal="false" timeToIdleSeconds="10000" timeToLiveSeconds="10000" overflowToDisk="false"> <cacheEventListenerFactory class="net.sf.ehcache.distribution.RMICacheReplicatorFactory" properties="replicateAsynchronously=true, replicatePuts=true, replicateUpdates=true, replicateUpdatesViaCopy=false, replicateRemovals=true,asynchronousReplicationIntervalMillis=1000" /> <bootstrapCacheLoaderFactory class="net.sf.ehcache.distribution.RMIBootstrapCacheLoaderFactory"/> </cache> </ehcache>
在server2 也就是 192.168.1.116 在hostName配置成此地址,即可了
以下是測试代码
package com.ehcache; import java.io.IOException; import java.io.InputStream; import net.sf.ehcache.Cache; import net.sf.ehcache.CacheException; import net.sf.ehcache.CacheManager; import net.sf.ehcache.Element; public class Test2 { public static void main(String[] args) throws InterruptedException { InputStream is=null; CacheManager manager=null; try { is = Test2.class.getResourceAsStream("/ehcache.xml"); manager = CacheManager.newInstance(is); } catch (CacheException e1) { try { if(is!=null){ is.close(); is=null; } } catch (IOException e) { e.printStackTrace(); } e1.printStackTrace(); } Cache cache = manager.getCache("myCache"); Element element = new Element("client3" + System.currentTimeMillis(), "client3"); cache.put(element); int i=0; while (true) { Element element2 = new Element("client-3-"+i,i); cache.put(element2); Thread.sleep(3000); System.out.println("\n"); for (Object key : cache.getKeys()) { System.out.println(key + ":" + cache.get(key).getObjectValue()); } i++; } } }
server2 的測试代码将 element那里改成client-2-就可以
然后贴上效果图一张:
client3 同步到client2的数据了
另外附叙述ehcache的淘汰缓存的算法:
LRU是Least Recently Used 最近最少使用算法;
FIFO 以一种队列方式谁先进谁先出
LFUleast frequently used即最不常常使用页置换算法
这是project文件的下载地址:点击打开链接
备注:作者水平有限。而且这些配置仅仅在局域网的实践过。假设有错误,请指出。
前面也写了而且试验了局域网内的,负载均衡,tomcat集群,session回话的分离而且双机热备。希望以后有机会让来亲自架构一下大规模的集群。