这篇文章主要讲解了“Apache Ignite有哪些特性”,文中的讲解内容简单清晰,易于学习与理解,下面请大家跟着小编的思路慢慢深入,一起来研究和学习“Apache Ignite有哪些特性”吧!
Ignite内存数据网格是一个内存内的键值存储,他可以在分布式集群的内存内缓存数据。 它通过强语义的数据位置和关系数据路由,来降低冗余数据的噪声,使其可以节点数的线性增长,直至几百个节点。 Ignite数据网格速度足够快,经过官方不断的测试,目前,他是分布式集群中支持事务性或原子性数据的最快的实现之一。
特性一览
Ignite数据网格是一个内存内的键值存储,可以视为分布式的分区化的哈希,集群中每个节点都持有所有数据的一部分,这意味着集群内节点越多,就可以缓存越多的数据。 和其他键值存储不同,Ignite通过可插拔的哈选算法来决定数据的位置,每个客户端都可以通过插入一个自定义的哈希函数来决定一个键属于那个节点,并不需要任何特殊的映射服务或者命名节点。
Ignite 100%兼容于JCache(JSR107)规范,JCache为数据缓存提供了非常简单,但是功能又非常强大的API。 JCache的一部分API包括:
基本缓存操作
ConcurrentMap APIs
并置处理(EntryProcessor)
事件和度量
可插拔的持久化Ï
根据配置,Ignite可以对内存内的数据进行分区或者复制,和REPLICATED
模式不同,数据是在集群内的所有节点中全复制的,在PARTITIONED
模式中,数据是在集群内的多个节点中平均拆分的,允许在内存内缓存TB级的数据。 Ignite也可以配置成具有多个副本,来保证故障时的数据弹性。
Ignite可以在接近数据的服务端,以并置的方式执行执行任何原生的Java、C++和.Net/C#代码。
Ignite集群可以自我修复,故障时客户端会自动重连,慢客户端会被自动踢出,故障节点的数据也会被自动传播到网格内的其他节点。
近缓存是本地客户端侧的缓存,他会存储最近和最频繁访问的数据。
Ignite在内存中支持2种模式的数据缓存,堆内
和堆外
。当缓存数据占用很大的堆,超过了Java主堆空间时,堆外存储可以克服JVM垃圾回收(gc)导致的长时间暂停,但数据仍然在内存内。
当配置为堆外存储时,Ignite同时也会在堆外存储查询索引,这意味着索引不会占用任何堆内内存的空间。
如果数据变冷(不被访问),Ignite会有选择地将其从堆内移动到堆外,然后再从堆外移动到交换存储(磁盘)。 当某些数据又被访问时,他会立即被传播到顶层,并且将其他的冷数据降到低一级的存储层。
从1.5版本开始,Ignite引入了一个新的存储缓存数据的概念,叫做二进制对象,他可以:
读取一个序列化的对象的属性而不需要将整个对象反序列化;
动态改变一个对象的结构;
动态创建一个对象的结构。
Ignite提供了一个完全符合ACID的分布式事务来保证一致性。 Ignite支持乐观
和悲观
的并发模型以及读提交
、可复制读
和序列化
的隔离级别。 Ignite的事务使用了二阶段提交协议,适当地也进行了很多一阶段提交的优化。
Ignite支持无死锁的乐观事务,他不获得任何锁,用户也不用担心锁的顺序,这样的事务也提供了更好的性能。
Ignite的事务化EntryProcessor可以在服务端以一个事务来执行并置化的逻辑。
Ignite可以在整个集群中,在一个缓存的所有分区中执行事务。
Ignite允许开发人员定义明确的锁来强制缓存对象的互斥。
Ignite支持使用标准的SQL语法(ANSI 99)来查询缓存,可以使用任何的SQL函数,包括聚合和分组。
Ignite支持分布式的SQL关联和跨缓存的关联。
持续查询对于当执行一个查询后又想持续的获得之前的查询结果的数据更新通知时,是非常有用的。
对于SQL查询,Ignite支持内存内的索引,因此所有的数据检索都是非常快的。
Ignite支持完整的查询一致性,查询开始执行后的更新不会影响查询的结果。
Ignite的查询是容错的,即查询结果总是一致的并且不会受到集群拓扑改变的影响。
Ignite提供JDBC驱动
,可以使用标准SQL查询和JDBC API获得缓存内的分布式数据。
Ignite的ODBC驱动可以使用标准的SQL查询和ODBC API来从缓存中获得数据。
通写模式允许更新数据库中的数据。
通读模式允许从数据库中读取数据。
Ignite提供了一个选项,通过后写缓存来异步地执行数据库更新。
自动化地连接底层数据库并且生成XML的对象关系映射配置和Java领域模型POJO。
Ignite可以自动地与外部数据库集成,包括RDBMS、NoSQL和HDFS。
Ignite数据网格能够缓存任何支持Java Servlet3.0规范的的应用服务器的Web Session,包括Apache Tomcat,Eclipse Jetty,Oracle WebLogic以及其他。 当运行应用服务器集群时缓存Web Session对于提高Servlet容器的性能以及可扩展性是非常有用的。
Ignite可以作为Hibernate的二级缓存
(或者L2Cache),他可以显著的提高应用中持久化层的速度。
Ignite支持基于Spring注解方式的Java方法缓存以使一个方法的执行结果可以缓存在Ignite缓存中。以后如果同一个方法通过同样的参数集进行调用,结果会直接从缓存中获取而不是实际执行这个方法。
Ignite.NET构建于Ignite之上,他可以执行几乎所有的内存数据网格操作,包括ACID事务、SQL查询、分布式关联、消息和事件等。
Ignite.C++构建于Ignite之上,他可以执行几乎所有的内存数据网格操作,包括SQL查询、分布式关联等。
Ignite可以配置为一个Java事务API(JTA)事务管理器搜索类。
Ignite提供了对OSGi的支持。
分布式计算是通过并行处理的方式来获得更高的性能,更低的延迟以及线性可扩展性,Ignite计算网格提供了一组简单的API来允许用户在集群内的多台计算机中执行分布式计算和数据处理。 分布式并行计算是基于在集群内的节点中进行任何的计算然后将结果返回的能力。
特性一览
Ignite计算网格可以对集群内的任何闭包进行广播和负载平衡,包括Java8 lambda,还包括纯Java Runnables和Callables。
ComputeTask
是Ignite对内存内ForkJoin
范式的抽象,也是MapReduce的一个轻量级形式。纯MapReduce并不是为了性能而构建,只是适用于进行离线数据的批量处理(比如Hadoop MapReduce)。 然而,对驻留在内存的数据进行计算时,实时性,低延迟和高吞吐量通常具有很高的优先级,同时,简化API也非常重要。基于这些考虑,Ignite提供了ComputeTask
API,这个就是Ignite的ForkJoin
实现(轻量级MapReduce)。
Ignite提供了一个标准JDK中ExecutorService
的集群实现,他会自动地在集群内以负载平衡的模式执行所有的计算。计算也会容错并且只要有一个节点就能保证执行,你可以把他视为集群化的分布式的线程池。
计算和数据的并置可以使网络中数据序列化最小化,并且可以显著的提高应用的性能和可扩展性。不管何时,都要尽量做好集群节点中缓存的待处理数据和计算的并置。 Ignite根据需要,可以提供多种方式自动或者手动地进行计算和数据的并置。
Ignite支持自动作业故障切换。如果一个节点崩溃或其他错误,作业会自动转移到其他可用节点重新执行。可插拔的FailoverSpi
负责进行执行一个故障任务时新节点的选择。 至少一次保证:Ignite保证只要有一个节点存在,任务就不会丢失。
负载平衡组件负责平衡集群内各节点的分布式任务。Ignite中负载平衡是通过可插拔的LoadBalancingSpi
实现的,它控制集群内所有节点的负载并且确保集群内的每个节点的均衡负载。 对于同质化环境中的同质化任务,负载平衡是通过随机或者循环的策略实现的。然而,在很多其他的场景中,特别是在负荷不均衡时,他提供了很多的更复杂的自适应的负载平衡策略。
检查点是通过可插拔的CheckpointSpi
实现的,他提供了一个保存作业中间状态的功能,检查点对于长期执行的任务需要保存一些中间状态以防止节点故障是非常有用的。当一个故障节点重启时,一个作业可以载入一个保存的检查点然后从故障处继续执行。
可插拔的CollisionSpi
对于待执行的作业到达某个节点时如何进行调度提供了细粒度的控制。他提供了很多的策略,包括:FIFO,优先级甚至磨洋工。
Ignite流式计算允许以可扩展和容错的方式处理连续不中断的数据流。在一个中等规模的集群中,数据注入Ignite的比例会很高,很容易达到每秒百万级的规模。 工作方式:
客户端将流式数据注入Ignite;
数据在Ignite数据节点中自动分区;
数据在滑动窗口
中并发处理;
客户端在流式数据中执行并发SQL查询
;
客户端订阅数据变化的持续查询
。
特性一览
数据流处理器是由IgniteDataStreamer
API定义的,他是为了将大量的持续数据流注入Ignite流缓存而构建的。数据流处理器以可扩展和容错的方式,为所有数据流注入ignite提供了至少一次保证。
当需要执行自定义的业务逻辑而不仅仅是添加新数据时,就需要利用StreamRecerver
API的优势了。 流接收器允许直接在缓存数据的节点上以并置的方式处理数据流,在数据进入缓存之前可以修改数据或者添加任何自定义预处理逻辑.
Ignite流功能也允许在数据滑动窗口内进行查询。滑动窗口被配置为Ignite的缓存退出策略,可以基于时间
、基于大小
或者基于批量处理
,可以配置一个缓存一个数据窗口,然而,如果需要同一个数据具有不同的滑动窗口,也可以非常容易的为同一个数据定义不止一个缓存。
可以使用所有的Ignite数据索引功能,再加上Ignite SQL、TEXT,以及基于谓词的缓存查询,在数据流中进行查询。
持续查询对于当执行一个查询后又想持续的获得之前的查询结果的数据更新通知时,是非常有用的。
Ignite的JMS数据流处理器可以从JMS代理中消费消息然后将他们插入Ignite缓存。
IgniteSink是一个Flume池,他会从一个相关的Flume通道中提取事件然后将其注入Ignite缓存。
Ignite的MQTT流处理器从一个MQTT主题中消费消息,然后向Ignite缓存提供一个转换后的键值对。
Ignite的Twitter流处理器从一个Twitter流API中消费消息,然后将他们注入Ignite缓存。
Ignite的Kafka数据流处理器从一个Kafka代理中的给定Kafka主题中消费消息,然后将他们插入Ignite缓存。
Ignite的Camel流处理器从一个Apache Camel消费者端点消费消息,然后将他们注入Ignite缓存。
Ignite的Storm流处理器从一个Apache Storm消费者端点消费消息,然后将他们注入Ignite缓存。
Ignite以分布式的形式支持基于java.util.concurrent
框架的大部分数据结构。比如,可以在一个节点上使用java.util.concurrent.BlockingQeque
加入一些东西,然后再另一个节点上获取它。或者有一个分布式的ID生成器,他可以保证所有节点上的ID唯一性。
支持的数据结构包括:
Concurrent Map (Cache)
分布式队列和集合
AtomicLong
AtomicReference
AtomicSequence (ID生成器)
CountDownLatch
ExecutorService
特性一览
Ignite提供了一个快速的分布式阻塞队列
和分布式集合
的实现。
队列和集合可以以并置
或者非并置
的方式进行部署。在并置
模式中,集合中的所有元素都会驻留在同一个集群节点上。这种模式下,应该使用相对较小的集合。在非并置
模式下,集合的元素会均等地分布在集群内,这就允许在内存内保存很大的集合。
有界队列允许用户持有一个有预定义最大容量的队列,这将有助于控制整个缓存的容量。
Ignite支持分布式的AtomicLong
和AtomicReference
。
Ignite的CountDownLatch可以在所有的Ignite节点上同步作业。
ID生成器是通过AtomicSequence
实现的,当以原子序列执行incrementAndGet()
(或任何其他的原子性操作)时,数据结构会保存未来值的一个范围,这会保证跨集群内该序列实例的唯一性。
Ignite的分布式semaphore的实现和行为类似于** java.util.concurrent.Semaphore**。
Ignite提供了集群范围的高性能的消息功能,支持基于发布-订阅以及直接点对点通信模型的数据交换。消息可以以有序的,也可以以无序的方式进行交换。有序消息会稍微有点慢,但是如果使用的话,Ignite会保证收到消息的顺序和发送消息的顺序一致。 当在分布式网格环境中发生各种事件时,Ignite的分布式事件功能可以使应用收到通知。可以自动地收到集群内的本地和远程节点上发生的任务执行、读写和查询操作的通知,事件通知也可以分组在一起然后分批或者定期地发送。
特性一览
Ignite的分布式消息可以使所有的节点基于主题进行集群范围的通信。
Ignite的消息可以发给一组节点或者一个单独的节点。
Ignite支持有序的以及无序的消息,有序消息要稍微慢一点,但是如果你用的话,Ignite保证收到消息的顺序和发送消息的顺序一致。
当集群内发生各种事件时,Ignite的分布式事件功能可以使应用收到通知。
应用可以收到集群内的本地和远程节点上有关任务执行、读写和查询操作的通知。
事件通知可以分组在一起然后分批或者定期地进行发送。
服务网格可以在集群中任意部署自定义的服务,可以实现和部署任意服务,比如自定义计数器,ID生成器,分级映射等。 服务网格的主要应用场景是提供了在集群中部署各种单例服务的能力。但是,如果需要一个服务的多实例,Ignite也能保证所有服务实例的正确部署和容错。
特性一览
用户可以定义自己的服务并且Ignite会自动在集群内进行服务的分布化。比如,你可以创建自己特定的分布式计数器,或者自定义的数据加载服务,或者任何其他逻辑,然后将其部署到集群中。
Ignite允许将任意数量的服务部署到任意的网格节点,然而,最常用的特性是在集群中部署单例服务,不管是拓扑变更还是节点故障,Ignite都会维护单一性。
Ignite会保证服务的持续有效,以及按照指定的配置进行部署,不管是拓扑变更还是节点故障。
在所有的情况下,不只是单例服务部署,Ignite都会自动地确保在集群内的每个节点上部署大致数量相等的服务。当集群拓扑发生变化时,Ignite会对部署的服务进行重新评估,然后可能对已经部署的服务重新在其他节点上部署以保证更好的负载平衡。
Ignite支持与各种持久化存储的集成,它可以连接数据库,导入模式,配置索引类型,以及自动生成所有必要的XML OR映射配置和Java领域模型POJO,这些都可以轻易地下载和复制进自己的工程。 Ignite可以与任何支持JDBC驱动的关系数据库集成,包括Oracle、PostgreSQL、MS SQL Server和MySQL。
通过IgniteWeb控制台,可以自动化的进行RDBMS集成,这是一个交互式的配置向导、管理和监控工具,它可以:
为Ignite集群创建和下载各种配置;
从任何RDBMS模式自动化地构建Ignite的SQL元数据;
在内存缓存中执行SQL查询;
查看查询的执行计划、内存模式以及流化图表。
Ignite Web控制台是一个创新工具,它提供了很多丰富的功能来管理Ignite集群,并不限于上述提到的功能。
Apache Ignite提供了一个Spark RDD抽象的实现,他允许跨越多个Spark作业时方便地在内存内共享状态,不管是在同一个应用内部还是在不同的Spark应用之间。 IgniteRDD
作为Ignite分布式缓存的视图,既可以在Spark作业执行进程中部署,也可以在Spark workder中部署,也可以在他自己的集群中部署。 根据预配置的部署模型,状态共享既可以只存在于一个Spark应用的生命周期的内部(嵌入式模式
),或者也可以存在于Spark应用的外部(独立模式
),这种模式下状态可以在多个Spark应用之间共享。
特性一览
IgniteRDD
是原生Spark RDD和DataFrame API的一个实现,除了所有的标准的RDD功能,还会跨越其他的Spark作业、应用和worker共享RDD的状态。
Spark不支持SQL索引,但是Ignite可以,由于先进的内存索引功能,IgniteRDD在执行SQL查询时比Spark原生RDD或者DataFrame有百倍的性能提升。
Ignite一个独有的技术就是叫做Ignite文件系统(IGFS)的分布式内存文件系统,IGFS提供了和Hadoop HDFS类似的功能,但是仅仅在内存内部。事实上,除了他自己的API,IGFS实现了Hadoop的文件系统API,并且可以透明地加入Hadoop或者Spark应用。 IGFS将每个文件中的数据拆分为独立的数据块然后将他们存储在分布式内存缓存中。然而和Hadoop HDFS不同,IGFS不需要一个name节点,并且用一个哈希函数自动地确定文件数据位置。 IGFS可以独立部署,也可以部署在HDFS之上,不管是哪种情况,他对于HDFS中存储的文件都是一个透明的缓存层。 Tachyon替代 在Spark环境中IGFS可以透明地替代Tachyon文件系统,鉴于IGFS是基于久经考验的Ignite数据网格技术,他会比Tachyon有更好的读和写性能,并且更稳定。 Hadoop文件系统 如果打算使用IGFS作为Hadoop文件系统,可以参考Hadoop集成文档,这时IGFS和HDFS并没有什么不同。
特性一览
IGFS既可以在堆内,也可以在堆外存储文件,对于更大的存储空间占用关键是利用堆外来避免长时间的JVM垃圾回收导致的暂停。
IGFS实现了Hadoop的FileSystem
API,并且可以部署为原生的Hadoop文件系统,就像HDFS一样,这样就可以在Hadoop或者Spark环境中以即插即用的方式原生部署IGFS。
IGFS也可以在另一个Hadoop文件系统上部署为一个缓存层。这时IGFS中的一个文件如果发生变化,更新会被自动地写入HDFS。此外,如果读取了一个文件并且当时他不在IGFS中,Ignite会自动地将其从HDFS载入IGFS。
IGFS集成了一个原生的Apache Hadoop发行版,也支持Cloudera CDH以及Hortonworks HDP。
Apache Ignite带来了一个Hadoop MapReduce API的内存实现,他比原生的Hadoop MapReduce实现有了显著的性能提升。Ignite MapReduce比Hadoop性能更好,是因为基于推的资源分配以及进程内的计算和数据的并置。 另外,因为IGFS
不需要一个name节点,当使用IGFS时,Ignite MapReduce作业会在一个链路内直达IGFS数据节点。
特性一览
Ignite MapReduce是Hadoop MapReduce API的一个实现,他可以原生地加入已有的Hadoop环境,并且性能有很大的提升。
Ignite提供了一个Hadoop加速器发行版,包括IGFS以及Ignite MapReduce,这个环境可以很容易地加入已有的Hadoop环境。
对于客户端连接Ignite集群,Ignite提供了若干种协议,包括Ignite原生客户端,REST/HTTP,SSL/TLS,Memcached,Node.js(正在开发中)等等。 特性一览
对于客户端远程连接Ignite,原生客户端提供了完整的功能,他允许使用完整的Ignite
API,包括近缓存,事务,计算,流式处理,服务等等。
Ignite兼容于Memcached
,他允许用户使用任何Memcached兼容客户端在Ignite缓存中保存以及获取分布式数据,包括Java、PHP、Python、Ruby以及其他的Memcached客户端。
Ignite提供了一个HTTP REST客户端,可以以REST的方式通过HTTP或者HTTPS协议进行通信。REST API可以进行执行不同的操作,比如从/往缓存中读/写、执行任务、获取各种指标等等。
Ignite允许在所有的Ignite客户端和服务端节点之间使用SSL进行Socket通信。
Ignite未来会提供Node.js客户端,他能进行所有的缓存操作以及在Ignite中存储的JSON数据中执行SQL查询。
Apache Ignite可以独立运行,在集群中运行,在Docker容器中运行,还可以运行在Apache Mesos以及Hadoop Yarn环境。他可以在物理机上运行,也可以在虚拟机上运行。 公有云 对于公有云环境,Ignite原生地继承了Amazon AWS
、Google Compute Engine
,对于其他的云环境,Ignite集成了Apache JCloud
,他支持大多数的云供应商。 容器 Ignite可以容易地运行于容器环境,Ignite集成了Docker
,在服务器启动之前可以自动地构建并且将用户代码部署进Ignite。 资源管理 Ignite原生地集成了Hadoop Yarn
和Apache Mesos
,可以将Ignite轻易地无缝部署进Hadoop和Spark环境。
特性一览
Ignite节点会自动地感知自定义类,而不需要显式地部署他们。
Ignite以二进制的方式存储对象,而不需要在服务端节点上部署类。
Ignite节点之间会自动感知,这有助于必要时扩展集群,而不需要重启整个集群,简单地启动新加入的节点然后他们就是自动地加入集群。
Docker
可以将Ignite及其所有的依赖打包进一个标准的映像。Docker自动下载Ignite版本映像之后,就可以将用户的应用部署进Ignite,配置节点,他会自动启动整个配置好的Ignite节点。
对于公有云环境,Ignite原生地继承了Amazon AWS
、Google Compute Engine
,对于其他的云环境,Ignite集成了Apache JCloud
,他支持大多数的云供应商。
Ignite提供了Apache Mesos的原生支持,可以很容易地将Ignite部署进Mesos数据中心,比如Hadoop和Spark环境。
Ignite提供了Hadoop Yarn的原生支持,可以很容易地将Ignite部署进Hadoop和Spark环境。
感谢各位的阅读,以上就是“Apache Ignite有哪些特性”的内容了,经过本文的学习后,相信大家对Apache Ignite有哪些特性这一问题有了更深刻的体会,具体使用情况还需要大家实践验证。这里是亿速云,小编将为大家推送更多相关知识点的文章,欢迎关注!
免责声明:本站发布的内容(图片、视频和文字)以原创、转载和分享为主,文章观点不代表本网站立场,如果涉及侵权请联系站长邮箱:is@yisu.com进行举报,并提供相关证据,一经查实,将立刻删除涉嫌侵权内容。