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