我遇到过许多NoSQL数据库和SQL数据库。有不同的参数来衡量这些数据库的强弱,可伸缩性就是其中之一。横向和纵向缩放这些数据库有什么区别?
当前回答
公认的答案是水平与垂直缩放的基本定义。但与人们普遍认为的只有Cassandra、MongoDB等才能实现数据库的水平缩放不同,我想补充一点,任何传统的RDMS都可以实现水平缩放;而不使用任何第三方解决方案。
我知道很多公司,特别是基于SaaS的公司都这样做。这是使用简单的应用程序逻辑完成的。基本上,您需要一组用户,并将他们划分到多个DB服务器上。因此,例如,您通常会有一个存储客户端、DB服务器/连接字符串等的“元”数据库/表,以及一个存储客户机/服务器映射的表。
然后,只需将来自每个客户端的请求定向到它们映射到的DB服务器。
现在有些人可能会说这类似于水平分区,而不是“真正的”水平缩放,他们在某些方面是正确的。但最终结果是,您已经在多个DB服务器上扩展了数据库。
两种水平缩放方法之间的唯一区别是,一种方法(MongoDB等)缩放是由DB软件本身完成的。从这个意义上说,你是在“购买”规模。在另一种方法中(对于RDBMS水平缩放),缩放是由应用程序代码/逻辑构建的。
其他回答
你有一家公司,只有一名员工,但你当时有一个新项目,你雇佣了新的应聘者——这是横向扩展。其中,新候选是新机器,项目是对api的新流量/调用。
作为一个项目,IIT/NIT负责处理所有对api/流量的请求。如果任何时候对你的api有更多的请求,那就解雇他,换成一个高智商的NIT/IIT家伙——这是垂直缩放。
传统的关系数据库被设计为客户端/服务器数据库系统。它们可以水平缩放,但这样做的过程往往复杂且容易出错。像NuoDB这样的新SQL数据库是以内存为中心的分布式数据库系统,旨在横向扩展,同时保持传统RDBMS的SQL/AID财产。
有关NuoDB的更多信息,请阅读他们的技术白皮书。
还有一个没有提到的额外架构——基于SQL的数据库服务,它支持水平扩展,而不需要手动分片的复杂性。这些服务在后台进行分片,因此它们使您能够运行传统的SQL数据库,并像使用MongoDB或CouchDB等NoSQL引擎一样进行扩展。我熟悉的两个服务是EnterpriseDB for PostgreSQL和Xeround for MySQL。我看到了Xeround的一篇深入文章,它解释了为什么SQL数据库的扩展很困难,以及它们如何以不同的方式进行扩展——用一点盐来看待这一点,因为这是一篇供应商文章。还可以查看维基百科的云数据库条目,其中对SQL与NoSQL以及服务与自托管进行了很好的解释,列出了每种组合的供应商和扩展选项
是的,水平缩放意味着添加更多的机器,但这也意味着集群中的机器是相等的。MySQL可以通过使用副本在读取数据方面进行横向扩展,但一旦它达到服务器内存/磁盘的容量,就必须开始在服务器之间分割数据。这变得越来越复杂。由于复制速度通常太慢,无法跟上数据更改速度,因此在副本之间保持数据一致性通常是一个问题。
Couchbase也是一个很棒的NoSQL Horizontal Scaling数据库,用于许多商业高可用性应用程序和游戏,可以说是该类别中性能最高的数据库。它跨集群自动分区数据,添加节点很简单,而且您可以使用商品硬件、更便宜的虚拟机实例(例如,AWS使用大型而不是高内存、高磁盘机器)。它基于Membase(Memcached)构建,但增加了持久性。此外,在Couchbase的情况下,每个节点都可以执行读取和写入,并且在集群中都是平等的,只有故障切换复制(而不是像mySQL那样跨所有服务器进行完整数据集复制)。
性能方面,您可以看到一个优秀的Cisco基准:http://blog.couchbase.com/understanding-performance-benchmark-published-cisco-and-solarflare-using-couchbase-server
这里有一篇关于Couchbase架构的博客文章:http://horicky.blogspot.com/2012/07/couchbase-architecture.html
水平缩放意味着通过向资源池中添加更多机器来进行缩放,而垂直缩放意味着可以通过向现有机器添加更多功率(CPU、RAM)来进行缩放。
记住这一点的一个简单方法是将机器放在服务器机架上,我们在水平方向上添加更多机器,在垂直方向上向机器添加更多资源。
在数据库世界中,水平缩放通常基于数据的分区,即每个节点仅包含部分数据,在垂直缩放中,数据驻留在单个节点上,通过多核进行缩放,即在该机器的CPU和RAM资源之间分散负载。
通过水平扩展,通过将更多机器添加到现有池中,通常更容易动态扩展。垂直扩展通常限于单个机器的容量,超出该容量的扩展通常会导致停机,并有上限。
水平缩放的好例子有Cassandra、MongoDB、Google Cloud Spaner。。垂直缩放的一个很好的例子是MySQL-Amazon RDS(MySQL的云版本)。通过从小型机器切换到大型机器,它提供了一种简单的垂直缩放方式。此过程通常涉及停机时间。
内存数据网格(如GigaSpaces XAP、Coherence等)通常针对水平和垂直缩放进行优化,因为它们不绑定到磁盘。通过分区实现水平扩展,通过多核支持实现垂直扩展。
你可以在我之前的文章中阅读更多关于这个主题的内容:横向扩展与横向扩展以及NOSQL替代方案背后的共同原则
推荐文章
- 在Android SQLite中处理日期的最佳方法
- 使用{merge: true}设置的Firestore与更新之间的差异
- mysql_connect():[2002]没有这样的文件或目录(试图通过unix:///tmp/mysql.sock连接)在
- 使用电子邮件地址为主键?
- MongoDB在v4之前不兼容ACID意味着什么?
- 第一次设计数据库:我是否过度设计了?
- 我应该在SQL varchar(长度)中考虑电话的最长的全球电话号码是什么
- MySQL查询转储
- JSON有查询语言吗?
- phpMyAdmin错误>格式参数错误?
- 在PostgreSQL表已经创建后,我可以添加UNIQUE约束吗?
- 如何在MVC应用程序中缓存数据
- 在Laravel安全地移除迁移
- 使用MySQL Workbench创建一个新数据库
- GUID / UUID数据库键的优缺点