【问题标题】:MongoDB closes connection on read operationMongoDB 在读取操作时关闭连接
【发布时间】:2021-10-27 15:45:29
【问题描述】:

我在 Ubuntu Server 16.04 下的 WiredTiger 上运行 MongoDB 4.0 来存储复杂的文档。其中一个集合存在问题:文档中有许多图像以 base64 字符串形式写入。 我知道这是一种不好的做法,但我需要一些时间来解决它。

因此,一些find 操作失败,但只有那些具有非空过滤器或skip 的操作失败。例如db.collection('collection').find({}) 运行正常,而db.collection('collection').find({category: 1}) 只是在超时后关闭连接。应该返回多少文档并不重要:如果有过滤器,每次都会弹出错误(即使它应该返回 0 个文档),而空查询始终执行良好,直到 skip 太大。

UPD:一些skip 值会使查询失败。 db.collection('collection').find({}).skip(5000).limit(1) 运行良好,db.collection('collection').find({}).skip(9000).limit(1) 需要很多时间但也执行,而 db.collection('collection').find({}).skip(10000).limit(1) 每次都失败。看起来有某种缓冲区,数据库在其中存储与查询相关的数据,并且在 10000 个文档上它耗尽了资源。该集合本身有大约 10500 个文档。此外,通过_id 搜索运行正常。不幸的是,我没有机会创建新索引,因为操作失败,就像read

在从集合中删除 base64 图像之前,我可以使用什么临时解决方案?

【问题讨论】:

  • 尝试使用explain 运行其中一个查询以查看规划器在做什么,并检查 mongod 日志是否有错误。
  • 尝试使用聚合,但我怀疑它会给出任何差异结果。 even if it should return 0 docs - 尝试设置 limit 1
  • @Joe 如果我这样做,查询会以超时结束,并且数据库会在约 30 秒后重新启动。我在日志中没有看到任何错误,只有关机-启动顺序。
  • @dododo 同样的事情
  • 然后,您可以查看服务器日志以查看问题(尝试设置 $comment docs.mongodb.com/v4.0/reference/operator/query/comment 以更快地找到相关日志)

标签: mongodb mongodb-query wiredtiger


【解决方案1】:

发生这种情况是因为这种有问题的数据方案会导致大量 RAM 使用。集合中的实体越多,需要的 RAM 就越多,不仅要运行良好,还要运行 find

使用 storage.wiredTiger.engineConfig.cacheSizeGB 配置选项增加 MongoDB 默认 RAM 使用率允许所有操作正常运行。

【讨论】:

  • 这似乎只是隐藏了潜在的问题。如果缓存已满,驱逐工作人员将进入以释放空间。除非 OOM 杀手对服务被杀死负责,否则还有其他因素会影响这一点。
  • @Joe 我认为这可能是带有 Docker-compose 附加组件的 Docker。在同一台机器上运行多个容器会使 RAM 的使用不那么明显。
猜你喜欢
  • 1970-01-01
  • 2016-08-10
  • 1970-01-01
  • 2015-01-10
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多