具有mgo驱动的Golang app服务器和mongodb副本设置从属节点:连接太多

时间:2017-03-14 05:30:59

标签: mongodb go mgo

在使用mongodb副本集为我的app服务器提供服务时,我遇到了一个问题,即4个app服务器和2个mongo slave节点之间的TCP连接持续增加,直到2个mongo slave节点停止服务。

环境

  • 操作系统:Ubuntu 14.04 64位,适用于mongodb服务器和应用服务器
  • mongodb:v3.0.9,副本设置为1个主设备,2个从设备和1个仲裁器
  • app:4个服务器集群,由golang编写,带有mongodb驱动程序gopkg.in/mgo.v2

详细

1.通常我们在每个从节点上有大约55个连接。

以下是来自其中一个从属节点的正常日志:

  

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个连接现已开通)

2.在一天早上3:02左右,2个从节点'连接开始增加,每分钟每分钟可能有5-15个连接。

但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个连接现已开通)

3.早上8点37分,奴隶节点终于停止了服务。

  

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]无法创建新线程,关闭连接

4.即使mongo节点之间的心跳也会崩溃。

  

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

5.最后我重新启动了2个mongo从节点,一切顺利。

6.要及时恢复应用服务,不再需要有关mongo节点或应用服务器的站点状态。只有两个线索如下。

  • mongo slave节点上的TCP连接迅速增加(但主节点仍然正常)。
  • 从app服务器到mongo slave节点的读取操作得到i / o超时(从3:02开始)。

我的猜测和调查

- mongodb slave节点

有问题

假设来自mongodb slave节点的任何错误都会停止读取操作,从而导致app server' i / o超时;和app服务器认为池中没有连接到从节点不可用,因此尝试打开与从节点的新连接。但遗憾的是,无法正常建立连接,因此新连接仍在继续打开。

- 应用服务器' mgo驱动程序连接池泄漏。

但每个应用服务器只使用两个会话。详细地说,我在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连接增加'等等,但不幸的是不知道如何进一步调查这个问题。

真的很感激任何人都可以提供一些建议~~

非常感谢~~

0 个答案:

没有答案