【问题标题】:Why is query isolation a good thing?为什么查询隔离是一件好事?
【发布时间】:2015-11-30 16:51:31
【问题描述】:

来自MongoDB Documentation

通常,分片环境中最快的查询是那些 mongos 将路由到单个分片

这对我来说似乎违反直觉。分片的全部意义不是横向传播数据和处理,而不是纵向吗?如果在多个分片上进行处理以便并行处理,会不会更快?

在这种情况下,为什么在一台机器上进行所有处理比在多台机器上进行更好?

【问题讨论】:

    标签: mongodb optimization sharding horizontal-scaling


    【解决方案1】:

    与所有一般性陈述一样,也有很多例外,但在我们讨论这些之前,或许通过调整措辞会更有意义:

    通常,分片环境中最快的查询是那些 mongos 可以轻松路由到单个分片

    对于mongos 将查询路由到单个分片,那么它通常会满足以下条件:

    • 它将利用分片键
    • 因此,它会被索引(分片键上总是有一个索引)
    • 它将具有良好的数据局部性(所有数据都在一个分片上)
    • 查询将在该分片可以响应时尽快返回
    • 如果您的大多数查询看起来像这样,您将很好地了解索引的内存命中(至少)

    这种类型的查询一般会比较快,如果你有这种类型的查询模式(很多人都这样做),那么这个说法基本是正确的。

    但是,如果您(例如)正在做一些计算密集型的事情,并且在大型数据集上很好地并行化(大型数据集上的复杂聚合),那么拆分您的工作肯定会有优势。

    但是,也有潜在的缺点 - mongos 必须从所有分片中获取结果并可能进行一些处理(想象在分片之间进行排序),因此结果只会与最慢的分片一样快(可能还有mongos)。

    最终,这一切都取决于您的工作量、数据分布以及您选择分片键的程度,但作为一般性陈述,这并没有错。

    【讨论】:

    • 我仍然不明白为什么它会更快。假设查询我运行一个普通查询(没有聚合框架的东西),它返回 1M 文档。如果它从 5 个分片读取 200k 文档,从 1 个分片读取 1M 文档,不是更好吗?为什么在这种情况下击中单个分片会更好。
    • 它可能会更快,特别是如果 200k 表示您可以在单个分片上放入内存中的(接近)最大文档量,因此您实际上是通过分片来扩展可用的常驻内存。但是,如果您必须在用例中添加这么多的序言以证明它更快,那么它确实不符合一般声明的要求。对于您的用例,该声明可能根本不适用,文档提供的是有关最常见的一般查询和使用模式的一些指导(如我所述)
    • 我想我不明白为什么在只有 1k 个文档的情况下拆分分片也不是更好 - 远低于任何内存限制。是的,一个分片可以快速拉动它们,但如果 5 个分片每个拉动 200 个,会不会更快?
    • 通常因为这样做和在 mongos 上整理结果是有成本的 - 通过 mongos 以有效的方式(假设顺序无关紧要)流式传输结果会降低成本,并且有分片缓慢的可能性,等待所有结果,潜在的延迟。同样,在某些情况下,当分布在分片上时,您可能会更快地获得结果,或者您可能不会(尤其是当潜在的延迟占总时间的很大一部分时)。最好的事情是什么?测试您的实际工作量并找出适合您的工作量。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-07-18
    • 2021-09-02
    相关资源
    最近更新 更多