为啥直接搜索 MongoDB 分片的全文搜索比通过集群管理器 (mongos) 实例快得多?

Posted

技术标签:

【中文标题】为啥直接搜索 MongoDB 分片的全文搜索比通过集群管理器 (mongos) 实例快得多?【英文标题】:Why is full text search of MongoDB shards directly much faster than going through the cluster manager (mongos) instance?为什么直接搜索 MongoDB 分片的全文搜索比通过集群管理器 (mongos) 实例快得多? 【发布时间】:2019-02-06 19:00:16 【问题描述】:

我一直对 MongoDB 中的全文搜索性能非常不满意,因此我一直在寻找开箱即用的解决方案。相对较小的 2500 万个文档集合分布在 8 台强大的机器上(4 个具有冗余的分片),我看到一些查询需要 10 秒。那太可怕了。在云雀上,我尝试了 10 秒直接查询分片,似乎 mongos 将查询串行发送到分片,而不是并行发送。在 4 个分片中,我看到一个分片的搜索时间为 2.5 秒,而其他 3 个分片的搜索时间各不到 2 秒。总共不到 8.5 秒,但通过 mongos 花了 10 秒。掌心。

有人可以确认这些对分片的查询是连续运行的吗?或者提供一些其他的解释?

直接查询分片有哪些陷阱?

我们在 4.0 上,查询看起来像这样:

db.items.aggregate(
[
    "$match" : 
    "$text" :  "$search" : "search terms"
      
   , 
    "$project":  "type_id" : 1, "source_id": 1  ,
    "$facet" :  "types" : [  "$unwind" : "$type_id" ,  "$sortByCount" : "$type_id"] , "sources" : [  "$unwind" : "$source_id" ,  "$sortByCount" : "$source_id"]
]
);

我之前犯了一个错误,这是正在发送的查询有问题。我与一位 MongoDB 专家交谈,并了解了正在发生的事情的很大一部分(我认为),但很高兴看到其他人不得不说什么,以便我可以支付赏金并将其正式公布。

【问题讨论】:

你的 mongo 版本是什么?你的查询是什么样的?它是否使用其他条件而不是 $search,或额外的排序? 更新了描述。 您能否详细介绍一下您是如何创建文本索引的?你的分片是如何组织的?你有副本集(有多少)? 如果知道哪些查询需要更长的时间,您应该检查这些查询是否使用 btreeCursor 使用 db.collectionName.find(Query).explain() @ChrisSeline 你如何衡量你的查询时间?我很确定 scatter-gather 是并行运行的 【参考方案1】:

有人可以确认这些对分片的查询是连续运行的吗?要么 提供其他解释?

查询中没有分片键,查询将发送到所有分片并并行处理。但是,所有分片的结果将在主分片合并,因此它会等到最慢的分片返回。

直接查询分片有哪些陷阱?

您可能会包含孤立的文档。通过mongos 查询还检查孤立文档以确保数据一致性。因此,通过mongos 查询比直接从每个分片查询的开销更大。

使用 Robo 3T 的查询时间测量

使用 Robo 3T 无法正确测量查询时间。默认情况下,Robo 3T 返回前 50 个文档。对于驱动程序实现,如果返回的文档数量超过默认批量大小,要检索所有文档,将有getmore 请求跟随到数据库。 Robo 3T 只为您提供第一批,即结果的子集。

要评估您的查询,请将explain('executionStats') 添加到您的查询中。性能损失可能是分片之间的数据传输。由于查询中缺少分片键,所有分片的结果必须在合并之前发送到一个分片。总时间不仅是mongo引擎的查询时间(定位文档),还有文档检索时间。

执行下面的命令,您将看到每个分片的 inputStages 以更好地评估您的查询。

db.items.explain('executionStats').aggregate(
[
    "$match" : 
    "$text" :  "$search" : "search terms"
      
   , 
    "$project":  "type_id" : 1, "source_id": 1  ,
    "$facet" :  "types" : [  "$unwind" : "$type_id" ,  "$sortByCount" : "$type_id"] , "sources" : [  "$unwind" : "$source_id" ,  "$sortByCount" : "$source_id"]
]
);

【讨论】:

以上是关于为啥直接搜索 MongoDB 分片的全文搜索比通过集群管理器 (mongos) 实例快得多?的主要内容,如果未能解决你的问题,请参考以下文章

solr or es 结合弥补mongodb的全文检索功能

es笔记全文搜索倒排索引路由分片理解

数据库-Elasticsearch进阶学习笔记(分片映射分词器即时搜索全文搜索等)

什么是全文搜索的正确 mongodb 集合结构?

确切的短语在 mongodb 全文搜索中无法正常工作

MongoDB全文搜索和查找运算符