什么是ActiveCache?

前几天Oracle发布了WebLogic Server 10.3.4,这一版中加入了很多非常不错的新特性,其中之一就是ActiveCache。那么什么是ActiveCache,我们可以用它来做什么?我想就此问题谈谈自己的一点学习心得。

ActiveCache通俗来讲就是WLS+Coherence,都不是新东西,这是否有点瓶装旧酒的意思。可以这么说,但又不完全对,ActiveCache更象是WLS与Coherence之间的Glue,让WLS与Coherence结合的更加平滑与自然。从另一个角度来说,Coherence这个东东应用场景非常广,以前给客户讲Coherence时,客户总是感觉无从下手。而ActiveCache的出现明确了指明了两个应用方向:会话共享内存应用共享内存

为什么会话共享内存?

其实早在应用服务器集群横行的年代,共享内存或内存复制技术早已由应用服务器产品实现,这里面的优秀代表就是WebLogic Server。但是随着应用服务器集群的广泛使用,问题也接踵而至:

1. 应用服务器与应用内存争用

我们知道,每个JVM所能够使用的堆内存空间是有限的,尤其是在32bit的OS下,此问题尤为突出(通常不会超过1.5G),虽然64bit的OS可以改善此问题,但是由于Java垃圾回收机制的限制,为避免过长时的垃圾回收暂停,通常建议为每个JVM分配不超过2G的堆内存空间。应用服务器本身就是JVM上层的应用需要占用一定的堆内存空间,而部署其上的应用又需要使用大量的堆内存空间(例如:典型的购物车应用)。这就造成了同在一个JVM的应用服务本身与部署其上的应用都要争抢有限的堆内存空间。所以在早期的最佳实践中,建议应用开发人员尽量少用HttpSession,只在HttpSession中存放Stub或对象ID。这样做的副作用就是加剧了应用对于CPU与数据库的压力。

2. 不必要硬件资源浪费

当我们的集群处理能力(通常包括:内存、CPU、IO)不能满足业务需求时,我们可以通过增加服务器的方式水平扩展。但是很多情况下,最先到达处理上限的是内存,内存的吃紧反过来也会造成其它两个资源的消耗加剧(例如:造成大量的Page Out)。也就是说,我们对系统进行水平扩展的很大动因是为了获得更多的内存,其代价就是牺牲了大量的服务器硬件资源。

所以理想的模式是将分布内存与应用服务器分离,各司其职。如下图:

clustermem

截自其它案子,将就用吧:)

图中的架构中,上面就是应用服务器集群,物理服务器上的内存及计算资源完全由应用服务器使用。下面则是一个可线型扩展的分布式共享内存区,我们称作数据网格。当我计算能力不足时就在上面的应用服务器集群添加服务器,如果分布内存不足时,就在下面的数据网格添加服务器或服务进程提供内存。

3. 代码侵入性

虽然市面上有很多类似的数据网格的方案,但是很多方案都不可避免有代码入侵性,最好的也是只是通过JSR107进行规范。从大多数用户的视角,好的架构应该是尽可能尊重规范要求,同时最大限度的减小应用与应用容器的耦合。也就是说,我们不应该因为数据网格的引入造成大量的原有代码修改或重写。

为什么应用需要共享内存?

1. 打通异质环境

在复杂的企业计算环境中,如何让数据流动是个很大的难题,尤其是在内存中流动。例如:如何让.NET访问JVM的内存区?这方面不是普通的分布式缓存系统能够解决的。这里最常见的例子就是网游系统,网游引擎缓存了大量的用户行为或其它信息,而市场部门想对这些行为数据进行分析,这就需要打通这两套系统的内存边界。

2. O-R映射

这也是一个老生长谈的话题,在过去,如果我们想在一个基于内存的分布式缓存系统缓存一条来自于数据库的记录怎么实现?取出->实例化->缓存->访问。在这个过程中实际上是两部动作,一是OR-映射,二是是放入分布式缓存系统中管理。其实,我们需要的方式是这样的,当我需要访问某些对象实体就去访问分布式缓存,如果有,取之,没有,由分布式缓存系统去访问数据库将结果值实例化放入分布式缓存系统中。作为客户程序员无需关注底层细节。简单来讲就是将O-R解决方案(如:Toplink、Hibernate)与分布式缓存系统结合。

3. 容器注入支持

J2EE发展到现在,应用开发人员访问由应用服务器容器管理的资源时无非是通过资源注入或是查找JNDI树的方式。虽然现在有很多分布式缓存解决方案或开源项目,但是都缺乏商业应用容器的内置支持,很难通过让程序员通过标准的J2EE的方式访问分布缓存资源,这也正是ActiveCache要去解决的问题。

ActiveCache还提供了什么?

其实,上面所提到的功能点产品早已实现。但是唯一让用户不爽的是没有将Coherence与WLS原生集成,这样给用户带来了很大的管理维护成本。ActiveCache的出现着重解决的也正是这些问题,例如:我们可以通过WLS控制台管理控制Coherence节点。我们还可以借助WLST脚本生成相关配置与资源。

一句话ActiveCache是什么:WLS+Coherecne+维护、管理、监控支持。

参考

(完)

配置基于Coherence *Web的WebLogic Server会话管理2

《配置基于Coherence *Web的WebLogic Server会话管理》中介绍了如何将Coherence *Web与WebLogic Server集成,当时使用的WebLogic Server 10.3.2与Coherence 3.5,由于在那时还没引入作用域的概念,所以Coherence的作用域是全局性的,也就是说不管在WebLogic Server上部署多少应用,不管你想不想,所有的应用都必须使用Coherence接管的会话管理。这种方式带来的问题也是很明显的,首先由于全局使用一个Coherence Cluster,这就会引发会话变量的命名冲突问题。其次,是管理上无法针对不同的应用配置不同的配置选项,例如:会话模型(Session Model)。

Oracle Coherence 3.6版中解决了这个问题,此版本中引入了三种作用域:

  • 应用服务器作用域
  • EAR应用作用域
  • WAR应用作用域

实验环境准备

  • 介质版本分别为:WebLogic 10.3.3与Coherence 3.6
  • 随WebLogic Server 10.3.3一同安装的Coherence版本为3.5,我们需要下载Coherence 3.6覆盖原来的Coherence或使用其它目录存放Coherence 3.6
  • 此实验中所涉及的coherence.jar与coherence-web-spi.war都位于%COHERENCE_HOME%/lib目录下
  • 由于此版本中WebLogic Server启动时默认关闭了本地存储(local store),所以在实验前,确保%COHERENCE_HOME%/bin/

    cache-server.cmd选启动,然后再启动WebLogic Server实例。

配置应用服务器作用域集群节点

1. 将coherence.jar与%WL_HOME%/common/deployable-libraries/active-cache.jar加到WebLogic Server系统加路径中。

注:active-cache.jar一定要放在%WL_HOME%/common/deployable-libraries/目录下,并且加到类路径下。可以通过修改%DOMAIN_HOME%/bin/startWebLogic.cmd来更改类路径,此处不详述。

2. 将coherence-web-spi.war发布为共享库

3. 修改应用的weblogic.xml配置文件:

<?xml version="1.0" encoding="UTF-8"?>

    10.3.2
    CoherenceWeb
    
        coherence-web-spi
        1.0.0.0
        true
    

4. 测试方法

分别创建两个domain_a与domain_b,按照步骤1,2分布在两个domain上配置,将应用CoherenceWeb.war分别部署在两个domain中。访问domain_a上的应用CoherenceWeb,更新会话变量值,通过domain_b上的应用CoherenceWeb查看会话变量值的变化情况。如果两个应用中会话变量同步变化就算是成功了

5. 下载测试用应用包:CoherenceWeb.war

配置EAR作用域集群节点

1. 以共享库的方式部署active-cache.jar及coherence-web-spi.war

2. 将coherence.jar放入应用的lib目录下

3. 修改META-INF/weblogic-application.xml

<?xml version="1.0" encoding="UTF-8"?>

  
    	coherence-web-spi
	
	
        CoherenceCluster
	

4. 修改应用的META-INF/MANIFEST.MF

Extension-List: active-cache
active-cache-Extension-Name: active-cache
active-cache-Specification-Version: 1.0
active-cache-Implementation-Version: 1.0

6. 测试方法

分访问CoherenceTest.ear中的CoherenceWebA与CoherenceWebB,看是否访问正常。

5.  下载测试用应用包:CoherenceTest.ear

配置WAR-作用域集群节点

1. 以共享库的方式部署active-cache.jar及coherence-web-spi.war

2. 复制coherence.jar到应用的WEB-INF/lib目录下

3. 修改WEB-INF/weblogic.xml

<?xml version="1.0" encoding="UTF-8"?>

    10.3.2
    CoherenceWeb
	
    	coherence-web-spi
	
	
        CoherenceCluster
    

这里的<wls:coherence-cluster-ref>元素可选,如果有多个应用使用Coherence *Web,此项必须用以避免命名冲突

4. 修改应用的META-INF/MANIFEST.MF

Extension-List: active-cache
active-cache-Extension-Name: active-cache
active-cache-Specification-Version: 1.0
active-cache-Implementation-Version: 1.0

5.  发布应用

6. 测试方法

分别部署CoherenceWebC.war与NoCoherenceWeb.war,通过应用CoherenceWebC更改会话变量值,通过应用NoCoherenceWeb查看会话变量值的变化情况,如果NoCoherenceWeb的会话变量值不随NoCoherenceWeb会话值的变化而变化,则测试成功

7. 测试代码下载:CoherenceWebC.warNoCoherenceWeb.war

参考文档:

(完)

配置基于Coherence *Web的WebLogic Server会话管理

介质版本与补丁

WebLogic Server版本:10.3.2

Coherence版本:3.5.2/463

注:以上版本不需要打补丁,另外,WebLogic Server 10.3.1也不需要打补丁,其它版本需要打以下补丁:

 WebLogic Server 9.2 MP1WebLogic Server 10.3
WebLogic Smart UpdatePatch ID: AJQBPatch ID: 6W2W
Minimum Coherence Release Level/MetaLink Patch ID3.4.2 Patch2 – Patch ID: 84294153.4.2 Patch6 – Patch ID: 11399293

WebLogic Server 配置过程

%COHERENCE_HOME%:Coherence安装目录

%DOMAIN_HOME%:用户创建的WebLogic Domain目录

1. 创建WebLogic Domain

过程略

2. 复制%COHERENCE_HOME%\lib\coherence.jar到%DOMAIN_HOME%\lib目录下

3. 启动WebLogic Domain

4. 部署共享库,此库位于%COHERENCE_HOME%\lib\coherence-web-spi.war

Coherence配置

1. 复制%COHERENCE_HOME%\bin\cache-server.cmd并更名为web-cache-server.cmd

2. 修改web-cache-server.cmd,改为以下内容:

java -server -Xms512m -Xmx512m -cp %coherence_home%/lib/coherence.jar;%coherence_home%/lib/coherence-web-spi.war -Dtangosol.coherence.management.remote=true -Dtangosol.coherence.cacheconfig=WEB-INF/classes/session-cache-config.xml -Dtangosol.coherence.session.localstorage=true com.tangosol.net.DefaultCacheServer

3. 启动web-cache-server.cmd

测试

1. 根据上面所讲配置过程分别配置两个WebLogic Domain: domain_a, domain_b

2. 用oepe创建应用CoherenceWeb,实现三个功能:

  • a. 列出Http Session值
  • b. 更改Http Session值
  • c. 清空Http Session

详细实现参看“参考代码”

3. 修改CoherenceWeb的weblogic.xml文件

<?xml version="1.0" encoding="UTF-8"?>

    10.3.2
    CoherenceWeb
    
        coherence-web-spi
        1.0.0.0
        true
    

4. 将应用CoherenceWeb部署到domain_a与domain_b

5. 演示步骤

a. 从domain_a上更改session的值

b. 查看domain_b上的session的值是否更改

参考代码下载 :CoherenceWeb.war

参考资料

Coherence不同版本的区别

Oracle Coherence 网格版

Oracle Coherence 为集群化应用程序和应用服务器提供内存中的数据管理。Coherence 使得在集群中共享和管理数据就像在单个服务器上一样简单。

产品主要优点

  • 对企业数据进行快速、可靠的访问。
  • 使应用程序可以访问和更新 Java、.NET 以及 C++ 之间的公共数据。
  • 始终支持对桌面客户端进行实时数据网格访问和数据更新。
  • 进行优化以便在商用硬件上向外扩展。

产品主要特性

  • 查询、事务、后写式高速缓存、网格计算特性。
  • 对 Coherence TCP 和 TCMP 实时客户端都提供支持。
  • 自带的对 Coherence for .NET 的 .NET 支持。
  • 自带的对 Coherence for C++ 的 C++ 支持。
  • Oracle Coherence 网格版为异构环境(包括与桌面的实时连接和跨广域网 (WAN) 连接)提供分布式数据管理。

Oracle Coherence 企业版

Oracle Coherence 为集群化应用程序和应用服务器提供内存中的数据管理。Coherence 使得在集群中共享和管理数据就像在单个服务器上一样简单。

产品主要优点

  • 对应用程序数据进行快速、可靠的访问。
  • 支持内存中数据分析和事件处理。
  • 减少共享数据源的负载。
  • 进行优化以便在商用硬件上向外扩展。

产品主要特性

  • 通过使用筛选器对数据进行并行查询。
  • 基于网格处理事务以提高吞吐量。
  • 事件处理允许实时筛选和处理事件。
  • 后写式高速缓存可用于将写入操作与后端数据源绑定。
    • Oracle Coherence 标准版

Oracle Coherence 为集群化应用程序和应用服务器提供内存中的数据管理。Coherence 使得在集群中共享和管理数据就像在单个服务器上一样简单。

产品主要优点

  • 更快地访问经常访问的数据。
  • 减少共享数据源的负载。
  • 进行优化以便在商用硬件上向外扩展。

产品主要特性

  • 对缓存数据进行动态分区。
  • 在服务器发生故障时自动恢复。
  • Oracle Coherence 标准版为应用程序提供可伸缩的、容错的数据高速缓存。通过通读式/通写式高速缓存支持数据源集成,允许对数据源的透明访问。一致的数据高速缓存特性消除了由竞争激烈的数据、大量写入的负载和陈旧的数据引发的伸缩性问题。

    各版本产品特性总结

image

Coherence 缓存类型

分布式缓存(Distributed Cache)

支持容错与线性扩展。数据分布在所有Coherence集群节点上。为了容错的需求,每个数据片被存放在集群中的一台或多台机器上。分存式缓存也是最为常用的一种缓存。

复制式缓存(Replicated Cache)

复制式缓存也是一个集群,出于容错目的,数据被复制到集群中每个节点。这种缓存提供最快的读性能,并且具有很强的线性扩展能力。但是其写性能很差,这是由于写操作时,需要处理集群中的每个节点。由于数据被复制到每个节点,因此,添加服务器也不能提高缓存的平均容量。

就近式缓存(Near Cache)

就近式缓存其实是一种混合性缓存。它通常由一个前端分存式缓存与远端本地缓存构成。就近式缓存使用配置式的失效策略配置前段缓存实体,并且提供非常出色的性能与同步。就近式缓存后端是一个分存式缓存。提供0微秒级数据重复访问,以保证可以支持大量并发、一致性与故障转移,它有效的结合了制复式与分存式缓存的最好的特性。

本地缓存(Local Cache)

本地缓存是一种实际上是一个完全包含在一个特殊的集群节点上。它并不是一个集群服务,这种缓存常被用来与各种集群缓存服务绑定。

远程缓存Remote Cache

远程缓存被用来描述任何被Coherence *Extend客户端访问的进程外缓存。所有的缓存请求被送到Coherence代理并委托给另外缓存类型(Replicated,Optimistic, Partitioned)中的一个。

缓存类型综述

JVMs = JVMs数
DataSize = 总体缓存数据大小(不考虑数据冗余)
Redundancy = 维护的数据拷贝数
LocalCache = 本地缓存的大小cache_type

注:

  1. 作为一个粗略估计,100Mbps以太网,网络读通一个100KB大小的对象常需要〜20毫秒。千兆以太网,网络读取1KB大小的对象通常为亚毫秒级。
  2. 需要UDP多波或少量UDP 单波操作,这取决于JVM数量
  3. 需要少量UDP单波操作,这取决于冗余程度。
  4. 分存式缓存可以根据需要被配置为多级备份、或没有备份。多数情况使用一个备份,即总共有两个数据副本。
  5. 受限于本地CPU /内存性能,忽略不计的处理要求(典型为亚毫秒性能)。
  6. 基于监听器的Near Cache具有连贯一致性;基于过期的Near Cache在非事务性读时是非连贯一致性的,在事务访问时是连贯一致性的。