Oracle coherence缓存

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

网上除了官方用户指南,关于Coherence的介绍文章资料很少,因此总结出此文,从原理到快速指南和基本最佳实践,希望对需要的人提供一个参考。 
1 Coherence 概述 
1.1 Coherence是什么 
Oracle官方网站的描述是:Coherence 在可靠的、高度可伸缩的对等集群协议之上提供了复制的、分布式的(分区的)数据管理和缓存服务。Coherence 不存在单点故障,当某台服务器无法操作或从网络断开时,它可以自动且透明地进行故障切换并重新分布它的集群化数据管理服务。当新服务器加入或故障服务器重 启时,它会自动加入集群,Coherence 会将服务切回到该服务器,透明地重新分布集群负载。Coherence 包含网络级的容错特性和透明的软重启功能,以支持服务器自我修复。 
----来自Oracle Coherence 专区 
http://www.oracle.com/technology/global/cn/products/coherence/index.html 

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

1.2 Coherence的特点 
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集群以统一的逻辑试图对外提供缓存的读写接口,看起来使用Coherence Client就像在使用一个缓存一样。 

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

1.2.4 分区缓存(Partitioned Cache) 
这是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) 等。 

Java代码   收藏代码
  1. NamedCache cache = CacheFactory.getCache("dist-cache");  
  2. cache.put(key, value);  
  3. Object value = cache.get(key);  



正是基于以上技术和特点,Coherence成为一个高可用性,高扩展性,高性能但使用非常简单的网格型(Data Grid)分布式缓存框架。 

猜你喜欢

转载自flycw.iteye.com/blog/2413545