Apache Ignite高性能分布式网格框架-初探
Apache Ignite初步认识
今年4月开始倒腾openfire,过程中经历了许多,更学到了许多。特别是在集群方面有了很多的认识,真正开始认识到集群的概念及应用方法。
在openfire中使用的集群解决方案是代理+分布式内存。所谓代理便是通过一个入口转发请求到多个服务实例。而分布式内存就是解决服务实例间数据共享问题。通过这两步就可以搭建出一套水平扩展的集群系统。
openfire使用的分布式内存计算框架是hazelcast,并不了解它,大概只知道它是分布式网格内存计算框架。听许多openfire开发者都吐槽hazelcast有许多问题,集群效果上不太好,也因此意外间的发现了Ignite。
Ignite是apache基金的一个开源项目,功能与hazelcast非常类似:
Apache Ignite内存数据组织是高性能的、集成化的以及分布式的内存平台,他可以实时地在大数据集中执行事务和计算,和传统的基于磁盘或者闪存的技术相比,性能有数量级的提升。
特性:
可以将Ignite视为一个独立的、易于集成的内存组件的集合,目的是改进应用程序的性能和可扩展性,部分组件包括:
- 高级的集群化
- 数据网格(JCache)
- 流计算和CEP
- 计算网格
- 服务网格
- Ignite文件系统
- 分布式数据结构
- 分布式消息
- 分布式事件
- Hadoop加速器
- Spark共享RDD
已经有国内的大神做了翻译,可以看看这个链接:https://www.zybuluo.com/liyuj/note/481591
这里面有Ignite的手册,介绍的还是比较清楚的。
启动一个Ignite吧
只要少量的代码我们就可以将Ignite应用到自己的系统中,比如我需要做一个缓存。
- 在工程中通过Maven引入
Ignte的最小引入包就是一个ignite-core.jar包依赖
<dependency>
<groupId>org.apache.ignite</groupId>
<artifactId>ignite-core</artifactId>
<version>${ignite.version}</version>
</dependency>
这样就行啦。。
- 启动Ignite创建并使用缓存
我们需要创建一个缓存,那么如何整呢?
Ignite ignite = Ignition.start();
这一句代码就启动了一个Ignite节点,整个过程不需要配置就这么简单的跑起来了。
好了,再创建一个缓存用来存用户的ID和姓名:
IgniteCache<Integer, String> cache = ignite.getOrCreateCache("userInfo");
cache.put(1, "小明");
这样就over了,是不是感觉和使用hashmap差不多?但重要的是什么,如果有另外一个ignite节点起来了,它们会自动发现并组成集群,那么userInfo这个缓存就会自动的完成分布式存储咯。
只不过有点问题,默认情况下缓存模式是分区模式,当然分区模式下需要设置缓存的备份数量backups,如果不设置的话缓存并不会在其他节点上做备份。
什么意思呢?就是说系统中有一个节点node1,这时候存了userInfo,此时node2启动了,并且自动发现后node1和node2建立了集群,不过node1突然挂了,此时系统会访问node2的数据,结果就失败啦。也就是说默认配置下数据是不会自带分布式存储的。需要做一下缓存的配置才行。
可以在创建缓存的时候指定一下缓存的配置:
CacheConfiguration cfg = new CacheConfiguration();
cfg.setCacheMode(CacheMode.PARTITIONED);
cfg.setBackups(1);
cfg.setName("userInfo");
IgniteCache<Integer, String> cache = ignite.getOrCreateCache(cfg);
cache.put(1, "小明");
Ignite提供了三种不同的缓存操作模式,分区、复制和本地。可以参考这里的介绍:https://www.zybuluo.com/liyuj/note/393469#33缓存模式
Ignite配置Tomcat WebSession练练手
我最开始拿Ignite的用处主要是做缓存使用,而且其支持JCache的特性和集群化做缓存非常合适,特别是未来部署成分布式也很平滑。但是目前我使用的还比较浅,估计入门都不算,这也可见Ignite使用多么简单,基本上看看手册就可以上手了。
这些天我还是想尝试一下Ignite的WebSession的集群功能,为以后Web系统集群做一个基础。之前的使用Redis的方案总觉得不是特别爽,虽然对代码的侵入性低,但不是java系列的。目前Ignite官方给出了WebSession集群的指南:https://www.zybuluo.com/liyuj/note/393469#318web会话集群化
我根据这个指南做了尝试,效果基本达到,但是对于像我这样的初学者面对这个手册会遇到一些问题。首先在配置后启动系统后发现会报一个异常:
严重: Exception starting filter IgniteWebSessionsFilter
class org.apache.ignite.IgniteException: Cache for web sessions is not started (is it configured?): partitioned
at org.apache.ignite.cache.websession.WebSessionFilter.initCache(WebSessionFilter.java:336)
at org.apache.ignite.cache.websession.WebSessionFilter.init(WebSessionFilter.java:292)
at org.apache.catalina.core.ApplicationFilterConfig.initFilter(ApplicationFilterConfig.java:279)
at org.apache.catalina.core.ApplicationFilterConfig.getFilter(ApplicationFilterConfig.java:260)
at org.apache.catalina.core.ApplicationFilterConfig.<init>(ApplicationFilterConfig.java:105)
at org.apache.catalina.core.StandardContext.filterStart(StandardContext.java:4854)
at org.apache.catalina.core.StandardContext.startInternal(StandardContext.java:5546)
at org.apache.catalina.util.LifecycleBase.start(LifecycleBase.java:150)
at org.apache.catalina.core.ContainerBase$StartChild.call(ContainerBase.java:1575)
at org.apache.catalina.core.ContainerBase$StartChild.call(ContainerBase.java:1565)
at java.util.concurrent.FutureTask.run(FutureTask.java:266)
at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1142)
at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:617)
at java.lang.Thread.run(Thread.java:745)
这个问题我查了蛮久,后来还是@李玉珏给了指导解决了。问题的原因是WebSessionFilter初始化时找不到对应的缓存。我查看了代码:
@SuppressWarnings("unchecked")
void initCache() {
cache = webSesIgnite.cache(cacheName);
binaryCache = webSesIgnite.cache(cacheName);
if (cache == null)
throw new IgniteException("Cache for web sessions is not started (is it configured?): " + cacheName);
报错的代码就是因为cache为null导致的。这里比较重要的是
cache = webSesIgnite.cache(cacheName);
在前面举的例子中我们获取一个缓存是用getOrCreateCache方法,这个方法会在缓存不存在的情况下自动创建一个缓存,但是cache方法却不会。所以要解决这个问题就是要在Ignite启动后先把缓存创建好。
但是整个过程我们并没有手动显式的去启动Ignite,是WebSessionFilter在Init的时候获取的,所以我们可以通过配置的方式将缓存首先创建。
如何指定Ignite XML文件加载?
需要创建一个XML文件,并将其放在Web目录的META-INF目录下面,比如创建一个default-config.xml文件,文件内容如下:
<?xml version="1.0" encoding="UTF-8"?> <!--
Licensed to the Apache Software Foundation (ASF) under one or more
contributor license agreements. See the NOTICE file distributed with
this work for additional information regarding copyright ownership.
The ASF licenses this file to You under the Apache License, Version 2.0
(the "License"); you may not use this file except in compliance with
the License. You may obtain a copy of the License at http://www.apache.org/licenses/LICENSE-2.0 Unless required by applicable law or agreed to in writing, software
distributed under the License is distributed on an "AS IS" BASIS,
WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
See the License for the specific language governing permissions and
limitations under the License.
--> <beans xmlns="http://www.springframework.org/schema/beans"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://www.springframework.org/schema/beans
http://www.springframework.org/schema/beans/spring-beans.xsd">
<bean class="org.apache.ignite.configuration.IgniteConfiguration" >
<property name="cacheConfiguration">
<bean class="org.apache.ignite.configuration.CacheConfiguration">
<!-- Cache name. -->
<property name="name" value="partitioned"/>
<property name="cacheMode" value="PARTITIONED"/>
<property name="backups" value="1"/>
</bean>
</property>
</bean>
</beans>
这里的配置意思是创建一个name为partitioned的缓存,使用分区模式,备份数为1.再次启动web程序就可以啦。
结合Spring方式
对于使用Spring的应用是可以集成Ignite缓存的,配置方式需要通过一个缓存抽象类来完成org.apache.ignite.cache.spring.SpringCacheManager。
在自己项目的Spring里做如下配置:
<!-- Provide configuration bean. -->
<bean id="cacheManager" class="org.apache.ignite.cache.spring.SpringCacheManager">
<property name="configuration">
<bean class="org.apache.ignite.configuration.IgniteConfiguration">
<property name="cacheConfiguration">
<bean class="org.apache.ignite.configuration.CacheConfiguration">
<!-- Cache name. -->
<property name="name" value="partitioned"/>
<property name="cacheMode" value="PARTITIONED"/>
<property name="backups" value="1"/>
</bean>
</property>
</bean>
</property>
</bean>
总结
可以看到Ignite的使用还是非常简单的,特别是其配置的简单性,很容易上手,轻松就搭建了一套分布式内存系统。而且对于Ignite来说还有更多的高级特性,参考"特性"部分。接下来还需要再继续深入了解。
另外对于作为缓存使用我在j2cache开源项目里有简单的集成,代码可以看:https://github.com/mini188/j2cache
Apache Ignite高性能分布式网格框架-初探的更多相关文章
- Apache Ignite之集群应用测试
集群发现机制 在Ignite中的集群号称是无中心的,而且支持命令行启动和嵌入应用启动,所以按理说很简单.而且集群有自动发现机制感觉对于懒人开发来说太好了,抱着试一试的心态测试一下吧. 在Apache ...
- Apache Ignite 学习笔记(三): Ignite Server和Client节点介绍
在前两篇文章中,我们把Ignite集群当做一个黑盒子,用二进制包自带的脚本启动Ignite节点后,我们用不同的客户端连接上Ignite进行操作,展示了Ignite作为一个分布式内存缓存,内存数据库的基 ...
- Apache Ignite 学习笔记(二): Ignite Java Thin Client
前一篇文章,我们介绍了如何安装部署Ignite集群,并且尝试了用REST和SQL客户端连接集群进行了缓存和数据库的操作.现在我们就来写点代码,用Ignite的Java thin client来连接集群 ...
- Apache Ignite简介以及Ignite和Coherence、Gemfire、Redis等的比较
一.Ignite简介 Apache Ignite 内存数组组织框架是一个高性能.集成和分布式的内存计算和事务平台,用于大规模的数据集处理,比传统的基于磁盘或闪存的技术具有更高的性能,同时他还为应用和不 ...
- Apache Ignite——集合分布式缓存、计算、存储的分布式框架
Apache Ignite内存数据组织平台是一个高性能.集成化.混合式的企业级分布式架构解决方案,核心价值在于可以帮助我们实现分布式架构透明化,开发人员根本不知道分布式技术的存在,可以使分布式缓存.计 ...
- Apache Ignite - 轉
Ignite Docs Online: ignite-doc-cn https://dongwq.gitbooks.io/ignite-doc/content/index.html - Apache ...
- 分布式数据库缓存系统Apache Ignite
Apache Ignite内存数据组织是高性能的.集成化的以及分布式的内存平台,他可以实时地在大数据集中执行事务和计算,和传统的基于磁盘或者闪存的技术相比,性能有数量级的提升. 将数据存储在缓存中能够 ...
- Apache Ignite——新一代数据库缓存系统
[编者按]飞速增长的数据需要大量存储,对这些数据的管理也不是一件容易的事.但相比于存储和管理,如何处理数据才是开发人员真正的挑战.对于TB级别数据的存储和处理通常会让开发人员陷入速度.可扩展性和开销的 ...
- Apache Ignite上的TensorFlow
任何深度学习都是从数据开始的,这是关键点.没有数据,就无法训练模型,也无法评估模型质量,更无法做出预测,因此,数据源非常重要.在做研究.构建新的神经网络架构.以及做实验时,会习惯于使用最简单的本地数据 ...
随机推荐
- 《Django By Example》第五章 中文 翻译 (个人学习,渣翻)
书籍出处:https://www.packtpub.com/web-development/django-example 原作者:Antonio Melé (译者@ucag注:大家好,我是新来的翻译, ...
- Spring基于AOP的事务管理
Spring基于AOP的事务管理 事务 事务是一系列动作,这一系列动作综合在一起组成一个完整的工作单元,如果有任何一个动作执行失败,那么事务 ...
- 80 端口被占用 pid=4
80端口被pid=4的系统进程给占用的解决方法: 一般开发的时候我们都会安装sqlserver ,也会把Sql server Reporting Services 安装上去.原因就是这个服务占用了80 ...
- .NET平台开源项目速览(15)文档数据库RavenDB-介绍与初体验
不知不觉,“.NET平台开源项目速览“系列文章已经15篇了,每一篇都非常受欢迎,可能技术水平不高,但足够入门了.虽然工作很忙,但还是会抽空把自己知道的,已经平时遇到的好的开源项目分享出来.今天就给大家 ...
- nginx源码分析之模块初始化
在nginx启动过程中,模块的初始化是整个启动过程中的重要部分,而且了解了模块初始化的过程对应后面具体分析各个模块会有事半功倍的效果.在我看来,分析源码来了解模块的初始化是最直接不过的了,所以下面主要 ...
- SDWebImage源码解读_之SDWebImageDecoder
第四篇 前言 首先,我们要弄明白一个问题? 为什么要对UIImage进行解码呢?难道不能直接使用吗? 其实不解码也是可以使用的,假如说我们通过imageNamed:来加载image,系统默认会在主线程 ...
- WebApi返回Json格式字符串
WebApi返回json格式字符串, 在网上能找到好几种方法, 其中有三种普遍的方法, 但是感觉都不怎么好. 先贴一下, 网上给的常用方法吧. 方法一:(改配置法) 找到Global.asax文件,在 ...
- mac好用的markdown编辑器
在刚开始接触markdown的时候,就被吸引了.此后一直在找贴心的好用的markdown编辑器.印象笔记和马克飞象配合着用也是挺好的,唯一的缺点就是比较封闭,发个笔记的链接给同学,还得注册才能看,导致 ...
- 敏捷测试模式之Scrum及其实践
一. 敏捷开发模式简介 敏捷是近年来软件研发领域很火的一个词,采用敏捷开发模式的研发团队是越来越多了,尤其是敏捷模式中的Scrum更是佼佼者大行其道,这表明敏捷模式确有其好处,能给企业带来效率的 ...
- 创建maven项目(cmd 命令)
2016五月 22 原 创建maven项目(cmd 命令) 分类:maven (994) (0) 1.普通方式创建 1)进入cmd窗口执行 mvn archetype:generate 2) 光标停止 ...