MongoDB 超时设置

发布时间 2024-01-02 14:51:26作者: abce

MongoDB 驱动程序为 Mongo 客户端提供了多个选项,用于处理使用过程中可能出现的不同网络超时错误。在某些情况下,这些选项的默认值可能不适合你的使用情况,因此,了解不同的 MongoClient 超时选项对于避免应用出现不可预知的挂起并提高性能至关重要。

 

在抽象层面上,每当使用 MongoClient 连接、发送或接收请求时,它都会使用在内部预定义的超时选项,以决定应用程序等待初始连接建立或服务器响应请求的时间。

 

典型的应用会根据业务逻辑与不同的数据库服务器进行交互。例如,付款历史记录可能在一个数据库群集上,而分析记录可能在另一个群集上。

 

当出现网络错误时,默认超时会严重影响应用程序的行为。如果你的分析服务器宕机,那么每个操作在失败前都将等待默认的 30 秒(这可能是你想要的,也可能不是)。

 

超时错误可能由不同因素导致,如网络问题、服务器或客户端设置配置错误以及写入操作延迟。

 

主要的超时类型

了解这些类型的超时对于掌握 MongoDB 的使用至关重要。主要有三种: 服务器选择超时、连接超时和套接字超时。

 

默认值从 1 秒到 30 秒不等,具体取决于应用程序的需求和工作负载。为防止出现此类问题,有必要对上述设置进行相应调整。

 

这包括驱动程序在中止新连接尝试前将使用的一定毫秒数,以及等待找到合适服务器的持续时间,以及通过套接字在客户端和服务器之间发送/接收数据的限制。

 

1.服务器选择超时

 

这是选择合适的服务器执行操作的时间,默认值为 30 秒。

 

如果在这段时间内找不到合适的服务器,就会出现 "超时错误"。这类故障可能有多种根本原因,如网络宕机、服务器方面的任何问题以及副本集内部主节点故障。

 

例如,如果由于网络问题或服务器端负载请求过大而导致连接出现问题,可能会造成与解析相关的延迟,从而引发超时问题。

 

超过 "服务器选择超时 "限制所造成的影响可能会损害 MongoDB 的效率,从而导致选择错误,即超时超过了允许的限制。

 

2.连接超时错误

 

连接超时定义了驱动程序在中止之前等待初始连接成功的时间(以毫秒为单位)。MongoDB 的 Java 和 Ruby 驱动程序默认将该参数设置为 10 秒--如果在该时间段内没有建立连接或新链接,则会放弃尝试。

 

服务器关闭或网络问题(如 IP/DNS 设置错误或端口号使用不当)都可能导致连接超时。

 

在这里设置过高的值可能会导致您的应用程序无法达到最佳性能,因为您会让系统一次又一次地等待建立联系的失败尝试,这就是为什么强烈建议测试不同的值,直到得出一个适合您的应用程序需要的值。这样做有助于确保最佳性能,同时保持足够的保护水平,防止不必要的连接尝试。

 

3.套接字超时

 

说到 MongoDB 中的套接字超时问题,可以使用 connectTimeoutMS 和 socketTimeoutMS 选项修改设置。

 

这些值有可能默认为操作系统级别的超时,也有可能为 TCP 连接定义精确的毫秒级时间限制,如果不满足这些限制,就会导致超时错误。

 

由于驱动程序无法在指定的时间内找到有效的 MongoDB 服务器,此类错误会对应用程序造成很大影响并导致故障。

 

为了解决这个问题,我们建议您检查客户端和服务器配置,仔细验证提供的所有连接详细信息是否准确,并在 Mongo 驱动程序端使用较大的套接字时间线延长设置截止时间,同时缩短查询时间,这样响应时间就不会太长,此外还要验证网络链接是否稳定/运行正常。

 

优化超时配置

要优化 Mongo 超时配置,必须检查连接设置,必要时调整保持连接的时间间隔,并抛出遇到的超时错误。

 

通过修改 MongoDB 驱动程序中的 connectTimeoutMS 选项,增加服务器选择超时设置有助于改善网络连接并加快系统的整体性能。

 

所有这些步骤都应根据应用需求量身定制,以确保运行顺畅,避免因连接不良或套接字掉线而导致超时,并在 MongoDB 配置过程中针对每种情况定义单独的限制。

 

配置 MongoDB 服务器选择超时

 

MongoDB 驱动程序配置和连接字符串可以包含 serverSelectionTimeoutMS 参数,用于控制成功选择的最长等待时间。这是新一代 Mongo 驱动程序(Java 版本 3.2.x+)中引入的。

 

默认情况下,该超时设置为 30,000 毫秒(30 秒),但建议用户将其保持在接近 15,000 毫秒(15 秒)的水平,因为它能够在不超过配置值的情况下加快 MongoDB 选举进程。修改该设置确实会影响性能。

 

如果在触发错误消息前给予过多的执行空间,那么消息响应时间可能会延长,而如果选择较短的等待时间,则在尝试与不可用服务器联系时会出现更频繁的连接错误。

 

设置连接超时参数

设置 MongoDB 连接超时参数是为了避免不必要的尝试,这取决于具体的使用情况和网络条件。

 

如果设置的值较低,则可以更快地检测到连接错误;如果设置的值较高,则可以更好地解决延迟或间歇性网络问题,不过过长的超时会导致应用程序挂起,几乎没有机会建立连接。

 

要适当配置这些值,请根据必要的标准调整 MongoDB 客户端设置中的 connectTimeoutMS 参数。然后验证连接是否正确,不要让连接等待时间过长而导致值高于需要的时间。

 

调整套接字超时以获得最佳性能

 

在调整 MongoDB 的套接字超时时,需要考虑连接超时和套接字超时等几个要素。前者是指驱动程序在放弃尝试连接前所等待的时间。后者指的是套接字处于非活动状态的时间。

 

要在不同的编程语言中确定这个时间,可以使用某些选项,如 connectTimeoutMS 或 MongoClientOptions 类,这些选项可以通过及时关闭连接来确保更高效的连接,但时间不能太短,以免因缺乏响应而导致经常性故障。

 

调整套接字超时对性能有很大影响,因为对预期持续时间的控制可确保资源不会在无限期的等待中浪费。

 

下面提供了一些示例代码,以说明 Java 和 Ruby 中的超时配置。

Java:

List<MongoCredential> creds = new ArrayList<MongoCredential>();  creds.add(MongoCredential.createCredential(username, DBname, password);
 
MongoClientOptions.Builder optionsBuilder = MongoClientOptions.builder();
 
optionsBuilder.connectTimeout(CONNECTION_TIME_OUT_MS);
 
optionsBuilder.socketTimeout(SOCKET_TIME_OUT_MS);
 
optionsBuilder.serverSelectionTimeout(SERVER_SELECTION_TIMEOUT_MS);
 
MongoClientOptions options = optionsBuilder.build();
 
Mongo m = new MongoClient(new ServerAddress(server , port), creds, options);

 

NodeJs:

var uri =  'mongodb://[username:password@]host[:port1]/[database]';
var options = { server:
               { socketOptions: 
                    { 
                        socketTimeoutMS: SOCKET_TIME_OUT_MS, 
                        connectTimeoutMS: CONNECTION_TIMEOUT_MS 
                    }
                }
              };
MongoClient.connect(uri, options, function(err, db) {
  if(!err) {
    console.log("We are connected");
  }
});

 

常见的超时故障排除

MongoDB 服务器选择超时问题,其根本原因可能有很多。这些原因包括副本集被认为没有主服务器、pod 意外崩溃或配置不正确(如 IP 和验证详细信息存储不当)。

 

 

诊断连接超时问题

在尝试诊断 MongoDB 中的连接超时错误时,必须检查服务器端和客户端的配置。要有效做到这一点,观察 "serverSelectionTimeoutMS "和connectTimeoutMS等设置,同时根据需要修改这些值,有助于防止由于网络故障或服务器/客户端参数配置不正确而导致的此类问题。

 

写操作延迟也可能导致超时,在排除故障时应将其考虑在内。

 

解决服务器选择延迟

应调整 MongoDB 中的超时值,以减少服务器选择延迟并提高服务器性能。

 

可能导致延迟的问题包括配置不正确的 IP 列表、服务器选择过程中超时、带锁的密集并发操作以及在副本集没有找到主节点的情况。

 

通过自定义超时的相关值,可以在响应速度和可靠性之间取得适当的平衡,从而减少 MongoDB 功能造成的延迟。

 

处理套接字超时异常

配置 MongoDB 时,必须适当调整套接字超时值,以确保可靠的网络连接并防止超时触发。

 

为此,可以使用 MongoDB Ruby 驱动程序中包含的 connect_timeout 设置,这些设置会限制操作在超时前等待响应的时间。

 

除了正确调整这些选项外,还必须采取其他步骤,例如优化连接池设置,以及在使用较新版本的软件时检查任何潜在的底层网络问题。

 

在通过提高超时限制来提高应用程序可靠性,或通过降低超时限制来提高性能之间找到最佳平衡点,是防止意外套接字超时异常发生,同时保持数据库环境足够响应时间的关键。

 

副本集中的超时考虑因素

在使用 MongoDB 时,副本服务器的可用性和状态会严重影响初始连接超时。将 serverSelectionTimeoutMS 降低到 15 秒、配置日志大小以实现副本间的高效同步,以及适当调整保持连接的时间间隔,都有助于优化服务器选择,从而最大限度地减少等待时间。

 

在进行更改之前必须慎重考虑。所做的调整可能会因等待时间过长或过短而影响整体性能,如果相关数据库不能立即可用,可能会导致更多的超时。

 

负载平衡和超时管理

在负载平衡请求时,超时值会受到网络延迟和数据传输延迟的影响。在调整负载平衡设置时,必须确定合适的请求超时时间,以获得有效的性能结果。