这篇文章上次修改于 2401 天前,可能其部分内容已经发生变化,如有疑问可询问作者。 # Apache Ignite核心特性介绍(2.1.0版) ## 1.摘要 ### 1.Ignite是什么? ![1](https://ignite.apache.org/images/Main-Ignite-diagram_v2.png) - 一个以内存为中心的数据平台 - 强一致性 - 高可用 - 强大的SQL、键-值以及相关处理的API **Ignite是不是分布式数据库?** **是**,在整个集群的多个节点中,Ignite中的数据要么是分区模式的,要么是复制模式的,这给系统带来了伸缩性,增加了弹性。Ignite可以自动化地控制数据如何分区,然而,开发者也可以插入自定义的函数,以及为了提高效率将部分数据并置在一起。 **Ignite是不是关系型SQL数据库?** **不完整**,尽管Ignite的目标是和其他的关系型SQL数据库具有类似的行为,但是在处理约束和索引方面还是有不同的。Ignite支持一级和二级索引,但是只有一级索引支持唯一性,Ignite还不支持外键约束。 从根本上来说,Ignite作为约束不支持任何会导致集群广播消息的更新以及显著降低系统性能和可伸缩性的操作。 **Ignite是不是内存数据库?** **是**,虽然Ignite的固化内存在内存和磁盘中都工作得很好,但是磁盘持久化是可以禁用的,使Ignite作为一个纯粹的内存数据库。 **Ignite是不是事务型数据库?** **不完整**,ACID事务是支持的,但是仅仅在键-值API级别,Ignite还支持跨分区的事务,这意味著事务可以跨越不同服务器不同分区中的键。 在SQL层,Ignite支持原子性,还不是事务型一致性,社区计划在2.2版本中实现SQL事务。 **Ignite是不是键-值存储?** **是**,Ignite提供了键-值API,兼容于JCache (JSR-107),并且支持Java,C++和.NET。 **Ignite是不是内存数据网格(IMDG)?** **是**,Ignite是一个全功能的数据网格,它既可以用于纯内存模式,也可以带有Ignite的原生持久化,它也可以与任何第三方数据库集成,包括RDBMS和NoSQL。 **固化内存是什么?** Ignite的固化内存架构使得Ignite可以将内存计算延伸至磁盘,它基于一个页面化的堆外内存分配器,它通过写前日志(WAL)的持久化来对数据进行固化,当持久化禁用之后,固化内存就会变成一个纯粹的内存存储。 **并置处理是什么?** Ignite是一个分布式系统,因此,有能力将数据和数据以及数据和计算进行并置就变得非常重要,这会避免分布式数据噪声。当执行分布式SQL关联时数据的并置就变得非常的重要。Ignite还支持将用户的逻辑(函数,lambda等)直接发到数据所在的节点然后在本地进行数据的运算。 ## 2.关键特性 ### 2.1.固化内存 ![2](https://ignite.apache.org/images/cluster_and_cylinders.png) Ignite作为以内存为中心的平台,是基于固化内存架构的,当Ignite持久化存储特性开启时,它可以在内存和磁盘中存储和处理数据和索引。 该内存架构在可以将集群中的所有可用资源持久化到磁盘的前提下,还可以获得内存级的高性能。 Ignite固化内存的构建和操作方式,类似于比如linux这样的操作系统的虚拟内存。但是两者的显著区别是,如果开启持久化存储的话,固化内存会一直将整个数据和索引保持在磁盘上,而虚拟内存使用磁盘只是用于交换用途。 当固化内存和Ignite持久化存储同时开启时,下面Ignite作为一个平台的优势和特点: **内存** - 堆外内存 - 避免明显的GC暂停 - 自动碎片整理 - 可预测的内存消耗 - 高SQL性能 **磁盘** - 可选的持久化 - 支持闪存、SSD以及Intel的3D Xpoint - 存储数据的超集 - 全事务化(前写日志WAL) - 集群瞬时启动 ### 2.2.Ignite持久化 ![3](https://ignite.apache.org/images/check_pointing-2.png) Ignite持久化存储是一个分布式的、支持ACID、兼容SQL的磁盘存储,它作为一个可选的磁盘层,可以将数据和索引存储在SSD、闪存、3D XPoint以及其他的非易失性存储器中,并且可以透明地与Ignite固化内存进行集成。 开启持久化存储后,就不再需要将所有的数据和索引保持在内存中,也不再需要在节点或者集群重启后对数据进行预热,因为Ignite的固化内存和持久化存储是紧密藕合的,并且视其为二级存储。这意味著如果数据或者索引的子集在内存中遗失,固化内存会从磁盘中获取。 Ignite的持久化存储相比于第三方存储有很多的优势(RDBMS、NoSQL、Hadoop),它可以作为Ignite集群的一个可替代的持久化层。 - 可以在数据中执行SQL查询,不管数据在内存中还是在磁盘中,这意味著Ignite可以作为一个经过内存优化的分布式SQL数据库; - 不再需要将所有的数据和索引保持在内存中,持久化存储可以在磁盘上存储数据的超集,然后只在内存中保存频繁访问的数据的子集; - 集群的瞬时重启,如果整个集群停机,不再需要通过预加载数据而对内存进行预热,只要所有集群节点都连接在一起了,整个集群就可以正常运转了; - 数据和索引在内存和磁盘中是以相似的格式进行存储的,这有助于避免昂贵的格式转换,数据集只是在内存和磁盘之间进行移动; - 通过插入第三方解决方案,可以创建完整的增量集群快照。 ### 2.3.分布式SQL数据库 ![4](https://ignite.apache.org/images/ignite-distributed-database.png) 在Ignite中,作为平台的一部分,提供了分布式SQL数据库的功能,这个数据库可以水平扩展、容错并且兼容ANSI-99标准,它支持所有的SQL以及DML命令,包括SELECT、update、INSERT、MERGE以及DELETE,它还提供了对和分布式数据库相关的DDL命令的一个子集的支持。 有赖于固化内存架构,数据集和索引可以同时在内存和磁盘中存储,这样可以跨越不同的存储层执行分布式SQL操作,来获得可以固化到磁盘的内存级性能。 可以在Java、C++、.NET中通过原生的API使用SQL语言来与Ignite进行交互,也可以通过Ignite的JDBC或者ODBC驱动,这从语言层面来说,比如PHP、Ruby以及其他的,具有了真正的跨平台连接性。 ### 2.4.内存数据网格 ![5](https://ignite.apache.org/images/ignite-db-cache.png) Ignite内存数据网格是一个*内存中的分布式键-值存储*,它可以在分布式集群的内存中缓存数据,Ignite数据网格可以视为一个分布式分区化的哈希,其中每个节点都持有整个数据集的一部分,这样的话,随著不断地增加新节点,就可以缓存更多的数据。 Ignite数据网格甚至可以线性地增长到几百个节点,它通过强语义的数据位置和关系数据路由,来降低冗余数据噪声。 Ignite数据网格速度足够快,经过官方不断的测试,目前,他是分布式集群中支持事务性或原子性数据的最快的实现之一。 ### 2.5.内存计算网格 ![6](https://ignite.apache.org/images/in_memory_compute.png) 分布式计算是通过并行处理的方式来获得更高的性能,更低的延迟以及线性可扩展性,Ignite计算网格提供了一组简单的API来允许用户在集群内的多台计算机中执行分布式计算和数据处理。 分布式并行计算是基于在集群内的节点中进行任何的计算然后将结果返回的能力。 ### 2.6.机器学习(测试) ![7](https://ignite.apache.org/images/Machine-Learning-Diagram_v4.png) Ignite从2.0版本开始,引入了一个叫做机器学习网格的分布式机器学习库的第一版。 构建机器学习网格的理由很简单,很多用户将Ignite作为各种数据集的高性能存储和处理核心系统,如果用户想在这些数据集上执行机器学习或者深度学习(即训练集或者模型推理),就需要首先进行ETL,将数据转换到其他的系统中,比如Apache Mahout或者Apache Spark。 机器学习网格的路线图是从基于分布式协同处理的核心代数实现开始的。初始版本在Ignite的2.0版本中发布。未来的版本会为python、R以及Scala引入自定义DSL,不断优化机器学习算法集比如线性和逻辑回归、决策树/随机孙林、SVM、朴素贝叶斯以及支持经过Ignite优化的神经网络,还有就是集成TensorFlow。 当前测试版的Ignite机器学习网格,在高度优化和可扩展的Ignite平台基础上支持一个分布式的机器学习库,实现了一个本地化以及分布式的矢量和矩阵运算,还有已经广泛使用的算法的分布式版本。 ## 3.扩展特性 ### 3.1.服务网格 ![8](https://ignite.apache.org/images/ignite_service.png) 服务网格可以在集群中任意部署自定义的服务,可以实现和部署任意服务,比如自定义计数器,ID生成器,分级映射等。 服务网格的主要应用场景是提供了在集群中部署各种单例服务的能力。但是,如果需要一个服务的多实例,Ignite也能保证所有服务实例的正确部署和容错。 ### 3.2.数据注入和流计算 ![9](https://ignite.apache.org/images/ignite-stream-query.png) Ignite流式计算允许以可扩展和容错的方式处理连续不中断的数据流。在一个中等规模的集群中,数据注入Ignite的比例会很高,很容易达到每秒百万级的规模。 **工作方式:** 1. 客户端将流式数据注入Ignite; 2. 数据在Ignite数据节点中自动分区; 3. 数据在`滑动窗口`中并发处理; 4. 客户端在流式数据中执行并发`SQL查询`; 5. 客户端订阅数据变化的`持续查询`。 ### 3.3.RDBMS集成 ![10](https://ignite.apache.org/images/domain-model.png) Ignite支持与各种持久化存储进行集成,它可以接入数据库、导入模式、配置索引类型、以及自动化地生成所有必要的XML OR映射配置和Java领域模型POJO,他们可以很容易地导入自己的开发工程。 Ignite可以与任何支持JDBC驱动的关系型数据库(RDBMS)进行集成,包括Oracle, PostgreSQL, Microsoft SQL Server, 和mysql。 **RDBMS集成向导** 通过Web控制台,Ignite支持自动化的RDBMS集成,它是一个交互式的配置向导、管理和监控工具,功能包括: - 创建和下载各种集群的配置文件; - 从任何RDBMS模式中自动化地构建Ignite的SQL元数据; - 在内存缓存中执行SQL查询; - 查看查询的执行计划、内存模式和流化图表。 这个Web控制台是一个创新的工具,它提供了丰富的功能来管理集群,并不限于上述提到的这些功能。 ### 3.4.分布式数据结构 Ignite以分布式的形式支持基于`java.util.concurrent`框架的大部分数据结构。比如,可以在一个节点上使用`java.util.concurrent.BlockingQeque`加入一些东西,然后再另一个节点上获取它。或者有一个分布式的ID生成器,他可以保证所有节点上的ID唯一性。 **支持的数据结构包括:** - Concurrent Map (Cache) - 分布式队列和集合 - AtomicLong - AtomicReference - AtomicSequence (ID生成器) - CountDownLatch - ExecutorService ### 3.5.消息和事件 Ignite提供了**集群范围的高性能的消息**功能,支持基于发布-订阅以及直接点对点通信模型的数据交换。消息可以以有序的,也可以以无序的方式进行交换。有序消息会稍微有点慢,但是如果使用的话,Ignite会保证收到消息的顺序和发送消息的顺序一致。 当在分布式网格环境中发生各种事件时,Ignite的**分布式事件**功能可以使应用收到通知。可以自动地收到集群内的本地和远程节点上发生的任务执行、读写和查询操作的通知,事件通知也可以分组在一起然后分批或者定期地发送。 ## 4.随处运行 ### 4.1.Java Ignite主要是用Java进行开发的,并且也提供了其他语言的原生支持。它在设计上是为内存计算的各种使用场景提供高性能的解决方案 - 从高性能计算,到工业级的先进数据网格,CEP以及数据流化处理。 Ignite本质上是一个内存键-值存储,它可以在分布式集群的内存中存储数据,然后在这个基础上支持ACID事务、SQL查询、分布式SQL关联、消息和事件、数据流化处理以及其他的功能。 通过在缓存中以通用的二进制格式写入对象,Ignite还支持跨平台的互操作性,这样使得应用可以在Java、.NET和C++之间无缝地进行操作。 ### 4.2.Ignite.NET Ignite.NET从设计上来说是在.NET平台上为内存计算的各种使用场景提供高性能的解决方案 - 从高性能计算,到工业级的先进数据网格,CEP以及数据流化处理。这些都是原生的,经过了.NET API的优化。 Ignite.NET是在Ignite之上构建的,这样就可以执行几乎所有的内存数据网格操作,包括ACID事务、SQL查询、分布式SQL关联、消息和事件、数据流化处理以及其他的。 通过在缓存中以通用的二进制格式写入对象,Ignite还支持跨平台的互操作性,这样使得应用可以在Java、.NET和C++之间无缝地进行操作。另外,Ignite.NET和Ignite C++都提供了原生的API,而它们的实现通过使用JNI委托了大部分的Java调用,这里,值得一提的是,JNI的消耗是最小的,不会造成性能的下降,特别是在分布式环境下,网络是最主要的开销,还有,Ignite提供了二进制编组器的纯.NET实现来保证性能。 ### 4.3.Ignite C++ Ignite C++从设计上来说是在C++平台上为内存计算的各种使用场景提供高性能的解决方案 - 从高性能计算,到工业级的先进数据网格,CEP以及数据流化处理。这些都是原生的,经过了C++ API的优化。 Ignite C++是在Ignite之上构建的,这样就可以执行几乎所有的内存数据网格操作,包括ACID事务、SQL查询、分布式SQL关联、消息和事件、数据流化处理以及其他的。 通过在缓存中以通用的二进制格式写入对象,Ignite还支持跨平台的互操作性,这样使得应用可以在Java、.NET和C++之间无缝地进行操作。另外,Ignite.NET和Ignite C++都提供了原生的API,而它们的实现通过使用JNI委托了大部分的Java调用,这里,值得一提的是,JNI的消耗是最小的,不会造成性能的下降,特别是在分布式环境下,网络是最主要的开销,还有,Ignite提供了二进制编组器的纯C++实现来保证性能。 ### 4.4.客户端协议 对于客户端连接Ignite集群,Ignite提供了若干种协议,包括Ignite原生客户端,REST/HTTP,SSL/TLS,Memcached,Node.js(正在开发中)等等。 ### 4.5.部署选项 ![11](https://ignite.apache.org/images/ignite-deploy-2.png) Apache Ignite可以独立运行,在集群中运行,在Kubernetes或者Docker容器中运行,还可以运行在Apache Mesos以及Hadoop Yarn环境。他可以在物理机上运行,也可以在虚拟机上运行。 **公有云** 对于公有云环境,Ignite原生地继承了`Amazon AWS`、`Google Compute Engine`,对于其他的云环境,Ignite集成了`Apache JCloud`,他支持大多数的[云供应商](https://jclouds.apache.org/reference/providers/)。 **容器** Ignite可以容易地运行于容器环境,Ignite集成了`Docker`,在服务器启动之前可以自动地构建并且将用户代码部署进Ignite。 Ignite也可以部署进Kubernetes环境,它可以自动化地部署和管理容器化的应用。 **资源管理** Ignite原生地集成了`Hadoop Yarn`和`Apache Mesos`,可以将Ignite轻易地无缝部署进Hadoop和Spark环境。 ## 5.Hadoop & Spark ### 5.1.Spark共享RDD ![12](https://ignite.apache.org/images/spark-ignite-rdd.png) Apache Ignite提供了一个Spark RDD抽象的实现,他允许跨越多个Spark作业时方便地在内存内共享状态,不管是在同一个应用内部还是在不同的Spark应用之间。 `IgniteRDD`作为Ignite分布式缓存的视图,既可以在Spark作业执行进程中部署,也可以在Spark workder中部署,也可以在他自己的集群中部署。 根据预配置的部署模型,状态共享既可以只存在于一个Spark应用的生命周期的内部(`嵌入式模式`),或者也可以存在于Spark应用的外部(`独立模式`),这种模式下状态可以在多个Spark应用之间共享。 ### 5.2.内存文件系统 ![13](https://ignite.apache.org/images/spark-igfs.png) Ignite一个独有的技术就是叫做Ignite文件系统(IGFS)的分布式内存文件系统,IGFS提供了和Hadoop HDFS类似的功能,但是仅仅在内存内部。事实上,除了他自己的API,IGFS实现了Hadoop的文件系统API,并且可以透明地加入Hadoop或者Spark应用。 IGFS将每个文件中的数据拆分为独立的数据块然后将他们存储在分布式内存缓存中。然而和Hadoop HDFS不同,IGFS不需要一个name节点,并且用一个哈希函数自动地确定文件数据位置。 IGFS可以独立部署,也可以部署在HDFS之上,不管是哪种情况,他对于HDFS中存储的文件都是一个透明的缓存层。 IGFS可以与原生的Apache Hadoop发行版集成,也可以与Cloudera CDH、Hortonworks HDP集成。 **Tachyon替代** 在Spark环境中IGFS可以透明地替代Spark环境中的Tachyon文件系统,鉴于IGFS是基于久经考验的Ignite数据网格技术,他会比Tachyon有更好的读和写性能,并且更稳定。 **Hadoop文件系统** 如果打算使用IGFS作为Hadoop文件系统,可以参考[Hadoop集成文档](http://apacheignite-fs.readme.io/docs/file-system),这时IGFS和HDFS并没有什么不同。 ### 5.3.内存MapReduce ![14](https://ignite.apache.org/images/hadoop_sequence.png) Apache Ignite带来了一个Hadoop MapReduce API的内存实现,他比原生的Hadoop MapReduce实现有了显著的性能提升。Ignite MapReduce比Hadoop性能更好,是因为基于推的资源分配以及进程内的计算和数据的并置。 另外,因为`IGFS`不需要一个name节点,当使用IGFS时,Ignite MapReduce作业会在一个链路内直达IGFS数据节点。 转自:http://www.itread01.com/articles/1501945204.html
没有评论