QA: 为什么NoSQL数据库比关系型数据库更可伸缩?
AN: 关系型数据库遵循ACID原则;Nosql数据库遵循BASE原则。这个问题的答案与 NoSQL和SQL无关,而与BASE和ACID有关。
首先,RDBMS为了保持数据完整性和支持事务,多服务器RDBMS将需要具有快速的后端通信通道以同步所有可能的事务和写入,同时防止/处理死锁。
其次,可伸缩性必须分解成其组成部分:
读取扩展=处理更多数量的读取操作
写扩展=处理更大数量的写操作
符合ACID的数据库(如传统RDBMS的数据库)可以扩展读取。它们本质上不比NoSQL数据库低效率,因为(可能)性能瓶颈是由NoSQL(有时)缺乏(例如联接和位置限制)引起的,您可以选择不使用它们。群集SQL RDBMS可以通过在群集中引入其他节点来扩展读取。读操作可以扩展到多远,这是有限制的,但是当您在集群中引入更多节点时,很难扩展写操作。
写扩展是事情变得繁琐的地方。ACID原则施加了各种约束,您在最终一致(BASE)架构中看不到这些约束:
- 原子性意味着交易必须整体上完成或失败,因此必须在幕后进行大量记账以保证这一点。
- 一致性约束意味着群集中的所有节点必须相同。如果您写入一个节点,则在将响应返回给客户端之前,必须将该写入复制到所有其他节点。这使得传统的RDBMS集群难以扩展。
- 持久性约束意味着,为了永不丢失写入,您必须确保在将响应返回给客户端之前,已将写入刷新到磁盘。
为了扩大写操作或集群中节点的数量超过某个点,您必须能够放宽一些ACID要求:
- 删除原子性可让您缩短锁定表(数据集)的持续时间。示例:MongoDB,CouchDB。
- 删除一致性使您可以扩大群集节点之间的写入。例如:riak,cassandra。
- 降低持久性使您无需写入磁盘即可响应写命令。示例:memcache,redis。
NoSQL数据库通常遵循BASE模型而不是ACID模型。他们放弃了A,C和/或D要求,反过来又提高了可伸缩性。有些工具(例如Cassandra)可让您在需要时选择ACID的担保。但是,并非所有NoSQL数据库始终都具有更好的可伸缩性。
原味地址:为什么NoSQL数据库比SQL更可伸缩