JBoss Data Grid是Red Hat中间件产品(http://www.redhat.com/products/jbossenterprisemiddleware/data-grid/),JBoss Data Grid是基于开源社区产品Infinispan(http://infinispan.org/)。 企业版的JBoss Data Grid与社区版的Infinispan代码完全一样,所以本部分内容基于Infinispan进行。
概述
Infinispan提供了两种模式:
- 本地模式 - Infinispan提供的非集群的模式,在本地模式下,Infinispan可看作是一个单节点的,在内存中的数据缓存。与集群模式相比,因为我们不会考虑集群的可扩展性,容错能力,等,这使得Infinispan性能更高,使用更高效。
- 集群模式 - 集群模式是多个Infinispan服务器(Infinispan实例)组成一个集群,集群中所有点构成一个数据网格。网格中某一节点的状态需要复制到其他所有节点,或节点的一个子集上。这个子集中节点数的多少确定了Infinispan数据网格的容错能力和可扩展性,子集节点数太大会阻碍Infinispan网格的可扩展性。集群模式中节点之间是通过JGroups来复制状态,我们在后面会做详细讨论。根据复制策略的不同,集群模式又可分为分布式模式,复制模式和无效模式
本地模式
尽管Infinispan主要特性体现在集群模式,Infinispan本地模式提供了需要实用高效的特性,Infinispan的Cache接口继承JDK的ConcurrentMap,和普通Map相比,Infinispan提供了如下特性:
- 缓存条目可通过缓存存储器保存到第三方存储服务器(关系数据库,No-SQL,云),并且可通过同步,异步的模式通过缓存存储器操作第三方存储服务器
- 缓存条目的逐出阻止Java虚拟机内存溢出
- 缓存条目的过期确保长时间未被使用的条目被移除
- JTA和XA支持使缓存操作有事务性的保证
- 基于MVCC的并发读处理确保缓存实体可被告诉的非阻塞的读取
Infinispan服务器的缓存容器
Infinispan服务器相当与一个缓存容器,容器中可以有多个缓存实体,这些缓存可以是本地的,也可以是集群的。Infinispan服务器提供协议(HotRod,Rest,Memcached)供客户端应用连接到服务器,对容器中的缓存进行操作。Infinispan服务器配置文件中cache-container属性表示缓存容器,这个属性中包括多个缓存的配置,包括本地缓存和集群缓存。如下为缓存容器简单配置,我们从JDG/standalone/configuration/standalone.xml中摘出。
<subsystem xmlns="urn:infinispan:server:core:5.3" default-cache-container="local">
<cache-container name="local" default-cache="default" start="EAGER">
</cache-container>
</subsystem>
cache-container包括如下属性:
- name 确定了缓存容器的名字
- default-cache 确定了缓存容器默认使用的缓存实例
- start 确定是否在Infinispan服务器启动时加载缓存容器,该属性有效值可为EAGER或LAZY,如果为EAGER则Infinispan服务器启动时加载缓存容器,LAZY则在请求时加载
本地模式的配置
在Infinispan服务器中如下配置添加了本地缓存到缓存容器,如下:
<cache-container name="local" default-cache="default" >
<local-cache name="default" start="EAGER">
<locking isolation="NONE" acquire-timeout="30000" concurrency-level="1000" striping="false" />
<transaction mode="NONE" />
</local-cache>
</cache-container>
如上通过配置文件创建的本地缓存类似通过Infinispan 接口 DefaultCacheManager创建默认缓存。 另外,本地缓存和集群缓存可以同时位于cache-container中,但如果缓存容器中有集群缓存,则cache-container必须要有<transport/> 属性。local-cache元素包括如下属性和子元素:
- name 确定了本地缓存的名字
- start 确定缓存容器是否默认启动缓存实例,该属性有效值可为EAGER或LAZY,如果为EAGER则缓存容器启动时启动缓存实例,LAZY则表示只有在请求时加载
- batching 确定是否批处理操作本地缓存
- indexing 确定本地缓存的索引属性,该属性有效值可为NONE,LOCAL和ALL
<clustering mode="local" />
注意,如上为集群缓存配置模式指定local,在这种情况下,即使定义<transport/> 属性。
集群模式
根据状态复制策略的不同,集群模式又细分为:分布式模式,复制模式和无效模式,随后我们