Nosql 传统RDBMS中的水平缩放

Nosql 传统RDBMS中的水平缩放,nosql,rdbms,horizontal-scaling,Nosql,Rdbms,Horizontal Scaling,我刚刚遇到了NoSQL系统,它们有着天赐的优势。其中之一似乎是毫不费力的水平缩放。我的问题是,为什么像MySQL或SQL Server这样的经典RDBMS不能进行水平扩展?或者不能像NoSQL系统那样做?原因有很多。这里有一个: 水平扩展通常通过分片实现——给定的实体存储在集群中的一台主机上,由该实体的某些功能决定。如果可能的话,跨碎片的连接效率极低。传统的关系型数据库依赖于数据的连接和并置,这通常会阻止有效的分片 我从@joews那里取了一个不同的存根 有些场景需要全文搜索。或者存储一些大容量

我刚刚遇到了NoSQL系统,它们有着天赐的优势。其中之一似乎是毫不费力的水平缩放。我的问题是,为什么像MySQL或SQL Server这样的经典RDBMS不能进行水平扩展?或者不能像NoSQL系统那样做?

原因有很多。这里有一个:


水平扩展通常通过分片实现——给定的实体存储在集群中的一台主机上,由该实体的某些功能决定。如果可能的话,跨碎片的连接效率极低。传统的关系型数据库依赖于数据的连接和并置,这通常会阻止有效的分片

我从@joews那里取了一个不同的存根

有些场景需要全文搜索。或者存储一些大容量的关键值数据。一些NoSQL系统,比如Lucene,有几种类型的索引可以并行扫描(想想看)。而传统的RDBMS搜索一次使用一个索引,有时甚至默认为昂贵的全表扫描

一些公司,如Facebook,已经将MySQL实例分片用于实时内容服务。但要做到这一点,您可能需要冒险更改MySQL源代码和/或在此基础上构建系统。你确定你准备好了吗

其他用例有如此多的数据,以至于它不适合传统RDBMS的查询模型,这就是为什么各种系统,比如Dremel、ApacheDrill和Presto都出现了

所有这些都说明了,记住一个事实,NoSQL系统根据它们如何处理著名的CAP定理而分组到桶中。Martin Fowler对我的口味给出了最简单的解释:在分布式系统的网络分区中,您可以保证数据的一致性(不同用户与系统的交互之间没有冲突)或系统的可用性(系统是可搜索的或数据是可接受的,无论是什么)。我强烈推荐观看Martin对NoSQL的介绍:


相反,RDBMS是事务性的,即它们提供全部或全部功能,如ATM机。如果它对于您的用例和使用量/数据量是可接受的,请使用它!如果不是这样,请查看NoSQL,但要研究环境并找到最佳选择。

有两种水平缩放视图:

1) 数据太多,单个RDBMS节点负担不起=>sharding

2) 您希望扩展到多个并发用户=>复制

案例1)很难,因为常规联接不起作用

案例2)并没有那么难,有集群选项,或者您可以使用JTA在Java中创建自己的“集群”方法,看看它是基于什么的,但也可以使用其他持久化的ORM


当然,您的问题可能是1)和2)的总和。

NoSQL系统可以解决更简单的问题。例如,没有连接或没有索引,这当然是可能的,因为NoSQL实现了连接。如果以这种方式进行切分,则这些连接可能位于同一切分上,性能不会受到严重影响。不过,RDBMS的另一个问题是,每个碎片必须具有相同的模式,否则事情会变得很奇怪。触发器在分片环境中的实现也极具挑战性