了解Cassandra - 它能取代RDBMS吗?

时间:2018-05-17 12:59:06

标签: cassandra bigdata microservices cql

我花了最后一周在Cassandra上填写,尝试了解基础知识,以及是否符合我们的需求。我认为我现在在基本层面上理解它,但如果它像我相信我被告知那样......我只是不知道它是否合适。

我们有一个微服务平台,它本质上是我们客户之间的大型数据总线。他们使用一组API来推送和拉取共享数据。到目前为止,过滤非常简单......但是没有办法知道未来会带来什么。

在此平台之上是一个分析图层,其中包含基于传递数据的多个可视化(条形图,图形等)。

微服务平台是在MySQL上构建的,我们认为我们可以使用集群,我们真的没有太多的运气。最重要的是,变化是痛苦的,正如RDBMS世界中的课程一样。此外,我们预计会有成千上万的并发用户提供大量数据 - 似乎我们会遇到不可避免的扩展问题。

因此,我们开始将Cassandra视为分布式nosql潜在替代品。

我观看了DataStax视频,在另一个网站上开了一门课程,然后开始挖掘。我发现的是:

  • 数据以冗余方式存储在多个表中,每个表使用不同的主键和群集键,以启用不同类型的查询,因为行分散在群集中的不同节点上
  • 而不是加入,这是不受支持的,你将非规范化并创建包含大量列的“宽”表
  • 数据最终是一致的,因此新写入可能无法在可预测的合理时间内轻松阅读。
  • CQL,虽然类似于SQL,但主要是谎言。存储和密钥数据的方式决定了您可以使用哪种类型的查询。它似乎非常有限且不灵活。

虽然这些概念对我来说很有意义,但我很难看出它如何适合大多数长期数据库需求。如果数据在多个不同的表中是多余的......如何在多个表中管理和保持一致?在这种情况下,物化是否能够找到答案?

希望喜欢这个想法,并喜欢分布式功能,但坦白说,此时大部分都是吓跑了。在过去的一周里,我觉得我学到了很多,什么也没学到,我完全不确定如何继续学习。

我调查了JanusGraph,Elassandra等,看看它是否会在Cassandra之上提供一个更简单的界面,将它降级为基本上是一个存储引擎,但我不相信这些东西很多都已经足够成熟甚至是正确的,我们需要什么。

我想我正在寻找那些使用Cassandra建造东西的人的方向和见解,看看它是否适合我们正在做的事情。不幸的是,我离开了研发时间。谢谢!

2 个答案:

答案 0 :(得分:4)

Cassandra非常擅长它的功能,但它不是RDBMS的替代品。如果您发现需要以下任何一项,我不鼓励您迁移到Cassandra:

  • 严格一致性
  • ACID交易
  • 支持即席查询,包括联接,聚合等。

现在,对于你使用MySQL达到某些限制(或者认为你将来会发现它们),这里有一些想法:

  • 不要认为MySQL中的限制通常是RDBMS中的限制。所以你不认为我是一个$ some_other_DB狂热者,我已经使用MySQL近20年了,但它并不是所有工作的最佳工具。
  • 如果通过'更改'表示'架构更改',可以通过以下方式缓解许多痛苦:
    • 使用更好地实现它们的RDBMS(包括可能是更新的MySQL版本)
    • 使用社区支持的工具,例如pt-online-schema-change或gh-ost
祝你好运!

答案 1 :(得分:3)

  

了解Cassandra - 它可以取代RDBMS吗?

这里简短的回答是" NO。"当您突然需要扩展时,Cassandra不是RDBMS的简单替代品。

  

虽然这些概念对我来说很有意义,但我很难看出这是否符合大多数长期数据库需求。

符合长期数据库需求如果您将其应用于正确的用例。

免责声明:我有点像Cassandra狂热者。我已经使用了一段时间,为这个项目做了一点贡献,被命名为" Cassandra MVP,"甚至还合着了一本关于它的书。我认为它是伟大的技术,你可以用它做出惊人的事情。

话虽如此,但有很多事情并不擅长:

  • 查询灵活性。为了满足操作规模而在多个节点上传播行所做的权衡是, 提前知道您的查询模式,然后严格遵循它们。这个想法是,您希望由单个节点提供所有查询。而且,您必须对数据模型进行一些思考才能实现这一目标。未绑定的查询(SELECT没有WHERE条款)成为敌人。

  • 就地更新数据。计划通过密钥存储值,但随后更新它们(例如:状态)?卡桑德拉并不适合这种情况。这是因为Cassandra有一个基于日志的存储引擎,它不会覆盖任何东西......它只是废弃它。因此,您之前的值仍然存在,并且仍占用空间和计算资源。

  • 删除数据。删除分布式数据库世界中的数据非常棘手。毕竟,如何将 nothing 复制到另一个节点? Cassandra对这个问题的回答是使用一个名为墓碑的结构。墓碑占用空间,可能会降低性能,并且需要保持足够长的时间来复制(使其移除变得棘手)。

  • 维护数据一致性。 Cassandra具有高可用性和分区容错性,它采用了最终一致性的概念。"因此,毫不奇怪它真的不是为了保持一致而设计的。它有很多机制可以帮助保持数据的一致性,但它们远非完美。另外,如果您的数据处于同步状态,确实无法确定

  

如果数据在多个不同的表中是多余的......如何在这些表中管理和保持一致?在这种情况下,物化是否能够找到答案?

物化观点是我在可预见的未来继续远离的观点。他们进行实验"因为某种原因。基本上,一旦他们不同步,让他们重新同步的唯一方法就是重建它们。

我指导我的开发团队保持他们的查询表(包含相同数据的表,只是以不同方式键入)与BATCH语句同步。事实上,BATCH是一个用词不当,因为它可能应该被称为" ATOMIC"代替。由于它的名称,它被严重误用,其误用会导致问题。但是,它确实保持原子上的突变,所以这确实有帮助。

基本上,仔细检查您的数据库要求。如果Cassandra没有削减它,那么试着找到一个。 CockroachDB(或其他一个NewSQL)可能更适合您所谈论的内容。它试图成为Postgres的一个插件,并且它与一些类似Cassandra的机制一起扩展,所以它可能值得研究。