【问题标题】:Pro's of databases like BigTable, SimpleDB专业的数据库,如 BigTable、SimpleDB
【发布时间】:2010-09-15 14:57:56
【问题描述】:

Google BigTable 和 Amazon SimpleDB 等新的学校数据存储范例专为可扩展性等而设计。基本上,禁止连接和非规范化是实现此目的的方法。

然而,在this 主题中,共识似乎是大型表上的联接不一定必须太昂贵,并且非规范化在某种程度上被“高估”了 那么,为什么上述这些系统不允许连接并将所有内容强制放在一个表中以实现可伸缩性?是否需要在这些系统中存储大量数据(数 TB)?
数据库的一般规则是否根本不适用于这些规模? 是因为这些数据库类型是专门为存储许多相似的对象而定制的吗?
还是我错过了一些更大的图景?

【问题讨论】:

    标签: database scalability bigtable amazon-simpledb key-value-store


    【解决方案1】:

    分布式数据库并不像 Orion 所暗示的那样天真;在优化分布式数据集上的完全关系查询方面已经做了很多工作。您可能想看看 Teradata、Netezza、Greenplum、Vertica、AsterData 等公司在做什么。 (甲骨文最终也加入了这场游戏,他们最近宣布了这一消息;微软以曾经称为 DataAllegro 的公司的名义购买了他们的 solition)。

    话虽如此,当数据扩展到 TB 时,这些问题变得非常重要。如果您不需要可以从 RDBM 获得的严格事务性和一致性保证,那么反规范化和不进行连接通常要容易得多。特别是如果您不需要太多交叉引用。特别是如果您不进行临时分析,但需要通过任意转换进行编程访问。

    非规范化被高估了。仅仅因为在处理 100 Tera 时会发生这种情况,并不意味着每个从不费心学习数据库并且由于架构规划和查询优化不佳而无法查询一百万或两行的开发人员都应该使用这个事实.

    但如果你在 100 Tera 范围内,无论如何......

    哦,这些技术受到关注的另一个原因是——人们发现有些东西从一开始就不属于数据库,并且意识到他们不是在处理特定领域的关系,而是与基本键值对。对于不应该在数据库中的东西,完全有可能 Map-Reduce 框架或一些持久的、最终一致的存储系统就是这样。

    在较少的全球范围内,我强烈推荐使用 BerkeleyDB 来解决这类问题。

    【讨论】:

      【解决方案2】:

      我对它们不太熟悉(我只阅读了与其他人相同的博客/新闻/示例),但我的看法是,它们选择牺牲了名称中的许多正常关系数据库功能可扩展性 - 我会尝试解释。

      假设您的数据表中有 200 行。

      在 google 的数据中心中,其中 50 行存储在服务器 A 上,50 行存储在服务器 B 上,100 行存储在服务器 C 上。此外,服务器 D 包含来自服务器 A 和 B 的数据的冗余副本,服务器 E 包含服务器上的数据的冗余副本服务器 C.

      (在现实生活中我不知道会使用多少台服务器,但它被设置为处理数百万行,所以我想有不少)。

      要“选择 * where name = 'orion'”,基础架构可以将该查询发送到所有服务器,并汇总返回的结果。这使他们可以在任意数量的服务器上进行线性扩展(仅供参考,这几乎就是 mapreduce)

      然而,这意味着您需要做出一些权衡。

      如果您需要对一些数据进行关系连接,这些数据分布在 5 台服务器上,那么这些服务器中的每一个都需要从彼此之间提取数据每一行。当您有 200 万行分布在 10 台服务器上时,请尝试这样做。

      这导致权衡 #1 - 无连接。

      此外,根据网络延迟、服务器负载等,您的某些数据可能会立即保存,但有些可能需要一两秒钟。同样,当您有数十台服务器时,保存时间会越来越长,并且'每个人都等到最慢的人完成'的常规方法不再可以接受。

      这导致了权衡 #2 - 您的数据在写入后可能并不总是立即可见。

      我不确定还有哪些其他权衡,但在我看来,这就是主要的 2 个。

      【讨论】:

        【解决方案3】:

        所以我得到的是整个“非规范化,无连接”的哲学存在,不是因为连接本身不能在大型系统中扩展,而是因为它们实际上不可能在分布式数据库中实现。

        当您存储单一类型的大部分不变数据时(就像 Google 所做的那样),这似乎很合理。我在正确的轨道上吗?

        【讨论】:

        • 你已经成功了。还要加上'几乎不需要交叉引用不同“表”中的数据'
        【解决方案4】:

        如果您谈论的是几乎只读的数据,则规则会发生变化。在数据更改的情况下,非规范化是最难的,因为所需的工作增加并且锁定问题更多。如果数据几乎没有变化,那么非规范化就不是什么大问题了。

        【讨论】:

        • 另外,如果更新或删除时的数据级联是不可取的,或者更改失败不是负面的;非规范化似乎也有意义,或者至少不是一个糟糕的选择。例如,如果发票行项目只是对具有固定价格的库存的参考,那么它们将毫无用处,因为当库存更新价格时,发票会错误地报告金额。这个例子很复杂,可以在没有非规范化的情况下解决,但是大多数解决方法会增加活动集的大小或从内聚的 RDBMS 中取出数据
        【解决方案5】:

        Novaday 您需要为数据库找到更多的互操作环境。更频繁地,您不仅需要 MySQL 或 MS SQL 等关系数据库,还需要 Hadoop 等大数据场或 MongoDB 等非关系数据库。在某些情况下,所有这些 DB 都将在一个解决方案中使用,因此它们的性能在宏观范围内必须尽可能相同。这意味着,您将无法将 Azure SQL 用作关系数据库和一个具有 2 个内核和 3GB RAM 的 MongoDB 虚拟机。您必须在可能的情况下扩展您的解决方案并使用数据库即服务(如果不可能,则在云中构建您自己的集群)。

        【讨论】:

        • 这读起来像是流行语和糟糕语法的集合。非常抱歉,但读起来并不容易。请考虑重新组织内容以更易于阅读。
        猜你喜欢
        • 1970-01-01
        • 2022-07-13
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2011-01-22
        • 1970-01-01
        • 2010-12-02
        • 2017-06-16
        相关资源
        最近更新 更多