努力, 努力, 再努力
全部博文(220)
分类: Java
2015-08-06 20:27:26
---基于自动成员发现
目录
1. 在EHCache RMI集群方式部署仅需要修改ehcache.xml 3
2. TOMCAT-1上ehcache.xml内容如下:... 3
(1) 配置 cacheManagerPeerProviderFactory. 4
(2) 配置cacheManagerPeerListenerFactory. 4
EhCache 分布式缓存/缓存集群, style="color:windowtext;text-decoration:none;"> 5
1. 系统版本:CentOS release 6.3 (Final)
2. 内核版本:2.6.32-279.el6.x86_64
3. WEB服务器版本:apache-tomcat-7.0.57
4. Ehcache版本:ehcache-core-2.4.4.jar
Tomcat-1, Tomcat-2, Tomcat-3 是运行apache-tomcat-7.0.57的WEB服务器,为了减轻数据库的压力,增加用户访问页面动态内容的速度,每台WEB服务器都使用了EHCACHE缓存。用户访问的响应内容并不是磁盘上或者数据库中的真实数据,而是在内存中的缓存。
假设网站域名为
用户A访问, 该请求被分配到TOMCAT-2, 此时TOMCAT-2在内存中生成缓存,假设该缓存过期时间为4个小时。之后4个小时内,用户访问都是从对缓存中返回响应数据。
当用户B访问,经过负载分发器,该请求被分配到Tomcat-1服务器上,该用户在Tomcat-1服务器上发表了一篇贴子,该贴子的内容实际存储在Tomcat-3的数据库中。 此时,该贴子的标题与内容同时被存入Tomcat-1服务器的缓存中。
当用户C访问,该请求被分配到tomcat-1,因为Tomcat-1服务器缓存刚刚更新,所以用户C是可以看到用户A发表的帖子。
但用户D访问时,该请求被分配到Tomcat-2, 注意此时Tomcat-2的页面缓存已经生成,而且缓存过期时间为4个小时,用户D得到的响应数据没有用户B发现的帖子。只有过4个小时之后,缓存过期更新之后,后续用户才能看到用户B发现的帖子。
简单来说,就是TOMCAT-1服务器缓存发生了变化,但TOMCAT-2, TOMCAT-3并不知道这个变化,直到缓存过期前,都会将缓存里的数据原样返回给用户。
*** 或许我的描述冗长而难以理解,从网上接录一段以帮助理解:
由 于 EhCache 是进程中的缓存系统,一旦将应用部署在集群环境中,每一个节点维护各自的缓存数据,当某个节点对缓存数据进行更新,这些更新的数据无法在其它节点中共享,
这不仅会降低节点运行的效率,而且会导致数据不同步的情况发生。例如某个网站采用 A、B 两个节点作为集群部署,当 A 节点的缓存更新后,而 B 节点缓存尚未更新就可能出现用户在浏览页面的时候,一会是更新后的数据,一会是尚未更新的数据,尽管我们也可以通过 Session Sticky 技术来将用户锁定在某个节点上,但对于一些交互性比较强或者是非 Web 方式的系统来说,Session Sticky 显然不太适合
*** EHCache RMI集群部署方式适合小规模集群,节点个数< 5
过多的理论不在此赘述:
通过EHCache RMI集群方式部署,采用自动成员发现,实现缓存同步。
示意图:
<ehcache xsi:noNamespaceSchemaLocation="ehcache.xsd" updateCheck="true" monitoring="autodetect" xmlns:xsi="
<diskStore path="java.io.tmpdir" />
<cacheManagerPeerProviderFactory
class="net.sf.ehcache.distribution.RMICacheManagerPeerProviderFactory"
properties="peerDiscovery=automatic,multicastGroupAddress=230.0.0.1,multicastGroupPort=4446, timeToLive=1"/>
<cacheManagerPeerListenerFactory
class="net.sf.ehcache.distribution.RMICacheManagerPeerListenerFactory"
properties="hostName=192.168.1.10,port=40001,socketTimeoutMillis=2000"/>
<defaultCache maxElementsInMemory="10000" eternal="false" timeToIdleSeconds="14400" timeToLiveSeconds="14400" overflowToDisk="false" >
<cacheEventListenerFactory
class="net.sf.ehcache.distribution.RMICacheReplicatorFactory"
properties="replicateAsynchronously=true,replicatePuts=true,replicateUpdates=true,replicateUpdatesViaCopy=false,replicateRemovals=true" />
<bootstrapCacheLoaderFactory class="net.sf.ehcache.distribution.RMIBootstrapCacheLoaderFactory"/>
</defaultCache>
<cache name="contentCache" maxElementsInMemory="10000" eternal="false" timeToIdleSeconds="14400" timeToLiveSeconds="14400" overflowToDisk="false" >
<cacheEventListenerFactory
class="net.sf.ehcache.distribution.RMICacheReplicatorFactory"
properties="replicateAsynchronously=true,replicatePuts=true,replicateUpdates=true,replicateUpdatesViaCopy=false,replicateRemovals=true "/>
<bootstrapCacheLoaderFactory class="net.sf.ehcache.distribution.RMIBootstrapCacheLoaderFactory"/>
</cache>
</ehcache>
(3) 配置cacheEventListenerFactory
(4) 配置bootstrapCacheLoaderFactory
(1) 在ehcache.xml中timeToLive=1
(2) 在ehcache.xml中hostName=不能写localhost, 要写主机名或者IP
(3) 每个缓存名下都要写 cacheEventListenerFactory
(4) 修改完各个节点的配置后,重启tomcat服务:杀掉相关的java进程
执行startup.sh
(5) XML元素的属性之间可以用空格分开,也可以用回车隔开
**** 按照上述方法,可以使用ehcache缓存集群顺利同步 ***
理论上的讲解可以参见上面的链接,不在本文赘述
好友推荐,应当细看:
http://blog.csdn.net/xh199110/article/details/38474061
此文对hostName=localhost有说明
官网链接:
注意: 官网中的示例是:hostName=localhost, 但我测试,应该写ip地址
使用localhost主机名缓存不同步。