我们将一个ASP.NET MVC应用程序部署到Azure网站,该网站连接到MongoDB并执行读写操作.应用程序迭代地执行此操作.每分钟几千次.
我们使用Autofac初始化C#驱动程序,并按照https://groups.google.com/forum/#!topic/mongodb-user/_Z8YepNHnbI和其他一些地方的建议将MaxConnectionIdleTime设置为45秒.
我们仍然收到大量以下错误:
无法从传输连接读取数据:连接尝试失败,因为连接方在一段时间后没有正确响应,或者由于连接主机无法响应而建立连接失败.方法消息:":{"ClassName":"System.IO.IOException","Message":"无法从传输连接读取数据:连接尝试失败,因为连接方在一段时间后没有正确响应,或已建立的连接失败,因为已连接的主机无法响应.
在连接到Azure上相同数据中心/区域中的VM上部署的MongoDB实例时,以及连接到外部PaaS MongoDB提供程序时,我们会收到此错误.
我在本地计算机上运行相同的代码并连接到同一个数据库,但我没有收到这些错误.只有当我将代码部署到Azure网站时才会这样.有什么建议?
当Mongo数据库(版本3.0.5)从主数据库服务器复制到从服务器时,我得到套接字错误110(连接超时),更准确地说,在提交该数据库的复制时(从服务器的日志在下面).我想可能原因就是数据库很大并且发送操作提交需要花费太多时间.
如何为mongo服务器指定不同的套接字超时?如果不可能,有没有其他方法来修复复制?
我发现这样的选项只适用于mongo客户端(连接字符串选项socketTimeoutMS),但它对Mongo服务器没有帮助.
2016-04-26T13:36:34.693+0100 I INDEX [rsSync] done building bottom layer, going to commit
2016-04-26T13:36:34.693+0100 I INDEX [rsSync] build index done. scanned 30980334 total records. 4072 secs
2016-04-26T13:36:34.772+0100 I REPL [rsSync] initial sync cloning db: {skipped db name}
2016-04-26T13:36:34.823+0100 I NETWORK [rsSync] Socket say send() errno:110 Connection timed out {skipped ip}:27017
2016-04-26T13:36:34.828+0100 E REPL [rsSync] 9001 socket exception [SEND_ERROR] server [{skipped ip}:27017]
2016-04-26T13:36:34.828+0100 E REPL [rsSync] initial sync attempt failed, 9 attempts remaining
Run Code Online (Sandbox Code Playgroud)
更新.我在评论中被要求输出rs.status():
{ "set" : "<skippedsetname>",
"date" …Run Code Online (Sandbox Code Playgroud) 我有一个使用 MongoLab 插件托管在 Windows Azure 上的应用程序,我遇到了一个问题,即应用程序在我部署后运行良好,但是在几分钟不活动后,我收到一个数据库错误:
没有可用于使用 ReadPreference PRIMARY 查询的主副本集
在我重新启动相同模式返回的网站之前,此错误不会消失 - 直到错误返回几分钟后才能完美运行
我的基本应用代码:
mongoConnect(process.env.CUSTOMCONNSTR_MONGOLAB_URI, {
server: {
auto_reconnect: true,
socketOptions: {
socketTimeoutMS: 120000,
keepAlive: 1
}
},
replSet: {
socketOptions: {
socketTimeoutMS: 120000,
keepAlive: 1
}
}
}).then(function (db) {
//app configure ...
http.createServer(app).listen(app.get('port'), function () {
console.log("Express server listening on port " + app.get('port'));
});
});
Run Code Online (Sandbox Code Playgroud)
*mongoConnect 是 mongoclient.connect 的一个简单的“promisified”函数
我知道这是最佳实践,我正在与数据库建立一个连接,然后为所有请求重用该数据库对象。通过阅读https://support.mongolab.com/entries/23009358-Handling-dropped-connections-on-Windows-Azure 之类的内容,我将 sockettimeouts 设置为 2 分钟,以防止任何防火墙过早杀死套接字并自动重新连接到true 所以它们重新连接,但是这两种设置都不能解决问题。