文档章节

Apache Cassandra和Apache Ignite:分布式数据库的明智之选

李玉珏
 李玉珏
发布于 2018/05/13 22:48
字数 2013
阅读 971
收藏 5

Apache Cassandra应用广泛,是一个开源的、分布式的、键值存储列模式NoSQL数据库,支撑了很多大公司的关键业务,比如Netflix、eBay以及Expedia,对于Cassandra的用户来说,如果他对Cassandra很满意,但是又需要高级的SQL查询功能,那么Ignite对于Cassandra来说,是一个增强,如果他对Cassandra的速度不满意,或者希望在分布式键值存储数据库中执行SQL,那么Ignite会是Cassandra的一个强有力替代者。

Cassandra的优势和限制

Cassandra的优势包括:

  • 全分布式、对等架构:Cassandra无单点故障,因此适用于高可用场景。它支持多数据中心复制,比如,可以将数据存储于多个AWS可用区域中,以获得更大的弹性;
  • 大规模和线性扩展:在任意数据中心的任意Cassandra集群中,可以添加/删除任意数量的节点,使得用户可以可靠地存储不断增长的结构化和非结构化数据;
  • 柔性建模:Cassandra的分布式系统技术来源于亚马逊的Dynamo键值存储以及Google的BigTable列数据模型,使其可以对相对于传统关系型数据库更复杂的数据结构进行建模;
  • 可调一致性:用户可以配置复制来平衡速度和可靠性;
  • 开源社区:Cassandra用户受益于一个庞大而活跃的社区,社区对Cassandra进行持续地改进,并且通过一些网站提供技术支持。

Cassandra的常规用途包括从应用日志和传感器获得大量数据,然后进行存储和分析,还有就是高可用地存储键值数据,这对于面向Web的应用,或者IT监控非常有用,他们需要对大量数据进行高速的统计。

虽然强大,但是Cassandra也有一些限制:

  • 基于磁盘,因此限制了某些操作的速度,因为需要对磁盘进行读写;
  • 不支持ANSI-99 SQL,因此无法执行特定的SQL查询;
  • Cassandra是最终一致的,因此事务数据可能丢失,这对于事务敏感的应用来说,是个挑战。

Cassandra和Ignite一起使用的好处

在已有的数据层和应用层之间,Ignite可以充当一个内存计算层,在Cassandra和已有的应用层之间,可以插入一个Ignite集群,这样在Ignite集群保持的数据中可以提供ANSI-99 SQL支持以及ACID事务支持。

SQL查询

Ignite包含了一个兼容ANSI-99 SQL的引擎,它可以在Ignite集群持有的数据中,执行SQL以及对数据进行索引,使用Ignite的ODBC/JDBC API,可以向Ignite发送标准的SQL命令,对于Ignite持有的Cassandra数据,也可以执行SQL查询,从而为Cassandra中存储的数据提供高性能和高灵活性的SQL支持。

ACID事务

Ignite为分布式事务提供了用户可定义的事务保证,可以从最终一致调整为强一致,Ignite会将任何变化写入内存数据集以及后面的Cassandra,保证两者间的数据一致性。

数据无需重建模

加入Ignite,不需要修改Cassandra中已有的数据,和处理传统关系型数据库一样,Ignite可以从Cassandra及其他的NoSQL数据库中读取数据。也不需要修改模型,这些都会被直接迁移到Ignite中。

Ignite不需要推倒重来,因此如果希望从关系型数据库迁移到Cassandra,这会是一个捷径,因为无需为了匹配Cassandra的约束而对数据重新建模。为了解决移植需要对数据重新建模的问题,可以在关系型数据库上使用Ignite,然后将编程接口切换为Ignite,然后将关系型数据库移植到Cassandra,通过Ignite,应用无法感知到前后有什么不同。

Ignite可以很好地与NoSQL、RDBMS以及Hadoop存储协同,因此Ignite可以用于对它们进行加速和扩展。Ignite也可以与Spark一起工作,Ignite文件系统还可以用于将弹性分布式数据集(RDD)或者DataFrames移入内存,使SparkRDD可变,并且可以在多个Spark作业间共享状态。

成熟的代码库

虽然Ignite对于Apache基金会(ASF)来说非常新,但是它有一个很成熟的代码库。它以前在2007年时,是一个私有的项目,在2014年捐赠给ASF。然后一年后毕业成为ASF的顶级项目,毕业速度在Apache项目中第二快(在Spark之后)。Ignite有一个活跃的全球社区,有超过100万行代码,有健壮的特性集。

方案集成

从架构上来说,Ignite与Cassandra的集成是非常简单的。Cassandra的用户,通常来说需要对Cassandra集群进行读写(可能使用Kafka或者其他的客户端)。Ignite会嵌入应用和Cassandra之间,使用Ignite的Cassandra连接器进行集成。应用以后就不需要对Cassandra进行读写,而是对Ignite进行读写,因此他就会访问内存而不是磁盘中的数据,而Ignite会对Cassandra进行读写。

单一的选择可能更好

虽然将Ignite和Cassandra整合可以创建一个强大的方案,但是对于某些场景来说,未必是最佳的。比如,对于新的应用来说,需要执行SQL查询的功能,Ignite包含了一个内存数据库,它可以作为一个独立的、分布式的内存RDBMS,支持ACID事务以及ANSI-99 SQL,包括DML和DDL。兼容ANSI-99的SQL引擎支持带索引的内存级SQL,可以以内存计算的速度执行SQL查询。Ignite还支持ACID事务的强一致,可以满足对事务有强需求的应用。

对于受限于Cassandra的SQL能力和最终一致性的用户,会发现迁移到Ignite(而不是添加)后有了他们需要的数据库功能和内存级的性能,而只需要维护一个简单的应用/数据库两层架构。

对于读密集型应用来说,Ignite会比Cassandra快3-6倍,而Cassandra会有更好的写入性能。因此如果一个应用写入负载很重,而对SQL查询以及ACID事务要求不高,那么Cassandra仍然是独立方案的最佳选择。然而,对于任何需要高速读或者混合性能的关键应用,独立的Ignite部署会是最佳选择。

下一步

对于正在使用或者考虑使用Cassandra的用户,面对当前的面向Web的应用,也会关心极限OLTP和OLAP负载下的性能需求,应该考虑利用Ignite内存计算平台的优势,将两个方案结合,会使应用在内存中而不是磁盘上访问数据,这是一个比磁盘快1000倍的方法。在Cassandra之上加入Ignite,在维持Cassandra的高可用和水平扩展之外,还提供了其他的好处,包括更灵活的兼容ANSI-99的SQL查询,以及更健壮的一致性,这些都不需要对数据进行重新建模。但是,如果对SQL查询、强一致、或者要求主要是读或者混合读写的性能最大化,那么会发现将Cassandra替换成Ignite或者最初就选择Ignite可能会更好。

如果要入门,可以访问Apache Ignite的官方网站了解更多信息,社区也会通过Apache Ignite用户列表提供技术支持。

本文译自GridGain公司创始人和CTO尼基塔 伊万诺夫的博客

© 著作权归作者所有

李玉珏

李玉珏

粉丝 365
博文 76
码字总数 143787
作品 0
沈阳
架构师
私信 提问
加载中

评论(10)

hblt-j
hblt-j
https://www.cnblogs.com/xiashiwendao/p/8167758.html
ramnight
ramnight

引用来自“李玉珏”的评论

引用来自“ramnight”的评论

你好,请问下,目前ignite有没有自动同步mysql数据的机制?
第三方持久化方案是数据的更新是通过ignite来进行的,也是由ignite来进行持久化工作。
我这里指的是,将mysql作为ignite的数据来源,数据的更新是直接写入到mysql中的,ignite只是作为内存缓存(mysql全量数据)。在这种流程下,ignite有没有自动与mysql数据保持一致的机制?

没有,这样的方案得你自己做。
mysql的数据更新了,ignite怎么会知道。
所以,如果做的话,只能自己通过stream来实现吧,那如果这样的话,ignite有没有数据一致性检测机制呢?
比如我有10台机器,都是通过stream的方式将数据更新过来,且是复制模式,ignite有提供这种场景下的数据一致性检测机制吗?
李玉珏
李玉珏 博主

引用来自“ramnight”的评论

你好,请问下,目前ignite有没有自动同步mysql数据的机制?
第三方持久化方案是数据的更新是通过ignite来进行的,也是由ignite来进行持久化工作。
我这里指的是,将mysql作为ignite的数据来源,数据的更新是直接写入到mysql中的,ignite只是作为内存缓存(mysql全量数据)。在这种流程下,ignite有没有自动与mysql数据保持一致的机制?

没有,这样的方案得你自己做。
mysql的数据更新了,ignite怎么会知道。
ramnight
ramnight
你好,请问下,目前ignite有没有自动同步mysql数据的机制?
第三方持久化方案是数据的更新是通过ignite来进行的,也是由ignite来进行持久化工作。
我这里指的是,将mysql作为ignite的数据来源,数据的更新是直接写入到mysql中的,ignite只是作为内存缓存(mysql全量数据)。在这种流程下,ignite有没有自动与mysql数据保持一致的机制?
漂浮的沙
漂浮的沙
你好,在我通过DataRegionConfiguration.setPersistenceEnabled(true);开启了本地持久化之后,先添加数十万数据到IgniteCache(其setDataRegionName就是上面的Region的名字),然后会注意到store里面对应的partition file一直有在增加.之后,我把cache里面的所有数据remove,clear,但是partition file所占的磁盘空间,还是一直在增长,并没有发现有减小. 我不确定这样子是否是正确的.
漂浮的沙
漂浮的沙
李老师你好,之前有邮件你,有遇到个问题(Attempted to release write lock while not holding it),不知道你是否有遇到,希望空的时候,可以帮我看一下,谢谢!
Leon_wy
Leon_wy
那我先买西瓜去了
l
lucky988

引用来自“李玉珏”的评论

引用来自“lucky988”的评论

是不是已经放弃ignite了?一直在等待你的2.4的翻译……

最近忙
马上就出2.5了,2.5版本的会翻译
👍
李玉珏
李玉珏 博主

引用来自“lucky988”的评论

是不是已经放弃ignite了?一直在等待你的2.4的翻译……

最近忙
马上就出2.5了,2.5版本的会翻译
l
lucky988
是不是已经放弃ignite了?一直在等待你的2.4的翻译……
Apache Ignite剖析

1.概述   Apache Ignite和Apache Arrow很类似,属于大数据范畴中的内存分布式管理系统。在《Apache Arrow 内存数据》中介绍了Arrow的相关内容,它统一了大数据领域各个生态系统的数据格式,...

smartloli
2018/03/11
0
0
Ignite内存计算平台与Oracle TimesTen Scaleout对比

1.产品介绍 Ignite Ignite内存计算平台是一个高性能、集成化、混合式的企业级分布式架构解决方案,功能强大,有先进的集群管理功能,对于分布式内存数据库、流处理技术、分布式计算、分布式服...

李玉珏
2018/08/09
0
0
内存数据组织 - Apache Ignite

1.Ignite是什么? Apache Ignite是一个以内存为中心的分布式数据库、缓存和处理平台,支持事务、分析以及流式负载,可以在PB级数据上享有内存级的性能。 1.1.Ignite定位 Ignite是不是内存数据...

匿名
2015/01/10
0
8
Apache Ignite 2.5.0 版本发布,千级节点伸缩性

Apache Ignite 2.5: 千级节点伸缩性 Apache Ignite的用户通常知道的两个关键点是-扩展性和性能。在很多分布式系统的整个生命周期中,通常会不停地改进性能,而对扩展性相关的改进次数,会比较...

李玉珏
2018/06/01
1K
10
全面对比,深度解析 Ignite 与 Spark

经常有人拿 Ignite 和 Spark 进行比较,然后搞不清两者的区别和联系。Ignite 和 Spark,如果笼统归类,都可以归于内存计算平台,然而两者功能上虽然有交集,并且 Ignite 也会对 Spark 进行支...

编辑部的故事
2018/09/13
0
0

没有更多内容

加载失败,请刷新页面

加载更多

Hadoop集群搭建-05安装配置YARN

Hadoop集群搭建-04安装配置HDFS Hadoop集群搭建-03编译安装hadoop Hadoop集群搭建-02安装配置Zookeeper Hadoop集群搭建-01前期准备 先保证集群5台虚拟机, nn1 nn2 s1 s2 s3 hadoop 是 是 是 ...

虚拟世界的懒猫
今天
10
0
聊聊spring cloud的ConsulServiceRegistry

序 本文主要研究一下spring cloud的ConsulServiceRegistry ServiceRegistry spring-cloud-commons-2.1.2.RELEASE-sources.jar!/org/springframework/cloud/client/serviceregistry/ServiceR......

go4it
昨天
8
0
Nextjs 学习 —— hooks

22

lemos
昨天
6
0
如何在spring mvc restful接口中定制化类型转换和格式化

1.痛点 最近小胖哥搞了个小程序,有几个spring mvc 接口传递了时间,时间用java 8 time 相关的api 来直接接收: 当使用根据ISO 8601格式化的参数向任何这些方法发送POST请求时,报出了如下异...

码农小胖哥
昨天
19
0
docker日志监控

日志处理机制 我们先来了解一下docker日志处理的机制,当启动一个容器的时候,它其实是docker daemon的一个子进程,docker daemon可以拿到你容器里面进程的标准输出,拿到标准输出后,它会通...

爱宝贝丶
昨天
6
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部