`
rain_2372
  • 浏览: 684232 次
  • 性别: Icon_minigender_1
  • 来自: 上海
社区版块
存档分类
最新评论

深入探讨在集群环境中使用 EhCache 缓存系统

阅读更多
EhCache 缓存系统简介

EhCache 是一个纯 Java 的进程内缓存框架,具有快速、精干等特点,是 Hibernate 中默认的 CacheProvider。

下图是 EhCache 在应用程序中的位置:

图 1. EhCache 应用架构图
图 1. EhCache 应用架构图

EhCache 的主要特性有:

    快速;
    简单;
    多种缓存策略;
    缓存数据有两级:内存和磁盘,因此无需担心容量问题;
    缓存数据会在虚拟机重启的过程中写入磁盘;
    可以通过 RMI、可插入 API 等方式进行分布式缓存;
    具有缓存和缓存管理器的侦听接口;
    支持多缓存管理器实例,以及一个实例的多个缓存区域;
    提供 Hibernate 的缓存实现;
    等等 …

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

EhCache 从 1.7 版本开始,支持五种集群方案,分别是:

    Terracotta
    RMI
    JMS
    JGroups
    EhCache Server

本文主要介绍其中的三种最为常用集群方式,分别是 RMI、JGroups 以及 EhCache Server 。

回页首

RMI 集群模式

RMI 是 Java 的一种远程方法调用技术,是一种点对点的基于 Java 对象的通讯方式。EhCache 从 1.2 版本开始就支持 RMI 方式的缓存集群。在集群环境中 EhCache 所有缓存对象的键和值都必须是可序列化的,也就是必须实现 java.io.Serializable 接口,这点在其它集群方式下也是需要遵守的。

下图是 RMI 集群模式的结构图:

图 2. RMI 集群模式结构图
图 2. RMI 集群模式结构图

采用 RMI 集群模式时,集群中的每个节点都是对等关系,并不存在主节点或者从节点的概念,因此节点间必须有一个机制能够互相认识对方,必须知道其它节点的信息,包括主机地址、端口号等。EhCache 提供两种节点的发现方式:手工配置和自动发现。手工配置方式要求在每个节点中配置其它所有节点的连接信息,一旦集群中的节点发生变化时,需要对缓存进行重新配置。

由于 RMI 是 Java 中内置支持的技术,因此使用 RMI 集群模式时,无需引入其它的 Jar 包,EhCache 本身就带有支持 RMI 集群的功能。使用 RMI 集群模式需要在 ehcache.xml 配置文件中定义 cacheManagerPeerProviderFactory 节点。假设集群中有两个节点,分别对应的 RMI 绑定信息是:
节点 1 192.168.0.11 4567 /oschina_cache
节点 2 192.168.0.12 4567 /oschina_cache
节点 3 192.168.0.13 4567 /oschina_cache

那么对应的手工配置信息如下:

<cacheManagerPeerProviderFactory
    class="net.sf.ehcache.distribution.RMICacheManagerPeerProviderFactory"
    properties="hostName=localhost,
    port=4567,
    socketTimeoutMillis=2000,
    peerDiscovery=manual,
    rmiUrls=//192.168.0.12:4567/oschina_cache|//192.168.0.13:4567/oschina_cache"
/>


其它节点配置类似,只需把 rmiUrls 中的两个 IP 地址换成另外两个节点对应的 IP 地址即可。

接下来在需要进行缓存数据复制的区域(Region)上配置如下即可:

<cache name="sampleCache2"
    maxElementsInMemory="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>


具体每个参数代表的意义请参考 EhCache 的手册,此处不再详细说明。

EhCache 的 RMI 集群模式还有另外一种节点发现方式,就是通过多播( multicast )来维护集群中的所有有效节点。这也是最为简单而且灵活的方式,与手工模式不同的是,每个节点上的配置信息都相同,大大方便了节点的部署,避免人为的错漏出现。

在上述三个节点的例子中,配置如下:

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


其中需要指定节点发现模式 peerDiscovery 值为 automatic 自动;同时组播地址可以指定 D 类 IP 地址空间,范围从 224.0.1.0 到 238.255.255.255 中的任何一个地址。

回页首

JGroups 集群模式

EhCache 从 1.5. 版本开始增加了 JGroups 的分布式集群模式。与 RMI 方式相比较, JGroups 提供了一个非常灵活的协议栈、可靠的单播和多播消息传输,主要的缺点是配置复杂以及一些协议栈对第三方包的依赖。

JGroups 也提供了基于 TCP 的单播 ( Unicast ) 和基于 UDP 的多播 ( Multicast ) ,对应 RMI 的手工配置和自动发现。使用单播方式需要指定其它节点的主机地址和端口,下面是两个节点,并使用了单播方式的配置:

<cacheManagerPeerProviderFactory
    class="net.sf.ehcache.distribution.jgroups.JGroupsCacheManagerPeerProviderFactory"
    properties="connect=TCP(start_port=7800):
        TCPPING(initial_hosts=host1[7800],host2[7800];port_range=10;timeout=3000;
        num_initial_members=3;up_thread=true;down_thread=true):
        VERIFY_SUSPECT(timeout=1500;down_thread=false;up_thread=false):
        pbcast.NAKACK(down_thread=true;up_thread=true;gc_lag=100;
retransmit_timeout=3000):
        pbcast.GMS(join_timeout=5000;join_retry_timeout=2000;shun=false;
        print_local_addr=false;down_thread=true;up_thread=true)"
propertySeparator="::" />


使用多播方式配置如下:

<cacheManagerPeerProviderFactory
    class="net.sf.ehcache.distribution.jgroups.JGroupsCacheManagerPeerProviderFactory"
    properties="connect=UDP(mcast_addr=231.12.21.132;mcast_port=45566;):PING:
    MERGE2:FD_SOCK:VERIFY_SUSPECT:pbcast.NAKACK:UNICAST:pbcast.STABLE:FRAG:pbcast.GMS"
    propertySeparator="::"
/>


从上面的配置来看,JGroups 的配置要比 RMI 复杂得多,但也提供更多的微调参数,有助于提升缓存数据复制的性能。详细的 JGroups 配置参数的具体意义可参考 JGroups 的配置手册。

JGroups 方式对应缓存节点的配置信息如下:

<cache name="sampleCache2"
    maxElementsInMemory="10"
    eternal="false"
    timeToIdleSeconds="100"
    timeToLiveSeconds="100"
    overflowToDisk="false">
    <cacheEventListenerFactory
        class="net.sf.ehcache.distribution.jgroups.JGroupsCacheReplicatorFactory"
        properties="replicateAsynchronously=true, replicatePuts=true,
        replicateUpdates=true, replicateUpdatesViaCopy=false, replicateRemovals=true" />
</cache>


使用组播方式的注意事项

使用 JGroups 需要引入 JGroups 的 Jar 包以及 EhCache 对 JGroups 的封装包 ehcache-jgroupsreplication-xxx.jar 。

在一些启用了 IPv6 的电脑中,经常启动的时候报如下错误信息:

java.lang.RuntimeException: the type of the stack (IPv6) and the user supplied addresses (IPv4) don't match: /231.12.21.132.

解决的办法是增加 JVM 参数:-Djava.net.preferIPv4Stack=true。如果是 Tomcat 服务器,可在 catalina.bat 或者 catalina.sh 中增加如下环境变量即可:

SET CATALINA_OPTS=-Djava.net.preferIPv4Stack=true


经过实际测试发现,集群方式下的缓存数据都可以在 1 秒钟之内完成到其节点的复制。

回页首

EhCache Server

与前面介绍的两种集群方案不同的是, EhCache Server 是一个独立的缓存服务器,其内部使用 EhCache 做为缓存系统,可利用前面提到的两种方式进行内部集群。对外提供编程语言无关的基于 HTTP 的 RESTful 或者是 SOAP 的数据缓存操作接口。

下面是 EhCache Server 提供的对缓存数据进行操作的方法:

OPTIONS /{cache}}

获取某个缓存的可用操作的信息。

HEAD /{cache}/{element}

获取缓存中某个元素的 HTTP 头信息,例如:

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


EhCache Server 返回的信息如下:

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 Server 在应用中的架构:

图 3. EhCache Server 应用架构图
图 3. EhCache Server 应用架构图

EhCache Server 同时也提供强大的安全机制、监控功能。在数据存储方面,最大的 Ehcache 单实例在内存中可以缓存 20GB。最大的磁盘可以缓存 100GB。通过将节点整合在一起,这样缓存数据就可以跨越节点,以此获得更大的容量。将缓存 20GB 的 50 个节点整合在一起就是 1TB 了。

回页首

总结

以上我们介绍了三种 EhCache 的集群方案,除了第三种跨编程语言的方案外,EhCache 的集群对应用程序的代码编写都是透明的,程序人员无需考虑缓存数据是如何复制到其它节点上。既保持了代码的轻量级,同时又支持庞大的数据集群。EhCache 可谓是深入人心。

2009 年年中,Terracotta 宣布收购 EhCache 产品。Terracotta 公司的产品 Terracotta 是一个 JVM 级的开源群集框架,提供 HTTP Session 复制、分布式缓存、POJO 群集、跨越集群的 JVM 来实现分布式应用程序协调。最近 EhCache 主要的改进都集中在跟 Terracotta 框架的集成上,这是一个真正意义上的企业级缓存解决方案。

参考资料

学习

    查看 EhCache 更详细信息。

    查看 JGroups 更详细信息。

    更多开源项目的介绍来自 开源中国社区。

    技术书店:浏览关于这些和其他技术主题的图书。

    developerWorks Java 技术专区:数百篇关于 Java 编程各个方面的文章。

获得产品和技术

    下载 EhCache 集群的测试例子源码。

讨论

    加入 developerWorks 社区。

    查看 developerWorks 博客 的最新信息。

关于作者

刘柄成,开源中国社区(http://www.oschina.net)站长,DLOG4J 作者,十年的 Java 开发经验,热衷于开源软件的开发和应用。

原文链接: http://www.ibm.com/developerwork...
分享到:
评论

相关推荐

    集群环境中使用_EhCache_缓存系统&Ehcache配置文件的详细说明

    在集群环境中使用EhCache,可以实现数据的共享和一致性,有效减轻数据库的压力。本篇文章将深入探讨EhCache在集群环境中的应用及其配置文件的详细设置。 一、EhCache概述 EhCache是由Terracotta公司开发的内存缓存...

    ehcache项目缓存技术

    本篇文章将深入探讨Ehcache项目的缓存技术及其应用。 一、Ehcache简介 Ehcache是由Terracotta公司开发的内存缓存框架,它被广泛应用于各种Java应用程序,包括Web应用、大数据处理、数据库连接池等场景。Ehcache...

    Ehcache 简单的监控

    在`EhCache-Cluster-Tester`这个压缩包文件中,很可能是包含了一些测试用例或者示例代码,用于演示如何在集群环境中配置和监控Ehcache。通过这些示例,我们可以学习如何设置Ehcache的分布式特性,例如使用Terracotta...

    ehcache rmi集群demo

    在这个“ehcache rmi集群demo”中,我们将探讨如何将Ehcache与RMI结合,实现一个跨节点的缓存集群。 首先,Ehcache的核心概念包括缓存管理器(Cache Manager)、缓存(Cache)、缓存项(Cache Entry)等。缓存管理...

    Ehcache集群实例

    在本实例中,我们将探讨如何配置和使用Ehcache的集群功能,以及涉及的JGroups和RMI技术。 1. **Ehcache集群**:Ehcache集群使得多台服务器上的多个Ehcache实例能够共享数据。这通过分布式缓存实现,其中的缓存项...

    基于JGROUPS的ehcache的分布式缓存复制

    本文将深入探讨基于JGROUPS的Ehcache实现的分布式缓存复制,这是一种在Java应用中广泛使用的缓存解决方案。 首先,Ehcache是一个开源的、高性能的Java缓存库,提供本地缓存以及分布式缓存功能。它支持多种缓存策略...

    Ehcache集群使用

    在本文中,我们将深入探讨如何在实际项目中配置和使用 Ehcache 集群。 首先,我们需要理解 Ehcache 集群的工作原理。Ehcache 集群通过使用 Terracotta 服务器作为集群管理器,实现了跨节点的数据同步。当一个节点上...

    ehcache集群

    在本主题中,我们将深入探讨Ehcache如何通过JGroups实现集群。 ### Ehcache 集群的优势 1. **负载均衡**:Ehcache集群可以将数据分布在多个节点上,从而将负载分散到各个服务器,降低单个节点的压力。 2. **高可用...

    ehcache缓存教程

    本教程将深入探讨Ehcache的核心概念、配置以及在不同框架中的集成。 ### Ehcache简介 Ehcache由Talend公司维护,最初由Greg Luck创建,是基于内存的数据存储系统,用于临时存储数据,以减少对数据库的访问。它支持...

    memcached完全剖析ehcache memcached redis 缓存技术总结

    标题“memcached完全剖析ehcache memcached redis 缓存技术总结”表明,这篇内容将深入探讨三种流行的缓存技术——Memcached、Ehcache和Redis。缓存是IT行业中用于提高系统性能的关键技术,尤其是在大数据量和高并发...

    Ehcache缓存框架

    本文将深入探讨Ehcache的核心概念、功能、配置以及如何在实际项目中应用。 一、Ehcache简介 Ehcache是Terra Eclipse公司开发的一款本地内存缓存系统,它支持内存和磁盘存储,可以缓存对象、集合以及大块数据。...

    开源缓存包 EHCache 全接触

    本文将深入探讨 EHCache 的核心特性和使用方法。 ### 1. EHCache 架构 EHCache 由以下几个主要组件构成: - **Cache Manager(缓存管理器)**:它是整个缓存系统的中心,负责创建、管理和协调多个缓存实例。 - **...

    ehcache-terracotta代码配置

    在本篇中,我们将深入探讨如何在Java项目中配置Ehcache与Terracotta来实现这一功能。 1. Ehcache简介 Ehcache是基于内存的缓存解决方案,它提供了本地缓存、持久化存储和二级缓存等功能。通过将频繁访问的数据保存...

    ehcache-2.10.5.rar

    8. **缓存预热**:Ehcache允许预先加载一部分常用数据到缓存中,以减少系统启动后的等待时间,提升用户体验。 9. **安全性**:Ehcache 2.10.5版本可能包含了对缓存访问的安全控制,如通过认证和授权机制限制对缓存...

    37. Spring Boot集成EHCache实现缓存机制【从零开始学Spring Boot】

    在本教程中,我们将深入探讨如何使用Spring Boot集成EHCache来实现高效的缓存机制。Spring Boot简化了配置过程,使得我们可以快速地将EHCache引入到我们的应用中,从而提高应用程序的性能,减少对数据库或其他资源的...

    ehcache-clustered-3.8.1-kit.zip

    下面我们将深入探讨Ehcache集群化在3.8.1版本中的特点、功能以及如何配置和使用。 1. **Ehcache集群化原理** Ehcache使用分布式缓存策略,通过网络将缓存数据复制到多个节点上,确保数据的一致性和高可用性。在...

    EHCache使用手册

    本文将深入探讨EHCache的配置及其主要元素,帮助开发者更好地理解和使用EHCache。 首先,EHCache的配置文件通常命名为`ehcache.xml`,但也可以根据需求自定义。配置文件包含了对缓存行为的详细设定,这些设定主要由...

    ehcache和memcache性能比较

    本文将深入探讨这两种缓存技术的性能比较,以帮助开发者更好地选择适合自己的缓存策略。 首先,Ehcache是一款Java缓存框架,它主要面向Java应用程序提供服务。Ehcache具有以下特性: 1. 分布式支持:虽然Ehcache的...

Global site tag (gtag.js) - Google Analytics