Ignite(一): 概述

一、关于Apache Ignitehtml


  • Apache Ignite是一个以内存为中心分布式数据库缓存处理平台,支持事务分析以及流式负载,能够在PB级数据上享有内存级的性能。比传统的基于磁盘或闪存的技术具备更高的性能,同时他还为应用和不一样的数据源之间提供高性能、分布式内存中数据组织管理的功能。
  • Apache Ignite容许用户将经常使用的热数据储存在内存中,它支持分片复制两种方式,让开发者能够均匀地将数据分布式到整个集群的主机上。同时,Ignite还可支撑任何底层存储平台,无论是RDBMS、NoSQL,又或是HDFS。

 二、Why 选择Apache Ignitejava


     对于结构化数据处理,MB级用excel,pandas,sqlite,access,GB级用mysql,oracle,sql server,postgresql,TB级用mongodb,greenplum,PB级用hadoop,spark等等。数据量越大操做起来越费劲越费时,只适合过后慢慢分析,从spark开始内存计算就是为了解决太费时问题,Apache Beam也延续了这种趋势。随着时间的推移,移动互联网物联网的使用,数据会成指数增加不上大内存根本跑不快,服务器内存价格只会愈来愈便宜,内存计算只会愈来愈流行。mysql

     Ignite主要内存功能强大,更方便适用,用内存来聚合数据源处理数据。从官网的下图能够看出ignite有数据网格计算网格服务网格sql网格数据结构流计算文件系统高级集群等模块,都是放在内存操做,我想主要追求的是能快速分析处理数据,实时内存应用,不像hadoop基于硬盘文件,发个命令下去,等喝完茶才有结果。(关于内存数据网格的解释,参见:IMDG)算法

 三、Apache Ignite 历史sql


    Ignite来源于尼基塔·伊万诺夫于2007年建立的GridGain系统公司开发的GridGain软件,尼基塔领导公司开发了领先的分布式内存片内数据处理技术-领先的Java内存片内计算平台,今天在全世界每10秒它就会启动运行一次。他有超过20年的软件应用开发经验,建立了HPC和中间件平台,并在一些创业公司和知名企业都作出过贡献,包括Adaptec, Visa和BEA Systems。尼基塔也是使用Java技术做为服务器端开发应用的先驱者,1996年他在为欧洲大型系统作集成工做时他就进行了相关实践。mongodb

    2014年3月,GridGain公司将该软件90%以上的功能和代码开源,仅在商业版中保留了高端企业级功能,如安全性,数据中心复制,先进的管理和监控等。2015年1月,GridGain经过Apache 2.0许可进入Apache的孵化器进行孵化,很快就于8月25日毕业而且成为Apache的顶级项目,9月28日即发布了1.4.0版,应该说发展、迭代速度很是之快。该技术相关资料较少,但确是一个颇有潜力的技术,解决了大规模、大数据量、高并发企业级或者互联网应用面临的若干痛点。数据库

    至目前,Apache Ignite 最新版本为 2.6.0, 以下图:apache

四、理解Ignite缓存


  1. Ignite是否是内存数据库?
    • 虽然Ignite的固化内存在内存和磁盘中都工做得很好,可是磁盘持久化能够禁用从而成为一个纯粹的内存数据库,支持SQL和分布式关联
  2. Ignite是否是内存数据网格(IMDG)?
    • ,Ignite是一个全功能的分布式键-值数据网格,它既能够用于纯内存模式,也能够带有Ignite的原生持久化,它也能够任何第三方数据库集成,包括RDBMS和NoSQL。
  3. Ignite是否是一个分布式缓存?
    • 是,若是禁用原生持久化,Ignite就是一个分布式缓存,它实现了JCache规范(JSR107),而且提供了比规范更多的功能,包括分区复制分布式模式、分布式ACID事务SQL查询原生持久化等等。
  4. Ignite是否是分布式数据库?
    • 是,在整个集群的多个节点中,Ignite中的数据要么是分区模式的,要么是复制模式的,这给系统带来了伸缩性,增长了弹性。Ignite能够自动地控制数据如何分区,另外,开发者也能够插入自定义(关系)函数,以及为了提升效率将部分数据并置在一块儿。
  5. Ignite是否是关系型SQL数据库?
    • 不完整,尽管Ignite的目标是和其余的关系型SQL数据库具备相似的行为,可是在处理约束索引方面仍是有不一样的。Ignite支持一级和二级索引,可是只有一级索引支持惟一性,Ignite还不支持外键约束
  6. Ignite是否是磁盘或者只有内存的存储?
    • 都是,Ignite中的原生持久化是能够开关的,这使得Ignite能够持有比可用内存量大得多的数据。尤为是,少许的操做型数据集能够只保存在内存中,而更大的没法放在内存中的数据集,能够放在磁盘上,将内存做为一个缓存层,能够得到更好的性能。
  7. Ignite是否是一个NoSQL数据库?
    • 不确切,和其余的NoSQL数据库同样,Ignite支持高可用水平伸缩,可是,和其它的NoSQL数据库不一样,Ignite支持跨越整个集群的ACID事务和SQL
  8. Ignite是否是事务型数据库?
    • 不完整,ACID事务是支持的,可是仅仅在键-值API级别,Ignite还支持跨分区的事务,这意味着事务能够跨越不一样服务器不一样分区中的键。
    • 在SQL层,Ignite支持原子性,还不是事务型一致性,社区计划在将来的版本中实现SQL事务。
  9. Ignite是否是一个多模型数据库?
    • 是,Ignite数据的建模和访问,同时支持键值SQL,另外,Ignite还为在分布式数据上的计算处理,提供了强大的API。
  10. Ignite是否是一个键-值存储?
    • 是,Ignite提供了丰富的键-值API,兼容于JCache (JSR-107),而且支持Java,C++和.NET。

5.一、关键特性:分布式内存级SQL数据库安全


  • Ignite带来了一个兼容于ANSI-99、支持水平扩展容错分布式SQL数据库,根据须要,分布模式既能够是跨整个集群的分区模式,也能够是全复制模式。

  • 和其它的分布式SQL数据库不一样,Ignite的持久化存储将内存磁盘都视为有效的存储层,磁盘层,即原生持久化存储,默认是禁用的,这时Ignite就是一个纯粹的内存数据库(IMjDB)。

  • 和其余的SQL存储同样,也可使用JDBC或者ODBC与Ignite进行交互,Ignite还为Java、.NETC++开发者提供了原生的SQL API,而且性能更好。

  • Ignite的一个显著优点是,彻底支持分布式SQL关联,Ignite的数据关联支持并置模式和非并置模式。若是是并置模式,关联是在每一个节点的本地可用数据集上执行,而不须要在网络间移动大量的数据,在分布式数据库中,这样的方式提供了最好的扩展性和性能。

  • 除了标准的SQL,Ignite还提供了强大的处理API。

    • 键值API:Ignite的键值API可使用户以键值存储的方式与Ignite交互,除了JCache规范(JSR107)支持的标准键值操做,Ignite还提供了分布式ACID事务持续查询、扫描查询这样的扩展支持;

    • 并置处理:这个方式容许直接在数据所在的节点直接执行分布式SQL关联或者自定义业务逻辑,避免了昂贵的序列化和网络开销。

5.二、关键特性:键-值内存数据网格


  • Ignite提供了普遍的键-值API,能够做为一个内存数据网格,能够将Ignite视为一个分布式分区化的哈希映射,每一个节点持有整个数据集的一部分,和其余的内存数据网格(IMDG)不一样,Ignite能够同时将数据保存在内存和磁盘上,所以也就能够存储比可用物理内存多得多的数据。 目前,Ignite数据网格是分布式架构支持ACID事务或者原子化数据更新最快的实现之一。

  • 第三方数据库

    • 经过在应用和数据库层之间嵌入一个分布式缓存,Ignite会改进已有第三方数据库的性能和可扩展性,好比RDBMS、NoSQL或者基于Hadoop的存储,这种作法不须要对已有的数据进行替换,经过通读和通写,会保持与底层数据库的同步,Ignite会自动地与底层数据库事务进行合并,向用户透明地提供事务保证。

    • 可是,这种方法也有限制,好比,SQL和扫描查询只能处理保存在缓存中的数据,不包括外部数据库,由于Ignite没法索引外部数据,若是但愿磁盘上的数据也应该被索引到而且能够经过SQL访问,建议使用Ignite的原生持久化。

  • JCache API :Ignite的键-值API符合JCache规范(JSR107),支持以下功能:

    • 内存键值存储;

    • 基本的缓存操做;

    • ConcurrentMap API;

    • 并置处理(EntryProcessor);

    • 事件和指标;

    • 可插拔的持久化。

  • 扩展键-值API

    • 除了标准的JCache API,Ignite还支持分布式的ACID事务、持续查询、并置处理等等。

    • Ignite数据网格甚至能够线性地增加到几百个节点,它经过强语义的数据位置和关系数据路由,来下降冗余数据噪声。它能够被视为一个分布式分区化的哈希映射,每一个节点能够持有整个数据集的一部分,这意味着节点越多,缓存的数据也能够越多。

5.三、关键特性:ACID事务


  • Ignite是一个强一致的平台,彻底支持分布式ACID事务内存磁盘,都提供同样的一致性保证。

  • Ignite的事务,能够跨越多个节点多个缓存(或者说表)以及多个分区。对于应用来讲,乐观锁和悲观锁都是可用的,乐观模式还支持无死锁事务,能够在业务代码层面避免分布式死锁。

  • 二阶段提交协议:在分布式系统中,事务可能跨越多个节点,显然,要保证全部参与节点的数据一致性是一个很大的挑战。好比,若是一个节点故障,故障节点的事务就不能完整提交,在这类场景中,要保证数据一致性,一个普遍使用的方法是二阶段提交协议(2PC)。Ignite带来了二阶段提交协议的最快实现,另外,若是事务只涉及一个分区或者一个节点,Ignite会使用一个更快的一阶段提交协议。在一个事务中,若是数据发生了变化,那么在变化提交以前,Ignite会在本地事务映射中保存一个事务的状态,提交时,数据会被发送到相关的远程节点,其中只有持有相关数据主副本的节点,才会参与事务。

  • 一致性和Ignite持久化 :若是使用了Ignite的原生持久化,那么全部的更新都会写入预写日志(WAL文件中来保证一致性,即便事务执行期间集群或者某个节点故障,也没有问题。WAL的目的是,以附加模式将更新传播到磁盘,这是将数据持久化到磁盘的最快方式,若是集群或者某个节点故障,WAL提供了一个故障场景的恢复机制,集群老是能够恢复到最近成功提交的事务状态。

  • 一致性和第三方持久化 :若是Ignite做为缓存层运行于第三方数据库之上,好比RDBMS,Ignite仍然会保证缓存数据和外部数据的事务一致性。好比,若是RDBMS做为持久化层,Ignite会在将提交消息发给相关的集群节点以前,将事务写入数据库,这样的话,若是在数据库层发生事务故障,Ignite仍然会将回滚消息发给全部的相关节点,从而保持二者之间的数据一致性。

5.四、关键特性:并置处理


  • 基于磁盘的系统,好比RDBMS以及NoSQL,一般使用传统的C/S模式,这时数据是要从服务端传输到客户端的,在客户端进行处理,而后可能被丢弃。这个方法没法扩展,由于在分布式系统中经过网络移动大量数据是很是昂贵的操做。

  • 一个扩展性更好的方法是并置处理,它会反过来将计算带到数据实际驻留的服务端节点,它会在数据实际存储的地方执行高级的业务逻辑或者分布式SQL,甚相当联,避免了昂贵的序列化和网络开销。

5.五、关键特性:机器学习


  • Ignite的机器学习(ML)是一套简单、可扩展以及高效的工具,能够构建可预测的机器学习模型,而不须要昂贵的数据传输。

  • 将机器和深度学习加入Ignite的原理是很简单的,当前,若是要想让机器学习成为主流,数据科学家要解决两个主要的问题:

    • 问题#1:常规数据迁移(ETL)

      • 首先,模型是在不一样的系统中训练和部署(训练结束以后)的,数据科学家须要等待ETL或者其余的数据传输过程,来将数据移至好比Apache Mahout或者Apache Spark这样的系统进行训练,而后还要等待这个过程结束而且将模型部署到生产环境。在系统间移动TB级的数据可能花费数小时的时间,此外,训练部分一般发生在旧的数据集上。

    • 问题#2:水平扩展能力缺少

      • 第二个问题和扩展性有关。机器学习和深度学习须要处理的数据量不断增加,已经没法放在单一的服务器上。这促使数据科学家要么提出更复杂的解决方案,要么切换到好比Spark或者TensorFlow这样的分布式计算平台上。可是这些平台一般只能解决模型训练的一部分问题,这给开发者以后的生产部署带来了不少的困难。

  • 无ETL和大规模扩展性:Ignite的机器学习依赖于Ignite基于内存的存储,这给机器学习和深度学习任务带来了大规模的扩展性,而且取消了在不一样系统间进行ETL产生的等待。好比,在Ignite集群的内存和磁盘中存储的数据上,开发者能够直接进行深度学习和机器学习的训练和推理,而后,Ignite提供了一系列的机器学习和深度学习算法,对Ignite的分布式并置处理进行优化,这样在处理大规模的数据集或者不断增加的输入数据流时,这样的实现提供了内存级的速度和近乎无限的扩展性,而不须要将数据移到另外的存储。经过消除数据的移动以及长时间的处理等待,Ignite的机器学习能够持续地进行学习,能够在最新数据到来之时实时地对决策进行改进。
  • 容错和持续学习:Ignite的机器学习可以对节点的故障容错。这意味着若是在学习期间节点出现故障,全部的恢复过程对用户是透明的,学习过程不会被中断,就像全部节点都正常那样得到结果。
  • 遗传算法:
  • Ignite的机器学习组件包括一组遗传算法(GA),它是一种经过模拟生物进化过程来解决优化问题的一种方法。遗传算法很是适合于以最优的方式检索大量复杂的数据集,在现实世界中,遗传算法的应用包括:汽车设计、计算机游戏、机器人、投资、交通和运输等等。

5.六、关键特性:多语言支持


  • Ignite是以Java语言为主进行开发的,所以能够在JVM支持的任何操做系统和架构上部署和运行,好比,Ignite能够部署在Linux、Windows、MacOS、Oracle Solaris等操做系统上,支持x8六、x6四、SPARC、PowerPC指令集架构。

  • Java的API支持Ignite的全部功能,使用Java或者Scala开发的应用,相关的逻辑能够直接嵌入Ignite,而后借助于SQL以及键-值操做与集群进行交互,执行分布式计算和机器学习算法等等。

  • 除了Java,Ignite还支持.NET平台,Ignite.NET和Ignite C++使用JNI(Java Native Interface),会把大部分的调用转发给Java,这里须要注意的是,JNI的负载很是小,不会致使性能的降低,尤为是在分布式环境,总体的应用性能中网络是主要的开销。

  • 使用标准的JDBC或者ODBC链接,能够像其余的SQL存储同样与Ignite进行交互。Ignite还为Java、.NET和C++开发者提供原生的SQL API,性能更好。

  • 要使用其余的语言访问Ignite,好比Python、Ruby、PHP或者NodeJS,能够考虑使用Ignite的二进制客户端协议,JDBC或者ODBC驱动,或者文档中提到的其余客户端协议。

6.一、扩展特性:服务网格


  • 服务网格能够在集群中任意部署自定义的服务,能够实现和部署任意服务,好比自定义计数器,ID生成器,分级映射等。

  • 服务网格的主要应用场景是提供了在集群中部署各类单例服务的能力。可是,若是须要一个服务的多实例,Ignite也能保证全部服务实例的正确部署和容错。

6.二、扩展特性:数据注入和流计算


  • Ignite流式计算容许以可扩展和容错的方式处理连续不中断的数据流。在一个中等规模的集群中,数据注入Ignite的比例会很高,很容易达到每秒百万级的规模。

  • Ignite能够与主要的流处理技术和框架进行集成,好比Kafka、Camel、Storm或者JMS(Java Message Service),他们能够为基于Ignite的架构带来很是强大的功能。

  • 数据加载:Ignite提供了若干种技术来对数据进行预加载,好比,开启原生持久化后,Ignite的流处理API就是一个好的选择,若是使用第三方存储,那么使用CacheStoreAPI能够直接接入。

  • 工做方式:

    • 客户端将流式数据注入Ignite;

    • 数据在Ignite数据节点中自动分区;

    • 数据在滑动窗口中并发处理;

    • 客户端在流式数据中执行并发SQL查询;

    • 客户端订阅数据变化的持续查询。

6.三、扩展特性:RDBMS集成


  • Ignite支持与各类持久化存储进行集成,它能够接入数据库、导入模式、配置索引类型、以及自动化地生成全部必要的XML OR映射配置和Java领域模型POJO,他们能够很容易地导入本身的开发工程。
  • Ignite能够与任何支持JDBC驱动的关系型数据库(RDBMS)进行集成,包括Oracle, PostgreSQL, Microsoft SQL Server, 和MySQL。

  • RDBMS集成向导 :经过Web控制台,Ignite支持自动化的RDBMS集成,它是一个交互式的配置向导、管理和监控工具,功能包括:

    • 建立和下载各类集群的配置文件;

    • 从任何RDBMS模式中自动化地构建Ignite的SQL元数据;

    • 在内存缓存中执行SQL查询;

    • 查看查询的执行计划、内存模式和流化图表。

  • Ignite提供的Web控制台是一个创新的工具,它提供了丰富的功能来管理集群,并不限于上述提到的这些功能。

6.四、扩展特性:分布式数据结构


  • Ignite以分布式的形式支持基于java.util.concurrent框架的大部分数据结构。好比,能够在一个节点上使用java.util.concurrent.BlockingQeque加入一些东西,而后再另外一个节点上获取它。或者有一个分布式的ID生成器,他能够保证全部节点上的ID惟一性。

  • 支持的数据结构包括:

    • Concurrent Map (Cache)

    • 分布式队列和集合

    • AtomicLong

    • AtomicReference

    • AtomicSequence (ID生成器)

    • CountDownLatch

    • ExecutorService

6.三、扩展特性:消息和事件


  • Ignite提供了集群范围的高性能的消息功能,支持基于发布-订阅以及直接点对点通讯模型的数据交换。消息能够以有序的,也能够以无序的方式进行交换。有序消息会稍微有点慢,可是若是使用的话,Ignite会保证收到消息的顺序和发送消息的顺序一致。

  • 当在分布式网格环境中发生各类事件时,Ignite的分布式事件功能可使应用收到通知。能够自动地收到集群内的本地和远程节点上发生的任务执行、读写和查询操做的通知,事件通知也能够分组在一块儿而后分批或者按期地发送。

参考资料


相关文章
相关标签/搜索