可扩展性的目标是增加给定应用程序的整体容量,可以是垂直的(更大的机器)或水平的(添加更多机器)。说到水平扩展,你可以添加更多的机器,但是随着机器数量的增加,集群中某个节点发生故障的概率也会增加,这是需要牢记的。
当你添加更多节点时,你可以做的要么是拆分数据,称为sharding,也可以复制数据,称为replication .
复制
使用复制,通常的架构是主从,你只能写到主,谁将数据复制到从,所以这意味着你不能使用复制将写入拆分到集群,但它是可以拆分读取,具体取决于一致性级别(并非所有 NoSQL 技术都提供相同的级别)和集群配置。
分片
分片更适合提供缩放功能,因为您可以尽可能将数据集拆分为大小相似的多个部分。这显然允许将读取和写入拆分到不同节点的好处。为了使其发挥作用,需要建立一些机制:
- 路由:定位数据存储在哪个分片中,或者决定写入哪个分片
- 平衡:随着时间的推移保持数据集不同片段的大小具有相似的大小。
但通常这些机制是由数据库供应商提供的,因此无需担心提供,但仍然需要了解管理集群。
这里的问题是,正如我一开始提到的,集群的节点越多,给定节点发生故障的机会就越高,这意味着如果具有部分数据集的节点下线,部分数据将不可用,这不是理想的情况。但幸运的是,分片和复制不是唯一的,是否可以构建一个分片集群,其中每个分片都是一个集群,并且复制到位。
但是为了回答你的问题
不使用复制整个数据会破坏整个观点
No-SQL 数据库的可扩展性?
在主从架构中,不能拆分写入,但可以拆分读取,这在某种程度上是一种扩展方式,但主要目的是高可用性。
无论如何,有一些新的新兴数据库开始提供多主架构,其中所有节点都充当主节点,这意味着所有节点都可以接收写入和读取。
同样可以在 RDBMS 中完成,只有一个 master(用于写入)和
从属(用于读取),NO-SQL 在这方面如何更具可扩展性?
在单节点环境中,当涉及JOINS 时,NoSQL 已经比 RDBMS 快,因为它是一项昂贵的操作,或者涉及大量完整性检查。
因此,当您尝试在 RDBMS 中对数据集进行分片时,除非经过精心设计,否则最有可能出现的情况是所需数据位于不同的分片中。这意味着需要在不同节点之间执行 JOIN 和完整性检查,这使得它们的操作比现在更昂贵。
这意味着 RDBMS 数据库在您打算水平扩展时使用充当约束的机制,而 NoSQL 没有。是的,您仍然可以水平扩展 RDBMS,但总体而言会比使用 NoSQL 数据库更昂贵。
更新:图数据库特别提及
图数据库中的分片确实很困难,因为从数学上讲,在不同服务器之间分配大图的问题是 NP 完全的。而且,当必须在不同分片之间查询数据时,图的主要特征之一是丢失,快速横向。
我看到了图形数据库水平扩展的两种主要方法:
1) 让应用程序/开发人员决定如何对图进行分区,您可以想象这有多复杂。
2) 复制所有节点中的所有图并使用缓存分片,这意味着所有节点都拥有整个数据集,但每个节点在内存中维护对该节点查询最多的图部分特别是。
我猜,未来图数据库公司会开发更多的解决方案来解决这个问题。
与您的问题有关,在当前状态下,由于缺乏 RDBMS 约束,图形数据库在水平扩展方面仍然可以超过 RDBMS,但很难在不同的 NoSQL 数据库类型之间进行比较。