【转】Coherence企业级缓存

转载:

摘要:Oracle Coherence是一个企业级的分布式集群缓存框架。具有自管理,自恢复,高可用性,高扩展性等优良特点,在电信BOSS等项目中有很大的应用价值。本文对它的特点,架构,基本使用方法,JMX管理,调优等进行简要但快捷的介绍,并对于Hibernate的集成过程进行说明,为BOSS,CMP等移动项目提供一个的参考。

关键词:分布式缓存Coherence

网上除了官方用户指南,关于Coherence的介绍文章资料很少,因此总结出此文,从原理到快速指南和基本最佳实践,希望对需要的人提供一个参考。

1Coherence概述

1.1Coherence是什么

Oracle官方网站的描述是:Coherence在可靠的、高度可伸缩的对等集群协议之上提供了复制的、分布式的(分区的)数据管理和缓存服务。Coherence不存在单点故障,当某台服务器无法操作或从网络断开时,它可以自动且透明地进行故障切换并重新分布它的集群化数据管理服务。当新服务器加入或故障服务器重启时,它会自动加入集群,Coherence会将服务切回到该服务器,透明地重新分布集群负载。Coherence包含网络级的容错特性和透明的软重启功能,以支持服务器自我修复。

----来自OracleCoherence专区

http://www.oracle.com/technology/global/cn/products/coherence/index.html

一个典型的Hibernate应用+Coherence集群如下图所示:

1.2Coherence的特点

1.2.1分布式集群缓存

Coherence是一个分布式的缓存方案,并且通过集群为应用提供强大的缓存后备支持。Coherence主要是内存缓存,即存储区域主要在内存当中。

与一般的分布式缓存方案如JBossCache,Memcache等相同,分布式缓存的价值基于网络IO性能高于DB查询的磁盘IO性能这样一个特点。

Coherence所有的设计都是基于多个(可以是非常多)的JVM,很多Coherence的测试都是使用几十甚至上百个节点来进行的。

下图展示了一个典型的WAS项目架构:WAS集群+Near型Coherence集群架构。对于大型Web2.0网站(PHP或其他),集成Coherence也是类似的。

1.2.2自管理

Coherence使用的网络协议是TCMP,是对UDP,TCP/IP的组合使用。Coherence能将启动的实例节点(Node)自动组成为集群(Cluster)。在一个局域网环境中,通过多播(Multicast)机制,第1个启动的Node能自动发现后启动的Node,第1,2个Node同样能发现之后启动的其他Node,依次类推,自动组成集群;并且也能自动检测到死亡节点。集群各节点间通过单播(Unicast)机制进行数据复制,同步及发送通知消息。

Coherence集群以统一的逻辑试图对外提供缓存的读写接口,看起来使用CoherenceClient就像在使用一个缓存一样。

1.2.3自动容错和恢复

基于自管理的特点,一个Node挂掉后,集群能自动监测到,并做好死亡节点的数据恢复机制,客户端依然能正确的读出在死亡节点上存储的数据,容错和恢复对客户端来说是透明的。

1.2.4分区缓存(PartitionedCache)

这是Coherence与众不同的地方。一般集群如:JBossCache,Websphere集群等,每个Node都有数据的完整拷贝,Node间通过复制来实现数据同步和一致性,一般来说采用全复制模式,即一份数据在各节点上都有一份拷贝。这种模式下,节点要存储了较多的数据,同步复制时比较消耗网络带宽。

而Coherence的分区缓存只将一个Node上的数据在另一节点上做1个备份,有效降低复制的消耗好时间,并节省内存总需求,只需复制模式的1/N(N为缓存节点个数)。

1.2.5线性扩展

假如你的Coherence集群已经有4个Node,当系统数据量过大引起Cache容量满员,导致缓存性能下降时,可以通过启动新的Node来扩容,改善集群的性能。

这一点也是源自分区缓存技术,集群有N个Node,每个Node只存放1/N的数据,这种设计让Coherence能够处理非常多的数据,只需要通过增加节点的数量,就可以处理更多的数据。

下图为例,当两台机器,4个存储Node不够用时,通过新增机器,新增Node实例即可自动加入集群,提升Coherence缓存性能。

线性扩展更重要体现在性能上,下图展示了,Coherence集群通过增加机器,增加Node实例使得交易耗时大幅降低,而且随着集群规模呈线性下降。

1.2.6易用性

虽然上述特点看起来似乎很复杂,但那都是Coherence自己内部的事儿。对于客户端来说,与最简单的Map 操作一样,仅仅是 put(key,value), get(key) 等。
query.setCacheable(true);   
query.setCacheRegion(HIBERNATE_QUERY_CACHE);  
query.setCacheable(true);
query.setCacheRegion(HIBERNATE_QUERY_CACHE);

3.3)启用实体L2缓存

在hbm.xml中配置节点,为VO类启用实体缓存。

Xml代码 【转】Coherence企业级缓存 【转】Coherence企业级缓存【转】Coherence企业级缓存
  1.     
  2. <class name="com.xxx.system.perm.persistent.PermVO" table="SYS_PERM">    
  3. <cache usage="nonstrict-read-write"/>  
<class name="com.xxx.system.perm.persistent.PermVO" table="SYS_PERM"> 
<cache usage="nonstrict-read-write"/>

3.4)客户端缓存配置

客户端要使用与服务端同样的缓存配置 hibernate-cache-config.xml, 否则可能无法进行存储。 本例将其复制过来,放到classpath 下的 config目录中,因此,客户端启动命令(如果是tomcat,weblogic,websphere,修改相应cmd或bat文件)中也要加java参数:
引用
-Dtangosol.coherence.cacheconfig=config/hibernate-cache-config.xml

4.启动客户端Hibernate应用程序

执行数据查询操作,观察日志,以确定数据存储到了M2的三个节点中。

4.1)Coherence客户端启动日志

引用
2008-10-14 17:56:13.609 Oracle Coherence 3.3.1/389  (thread=main, member=n/a): Loaded ...

2008-10-1417:56:13.625OracleCoherence3.3.1/389(thread=main,member=n/a):Loaded...

2008-10-1417:56:13.625OracleCoherence3.3.1/389(thread=main,member=n/a):Optional...

OracleCoherenceVersion3.3.1/389

GridEdition:Developmentmode

Copyright(c)2000-2007Oracle.Allrightsreserved.

2008-10-1417:56:15.296OracleCoherenceGE3.3.1/389(thread=Cluster,member=n/a):ServiceCluster...

2008-10-1417:56:15.515OracleCoherenceGE3.3.1/389(thread=Cluster,member=n/a):ThisMember(Id=5,...

2008-10-1417:56:15.609OracleCoherenceGE3.3.1/389(thread=Cluster,member=n/a):Member(Id=2,Ti...

2008-10-1417:56:15.609OracleCoherenceGE3.3.1/389(thread=Cluster,member=n/a):Member(Id=3,....

2008-10-14 17:56:15.703 Oracle Coherence GE 3.3.1/389  (thread=main, member=5):

4.2)观察HibernateSQL输出

记得在log4j.xml 中打开相应的日志开关:
Xml代码 【转】Coherence企业级缓存 【转】Coherence企业级缓存【转】Coherence企业级缓存
  1. <category name="org.hibernate.SQL">  
  2.         <priority value="DEBUG" />           
  3.         <appender-ref ref="CONSOLE" /> <!-- ASYNC_Hibernate_SQL -->  
  4.     </category>                     
<category name="org.hibernate.SQL">
		<priority value="DEBUG" />		
		<appender-ref ref="CONSOLE" /> <!-- ASYNC_Hibernate_SQL -->
	</category>

观察日志输出

引用

ExecuteNo.1********************

2008-10-1418:00:44,687[DEBUG](AbstractBatcher.java,346)-selectthis.PERMCODEasPERM1_15_0_,....

(No.1)resultsize:1

ExecuteNo.2********************

(No.2)resultsize:1

ExecuteNo.3********************

(No.3)resultsize:1

ExecuteNo.4********************

(No.4)resultsize:1

ExecuteNo.5********************

(No.5)result size:1

第一次执行了sql,

后面sql都未执行,并且查询结果数为1,和第一次执行sql的结果相同。表明之后从Coherence中获取了数据,缓存生效。

4.3)查看M2上的cache数据:

在M2上的节点控制台切换到 HIBERNATE_QUERY_CACHE cache下面,执行:
引用

cacheHIBERNATE_QUERY_CACHE

并执行Coherence命令

引用
list

命令查看所有已在Cache中存储的数据。 下面的日志每个 sql:开头的就是一个对Query的缓存项。

引用

Map(HIBERNATE_QUERY_CACHE):list

sql:selectmanagelogv0_.LOGIDasLOGID5_,managelogv0_.OPRTIMEas

TE5_,managelogv0_.OPRACTIONasOPRACTION5_,managelogv0_.OPRTYPEa

OGmanagelogv0_;parameters:;namedparameters:{};firstrow:0;

,285,286,287,288,321]

key1=value1

sql:selectthis.PERMCODEasPERM1_15_0_,this.MODULECODEasMO

RM5_15_0_,this.PORTNOasPORT6_15_0_from(selectt.perm_codea

t.module_codeasmoduleCode,

t.perm_nameaspermName,

t.perm_descaspermDesc,

t.port_noasportNo,

t.perm_type_codeaspermTypeCode

fromsys_permtjoinsys_role_permo

ont.perm_code=o.perm_code

whereo.role_code=?)this;parameters:;namedparameters:

sql:selectcount(*)ascol_0_0_fromSYS_MANAGELOGmanagelogv0_;p….

OK,大功告成,成功将Coherence与Hibernate集成,Hibernate通过Coherence进行实体数据,查询数据的缓存。

Coherence企业级缓存(六) JMX 管理和监控

7.1 概述

Coherence支持集群JMX管理和监控,方便在多Node环境下的统一管理。

根据Coherence官方的推荐,一般一个集群中只设置一个JMX管理服务器(MBeanServer),并且管理服务器不存储数据(设置启动参数storage_enabled=false);其他Node为受管节点,存储数据。

7.2启动参数

要为节点启用JMX管理,启动时只要加入必要的javaproperty即可。一般可以JDK5+自带的JConsole工具做管理和监控。

JMX Server:
引用
-Dtangosol.coherence.management=all -Dtangosol.coherence.management.remote=true -Dcom.sun.management.jmxremote

JMX Node:

引用
-Dtangosol.coherence.management.remote=true -Dcom.sun.management.jmxremote 

7.3JMXServer监控

通过JConsole连接CoherenceJMXServer后的界面如下图所示:

图中,

Cluster代表整个集群

Node节点下代表各节点,图中有1,2两个节点;

Cache目录代表当前集群中创建的的NamedCache,图中展示了集群中有一个分区缓存cache1,存储在节点2中。

其他还有Server,StorageManager,PointToPoint等管理项。

右侧列出了所选项目的详细属性,图中为Node2上数据存储的信息,比较有用的是

命中次数CacheHits,

失误次数CacheMisses,

缓存访问次数:TotalGets,通过CacheHits/TotalGets就可得到命中率

缓存元素上限:HighUnits等。

通过观察各节点Cache的主要指标,就可以监控Coherence的运行情况,分析缓存的利用效率。见下图例:

图显示了在JOP号码资源应用下,号码资源VO的CacheHits变化情况,命中数在逐步提高,为2800,说明缓存有效发挥了其作用;当然命中率是反映Cache利用率更为直观的指标。

7.4Node监控

通过连接不同Node,还可以监控各存储节点的内存变化等信息,为调优提供必要依据。

Coherence企业级缓存(七) 性能调优

Coherence调优是很关键的一环,特别是对大型企业级应用,海量数据型应用,它将决定Coherence集群能否将效能最大化的发挥出来。

调优通常分三步:基础调优,运行前常规调优,运行后调优

8.1基础调优

包括操作系统调优,网络调优

操作系统的一些参数,对Coherence集群的数据传输有影响。

如:非Wins系统下Socket缓冲大小,应该至少增加到2M;Windows上的Datagram大小等,这些在官方指南中有详细的说明。

网络调优主要对交换机缓冲(Switch Buffer), Path MTU 等因素,比较常见的情况是,交换机缓存如果太小,Coherence在做Node通信时会发生延迟,Node日志一般为:
引用
Experienced a 4172 ms communication delay (probable remote GC) with Member(Id=7, Timestamp=2006-10-20 12:15:47.511, Address=192.168.0.10:8089, MachineId=13838); 320 packets rescheduled, PauseRate=0.31, Threshold=512

此时就需要增加交换机缓冲大小。

8.2运行前常规调优

指根据Coherence一般经验原则和最佳实践,在应用系统运行前分析缓存数据总量大小,计算Node个数,设置NodeJVM内存等。

缓存数据总量大小(DataSize,M):根据应用规模,数据量规模,业务频度,预先估计应该纳入缓存的数据量的大小(总字节数)。对大型系统来说,可能是1G–xG。

计算节点个数:分区和Near缓存每节点只承担M/N的数据量,Coherence的原则是,尽量多节点,而不要将Node的内存设置过大,避免GC时间过长,一般不要超过1G;因此,得到估计的数据总量大小M后,就可以估计需要配置的节点数,假设JVMmx为512M,则N=M/512,并据此推测需要的物理机器的数量。

JVM内存:Coherence默认为64M,每节点最大不要超过1G。并且最小和最大值设置为相同。当然可以根据项目情况,设置为384m,128m等。

例如:
引用
java -server -Xms1024m -Xmx1024m  

  GC 参数:一般应用Coherence的多为大型系统,多CPU;且缓存数据变化可能比较频繁。

引用
因此生产环境最好采用 并发的GC策略,

GC收集器个数设置为CPU个数;

适当加大新生代的内存大小。

8.3运行后调优

系统上线后,在运行过程中,可能会出现性能不如预期的情况,或者不定期出现缓慢情况。除了对JVM垃圾回收问题进行分析,还可以对应用进行分析,对缓存配置进行优化。

JVM 垃圾回收问题:节点GC时,会导致Node间的传输暂停,需要重传,引起集群性能下降。可可以通过Node的日志观察到,类似于:
引用
Experienced a 4172 ms communication delay (probable remote GC)

除了之前的优化交换机缓冲,还要考虑垃圾回收引起此问题的具体原因,可以通过打开垃圾回收日志进行观察,这通常可能会定位到程序代码的算法等问题。

引用
"-verbose:gc" or "-Xloggc:"

应用分析:

如果为了简便,在Coherence配置中使用 * 配置NamedCache的存储属性,那么意味着,所有NamedCache或者说一部分Cache 使用了相同的设置,如元素个数,超时时间,清除策略,前端缓存大小等。
Xml代码 【转】Coherence企业级缓存 【转】Coherence企业级缓存【转】Coherence企业级缓存
<cache-mapping>
      <!—Hiberante Entity cache configuration -->
      <cache-name>*</cache-name> <!— 类似配置如:near-*, com.xxx.crm.customer.* -->
      <scheme-name>hibernate-near</scheme-name>
      <init-params>
        <init-param> <!-- 后端entry个数限制 -->
          <param-name>back-size-limit</param-name>   <param-value>1000</param-value>
        </init-param>
        
        <init-param> <!-- 后端超时时间 30m -->
          <param-name>back-expiry</param-name>   <param-value>30m</param-value>
        </init-param>
      </init-params>
</cache-mapping>

但不同业务功能其数据量大小,查询频率,查询条件的多样性,数据修改的频率都是不同的,如果配置相同,则Cache机制在不同业务上体现的性能是不同的,应该区别对待,例如:

1)数据字典修改频率极低,可以只采用localcache,超时时间设置长一些,例如12h。

2)鉴权操作频率很高,因此要求高性能。鉴权数据中权限点修改频率低,但角色授权数据修改频率略高,但比一般业务也低很多,可以将frontcache设置大一些,或者只采用local访问。

3)在Hibernate中,低频修改数据缓存配置为nonstrict-read-write类型;只读数据采用read-only型。

4)至于业务数据,情况比较复杂。

例如:手机号码表,数据量极大,并且服务于BOSS大部分业务,并且手机号码的用户资料变更较少,因此缓存可以设置大些,超时时间设置长些。而类似的渠道数据,数据量略小一些,HighUnits可设置稍小一些。

而对于一些修改频繁,或新增频繁的数据,超时时间(ExpiryDelay)应当设置小一些。

此类分析应该跟踪生产环境的运行情况,业务频率,修改操作频率等,进行调整优化,并跟踪调优后的结果。

9.结束

OracleCoherence具有一般缓存框架的极不一样的强大特性,自管理,分区缓存,线性扩展等使得它能有效提升应用,特别是大型企业级应用的性能。Coherence也是一个网格计算方案,其线性扩展也体现了“另类”的系统架构,能发挥出强大的功能。

Coherence企业级缓存(一)特点

Coherence企业级缓存(二)QuickStart和编程

Coherence企业级缓存(三)四种缓存类型

Coherence企业级缓存(四)数据管理模式

Coherence企业级缓存(五)与Hibernate集成(1)

Coherence企业级缓存(五)与Hibernate集成(2)

Coherence企业级缓存(六)JMX管理和监控

Coherence企业级缓存(七) 性能调优

参考资料:

1.Oracle.CoherenceUser-guide.htm

2.http://www.oracle.com/technology/global/cn/products/coherence/index.html

3.iniubloghttp://iniu.net/iwork/2008/02/oracle-coherence.html

相关推荐