使用JGroups TCP实现EHCache的集群

最近一个项目采用ehcache作为缓存技术,因为负载需要,使用两台服务器做负载均衡,所以需要做缓存的集群处理,综合各方面因素,决定使用JGroups的方式,接下来是连续3天的折磨,今天终于搞定,把这个过程总结出来分享,希望类似需要的朋友别再重蹈我的曲折。

1、首先不要一上来就搜索如何配置,要把基础环境搭好,这也是网上90%的类似文章中不涉及的。像 http://blog.csdn.net/kindy1022/article/details/6681299 这样的文章才真正有用,但仍然不够详细。接下来是详细内容:

(1)我使用nginx + tomcat7 + jdk7;

(2)ehcache版本为2.10,建议大家直接使用ehcache-2.10.jar而不要用ehcache-core-xxx.jar+ehcache-terracotta-xxx.jar;

(3)jgroups使用最新的jgroups-3.6.4FINAL.jar,这个容易被忽略,网上很少有人提到,因为有ehcahce-jgroupsreplication-xxx.jar,所以会以为这就够了,关键启动还不报错。另外不必降版本;

(4)ehcache-jgroupsreplication-1.7.jar(就是查看这里面的源码时,发现JGroupsCacheReceiver需要jgroups jar包的支持)

2、再说配置文件,这是网上传讹最多的,一是不讲版本,直接贴配置,二是配置本身也有错误。建议大家去jgroups和ehcache的官网上看相关的配置,注意是相关的配置,ehcache官网上给出的jgroups也不完整,也没标版本。这里一定要注意。建议大家将jgroups的配置使用单独的配置文件,这样更合理一些。

(1)echache配置文件ehcache.xml,首先增加peerprovider

<cacheManagerPeerProviderFactory class="net.sf.ehcache.distribution.jgroups.JGroupsCacheManagerPeerProviderFactory"
        properties="jgroups_tcp.xml" />

(2)为每一个需要同步的cache配置listener,当然asynchronousReplicationIntervalMillis不是必须的,默认是1000,bootstrapCacheLoaderFactory也可以不要

<cache name="mybatis_common" overflowToDisk="true" eternal="true"  
        timeToIdleSeconds="300" timeToLiveSeconds="600" maxElementsInMemory="10000"  
        maxElementsOnDisk="100" diskPersistent="true" diskExpiryThreadIntervalSeconds="300"  
        diskSpoolBufferSizeMB="50" memoryStoreEvictionPolicy="LRU">
          <cacheEventListenerFactory class="net.sf.ehcache.distribution.jgroups.JGroupsCacheReplicatorFactory"
              properties="replicateAsynchronously=true, replicatePuts=true,
              replicateUpdates=true, replicateUpdatesViaCopy=false, replicateRemovals=true",
              asynchronousReplicationIntervalMillis=500/>
          <bootstrapCacheLoaderFactory class="net.sf.ehcache.distribution.jgroups.JGroupsBootstrapCacheLoaderFactory" 
              properties="bootstrapAsynchronously=false"/>
</cache>

(3)jgroups_tcp.xml如下:参考 http://www.jgroups.org/manual/index.html#_tcp

<TCP bind_port="7800" />
<TCPPING timeout="3000"
         initial_hosts="app1_IP[7800],app2_IP[7800]"
         port_range="10"
         num_initial_members="3"/>
<VERIFY_SUSPECT timeout="1500"  />
<pbcast.NAKACK2 use_mcast_xmit="false" gc_lag="100"
               retransmit_timeout="300,600,1200,2400,4800"
               discard_delivered_msgs="true"/>
<pbcast.STABLE stability_delay="1000" desired_avg_gossip="50000"
               max_bytes="400000"/>
<pbcast.GMS print_local_addr="true" join_timeout="3000" shun="false"
               view_bundling="true"/>

到底是bind_port还是start_port,官网给出的是bind_port。

3、一般情况下,这样就足够了,但是事有例外,如果仍然不行,看看下面的可能性:

(1)集群的服务器能不能连通,有没有防火墙之类

(2)每台服务器是不是有完整的、唯一的hostname,如果你的hostname有中文,建议改成英文,如果你恰好使用mac电脑开发测试,那它的电脑名和hostname是两回事,默认的hostname是localhost,这个不行,要改成正经的。

(3)现在的eclipse可以反编译class文件,并且可以在class上打断点debug,在ehcahce-jgroupsreplication-xxx.jar里找到listener类和JGroupsCacheReceiver,加上断点,看发送和接收消息是否都被触发。

Good Luck。

时间: 2025-01-13 10:45:58

使用JGroups TCP实现EHCache的集群的相关文章

EhCache 分布式缓存/缓存集群

开发环境: System:Windows JavaEE Server:tomcat5.0.2.8.tomcat6 JavaSDK: jdk6+ IDE:eclipse.MyEclipse 6.6 开发依赖库: JDK6. JavaEE5.ehcache-core-2.5.2.jar Email:[email protected] Blog:http://blog.csdn.net/IBM_hoojo http://hoojo.cnblogs.com/ http://hoojo.blogjava.

EhCache RMI 分布式缓存/缓存集群

EhCache 系统简介 EhCache 是一个纯 Java 的进程内缓存框架,具有快速.精干等特点. EhCache 的主要特性有: 快速.精干 简单: 多种缓存策略: 缓存数据有两级:内存和磁盘,因此无需担心容量问题: 缓存数据会在虚拟机重启的过程中写入磁盘: 可以通过 RMI.可插入 API 等方式进行分布式缓存: 具有缓存和缓存管理器的侦听接口: 支持多缓存管理器实例,以及一个实例的多个缓存区域: 提供 Hibernate 的缓存实现: EhCache集群解决的问题:  由 于 EhCa

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

EhCache 缓存系统简介 EhCache 是一个纯 Java 的进程内缓存框架,具有快速.精干等特点,是 Hibernate 中默认的 CacheProvider. 下图是 EhCache 在应用程序中的位置: 图 1. EhCache 应用架构图 EhCache 的主要特性有: 快速: 简单: 多种缓存策略: 缓存数据有两级:内存和磁盘,因此无需担心容量问题: 缓存数据会在虚拟机重启的过程中写入磁盘: 可以通过 RMI.可插入 API 等方式进行分布式缓存: 具有缓存和缓存管理器的侦听接口

集群环境中使用 EhCache 缓存系统

EhCache 缓存系统 : 本章节将要介绍EhCache及EhCache实现分布式的一些解决方案.并针对于这些解决性方案做一个实现,后续将出一个提供项目模块化.服务化.插件化的VieMall快速开发平台,同时集成Dubbo服务化.Zookeeper(分布式调度/分布式配置管理服务).Redis分布式缓存技术及Memcache/Ehcache 二级缓存切换.FastDFS分布式文件系统.ActiveMQ异步消息中间件.Solr搜索.Nginx负载均衡等分布式及读写分离.如果有时间可以深入分表分库

EhCache缓存在集群环境中同步问题

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

使用lvs搭建负载均衡集群

有时候,单台服务器的性能可能无法应付大规模的服务请求,且其一旦出现故障,就会造成用户在一段时间内无法访问.通过集群技术,可以在付出较低成本的情况下获得在性能.可靠性.灵活性方面的相对较高的收益. 集群是一组相互独立的.通过网络互联的计算机组,并以单一系统的模式加以管理,或用于分摊负载,或用于增强可靠性,或用于高速计算. 一.集群类型 LB:Load Balancing,负载均衡集群,用于消除单点故障,当一个节点出现故障而无法正常提供服务时,自动.快速地切换到另外的节点上去:常见软件或实现方式有l

Redis源码解析:25集群(一)握手、心跳消息以及下线检测

Redis集群是Redis提供的分布式数据库方案,通过分片来进行数据共享,并提供复制和故障转移功能. 一:初始化 1:数据结构 在源码中,通过server.cluster记录整个集群当前的状态,比如集群中的所有节点:集群目前的状态,比如是上线还是下线:集群当前的纪元等等.该属性是一个clusterState类型的结构体.该结构体的定义如下: typedef struct clusterState { clusterNode *myself; /* This node */ ... int sta

rabbitmq集群搭建方法简介(测试机linux centos)【转】

本文将介绍四台机器搭建rabbitmq集群: rabbitmq IP和主机名(每台机器已安装RabbitMQ 3.5.6, Erlang 18.1) 192.168.87.73 localhost73 192.168.87.74 localhost74 192.168.87.75 localhost75 192.168.87.76 localhost76 将上述IP和主机名添加到hosts文件( vim /etc/hosts) Rabbitmq的集群是依赖于erlang的集群来工作的,所以必须先

linux命令:linux集群系列之一---LVS类型(未完)

集群系统的主要优点: 高可扩展性: 高可用性:集群中的一个节点失效,它的任务可以传递给其他节点.可以有效防止单点失效. 高性能:负载平衡集群允许系统同时接入更多的用户. 高性价比:可以采用廉价的符合工业标准的硬件构造高性能的系统 集群类型: 最常见的三种集群类型: 负载均衡集群:LB (load balancing) 硬件负载均衡(Hardware): 1.F5,BIG IP 2.Citrix,Netscaler 3.A10 软件负载均衡(Software):  1.四层设备LVS 2.七层设备