【问题标题】:When to use/use cases NoSQL?何时使用/用例 NoSQL?
【发布时间】:2014-08-07 20:20:24
【问题描述】:

如今,我们拥有大量 NoSQL 选项和一般的 NoSQL。 考虑到大多数初创公司/项目可以很好地处理传统的 RDBMS,放弃/忽略 RDBMS 并“盲目地”采用 NoSQL 是当今的趋势。

让我们从 NoSQL 定义开始:

NoSQL 定义:下一代数据库主要解决以下问题:非关系型、分布式、开源和水平可扩展。 (+ 无模式(实际上是隐式模式,比显式差得多)和最终一致性)。

NoSQL(至少是处理大数据的概念)是由 Google (BigTable)、Amazon (Dynamo)、Twitter 和 Facebook 等公司创建的。 Cassandra 和 Riak 就是从那里出生的。好像只有MongoDB是自己开发的,对谷歌和亚马逊发表的论文没有影响。

但大多数公司的运营规模并不如此大。 RDBMS 可能非常适合。我找不到 MySQL 或 PostgreSQL 可以以合理的性能处理的确切数据量(至少 PostgreSQL 说有 32TB 的数据库可用PostgreSQL FAQ)。

而且我们仍然可以使用 RDBMS 进行扩展。我们可以很容易地进行分片(在应用程序级别)(尽管分片重新平衡更具挑战性,并且可能是一个问题)。我们甚至可以通过这种方式进行复制和扩展“读取”(考虑到我们只写入“master”)。但在这种情况下,我们必须应对分布式挑战:复制延迟和最终一致性。我们可以仅针对数据集(例如,仅几个表)执行此操作,其中复制延迟不是问题/大问题。

为了获得更好的性能,可以引入缓存(redis 或 memcached)。

如果可能,您应该提前计划您的查询,以从 RDBMS 中获得最佳性能,并在此基础上构建您的 API,反之亦然。

当然,在 NoSQL 世界中没有 ACID 的替代品,当你需要它时,使用 RDBMS 比尝试在 NoSQL 之上发明 ACID 简单得多(这是由于 CAP 定理,是不可能的)。 Braintree 对 PostgreSQL 使用和扩展的精彩总结:Scaling PostgreSQL

RDBMS 的另一个用例通常是将“实时”表拆分为报告表,这些表可能具有不同的(更扁平的结构)执行更高性能的查询,或者您可以创建一个单独的表/视图,用于快速读取(但同意,这增加了更多复杂性,但至少有一些选择)。

那么,有哪些 NoSQL 有利于 RDBMS 的用例,以及当 NoSQL 成为解决问题的更合适的解决方案时,RDBMS 的限制是什么。系统架构师在选择 NoSQL 之前应该问哪些问题。

我确实相信简单(尽管简单并不容易),NoSQL 并不像听起来那么简单(没有免费的午餐)(另外考虑到开发人员已经拥有悠久的 RDBMS 专业知识,而且他们更一般成熟的产品),并且您将面临使用 NoSQL 的一系列分布式挑战,更不用说正确配置和监控集群的更多操作工作了。

【问题讨论】:

    标签: scalability rdbms acid nosql


    【解决方案1】:

    这个问题很难回答,因为与 RDBMS 相反,NoSQL 没有任何意义——如果不说明您将使用什么产品,使用 NoSQL 就没有任何意义。想象一下,您必须开发 SVN 的 NoSQL 实现并且您选择 Cassandra——现在您必须实现自己的文件版本控制,在每次提交中处理可能在过去某处存在(可能很多)列的事实) 保存文件的先前版本,并且您应该能够轻松地显示文件历史记录。在查看 NoSQL 世界一段时间后,您会发现 HBase,它与 Cassandra “相似”,但它免费提供列版本控制。哦!

    所以第一点是,NoSQL 产品必须根据具体的应用需求来选择。不要用螺丝刀去钉钉子。

    以下是个人意见,基于我对 Cassandra 的选择,以集成到一个流量非常高的网站中,以便对公司和其他内容进行评分和评论。

    • 性能优于一致性

    我正在处理公司而不是用户的 cmets,因此一致性不是一个真正的问题。如果评论在发布后没有立即可见,没有人会抱怨。我不会因为误读而超额预订航班。相反,由于网站有数百万的访问量,查询应该执行得非常快

    • 无单点故障

    评论和用户一旦集成,就会出现在网站的任何页面中,从主页到公司的详细信息页面。由于数据库问题,我无法关闭整个网站。我不为 Datastax 工作,所以信不信由你,在 4 年多的时间里,我们没有任何绒毛(碰木头)——选择该产品是因为它发现了 “无单点故障” (幸好这是真的!)

    • 查询驱动设计(O(1)“复杂”查询)

    在开始对数据进行建模之前,我已经知道我必须执行的确切查询。
    -- 所以像

    这样的查询
    SELECT * FROM comments where city='ROME' and vote=3 and userid='abc' ORDER BY timestamp DESC LIMIT 100
    

    执行速度非常快,因为存储数据只是为了针对特定查询进行检索(这就是为什么在 NoSQL 世界中您经常听到 1 个表 = 1 个查询)

    干杯, 卡罗

    【讨论】:

      猜你喜欢
      • 2012-05-20
      • 2011-02-21
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-04-16
      • 1970-01-01
      • 2014-01-21
      • 1970-01-01
      相关资源
      最近更新 更多