Apache Ignite(二):核心特性一览(V1.4.0版本)

jopen 8年前

本篇主要介绍Apache Ignite的核心功能特性,有价值的功能点非常多,所以每个点写的并不详细,这篇文章主要目的还是方便更多的人更全面的了解它,后续的话,可能会针对某个功能点做详细的说明。

1.数据网格

Ignite内存数据网格是一个内存内的键值存储,他可以在分布式集群的内存内缓存数据。 它通过强语义的数据位置和关系数据路由,来降低冗余数据的噪声,使其可以节点数的线性增长,直至几百个节点。 Ignite数据网格速度足够快,经过官方不断的测试,目前,他是分布式集群中支持事务性或原子性数据的最快的实现之一。 特性一览

1.1.键值存储

Ignite数据网格是一个内存内的键值存储,可以视为分布式的分区后的哈希,集群中每个节点都持有所有数据的一部分,这意味着集群内节点越多,就可以缓存越多的数据。 和其他键值存储不同,Ignite通过可插拔的哈选算法来决定数据的位置,每个客户端都可以通过插入一个自定义的哈希函数来决定一个键属于那个节点,并不需要任何特殊的映射服务或者命名节点。

1.2.JCache(JSR107)

Ignite 100%兼容于JCache(JSR107)规范,JCache为数据缓存提供了非常简单,但是功能又非常强大的API。 JCache的一部分API包括:

  • 基本缓存操作
  • ConcurrentMap APIs
  • 并行处理(EntryProcessor)
  • 事件和度量
  • 可插拔的持久化

1.3.分区和复制

根据配置,Ignite可以对内存内的数据进行分区和复制,和REPLICATED模式不同,数据是在集群内的所有节点中全复制的,在PARTITIONED模式中,数据是在集群内的多个节点中平均拆分的,允许在内存内缓存TB级的数据。 Ignite也可以配置成具有多个副本,来保证故障时的数据弹性。 不管使用那种缓存模式,Ignite都保证任何故障模式下跨所有集群节点的数据一致性。

1.4.自修复集群

Ignite集群可以自我修复,故障时客户端会自动重连,慢的客户端会被自动踢出,故障节点的数据也会被自动传播到网格内的其他节点。

1.5.客户端近缓存

当数据被远程客户端访问时,Ignite也支持客户端侧的近缓存,在事务模式下,近缓存中的数据仍然是事务性的,要么是自动更新,要么是以一直的方式更新事务提交无效。

1.6.ACID事务

Ignite支持2种模式的缓存操作,事务性和原子性,事务模式下,可以事务性的将多个缓存操作作为一组,而原子模式下支持多个原子操作,一次一个。原子模式更轻量通常比事务模式缓存具有更好的性能。 事务模式下Ignite支持乐观事务和悲观事务,使用了尽可能经过一阶段提交优化后的2阶段提交协议。

1.7.查询和分布式关联

Ignite提供了非常优雅的查询API,支持:

  • 基于谓词的扫描查询
  • SQL查询(ANSI 99)
  • 文本查询

对于SQL和文本查询,Ignite提供了内存内的索引,因此所有的数据查询都是非常快的,如果在堆外内存缓存数据,查询索引也会在堆外内存中。 Ignite也允许用户使用可插拔的IndexingSpi来定制自己的索引。

1.8.持续查询

持续查询对于当执行一个查询后又想持续的获得之前的查询结果的数据更新通知时,是非常有用的。

1.9.堆内和堆外内存

Ignite支持2种模式缓存内存内的数据,堆内和堆外,堆外内存允许当堆太大时将数据存储在主Java堆空间之外,来避免JVM垃圾回收时导致的暂停,但是数据仍然在内存中。 只要配置了堆外内存,Ignite同时也会在堆外存储索引,这意味着索引不会占用任何堆内内存空间。

1.10.分层存储

当数据访问率下降时,ignite会有选择的将数据从堆内内存迁移至堆外内存,甚至从堆外内存迁移至交换(磁盘)存储。 当这部分数据又被访问时,他会立即被迁移到顶层,同时将其他的访问率低的数据迁移到更低的下一个内存层。

1.11.JDBC驱动

Ignite同时提供JDBC驱动,允许用户使用标准SQL查询和JDBC API获得缓存内的分布式数据。 Ignite允许用户使用任何标准SQL工具连接至Ignite然后在Ignite缓存的内存数据中开始执行SQL查询。

1.12.Web Session集群化

Ignite数据网格能够缓存任何支持Java Servlet3.0规范的的应用服务器的Web Session,包括Apache Tomcat,Eclipse Jetty,Oracle WebLogic以及其他。 当运行应用服务器集群时缓存Web Session对于提高Servlet容器的性能以及可扩展性是非常有用的。

1.13.Hibernate二级缓存

Ignite可以作为Hibernate的二级缓存,他可以显著的提高应用中持久化层的速度。

1.14.Spring缓存

Ignite支持基于Spring注解方式的Java方法缓存,这样的话,一个方法的执行结果就可以缓存在Ignite缓存中。以后如果同一个方法通过同样的参数集进行调用,结果会直接从缓存中获取而不是实际执行这个方法。

2.计算网格

分布式计算是通过并行处理的方式来获得更高的性能,更低的延迟以及线性可扩展性,Ignite计算网格提供了一组简单的API来允许用户在集群内的多台计算机中执行分布式计算和数据处理。 分布式计算是基于在集群内的节点中进行任何的计算然后将结果返回的能力。 特性一览

2.1.分布式闭包执行

Ignite计算网格允许对集群内的任何闭包进行广播和负载平衡,包括Java8 lambda,还包括纯Java Runnables和Callables。

2.2.ForkJoin执行

ComputeTask是Ignite对内存内ForkJoin的抽象和范式,也是MapReduce的一个轻量级形式,纯MapReduce并不是为了性能而构建,只是适用于进行离线数据的批量处理(比如Hadoop MapReduce)。 然而,对驻留在内存的数据进行计算时,实时性,低延迟和高吞吐量通常具有很高的优先级,同时,简化API也非常重要。基于这些考虑,Ignite提供了ComputeTask API,这个就是Ignite的ForkJoin实现(轻量级MapReduce)。

2.3.集群化 ExecutorService

Ignite提供了一个标准JDK中ExecutorService的集群实现,他会自动地在集群内以负载平衡的模式执行所有的计算。计算也会容错并且只要有一个节点就能保证执行,你可以把他视为集群化的分布式的线程池。

2.4.计算和数据的并置

计算和数据的并置可以使网络中数据序列化最小化,并且可以显著的提高应用的性能和可扩展性。不管何时,都要尽量做好集群节点中缓存的待处理数据和计算的并置。 Ignite根据需要,可以提供多种方式自动或者手动地进行计算和数据的并置。

2.5.容错

Ignite支持自动作业故障切换。如果一个节点崩溃或其他错误,作业会自动转移到其他可用节点重新执行。可插拔的FailoverSpi负责进行执行一个故障任务时新节点的选择。至少一次保证:Ignite保证只要有一个节点存在,任务就不会丢失。

2.6.负载均衡

负载平衡组件负责平衡集群内各节点的分布式任务。Ignite中负载平衡是通过可插拔的LoadBalancingSpi实现的,它控制集群内所有节点的负载并且确保集群内的每个节点的均衡负载。 对于同质化环境中的同质化任务,负载平衡是通过随机或者循环的策略实现的。然而,在很多其他的场景中,特别是在负荷不均衡时,他提供了很多的更复杂的自适应的负载平衡策略。

2.7.任务检查点

检查点是通过可插拔的CheckpointSpi实现的,他提供了一个保存作业中间状态的功能,检查点对于长期执行的任务需要保存一些中间状态以防止节点故障是非常有用的。当一个故障节点重启时,一个作业可以载入一个保存的检查点然后从故障处继续执行。

2.8.作业调度

可插拔的CollisionSpi对于待执行的作业到达某个节点时如何进行调度提供了细粒度的控制。他提供了很多的策略,包括:FIFO,优先级甚至磨洋工。

3.流式计算和CEP

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

  1. 客户端将流式数据注入Ignite;
  2. 数据在Ignite数据节点中自动分区;
  3. 数据在滑动窗口中并发处理;
  4. 客户端在流式数据中执行并发SQL查询;
  5. 客户端订阅数据变化的持续查询。

特性一览

3.1.数据流处理器

数据流处理器是由IgniteDataStreamer API定义的,他是为了将大量的持续数据流注入Ignite流缓存而构建的。数据流处理器以可扩展和容错的方式,为所有数据流注入ignite提供了至少一次保证。

3.2.并行处理

当你需要执行自己的业务逻辑而不仅仅是添加新数据时,就需要利用StreamRecerver API的优势了。 流接收器允许直接在缓存数据的节点上以并行的方式处理数据流,在数据进入缓存之前可以修改数据或者添加任何自定义预处理逻辑.

3.3.滑动窗口

Ignite流功能允许在数据滑动窗口内进行查询。滑动窗口被配置为Ignite的缓存抽取策略,可以基于时间、基于大小或者基于批量处理,可以配置一个缓存一个数据窗口,如果你需要同一个数据具有不同的滑动窗口的话,也可以非常容易的为同一个数据定义不止一个缓存。

3.4.滑动窗口查询

可以使用所有的Ignite数据索引功能,再加上Ignite SQL、TEXT,以及基于谓词的缓存查询,在数据流中进行查询。

3.5.持续查询

持续查询对于当执行一个查询后又想持续的获得之前的查询结果的数据更新通知时,是非常有用的。

4.分布式数据结构

Ignite以分布式的形式支持基于java.util.concurrent框架的大部分数据结构。比如,可以在一个节点上使用java.util.concurrent.BlockingQeque加入一些东西,然后再另一个节点上获取它。或者有一个分布式的ID生成器,他可以保证所有节点上的ID唯一性。 支持的数据结构包括:

  • Concurrent Map (Cache)
  • 分布式队列和集合
  • AtomicLong
  • AtomicReference
  • AtomicSequence (ID Generator)
  • CountDownLatch

特性一览

4.1.并置和非并置

队列和集合可以以并置或者非并置的方式进行部署。在并置模式中,集合中的所有元素都会驻留在同一个集群节点上。这种模式下,应该使用相对较小的集合。在非并置模式下,集合的元素会均等地分布在集群内,这就允许在内存内保存很大的集合。

4.2.有界队列

有界队列允许用户持有一个有预定义最大容量的队列,这将有助于控制整个缓存的容量。

4.3.基于预留的ID生成器

ID生成器是通过AtomicSequence实现的,当你以原子序列执行incrementAndGet()(或任何其他的原子性操作)时,数据结构会保存未来值的一个范围,这会保证跨集群内该序列实例的唯一性。 直到所有保存的值都被使用,所有的序列增长操作都会发生在客户端本地。

5.分布式消息

Ignite提供了集群范围内的高性能的消息功能,支持基于发布-订阅以及直接点对点通信模型的数据交换。消息可以以有序的,也可以以无序的方式进行交换。

特性一览

5.1.有序和无序

Ignite支持有序的以及无序的消息,有序消息要稍微慢一点,但是如果你用的话,Ignite保证收到消息的顺序和发送消息的顺序一致。

5.2.主题和点对点

Ignite消息支持基于主题的订阅,主题消息可以发送给一组节点,也可以发送给某一个节点。

6.服务网格

服务网格允许用户在集群中任意部署自定义的服务,比如自定义计数器,ID生成器,分级映射等。 服务网格的主要应用场景是提供了在集群中部署各种单例服务的能力。但是,如果你需要一个服务的多实例,Ignite也能保证所有服务实例的正确部署和容错。 特性一览

6.1.用户定义服务

用户可以定义自己的服务并且Ignite会自动在集群内进行服务的分布化。比如,你可以创建自己特定的分布式计数器,或者自定义的数据加载服务,或者任何其他逻辑,然后将其部署到集群中。

6.2.集群单例

Ignite允许将任意数量的服务部署到网各节点,然而,最经常被使用的特性是在集群中部署单例服务,不管是拓扑变更还是节点故障,Ignite都会维护单一性。

6.3.容错

Ignite会保证服务的持续有效,以及按照指定的配置进行部署,不管是拓扑变更还是节点故障。

6.4.负载平衡

在所有的情况下,不只是单例服务部署,Ignite都会自动地确保在集群内的每个节点上部署大致数量相等的服务。当集群拓扑发生变化时,Ignite会对部署的服务进行重新评估,然后可能对已经部署的服务重新在其他节点上部署以保证更好的负载平衡。

7.Spark共享RDD

Apache Ignite提供了一个Spark RDD抽象的实现,他允许跨越多个Spark作业时方便地在内存内共享状态,不管是在同一个应用内部还是在不同的Spark应用之间。 IgniteRDD作为Ignite分布式缓存的视图,既可以在Spark作业执行进程中部署,也可以在Spark workder中部署,也可以在他自己的集群中部署。 根据事先配置好的部署模型,状态共享既可以只存在于一个Spark应用的生命周期的内部(嵌入式模式),或者也可以存在于Spark应用的外部(独立模式),这种模式下状态可以在多个Spark应用之间共享。

特性一览

7.1.共享Spark RDD

IgniteRDD是原生Spark RDD的一个实现,DataFrame API具有所有标准RDD的功能,并且RDD的状态可以在Spark作业、应用以及worker之间共享。

7.2.更快的SQL

Spark不支持SQL索引,但是Ignite可以,由于先进的内存索引功能,IgniteRDD在执行SQL查询时比Spark原生RDD或者DataFrame有百倍的性能提升。

8.内存文件系统

Ignite一个独有的技术就是分布式内存文件系统(IGFS),IGFS提供了和Hadoop HDFS类似的功能,但是仅仅在内存内部。事实上,除了他自己的API,IGFS实现了Hadoop的文件系统API,并且可以透明地加入Hadoop或者Spark应用。 IGFS将每个文件中的数据拆分为独立的数据块然后将他们存储在分布式内存缓存中。然而和Hadoop HDFS不同,IGFS不需要一个name节点,并且用一个哈希函数自动地确定文件数据位置。 IGFS可以独立部署,也可以部署在HDFS之上,不管是哪种情况,他对于HDFS中存储的文件都是一个透明的缓存层。

特性一览

8.1.堆内和堆外

IGFS既可以在堆内,也可以在堆外存储文件,对于更大的存储空间关键是利用堆外来避免长时间的JVM垃圾回收导致的暂停。

8.2.IGFS作为Hadoop文件系统

IGFS实现了Hadoop的FileSystem API,并且可以部署为原生的Hadoop文件系统,就像HDFS一样,这样就可以在Hadoop或者Spark环境中以即插即用的方式原生部署IGFS。

8.3.Hadoop文件系统缓存

IGFS也可以在另一个Hadoop文件系统上部署为一个缓存层。这种情况下,IGFS中的一个文件如果发生变化,更新会被自动地写入HDFS。此外,如果读取了一个文件并且当时他不在IGFS中,Ignite会自动地将其从HDFS载入IGFS。

8.4.Hadoop发行版

IGFS集成了一个原生的Apache Hadoop,也支持Cloudera CDH以及Hortonworks HDP。

9.内存MapReduce

Apache Ignite带来了一个Hadoop MapReduce API的内存实现,他比原生的Hadoop MapReduce实现有了显著的性能提升。Ignite MapReduce比Hadoop性能更好,是因为基于推的资源分配以及数据的进程内协同计算。 另外,因为IGFS不需要一个name节点,当使用IGFS时,Ignite MapReduce作业会在一个链路内直达IGFS数据节点。

特性一览

9.1.原生Hadoop MapReduce

Ignite MapReduce是Hadoop MapReduce API的一个实现,他可以原生地加入已有的Hadoop环境,并且性能有很大的提升。

9.2.Hadoop加速

Ignite提供了一个Hadoop的加速发行版,包括IGFS以及Ignite MapReduce,这个环境可以很容易地加入已有的Hadoop环境。

10.客户端协议

对于客户端连接Ignite集群,Ignite提供了若干种协议,包括Ignite原生客户端,REST/HTTP,SSL/TLS,Memcached,Node.js(正在开发中)等等。 特性一览

10.1.Ignite原生客户端

对于客户端远程连接Ignite,原生客户端提供了完整的功能,他允许使用完整的Ignite API,包括近缓存,事务,计算,流式处理,服务等等。

10.2.Memcached

Ignite兼容于Memcached,他允许用户使用任何Memcached兼容客户端在Ignite缓存中保存以及获取分布式数据,包括Java、PHP、Python、Ruby以及其他的客户端。

10.3.REST/HTTP

Ignite提供了一个HTTP REST客户端,可以以REST的方式通过HTTP或者HTTPS协议进行通信。REST API可以进行执行很多的操作,比如从缓存中读取,实行任务,获取各种度量等等。

10.4.SSL/TLS

Ignite允许在所有的Ignite客户端和服务端节点之间使用SSL进行Socket通信。

10.5.Node.js(开发中)

Ignite未来会提供Node.js客户端,他能进行所有的缓存操作以及在Ignite中存储的JSON数据中执行SQL查询。

11.部署环境

Apache Ignite可以独立运行,在集群中运行,在Docker容器中运行,还可以运行在Apache Mesos以及Hadoop Yarn环境。他可以在物理机上运行,也可以在虚拟机上运行。

特性一览

11.1.独立集群

Ignite节点之间会自动感知,这有助于集群的可扩展性,而不需要重启集群,简单地启动新加入的节点然后他们就是自动地加入集群。

11.2.Docker容器

Docker可以将Ignite及其所有的依赖打包进一个标准的映像。Docker下载Ignite版本映像之后,就可以将用户的应用部署进Ignite,配置节点,他会自动启动整个配置后的Ignite节点。

11.3.公共云

对于公共云环境,Ignite原生地集成了Amazon AWS和GCE,对于其他的云环境,Ignite集成了Apache JCloud,他支持大多数已有的云服务商。

11.4.Apache Mesos

Ignite提供了Apache Mesos的原生支持,可以很容易地将Ignite部署进Mesos数据中心,比如Hadoop和Spark环境。

11.5.Hadoop Yarn

Ignite提供了Hadoop Yarn的原生支持,可以很容易地将Ignite部署进Hadoop和Spark环境。

来自: http://my.oschina.net/liyuj/blog/552671