Apache Ignite 内存数组组织框架是一个高性能、集成和分布式的内存计算和事务平台,用于大规模的数据集处理,比传统的基于磁盘或闪存的技术具有更高的性能,同时他还为应用和不同的数据源之间提供高性能、分布式内存中数据组织管理的功能。
在 Ignite 以前,大规模、大数据量、高并发企业级或者互联网应用为了解决数据缓存、降低数据库负载、提高查询性能等突出问题,很多采用了 Hazelcast 或者 Oracle Coherence 或者 GemFire(比如 12306 网站)或者目前应用越来越广泛的 Redis 等缓存技术,本文对这些相关的技术做了简单的比较,基本内容来源于其官方网站,进行了翻译整理,方便更多的人了解他。
1 Apache Ignite 是什么
Apache Ignite 内存数组组织框架是一个高性能、集成和分布式的内存计算和事务平台,用于大规模的数据集处理,比传统的基于磁盘或闪存的技术具有更高的性能,同时他还为应用和不同的数据源之间提供高性能、分布式内存中数据组织管理的功能。
2 Ignite 历史
Ignite 来源于尼基塔·伊万诺夫于 2007 年创建的 GridGain 系统公司开发的 GridGain 软件,尼基塔领导公司开发了领先的分布式内存片内数据处理技术 - 领先的 Java 内存片内计算平台,今天在全世界每 10 秒它就会启动运行一次。他有超过 20 年的软件应用开发经验,创建了 HPC 和中间件平台,并在一些创业公司和知名企业都做出过贡献,包括 Adaptec, Visa 和 BEA Systems。尼基塔也是使用 Java 技术作为服务器端开发应用的先驱者,1996 年他在为欧洲大型系统做集成工作时他就进行了相关实践。
2014 年 3 月,GridGain 公司将该软件 90% 以上的功能和代码开源,仅在商业版中保留了高端企业级功能,如安全性,数据中心复制,先进的管理和监控等。 2015 年 1 月,GridGain 通过 Apache 2.0 许可进入 Apache 的孵化器进行孵化,很快就于 8 月 25 日毕业并且成为 Apache 的顶级项目,9 月 28 日即发布了 1.4.0 版,应该说发展、迭代速度非常之快。该技术相关资料较少,但确是一个很有潜力的技术,解决了大规模、大数据量、高并发企业级或者互联网应用面临的若干痛点。
重要通知:接下来 InfoQ 将会选择性地将部分优秀内容首发在微信公众号中,欢迎关注 InfoQ 微信公众号第一时间阅读精品内容。
3 Ignite 和 Hadoop 以及 Spark 的关系
Ignite 和 Hadoop 解决的是不同的问题,即使在一定程度上可能应用了类似的底层基础技术。Ignite 是一种多用途,和 OLAP/ OLTP 内存中数据结构相关的,而 Hadoop 仅仅是 Ignite 原生支持(和加速)的诸多数据来源之一。
Spark 是一个和 Ignite 类似的项目。但是 Spark 聚焦于 OLAP,而 Ignite 凭借强大的事务处理能力在混合型的 OLTP/ OLAP 场景中表现更好。特别是针对 Hadoop,Ignite 将为现有的 Map/Reduce,Pig 或 Hive 作业提供即插即用式的加速,避免了推倒重来的做法,而 Spark 需要先做数据 ETL,更适合新写的分析应用。
4 和类似技术的对比
在 Ignite 以前,大规模、大数据量、高并发企业级或者互联网应用为了解决数据缓存、降低数据库负载、提高查询性能等突出问题,很多采用了 Hazelcast 或者 Oracle Coherence 或者 GemFire(比如 12306 网站)或者目前应用越来越广泛的 Redis 等缓存技术,本文对这些相关的技术做了简单的比较,基本内容来源于其官方网站,进行了翻译整理,方便更多的人了解他。
4.1 Ignite 和 Hazelcast
Apache Ignite 和 Hazelcast 都提供了富数据网格的特性,解决了可扩展的分布式集群环境下在内存中对数据进行缓存和分区的问题。
Ignite 和 Hazelcast 在缓存的方式上是有很多不同的,同时支持事务和数据的查询,下面的表格列出了一些主要的不同点,这些都是我们在选择内存数据网格产品时需要特别关注的。
序号
对比项目
Apache Ignite
Hazelcast
1
聚焦于开源
Ignite 是一个 Apache 的开源项目,还在不断的增加新特性,对 C++、.NET/C#和 Node.js 的支持也会很快到来。
Hazelcast 正在持续的减少开源版本的功能,更多的功能加入了企业版中,比如堆外存储,持续查询,Web-Session 集群,SSL 加密支持等。
2
JCache(JSR107)
Ignite 完全兼容 JCache (JSR 107) 缓存规范
Hazelcast 完全兼容 JCache (JSR 107) 缓存规范
3
堆外存储
Ignite 根据用户配置支持将数据存储在堆内或者堆外
Hazelcast 仅在商业版中提供堆外存储的功能
4
堆外索引
只要配置了堆外存储,Ignite 就会在堆外存储索引 (为了不影响使用堆内内存的用户应用。)
不支持
5
持续查询
Ignite 支持持续查询,比如允许客户端和服务器端订阅数据变化的持续通知
Hazelcast 仅在商业版中提供持续查询的功能。
6
SQL 查询
Ignite 支持完整的 SQL(ANSI-99) 语法以查询内存中的数据
Hazelcast 仅对 SQL 提供有限的支持 (只有几个关键字)
7
关联查询
Ignite 支持完整的 SQL 关联,包括跨多个缓存的关联,比如:select * from A a, B b where a.b_id = b.id
Hazelcast 不支持任何的关联查询,不管用不用 SQL,如果需要,开发者需要手工处理多个查询的结果。
8
查询一致性
Ignite 提供完整的查询一致性,即查询是在一个特定的快照中执行的,查询开始之后的数据更新不影响查询的结果。
Hazelcast 查询是不一致的,这是可能的,查询结果的一部分将看到一定的更新,而另一部分则不会。
9
查询容错
Ignite 查询是容错的,即查询结果始终是一致的不会受到集群拓扑发生变化的影响,比如节点的加入,退出或崩溃。
Hazelcast 查询是不容错的,即查询结果在集群拓扑发生变化时不一致,而数据正在后台重新平衡。
10
数据一致性
Ignite 支持内存中数据的原子性和事务一致性,不管数据存储在分区或者复制缓存中。
Hazelcast 仅在分区缓存中支持原子性和事务一致性,而存储在复制缓存中的数据没有任何事务一致性的保证。
11
SSL 加密
Ignite 为所有的网络传输提供 SSL 加密,包括客户端和服务器端以及服务器之间。
Hazelcast 仅在商业版中提供 SSL 加密功能。
12
Web-Session 集群
Ignite 为所有已知的应用服务器提供 Web-Session 的缓存和集群化支持。
Hazelcast 仅在商业版中提供 Web-Session 集群化支持。
13
计算网格
Ignite 提供集群上的 M/R,Fork/Join 和基本的分布式 lambda 处理,包括任务负载平衡,容错,检查点,计划任务等。
Hazelcast 仅支持 M/R 和集群内的分布式随机任务。
14
流式网格
Ignite 支持内存流,包括对数据流浮动窗口的查询和维护支持
不支持
15
服务网格
Ignite 可以使用户方便地将其服务集群化,包括支持各种单例集群。
Hazelcast 管理的服务不提供单例集群的功能。
16
.Net/C#,C++ 支持
Ignite 将在 1.5.0 版中提供完整的内存组织 API
Hazelcast 仅在商业版中提供有限的客户端 API 支持。
17
Node.js 支持
Ignite 将在 1.5.0 版中提供 Node.js 的客户端 API。
不支持
4.2 Ignite 和 Coherence
Apache Ignite 和 Oracle Coherence 都提供了富数据网格的特性,解决了可扩展的分布式集群环境下在内存中对数据进行缓存和分区的问题。
Ignite 和 Coherence 在缓存的方式上是有很多不同的,同时支持事务和数据的查询,下面的表格列出了一些主要的不同点,这些都是我们在选择数据网格产品时需要特别关注的。
序号
对比项目
Apache Ignite
Oracle Coherence
1
开源和闭源
Ignite 是一个 Apache 的开源项目,并且还在不断的增加新特性,对 C++、.NET/C#和 Node.js 的支持也会很快到来。
Coherence 是一个 Oracle 的专有软件,并不提供开源和免费的版本。
2
JCache (JSR 107)
Ignite 完全兼容 JCache (JSR 107) 缓存规范
Coherence 完全兼容 JCache (JSR 107) 缓存规范
3
堆外存储
Ignite 根据用户配置支持将数据存储在堆内或者堆外
Coherence 对开发者提供了有限的选项支持将数据存储在堆外
4
堆外索引
只要配置了堆外存储,Ignite 就会在堆外存储索引 (为了不影响使用堆内内存的用户应用。)
不支持
5
SQL 查询
Ignite 支持完整的 SQL(ANSI-99) 语法以查询查询内存中的数据
不支持
6
关联查询
Ignite 支持完整的 SQL 关联,包括跨多个缓存的关联,比如:select * from A a, B b where a.b_id = b.id
Coherence 不支持任何的关联查询,不管用不用 SQL,如果需要,开发者需要手工处理多个查询的结果。
7
ACID 事务
Ignite 提供了每台服务器每秒成千上万事务的优异性能。
Coherence 因为性能原因不建议使用事务。
8
分层存储
Ignite 支持分层存储模型,数据可以在堆内、堆外以及交换空间内存储和移动,上层将提供更多的存储能力,当然延迟也会增加。
不支持
9
数据流
Ignite 提供内存流的支持,包括支持流数据的维护、查询和浮动窗口
不支持
10
配置
Ignite 支持通过 Java Bean 以及原生的 Spring XML 集成对系统进行配置,同时也支持通过代码对系统进行方便配置的能力。
Coherence 通过专有的 XML 格式文件进行配置,不支持通过代码进行配置。
4.3 Ignite 和 Gemfire
Apache Ignite 和 Pivotal Gemfire 都提供了富数据网格的特性,解决了可扩展的分布式集群环境下在内存中对数据进行缓存和分区的问题。
Ignite 和 Gemfire 在缓存的方式上是有很多不同的,同时支持事务和数据的查询,下面的表格列出了一些主要的不同点,这些都是我们在选择数据网格产品时需要特别关注的。
序号
对比项目
Apache Ignite
Pivotal Gemfire
1
开源和闭源
Ignite 是一个 Apache 的开源项目,并且还在不断的增加新特性,对 C++ 和.NET/C#和 Node.js 的支持也会很快到来。
Gemfire 是 Pivotal 的专有软件。
2
JCache (JSR107)
Ignite 数据网格是 JCache(JSR107)规范的一个实现,该 API 为数据访问提供了简单易用、但是功能强大的 API。
Gemfire 没有实现 JCache,使用专有的 API。
3
堆外存储
Ignite 根据用户配置支持将数据存储在堆内和堆外
Gemfire 不支持将数据存储在堆外
4
SQL 查询
Ignite 支持完整的 SQL(ANSI-99) 查询语法以查询内存中的数据。
Gemfire 不支持标准的 SQL 语法,但是他提供了他自己的叫做 OQL 的对象查询语言。
5
关联查询
Ignite 支持完整的 SQL 关联,包括跨多个缓存的关联,比如:select * from A a, B b where a.b_id = b.id
Gemfire 不支持任何的跨区或者跨缓存的关联查询,如果需要,开发者需要手工处理多个查询的结果。
6
跨分区事务
Ignite 支持跨分区事务,事务可以在整个集群中缓存的所有分区中执行。
Gemfire 不支持跨越多个缓存分区或者节点的事务。
7
分层存储
Ignite 支持分层存储模型,数据可以在堆内、堆外以及交换空间内存储和移动,上层将提供更多的存储能力,当然延迟也会增加。
不支持
8
数据流
Ignite 提供内存流的支持,包括支持流数据的维护、查询和浮动窗口
不支持
9
配置
Ignite 支持通过 Java Bean 以及原生的 Spring XML 集成对系统进行配置,同时也支持通过代码对系统进行方便配置的能力。
Gemfire 通过专有的 XML 格式文件进行配置,不支持通过代码进行配置。
10
部署
Ignite 节点是对等的,并且在启动时自动加入集群(不需要任何 locator 服务器)。
Gemfire 需要启动和维护一个 locator 服务器,以便控制节点的加入
4.4 Ignite 和 Redis
Apache Ignite 和 Redis 都提供了分布式缓存的功能,但是每个产品提供的功能特性是非常不同的。Redis 主要是一个数据结构存储,但是 Ignite 提供了很多内存内的分布式组件,包括数据网格、计算网格、流,当然也包括数据结构。
Ignite 是一个内存数据组织,并且提供了更多的功能,无法进行一个一个对应功能特性的比较,但是我们仍然能对一些数据网格功能进行比较。
序号
对比项目
Apache Ignite
Redis
1
JCache (JSR 107)
Ignite 完全兼容 JCache(JSR107)缓存规范
不支持
2
ACID 事务
Ignite 完全支持 ACID 事务,包括乐观和悲观并发模型以及 READ_COMMITTED, REPEATABLE_READ 和 SERIALIZABLE 隔离级别。
Redis 提供了客户端乐观事务的有限支持,在并发更新情况下,客户端需要手工重试事务。
3
数据分区
Ignite 支持分区缓存,类似于一个分布式哈希,集群中的每个节点都存储数据的一部分,在拓扑发生变化的情况下,Ignite 会自动进行数据的平衡。
Redis 不支持分区,但是他提供了副本的分片,
4
全复制
Ignite 支持缓存的复制,集群中的每个节点的每个键值对都支持。
Redis 不提供对全复制的直接支持。
5
原生对象
Ignite 允许用户使用自己的领域对象模型并且提供对任何 Java/Scala, C++ 和.NET/C#数据类型 (对象) 的原生支持,用户可以在 Ignite 缓存中轻易的存储任何程序和领域对象。
Redis 不允许用户使用自定义数据类型,仅支持预定义的基本数据结构集合,比如 Set、List、Array 以及一些其他的。
6
(近) 客户端缓存
Ignite 提供客户端缓存最近访问数据的直接支持。
Redis 不支持客户端缓存。
7
服务器端并行处理
Ignite 支持在服务器端,靠近数据并行地直接执行任何 Java, C++ 和.NET/C#代码。
Redis 通常没有任何并行数据处理的能力,服务器端基本只支持 LUA 脚本语言,服务器端不直接支持 Java, .NET, 或者 C++ 代码执行。
8
SQL 查询
Ignite 支持完整 SQL(ANSI-99)语法以查询内存中的数据。
Redis 不支持任何查询语言,只支持客户端缓存 API。
9
持续查询
Ignite 提供对客户端和服务器端持续查询的支持,用户可以设置服务器端的过滤器来减少和降低传输到客户端的数据量。
Redis 提供客户端基于键值的事件通知的支持,然而,他不提供服务器端的过滤器,因此造成了在客户端和服务器端中更新通知网络流量的显著增加。
10
数据库集成
Ignite 可以自动集成外部的数据库 -RDBMS, NoSQL, 和 HDFS
不支持
5 总结
按照官方的说法,Ignite 是很强大的整体解决方案和开发平台,功能很多而且复杂,和相关技术的比较中也没有提到缺点或者不足,这个只能使用过程中逐步发现。
从设计的角度看,Ignite 对开发者非常友好,提供了丰富的、符合各种标准和规范的 API,如果在已有项目或者系统中集成的话,对已有代码的侵入性或者对已有架构设计的破坏性较小,在已有架构代码中做出不是很大的修改,就可以在整个系统中加入一个数据缓存层或者内存计算层,对下可以映射各种关系库或者非关系库,对上方便的对接应用系统。
目前来看,一个显而易见的问题就是,社区刚刚建立,文档等开发资料较少,虽然 Ignite 本身历史尚短,但是既然来源于历史不算短的商业软件,还是经过实际生产环境验证的,可用性肯定是有的。社区的活跃和文档的完善还需要较长的时间,应用开发商和开发者对他的认知和接受,也还需要一个过程,Ignite 技术和社区是不是会像 Hadoop 等技术一样活跃甚至火爆,或者是不是能替代一些技术,还需要观察,路还很长。
评论