【发布时间】: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