【问题标题】:Scaling in nosql vs rdbms?在 nosql 与 rdbms 中缩放?
【发布时间】:2016-03-31 05:03:46
【问题描述】:

我试图了解 nosql 和关系数据库在可扩展性方面的架构差异。

我对可扩展性(水平)的理解是,随着数据的增长,我们会添加越来越多的服务器来平均分配负载。

在键值NO-SQL数据库中,我们可以添加新机器并拆分键。然而,到目前为止,我看到的所有示例都可以理解 NO-SQL 数据库中的最终一致性,它们都具有主从配置,其中数据在所有从属设备之间复制,而不是在不同的机器上拆分以实现可伸缩性。

我的问题是,使用复制整个数据不会破坏 No-SQL 数据库的可扩展性吗?在 RDBMS 中也可以这样做,只有一个 master(用于写入)和一个 slave(用于读取),NO-SQL 在这方面如何更具可扩展性?

【问题讨论】:

标签: database scalability nosql


【解决方案1】:

NoSQL 数据库中的主从配置是为了 高可用性 目的和数据一致性,不要与 可扩展性 的目的相混淆,即负载平衡工作负载.

【讨论】:

  • 如果跨多台服务器的复制有助于实现高可用性,我们如何实现可扩展性/负载平衡?
【解决方案2】:

在 NoSQL 中,就拆分键而言,只有主副本很重要。从站通常用于 HA 和可用性。实际上,这种复制负责最终的一致性——您将立即获得数据,可能不是最新的数据,但最终您将获得更新的数据。

另一方面,RDBMS 将具有较慢的数据访问/修改,因为它必须遵循 ACID 属性,并且大多数情况下具有强一致性。

复制不是区分因素,因此,在 NoSQL 和 RDBMS 之间,是否遵守 ACID 属性才是。可扩展性也不意味着没有额外的副本。希望得到答案。

【讨论】:

    【解决方案3】:

    要回答您的问题,复制数据并不会破坏可扩展性这一点。

    可扩展性大致是指扩展数据库的能力,不一定与拥有更多数据库副本有关。

    如其他答案所述,更多带有数据库信息的服务器允许更多用户随时可用访问它。

    我认为这可能是 ScalabilityAvailability 之间的误解?

    【讨论】:

    • 好吧,我明白了,多副本==高可用,所以如果一个坏了,我们还有其他的,我们如何在rdbms和no-sql中实现高扩展性?
    • 我目前是一名学生,没有太多实施这些系统的经验,我只学过理论。我发现了另一个堆栈交换帖子,它可能比我能帮助你更多。此线程中的答案比我所能收集的要详细得多,结构也更好:programmers.stackexchange.com/questions/194340/…
    【解决方案4】:

    可扩展性的目标是增加给定应用程序的整体容量,可以是垂直的(更大的机器)或水平的(添加更多机器)。说到水平扩展,你可以添加更多的机器,但是随着机器数量的增加,集群中某个节点发生故障的概率也会增加,这是需要牢记的。

    当你添加更多节点时,你可以做的要么是拆分数据,称为sharding,也可以复制数据,称为replication .

    复制

    使用复制,通常的架构是主从,你只能写到主,谁将数据复制到从,所以这意味着你不能使用复制将写入拆分到集群,但它是可以拆分读取,具体取决于一致性级别(并非所有 NoSQL 技术都提供相同的级别)和集群配置。

    分片

    分片更适合提供缩放功能,因为您可以尽可能将数据集拆分为大小相似的多个部分。这显然允许将读取和写入拆分到不同节点的好处。为了使其发挥作用,需要建立一些机制:

    • 路由:定位数据存储在哪个分片中,或者决定写入哪个分片
    • 平衡:随着时间的推移保持数据集不同片段的大小具有相似的大小。

    但通常这些机制是由数据库供应商提供的,因此无需担心提供,但仍然需要了解管理集群。

    这里的问题是,正如我一开始提到的,集群的节点越多,给定节点发生故障的机会就越高,这意味着如果具有部分数据集的节点下线,部分数据将不可用,这不是理想的情况。但幸运的是,分片和复制不是唯一的,是否可以构建一个分片集群,其中每个分片都是一个集群,并且复制到位。

    但是为了回答你的问题

    不使用复制整个数据会破坏整个观点 No-SQL 数据库的可扩展性?

    在主从架构中,不能拆分写入,但可以拆分读取,这在某种程度上是一种扩展方式,但主要目的是高可用性。

    无论如何,有一些新的新兴数据库开始提供多主架构,其中所有节点都充当主节点,这意味着所有节点都可以接收写入和读取。

    同样可以在 RDBMS 中完成,只有一个 master(用于写入)和 从属(用于读取),NO-SQL 在这方面如何更具可扩展性?

    在单节点环境中,当涉及JOINS 时,NoSQL 已经比 RDBMS 快,因为它是一项昂贵的操作,或者涉及大量完整性检查。

    因此,当您尝试在 RDBMS 中对数据集进行分片时,除非经过精心设计,否则最有可能出现的情况是所需数据位于不同的分片中。这意味着需要在不同节点之间执行 JOIN 和完整性检查,这使得它们的操作比现在更昂贵。

    这意味着 RDBMS 数据库在您打算水平扩展时使用充当约束的机制,而 NoSQL 没有。是的,您仍然可以水平扩展 RDBMS,但总体而言会比使用 NoSQL 数据库更昂贵。


    更新:图数据库特别提及

    图数据库中的分片确实很困难,因为从数学上讲,在不同服务器之间分配大图的问题是 NP 完全的。而且,当必须在不同分片之间查询数据时,图的主要特征之一是丢失,快速横向。

    我看到了图形数据库水平扩展的两种主要方法:

    1) 让应用程序/开发人员决定如何对图进行分区,您可以想象这有多复杂。

    2) 复制所有节点中的所有图并使用缓存分片,这意味着所有节点都拥有整个数据集,但每个节点在内存中维护对该节点查询最多的图部分特别是。

    我猜,未来图数据库公司会开发更多的解决方案来解决这个问题。

    与您的问题有关,在当前状态下,由于缺乏 RDBMS 约束,图形数据库在水平扩展方面仍然可以超过 RDBMS,但很难在不同的 NoSQL 数据库类型之间进行比较。

    【讨论】:

      【解决方案5】:

      如果我们只考虑键值数据库和 SQL 数据库,那么前者比后者更适合可扩展性。

      这是因为键值对存储没有事务。所以你唯一的保证是你可以原子地改变一个键的一个值。这导致易于扩展。

      例如,您只是散列一个键并将键值对存储在与该键的散列相对应的机器上。

      如果不丢失 ACID(事务的原子性、一致性、隔离性、持久性)属性,您将无法对 SQL 数据库执行相同的操作。此外,如果您将不同的表或表的不同部分存储在不同的机器上,您甚至无法轻松执行连接 SELECT。

      因此,一般而言,NoSQL 数据库比 SQL 数据库更适合跨多台机器进行分片。

      【讨论】:

        猜你喜欢
        • 2016-09-05
        • 2012-07-25
        • 1970-01-01
        • 2013-05-04
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2015-09-09
        • 1970-01-01
        相关资源
        最近更新 更多