检查排队 reads/writes 的 MongoDB
Check queued reads/writes for MongoDB
我觉得以前有人问过这个问题,但我找不到了。如果这是重复,请原谅。
我正在 Heroku 中托管的 Node.js 上构建服务,并使用由 Compose 托管的 MongoDB。在重负载下,延迟最有可能来自数据库,因为服务层没有什么非常 CPU-heavy 的东西。因此,当 MongoDB 过载时,我想立即 return 一个 HTTP 503 而不是等待超时。
我也在使用 REDIS,REDIS 有一个功能,您可以在其中检查排队命令的数量 (redisClient.command_queue.length)。有了这个功能,我可以马上知道是否备份了 REDIS。 MongoDB 有类似的东西吗?
到目前为止,我发现的最佳选择是通过 this command 轮询服务器的状态,但是 (1) 我希望在客户端有一些东西,因为轮询间隔内可能会出现尖峰,这会导致问题,以及 (2) 我实际上不确定我想对状态响应的哪一部分采取行动。第二部分让我提出一个后续问题...
我不完全理解 MondoDB 客户端如何与服务器一起工作。每个客户端实例(在我的例子中是每个进程)是否共享一个连接?查询和写入是在本地排队还是在服务器上排队?或者,是否为每个 query/write 打开一个连接,直到数据库的连接池耗尽?如果是后者,看来我可能想密切关注打开的连接。 MongoDB 服务器 return 是否在其他时间提供此类信息,除了轮询状态时?
谢谢!
MongoDB连接池工作流程-
每个 MongoClient 实例都有一个内置的连接池。客户端按需打开套接字以支持应用程序所需的并发 MongoDB 操作数。套接字没有线程亲和性。
客户端实例,在您的 MongoDB 拓扑中为每个服务器打开一个额外的套接字,用于监视服务器的状态。
每个连接池的大小上限为 maxPoolSize
,默认为 100。
当您的应用程序中的线程开始对 MongoDB 进行操作时,如果所有其他套接字都在使用中并且池已达到其最大值,线程将暂停,等待套接字返回到池中通过另一个线程。
你可以增加maxPoolSize
:
client = MongoClient(host, port, maxPoolSize=200)
默认情况下,允许任意数量的线程等待套接字变为可用,并且它们可以等待任意长度的时间。覆盖 waitQueueMultiple
以限制等待线程的数量。例如,要保持服务员的数量小于或等于 500:
client = MongoClient(host, port, maxPoolSize=50, waitQueueMultiple=10)
一旦池达到其最大大小,额外的线程将被允许无限期地等待套接字变为可用,除非您设置 waitQueueTimeoutMS
:
client = MongoClient(host, port, waitQueueTimeoutMS=100)
连接池参考-
http://blog.mongolab.com/2013/11/deep-dive-into-connection-pooling/
我觉得以前有人问过这个问题,但我找不到了。如果这是重复,请原谅。
我正在 Heroku 中托管的 Node.js 上构建服务,并使用由 Compose 托管的 MongoDB。在重负载下,延迟最有可能来自数据库,因为服务层没有什么非常 CPU-heavy 的东西。因此,当 MongoDB 过载时,我想立即 return 一个 HTTP 503 而不是等待超时。
我也在使用 REDIS,REDIS 有一个功能,您可以在其中检查排队命令的数量 (redisClient.command_queue.length)。有了这个功能,我可以马上知道是否备份了 REDIS。 MongoDB 有类似的东西吗?
到目前为止,我发现的最佳选择是通过 this command 轮询服务器的状态,但是 (1) 我希望在客户端有一些东西,因为轮询间隔内可能会出现尖峰,这会导致问题,以及 (2) 我实际上不确定我想对状态响应的哪一部分采取行动。第二部分让我提出一个后续问题...
我不完全理解 MondoDB 客户端如何与服务器一起工作。每个客户端实例(在我的例子中是每个进程)是否共享一个连接?查询和写入是在本地排队还是在服务器上排队?或者,是否为每个 query/write 打开一个连接,直到数据库的连接池耗尽?如果是后者,看来我可能想密切关注打开的连接。 MongoDB 服务器 return 是否在其他时间提供此类信息,除了轮询状态时?
谢谢!
MongoDB连接池工作流程-
每个 MongoClient 实例都有一个内置的连接池。客户端按需打开套接字以支持应用程序所需的并发 MongoDB 操作数。套接字没有线程亲和性。
客户端实例,在您的 MongoDB 拓扑中为每个服务器打开一个额外的套接字,用于监视服务器的状态。
每个连接池的大小上限为 maxPoolSize
,默认为 100。
当您的应用程序中的线程开始对 MongoDB 进行操作时,如果所有其他套接字都在使用中并且池已达到其最大值,线程将暂停,等待套接字返回到池中通过另一个线程。
你可以增加maxPoolSize
:
client = MongoClient(host, port, maxPoolSize=200)
默认情况下,允许任意数量的线程等待套接字变为可用,并且它们可以等待任意长度的时间。覆盖 waitQueueMultiple
以限制等待线程的数量。例如,要保持服务员的数量小于或等于 500:
client = MongoClient(host, port, maxPoolSize=50, waitQueueMultiple=10)
一旦池达到其最大大小,额外的线程将被允许无限期地等待套接字变为可用,除非您设置 waitQueueTimeoutMS
:
client = MongoClient(host, port, waitQueueTimeoutMS=100)
连接池参考- http://blog.mongolab.com/2013/11/deep-dive-into-connection-pooling/