Chinaunix首页 | 论坛 | 博客
  • 博客访问: 1237667
  • 博文数量: 220
  • 博客积分: 0
  • 博客等级: 民兵
  • 技术积分: 1769
  • 用 户 组: 普通用户
  • 注册时间: 2015-03-13 16:19
个人简介

努力, 努力, 再努力

文章分类

全部博文(220)

文章存档

2018年(8)

2017年(46)

2016年(75)

2015年(92)

我的朋友

分类: Java

2015-08-06 20:27:26

EHCache 集群部署成功案例

---基于自动成员发现

目录

EHCache 集群部署成功案例... 1

一.环境描述... 1

二.需求描述... 1

1.  架构图... 1

2.  需求说明,场景描述... 2

3.  解决方法... 2

三. 案例... 3

1.  EHCache RMI集群方式部署仅需要修改ehcache.xml 3

2.  TOMCAT-1ehcache.xml内容如下:... 3

3.大致步骤说明... 4

(1) 配置 cacheManagerPeerProviderFactory. 4

(2) 配置cacheManagerPeerListenerFactory. 4

4. 注意事项... 4

四. 相关资源... 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

二.  需求描述

1.  架构图

   


Tomcat-1, Tomcat-2, Tomcat-3 是运行apache-tomcat-7.0.57WEB服务器,为了减轻数据库的压力,增加用户访问页面动态内容的速度,每台WEB服务器都使用了EHCACHE缓存。用户访问的响应内容并不是磁盘上或者数据库中的真实数据,而是在内存中的缓存。

2.  需求说明,场景描述

假设网站域名为

 

用户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 是进程中的缓存系统,一旦将应用部署在集群环境中,每一个节点维护各自的缓存数据,当某个节点对缓存数据进行更新,这些更新的数据无法在其它节点中共享, 这不仅会降低节点运行的效率,而且会导致数据不同步的情况发生。例如某个网站采用 AB 两个节点作为集群部署,当 A 节点的缓存更新后,而 B 节点缓存尚未更新就可能出现用户在浏览页面的时候,一会是更新后的数据,一会是尚未更新的数据,尽管我们也可以通过 Session Sticky 技术来将用户锁定在某个节点上,但对于一些交互性比较强或者是非 Web 方式的系统来说,Session Sticky 显然不太适合

*** EHCache RMI集群部署方式适合小规模集群,节点个数< 5

3.  解决方法

过多的理论不在此赘述:

通过EHCache RMI集群方式部署,采用自动成员发现,实现缓存同步。

示意图:


 

三.  案例

1.    EHCache RMI集群方式部署仅需要修改ehcache.xml

2.    TOMCAT-1ehcache.xml内容如下:

<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.大致步骤说明

(1) 配置 cacheManagerPeerProviderFactory

(2) 配置cacheManagerPeerListenerFactory

(3) 配置cacheEventListenerFactory

(4) 配置bootstrapCacheLoaderFactory

4. 注意事项

                   (1) ehcache.xmltimeToLive=1

                   (2) ehcache.xmlhostName=不能写localhost, 要写主机名或者IP

(3) 每个缓存名下都要写 cacheEventListenerFactory

           (4) 修改完各个节点的配置后,重启tomcat服务:杀掉相关的java进程

              执行startup.sh
            (5) XML元素的属性之间可以用空格分开,也可以用回车隔开

 

       **** 按照上述方法,可以使用ehcache缓存集群顺利同步 ***

 

四.  相关资源


EHCache 分布式缓存/缓存集群,

style="font-size:12.0pt;line-height:240%;">

理论上的讲解可以参见上面的链接,不在本文赘述

  

好友推荐,应当细看:

http://blog.csdn.net/xh199110/article/details/38474061

此文对hostName=localhost有说明

官网链接:

http://ehcache.org/generated/2.9.0/html/ehc-all/#page/Ehcache_Documentation_Set%2Fto-rmi_replicated_caching_using_rmi.html%23wwconnect_header

 

注意: 官网中的示例是:hostName=localhost 但我测试,应该写ip地址

使用localhost主机名缓存不同步。

 

 

 

 

 

 


阅读(1697) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~