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

注:此文章为原创,欢迎转载,请在文章页面明显位置给出此文链接!
若您觉得这篇文章还不错请点击下右下角的推荐,非常感谢!
http://www.cnblogs.com/5207

Apache Ignite高性能分布式网格框架-初探的更多相关文章

  1. Apache Ignite之集群应用测试

    集群发现机制 在Ignite中的集群号称是无中心的,而且支持命令行启动和嵌入应用启动,所以按理说很简单.而且集群有自动发现机制感觉对于懒人开发来说太好了,抱着试一试的心态测试一下吧. 在Apache ...

  2. Apache Ignite 学习笔记(三): Ignite Server和Client节点介绍

    在前两篇文章中,我们把Ignite集群当做一个黑盒子,用二进制包自带的脚本启动Ignite节点后,我们用不同的客户端连接上Ignite进行操作,展示了Ignite作为一个分布式内存缓存,内存数据库的基 ...

  3. Apache Ignite 学习笔记(二): Ignite Java Thin Client

    前一篇文章,我们介绍了如何安装部署Ignite集群,并且尝试了用REST和SQL客户端连接集群进行了缓存和数据库的操作.现在我们就来写点代码,用Ignite的Java thin client来连接集群 ...

  4. Apache Ignite简介以及Ignite和Coherence、Gemfire、Redis等的比较

    一.Ignite简介 Apache Ignite 内存数组组织框架是一个高性能.集成和分布式的内存计算和事务平台,用于大规模的数据集处理,比传统的基于磁盘或闪存的技术具有更高的性能,同时他还为应用和不 ...

  5. Apache Ignite——集合分布式缓存、计算、存储的分布式框架

    Apache Ignite内存数据组织平台是一个高性能.集成化.混合式的企业级分布式架构解决方案,核心价值在于可以帮助我们实现分布式架构透明化,开发人员根本不知道分布式技术的存在,可以使分布式缓存.计 ...

  6. Apache Ignite - 轉

    Ignite Docs Online: ignite-doc-cn https://dongwq.gitbooks.io/ignite-doc/content/index.html - Apache ...

  7. 分布式数据库缓存系统Apache Ignite

    Apache Ignite内存数据组织是高性能的.集成化的以及分布式的内存平台,他可以实时地在大数据集中执行事务和计算,和传统的基于磁盘或者闪存的技术相比,性能有数量级的提升. 将数据存储在缓存中能够 ...

  8. Apache Ignite——新一代数据库缓存系统

    [编者按]飞速增长的数据需要大量存储,对这些数据的管理也不是一件容易的事.但相比于存储和管理,如何处理数据才是开发人员真正的挑战.对于TB级别数据的存储和处理通常会让开发人员陷入速度.可扩展性和开销的 ...

  9. Apache Ignite上的TensorFlow

    任何深度学习都是从数据开始的,这是关键点.没有数据,就无法训练模型,也无法评估模型质量,更无法做出预测,因此,数据源非常重要.在做研究.构建新的神经网络架构.以及做实验时,会习惯于使用最简单的本地数据 ...

随机推荐

  1. ABP文档 - 本地化

    文档目录 本节内容: 简介 应用语言 本地化源 XML文件 注册XML本地化源 JSOn文件 注册JSON本地化源 资源文件 自定义源 获取一个本地文本 在服务端 在MVc控制器里 在MVC视图里 在 ...

  2. 很多人很想知道怎么扫一扫二维码就能打开网站,就能添加联系人,就能链接wifi,今天说下这些格式,明天做个demo

    有些功能部分手机不能使用,网站,通讯录,wifi基本上每个手机都可以使用. 在看之前你可以扫一扫下面几个二维码先看看效果: 1.二维码生成 网址 (URL) 包含网址的 二维码生成 是大家平时最常接触 ...

  3. [.NET] 利用 async & await 的异步编程

    利用 async & await 的异步编程 [博主]反骨仔 [出处]http://www.cnblogs.com/liqingwen/p/5922573.html  目录 异步编程的简介 异 ...

  4. Oracle手边常用70则脚本知识汇总

    Oracle手边常用70则脚本知识汇总 作者:白宁超 时间:2016年3月4日13:58:36 摘要: 日常使用oracle数据库过程中,常用脚本命令莫不是用户和密码.表空间.多表联合.执行语句等常规 ...

  5. 免费开源的DotNet任务调度组件Quartz.NET(.NET组件介绍之五)

    很多的软件项目中都会使用到定时任务.定时轮询数据库同步,定时邮件通知等功能..NET Framework具有“内置”定时器功能,通过System.Timers.Timer类.在使用Timer类需要面对 ...

  6. PhpStorm和WAMP配置调试参数,问题描述Error. Interpreter is not specified or invalid. Press “Fix” to edit your project configuration.

    PhpStorm和WAMP配置调试参数 问题描述: Error. Interpreter is not specified or invalid. Press “Fix” to edit your p ...

  7. 著名ERP厂商的SSO单点登录解决方案介绍一

          SSO英文全称Single Sign On,单点登录.SSO是在多个应用系统中,用户只需要登录一次就可以访问所有相互信任的应用系统.它包括可以将这次主要的登录映射到其他应用中用于同一个用户 ...

  8. ComponentPattern (组合模式)

    import java.util.LinkedList; /** * 组合模式 * * @author TMAC-J 主要用于树状结构,用于部分和整体区别无区别的场景 想象一下,假设有一批连锁的理发店 ...

  9. nginx启动报错:/usr/local/nginx/sbin/nginx: error while loading shared libraries: libcrypto.so.1.1: cannot open shared object file: No such file or directory

    查看依赖库:

  10. BZOJ 3504: [Cqoi2014]危桥 [最大流]

    3504: [Cqoi2014]危桥 Time Limit: 10 Sec  Memory Limit: 128 MBSubmit: 1407  Solved: 703[Submit][Status] ...