gpt4 book ai didi

node.js - Mongodb 服务器套接字在 replSet 上关闭

转载 作者:可可西里 更新时间:2023-11-01 09:13:34 26 4
gpt4 key购买 nike

当我们进行大量并行连接时,我们遇到了 mongodb 套接字关闭的问题。

这是一个测试脚本:

var mongodb = require("mongodb");
var async = require("async");

mongodb.MongoClient.connect("mongodb://mongo-dev1:27017/test", function(err, db) {
if (err) { throw err; }

var calls = [];

var col = db.collection("test");

var count = 10000;
for(var i = 0; i < count; i++) {
(function(i) {
calls.push(function(cb) {
console.time("update_" + i);
col.update({ i : i }, { i : i }, { upsert : true }, function(err) {
console.timeEnd("update_" + i);

cb(err);
});
});
})(i);
}

async.parallel(calls, function(err) {
if (err) { throw err; }

console.log("done");
});
});

如果我运行该脚本,它将失败并出现以下错误 MongoError: server mongo-dev1:27017 sockets closed

mongodb本身的日志输出是

SocketException 处理请求,关闭客户端连接:9001 socket exception [SEND_ERROR] server [192.168.1.111:53556]

我无法弄清楚是什么机制导致套接字关闭。我相信等式的 Node 端挂断了,因为我的事件时间显示 Node 关闭事件发生在 mongodb 日志中的 SocketException 之前几毫秒。我已经进入 mongodb 包到 mongodb-core 并做了一些 console.log 事件的发起者是 at TCP.close (net.js:485:12)。这告诉我套接字本身正在关闭。基于此,感觉就像是 linux 本身正在关闭套接字或 mongoDB 主机盒,而不是 Node 或 MongoDB 在做这件事。不过我不确定如何证明这一点。

这是我考虑过但已排除的第一组选项:

  1. 套接字超时 - 如果是超时,则错误消息不同,我在构建连接时通过传递 socketTimeoutMS 选项验证了这一点。如果我传递一些小的东西,我会收到超时错误。

  2. MongoDB 连接不足 - 如果我使用 db.serverStatus().connections 监视 mongodb replset 上的连接,我仍然有大量可用连接。

  3. 当我与本地主机非副本集通信时,此行为不会复制。这可能是本地主机的事情,也可能是副本集的事情。

  4. 如果我将 parallel 更改为 parallelLimit 100,它会顺利完成。由于 Node 使用连接池,无论我是并行发送 1000 个还是一次并行发送 100 个,它对 MongoDB 的流量应该是相同的,因为它们都被迫进入相同的 10 个套接字。这有助于指导我这是一个 Node 问题。

使用 Node 10、 Node 12 和 MongoDB 2.6

最佳答案

我在重负载下遇到了同样的问题,但是在深入研究 mongodb 驱动程序时,我发现 socketTimeout 和 connectTimeout 的默认值设置为 30000 毫秒。

提高他们都解决了我的问题:

mongodb://m1.url.xyz:27017,m2.url.xyz:27017/test?replicaSet=myset&connectTimeoutMS=300000&socketTimeoutMS=300000&readPreference=secondary

(确保 ulimit 设置和 net.ipv4.tcp_keepalive_time 针对 mongodb 进行了优化) http://docs.mongodb.org/manual/faq/diagnostics/

关于node.js - Mongodb 服务器套接字在 replSet 上关闭,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32128577/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com