了解 MongoDB 超时设置

Posted

技术标签:

【中文标题】了解 MongoDB 超时设置【英文标题】:Understanding MongoDB timeout settings 【发布时间】:2021-02-21 18:32:35 【问题描述】:

我很难理解为我的应用程序配置的最佳超时设置是什么 超时设置分为三种类型:

connectTimeoutMS 套接字超时时间 最大时间毫秒

除此之外,我们还有:

保持活跃 池大小 自动重新连接

connectTimeout 对应于应用程序在指定时间范围内无法连接到 mongoDB 时的超时设置。我认为这会导致异常。

socketTimeoutMS对应于socket在关闭前等待从db服务器获得响应。

maxTimeMS 对应于在数据库中运行的操作的超时。这会导致异常。

socketTimeout 和 maxTimeout 有什么区别?我有一个要求,当请求数据库在 5 秒后超时时,我必须记录一个错误代码。未收到来自此数据库的响应。为此目的最佳超时设置是什么?

poolsize、keepAlive、自动连接如何与超时设置相关联?示例会很有用。

【问题讨论】:

【参考方案1】:

假设你有一个 mongod 正在运行。

您连接到它,并运行一个查询来扫描包含数百万文档的集合,而不是使用索引。

你会得到 maxTimeMS 的异常,因为查询运行的时间比那个长。

假设您的 mongod 变得非常过载。您的驱动程序仍然连接到套接字,但是当您发送另一个查询时,它会超时等待数据库响应套接字。这就是 socketTimeoutMS 参数控制的内容。

https://developer.mongodb.com/community/forums/t/connect-timeout-and-execution-timeout-in-nodejs-driver/2129/2 有一些很好的信息

也可以在https://docs.mongodb.com/drivers/node/faq#what-is-the-difference-between-connecttimeoutms-sockettimeoutms-and-maxtimems

Keepalive 在https://docs.mongodb.com/drivers/node/faq#what-does-the-keepalive-setting-do

如果您在该常见问题解答页面上找到“poolsize”页面,您将看到有关该内容的详细信息。

【讨论】:

【参考方案2】:

要解释的最简单的超时是套接字超时。每当在套接字上执行读取或写入时,如果读取或写入的时间超过超时时间,则操作将失败并出现错误。

然而,设置套接字超时远非简单。执行查询时,服务器在至少有一个文档(或确定没有文档匹配)之前不会回复。这意味着 套接字超时必须设置为至少与应用程序发出的最长运行查询一样高

另外,单个查询可能涉及多次读取或写入。因此,可以想象,慢速网络实际上不会触发超时。

解决这个问题的方法是 max time 和 keep-alives:

最大时间限制查询在服务器上执行的时间。超过此限制时,服务器将返回错误。然后应用程序知道查询花费了太长时间,而不是存在网络问题。此外,客户端停止等待的长时间运行的查询在完成之前不会在服务器上运行,这可能需要相当长的时间。 Keep-alive 是一个TCP feature,它定期从连接的一端向另一端发送“ping”,以识别死连接。 keep-alive 设置设置起来有些复杂,但旨在允许 长时间运行的查询 成功完成,同时相对快速地检测 网络错误。所有 MongoDB 驱动程序都将 keep-alives 配置为合理的默认值(大约 2 分钟),您可以根据需要降低间隔。

连接超时类似于套接字超时,但适用于首次建立连接时。因此,它可以设置为低于套接字超时,因为它不需要受查询执行时间的限制。通过设置较低的连接超时,可以在首次连接时更快地检测到死服务器。

池大小实际上与超时没有任何关系,并且自动重新连接是特定于驱动程序的选项,它也与超时不在同一类别中。

【讨论】:

连接何时处于活动状态? 这不是我使用的术语。

以上是关于了解 MongoDB 超时设置的主要内容,如果未能解决你的问题,请参考以下文章

使用 mongodb-memory-server 进行测试失败/超时

了解 Golang 上下文超时

MongoDB超时查询

mongodb 设置自动删除过期数据

是啥导致 AWS Lambda 上的 Mongodb 超时错误?

使用 Node.js 和 mongodb 处理超时