在使用mongodb副本集为我的app服务器提供服务时,我遇到了一个问题,即4个app服务器和2个mongo slave节点之间的TCP连接持续增加,直到2个mongo slave节点停止服务。
以下是来自其中一个从属节点的正常日志:
2017-03-12T03:01:41.165 + 0800 I NETWORK [initandlisten]连接从127.0.0.1:43775#1537161接受(55个连接现已打开)
2017-03-12T03:01:41.188 + 0800 I ACCESS [conn1537161]成功通过管理员身份验证为主管理员 2017-03-12T03:01:41.193 + 0800 I NETWORK [conn1537161]终端连接127.0.0.1:43775(现在有54个连接) 2017-03-12T03:01:41.938 + 0800 I NETWORK [conn1537152]终端连接10.162.xxx.xxx:49334(53个连接现已开启)
2017-03-12T03:01:41.938 + 0800我从10.162.xxx.xxx:49345#1537162接受网络[initandlisten]连接(54个连接现已打开)
2017-03-12T03:01:41.958 + 0800 I ACCESS [conn1537162]在本地成功认证为主__system 2017-03-12T03:01:42.256 + 0800 I NETWORK [initandlisten]连接从127.0.0.1:43776#1537163接受(55个连接现已打开)
2017-03-12T03:01:42.279 + 0800 I ACCESS [conn1537163]成功通过管理员身份验证为主管理员 2017-03-12T03:01:42.284 + 0800 I NETWORK [conn1537163]终端连接127.0.0.1:43776(现在有54个连接) 2017-03-12T03:01:42.721 + 0800 I ACCESS [conn1401659]在线成功在线认证为校长 2017-03-12T03:01:47.243 + 0800 I NETWORK [conn1537154] end connection 10.251.xxx.xxx:34844(53个连接现已开通)
但mongo主节点并没有什么不寻常之处。请注意,在此期间我们的应用服务器访问次数少于日光。来自上述同一从节点的异常日志:
2017-03-12T03:05:59.301 + 0800我从10.171.xxx.xxx:33377#1537221接受网络[initandlisten]连接(现已打开86个连接)
2017-03-12T03:06:01.484 + 0800 I NETWORK [conn1537215]终端连接120.26.xxx.xxx:48190(85个连接现已开启)
2017-03-12T03:06:01.487 + 0800我从120.26.xxx.xxx:48203#1537222接受网络[initandlisten]连接(86个连接现已打开)
2017-03-12T03:06:01.508 + 0800 I ACCESS [conn1537222]在本地成功验证为主__system 2017-03-12T03:06:05.464 + 0800我从10.168.xxx.xxx:51008#1537223接受网络[initandlisten]连接(87个连接现已打开)
2017-03-12T03:06:11.231 + 0800 I ACCESS [conn1537213]在线成功在线认证为校长 2017-03-12T03:06:12.289 + 0800 I NETWORK [conn1537216] end connection 10.162.xxx.xxx:49427(86个连接现已开通)
2017-03-12T08:37:44.764 + 0800我从10.171.xxx.xxx:37444#1571431接受网络[initandlisten]连接(32306连接现已打开)
2017-03-12T08:37:44.773 + 0800 I ACCESS [conn1571430]在线成功在线认证 2017-03-12T08:37:44.786 + 0800 I NETWORK [initandlisten] pthread_create失败:错误:11资源暂时不可用
2017-03-12T08:37:44.786 + 0800 I NETWORK [initandlisten]无法创建新线程,关闭连接
2017-03-12T08:37:45.290 + 0800 I NETWORK [initandlisten]连接从10.171.xxx.xxx:37445#1571432接受(32306连接现已打开)
2017-03-12T08:37:45.290 + 0800 I NETWORK [initandlisten] pthread_create失败:错误:11资源暂时不可用
2017-03-12T08:37:45.290 + 0800 I NETWORK [initandlisten]无法创建新线程,关闭连接
2017-03-12T08:37:57.000 + 0800 I REPL [ReplicationExecutor]对xxx.xxx.xxx.xxx:27017的心跳请求出错; UnknownError发送命令{replSetHeartbeat:" rs1",pv:1,v:5,from:" xxx.xxx.xxx.xxx:27018",fromId:1,checkEmpty:false}数据库管理员通过网络到xxx.xxx.xxx.xxx:27017收到异常boost :: thread_resource_error
假设来自mongodb slave节点的任何错误都会停止读取操作,从而导致app server' i / o超时;和app服务器认为池中没有连接到从节点不可用,因此尝试打开与从节点的新连接。但遗憾的是,无法正常建立连接,因此新连接仍在继续打开。
但每个应用服务器只使用两个会话。详细地说,我在init()期间获取会话,并将它们用于db读/写操作。我无法弄清楚泄漏。以下是我获得会话的代码:
func init() {
...some code...
session, err := mgo.Dial(url)
if err != nil {...handle error...}
strongSession = session.Copy()
strongSession.SetMode(mgo.Strong, true)
strongSession.SetSafe(&mgo.Safe{})
eventualSession = session
eventualSession.SetMode(mgo.Eventual, true)
eventualSession.SetSafe(&mgo.Safe{})
...some code...
}
如果问题是由mgo驱动程序的连接池泄漏引起的,我是否可以假设某些池管理错误与驱动程序gopkg.in/mgo.v2?
此问题在我的实际环境中,几天前和两个月前发生两次,同一时间段从凌晨3:00到8:30。
我真的想过,如果mongo服务器和app服务器上的任何任务,但一无所获。
我已经挖了日志,搜索谷歌和stackoverflow几天关键词如' mgo连接池' mongo无法创建新线程',&#39 ; mongo连接增加'等等,但不幸的是不知道如何进一步调查这个问题。
真的很感激任何人都可以提供一些建议~~
非常感谢~~