MongoDB连接在多个应用程序服务器上失败

时间:2018-10-09 17:21:42

标签: mongodb go mgo

我们有带gogo的mgo驱动程序的mongodb。除了应用程序(golang二进制文件)之外,还有两个连接到mongodb的应用程序服务器正在运行。 Mongodb作为副本集运行,每台服务器根据副本的当前状态连接两个主副本或辅助副本。

我们在其中一台mongo服务器上经历了aria-live(导致从我们的应用程序连接到mongodb的过程终止。此后,副本集继续起作用,但是我们的第二台服务器(错误没发生)连接也终止了。

在golang日志中,它表现为:

span

为什么会这样?如何预防?

据我了解,SocketException handling request, closing client connection: 9001 socket exception通过url连接到整个副本(它通过单个实例的url检测到整个拓扑),但是为什么其中一台服务器上的连接被杀死却在第二台服务器上杀死了它?

编辑:

  1. read tcp 10.10.0.5:37698-\u003e10.10.0.7:27017: i/o timeout 使用的完整软件包路径
  2. 很遗憾,这里无法共享mongo文件。但是除了socketexecption mongo日志之外,它不包含任何有用的东西。有迹象表明存在某种程度的锁争用,其中锁获取时间有时很高,但除此之外没有任何其他作用
  3. MongoDB有时会做一些重索引工作,但是最近没有任何异常的高峰,因此没有超出正常范围的

1 个答案:

答案 0 :(得分:3)

首先,将不再维护您使用的mgo驱动程序:由{@ {3}}托管的Gustavo Niemeyer开发的gopkg.in/mgo.v2

请使用社区支持的分支https://github.com/go-mgo/mgo。这个继续得到修补和发展。

它的更改日志包括:“连接处理得到改善” ,它似乎与您的问题直接相关。

其详细信息可以在此处github.com/globalsign/mgo处读取,它指向原始的拉取请求https://github.com/globalsign/mgo/pull/5

  

如果mongoServer无法拨打服务器,它将关闭所有活动的套接字(无论当前是否正在使用)。   有两个缺点:

     
      
  • 飞行中的请求将被无礼地中断。

  •   
  • 所有套接字同时关闭,并且可能同时拨打服务器。大规模拨号请求中的任何偶然失败(高并发情况)都将再次关闭所有套接字,并重复执行...(在我们的生产环境中发生)

  •   
     

所以我认为当前使用的套接字在闲置后应该关闭。

请注意,github.com/globalsign/mgo具有向后兼容的API,它基本上只是添加了一些新的东西/功能(除了修补程序和补丁程序),这意味着您应该能够仅更改导入路径,并且所有内容都应无需进一步更改即可工作。