JBoss 系列三十一:Infinispan 缓存模式中我们讨论了Infinispan的本地缓存和集群缓存,其中图1,图2,图3分别描述了Infinispan集群缓存的分布式模式,复制模式,失效模式,本示例展示或说明这些模式,具体类似图中所示,本示例演示的三种集群模式都是四个节点构成一个网格,数据在四个节点间进行复制。同样我们也使用单一节点演示非集群的本地模式。本示例可通过图形化和命令行的方式来操作各个节点,我们可以清晰的看到数据复制的结果。
如下图所示,我们假设示例中有4个Infinispan缓存实例构成4个节点的数据网格,
我们将Infinispan缓存模式示例分为两部分,核心部分和展示部分。核心部分包括Infinispan和jGroups,我们知道jGroups是群组通信工具包,Infinispan基于jGroups构建一个分布式数据网格平台,这部分包括Infinispan启动,配置等主要逻辑。展示部分指的是显示界面,我们通过显示界面可以操作数据网格,改变网格中的数据,展示Infinispan缓存模式,我们有二种界面:
根据JBoss Cluster Framework Demo 介绍所示的方法,任意从SourceForge下载或编译生成DEMO_HOME,示例运行启动脚本位于DEMO_HOME/bin目录下,本示例相关的Infinispan配置文件位于DEMO_HOME/conf目录下。如果以命令行方式运行本示例,我们需要了解本示例所支持的命令,Infinispan缓存模式示例支持的命令如下表:
ls | 显示当前节点下所有缓存条目 |
rm | 移除当前节点下某特定key对应的缓存条目 |
add | 添加新缓存条目到当前节点 |
tree | 显示当前节点下所有缓存条目 |
tree -l | 显示当前节点下所有缓存条目的详细内容 |
tree -list | 与tree -l命令功能完全相同 |
search | 根据某特定key查询对应的缓存条目 |
exit | 退出当前命令行窗口 |
quit | 与exit命令功能完全相同 |
我们打开一个命令行终端,进入DEMO_HOME/bin目录,执行:
./dataGrid.sh -b <IP> -c infinispan-local.xml
启动完成后GUI界面如下图所示,GUI界面代表当前缓存情况,图中所示缓存中包括4条数据,即k1/Value,k2/Value,k3/Value,k1/Value。
在GUI界面的底部,有所有操作的控制按钮,单击相应的按钮可以做相关的操作,操作按钮包括:
./dataGrid.sh -b <IP> -console -c infinispan-local.xml
[Infinispan-DataGrid /]tree -l / - ├── k2 - CacheEntry [key=k2, value=value, lifespan=-1, maxIdle=-1, alias=localhost-63861] ├── k1 - CacheEntry [key=k1, value=value, lifespan=-1, maxIdle=-1, alias=localhost-63861] ├── k4 - CacheEntry [key=k4, value=value, lifespan=-1, maxIdle=-1, alias=localhost-63861] └── k3 - CacheEntry [key=k3, value=value, lifespan=-1, maxIdle=-1, alias=localhost-63861]
如系列三十一图1 Infinispan分布式模式所示,我们演示4个节点构成的分布式数据网格。我们需要四台物理机器,分别为Server1,Server2,Server3,Server4,根据JBoss Cluster Framework Demo 介绍所示的方法,任意从SourceForge下载或编译生成DEMO_HOME,分别在四台机器上,打开命令行终端,进入DEMO_HOME/bin目录,执行:
./dataGrid.sh -b <IP> -c infinispan-distribution.xml
依次启动完成后,四台物理机器上会出现GUI管理界面,基于这些界面我们可以测试Infinispan分布式模式。注意,实际中在运行本示例时,我们可以在同一台机器上运行,因为Infinispan底层使用消息传递的是jGroups,jGroups是多播通信工具,所以不需要一定要绑定不同IP。Infinispan分布式模式缓存条目保存在网格节点的一个子集上,这样体现的Infinispan可扩展性,和大树据性,这里我们配置的子集数(numOwners)为2,即任何数据在网格中存在两份。接下来我们做如下操作:
从图中我们可以发现,任何缓存条目都存在2份,k1/Value位于Server1和Server3,k2/Value位于Server1和Server4,k3/Value位于Server2和Server3,k4/Value位于Server1和Server3。
我们也可以以命令行启动测试Infinispan分布式模式,
./dataGrid.sh -b <IP> -console -c infinispan-distribution.xml
如系列三十一图2 Infinispan复制模式所示,我们同样演示4个节点构成的复制模式数据网格。我们同样需要四台物理机器,分别为Server1,Server2,Server3,Server4,根据JBoss Cluster Framework Demo 介绍所示的方法,任意从SourceForge下载或编译生成DEMO_HOME,分别在四台机器上,打开命令行终端,进入DEMO_HOME/bin目录,执行:
./dataGrid.sh -b <IP> -c infinispan-replication.xml
依次启动完成后,四台物理机器上会出现GUI管理界面,基于这些界面我们可以测试Infinispan复制模式。Infinispan复制模式所有节点上的缓存条目保持同步,接下来我们做如下操作:
从图中我们可以发现,四个节点上的数据相同,都包括k1/Value,k2/Value,k3/Value和k4/Value。
我们也可以以命令行启动测试Infinispan复制模式,
./dataGrid.sh -b <IP> -console -c infinispan-replication.xml
如系列三十一图3Infinispan失效模式所示,我们同样演示4个节点构成的数据网格。我们需要四台物理机器,分别为Server1,Server2,Server3,Server4,根据JBoss Cluster Framework Demo 介绍所示的方法,任意从SourceForge下载或编译生成DEMO_HOME,分别在四台机器上,打开命令行终端,进入DEMO_HOME/bin目录,执行:
./dataGrid.sh -b <IP> -c infinispan-invalidation.xml
依次启动完成后,四台物理机器上会出现GUI管理界面,基于这些界面我们可以测试Infinispan复制模式。Infinispan失效模式是指当某一节点上数据发生改变后,其它节点收到失效消息,将它上面的数据移除缓存。接下来我们做如下操作:
从图中我们可以发现,Server1上的key/V_old被移除,而key/V_new存在于网格中。
我们也可以以命令行启动测试Infinispan失效模式,
./dataGrid.sh -b <IP> -console -c infinispan-invalidation.xml
我们可以通过DEMO_HOME/conf/log4j.xml文件配置日志级别,DEMO_HOME/log/demo.log中为日志输出,该日志中包括本示例的日志,以及Infinispan,JGroups输出的日志,另外在命令行终端也有日志输出。
本示例涉及到的配置文件包括infinispan-local.xml,infinispan-distribution.xml,infinispan-replication.xml和infinispan-invalidation.xml,它分别代表Infinispan非集群本地模式,集群分布式模式,集群复制模式以及集群无效模式,这些配置文件都位于DEMO_HOME/conf,我们可以去分别查看。例如infinispan-local.xml如下配置:
<clustering mode="local">
又如infinispan-distribution.xml中如下配置
<clustering mode="dist"> <l1 enabled="false" lifespan="60000" /> <hash numOwners="2"/> <sync/> </clustering>
<transport> <properties> <property name="configurationFile" value="jgroups.xml" /> </properties> </transport>
Infinispan缓存模式示例的代码位于cluster/infinispan/grid/demo/下。
CacheDelegate.java定义了操作缓存的方法,如下
public interface CacheDelegate { public abstract Cache<String, String> getGenericCache(); public abstract void removeAll(Set<String> keys); public abstract void remove(String key); public abstract void destory(); }
public CacheDelegateImpl(String configFile) { cache = MyCacheManagerProvider.getInstance().getCacheManager(configFile).getCache(); }
configFile就是DEMO_HOME/conf目录下的配置文件,MyCacheManagerProvider类创建缓存管理器的代码如下:
try { manager = new DefaultCacheManager(ResourceLoader.getInstance().getResourceAsStream(configFile), true); } catch (IOException e) { throw new IllegalArgumentException(configFile + " can not find", e); }