如何为MongoDB服务器从属副本指定套接字超时

时间:2016-04-26 16:37:02

标签: mongodb sockets database-replication replicaset

当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

更新。我在评论中要求输出rs.status():

{       "set" : "<skippedsetname>",
        "date" : ISODate("2016-05-04T15:35:06.717Z"),
        "myState" : 5,
        "syncingTo" : "<skipped domain name of other server>:27017",
        "members" : [
                {
                        "_id" : 0,
                        "name" : "<skipped domain name of this server>:27017",
                        "health" : 1,
                        "state" : 5,
                        "stateStr" : "STARTUP2",
                        "uptime" : 29,
                        "optime" : Timestamp(0, 0),
                        "optimeDate" : ISODate("1970-01-01T00:00:00Z"),
                        "syncingTo" : "<skipped domain name of other server>:27017",
                        "configVersion" : 9,
                        "self" : true
                },
                {
                        "_id" : 2,
                        "name" : "10.0.1.7:27017",
                        "health" : 1,
                        "state" : 7,
                        "stateStr" : "ARBITER",
                        "uptime" : 26,
                        "lastHeartbeat" : ISODate("2016-05-04T15:35:05.859Z"),
                        "lastHeartbeatRecv" : ISODate("2016-05-04T15:35:06.347Z"),
                        "pingMs" : 3,
                        "configVersion" : 9
                },
                {
                        "_id" : 3,
                        "name" : "<skipped domain name of other server>:27017",
                        "health" : 1,
                        "state" : 1,
                        "stateStr" : "PRIMARY",
                        "uptime" : 26,
                        "optime" : Timestamp(1462376105, 196),
                        "optimeDate" : ISODate("2016-05-04T15:35:05Z"),
                        "lastHeartbeat" : ISODate("2016-05-04T15:35:05.859Z"),
                        "lastHeartbeatRecv" : ISODate("2016-05-04T15:35:06.086Z"),
                        "pingMs" : 4,
                        "electionTime" : Timestamp(1461688501, 1),
                        "electionDate" : ISODate("2016-04-26T16:35:01Z"),
                        "configVersion" : 9
                }
        ],
        "ok" : 1    }

更新。我应该提到托管使用的是Azure。查询&#34; azure mongodb连接超时&#34;完全用Google搜索Answer and explanation。我的坏。

2 个答案:

答案 0 :(得分:3)

您对错误原因的假设是错误的。

  • Connection timed out:在尝试建立TCP连接期间,在给定的时间限制内没有来自另一方的响应。

换句话说,它是建立套接字的问题,而不是复制数据库需要多长时间的问题。

调整TCP超时是系统设置,而不是每个应用程序执行的操作。 Linux上的设置位于系统范围内/etc/sysctl.confnet.ipv4.tcp_syn_retries - {strong>但是你可以play around几乎不会更改建立的超时时间一个套接字(对于任何程序,包括mongo),我改变它的次数是为了让它更短,以便更快地获得错误,而不是增加它 - 增加它不可能是任何地球应用程序中的正确解决方案

问题是配置问题 - 比如您的设置中有一些错误的IP地址,或网络问题,例如防火墙,路由表或网络交换机有时无法工作60-120秒一次。

答案 1 :(得分:0)

可能有一些文件锁定了奴隶中的文件系统。如果我在哪里,我将从副本中删除该节点,然后擦除dbpath下的所有文件,检查mongo用户是否可以访问此目录并重新启动mongod。一旦运行,将其添加回RS并等待它。另见:https://docs.mongodb.org/manual/tutorial/recover-data-following-unexpected-shutdown/#mongod-lock