/ MongoDB

阿里云MongoDB 连接错误:No primary detected for set mgset-xxxx

问题背景

为了减少运维开支,简化运维工作,最近在使用阿里云的MongoDB云服务器。

相比于亚马逊AWS,在阿里云上部署MongoDB非常简单,因为阿里云提供了开箱即用的MongoDB服务。

在购买阿里云MongoDB服务时,只需要关注以下几个指标:

  • 1). 区域,尽量离需要服务的用户位置近一些。虽然DB不作为前端直接提供服务,还可以直接通过内网网络进行连接,但是,与其他服务尽量在同一个地域,能够更好地保证内网的稳定性。
  • 2). 性能,可以选择cpu核数和内存容量
  • 3). 集群方式,可以选择
    • a. 副本集
    • b. 分片集群
  • 4). MongoDB 版本

这些配置除了影响数据库的性能以外,还会影响最终产生的费用,需要根据项目的实际情况综合考虑。

按照开发团队的需求,我们选购了相应性能配置、足够容量、3节点的副本集,这样在项目初期就有足够的稳定性和容错能力。

但是,在交付给开发团队使用的时候,遇到一个奇怪的错误,无论是代码还是MongoDB的命令行工具mongo都报了类似的错误:

No primary detected for set mgset-xxxxxxxxx

详细日志是这样子:

...
Successfully connected to <节点1>:3717 (1 connections now open <节点1>:3717 with a 5 second timeout)
2021-02-03T18:45:24.232+0800 I NETWORK  [thread1] Detected bad connection created at 1612349124231592 microSec, clearing pool for <节点1>:3717 of 0 connections
2021-02-03T18:45:24.232+0800 I NETWORK  [thread1] Dropping all pooled connections to <节点1>:3717(with timeout of 5 seconds)
2021-02-03T18:45:24.232+0800 I NETWORK  [thread1] Ending connection to host <节点1>:3717(with timeout of 5 seconds) due to bad connection status; 0 connections to that host remain open
2021-02-03T18:45:24.233+0800 I NETWORK  [thread1] Successfully connected to <节点2>:3717 (1 connections now open to <节点2>:3717 with a 5 second timeout)
2021-02-03T18:45:24.234+0800 I NETWORK  [thread1] Detected bad connection created at 1612349124233198 microSec, clearing pool for <节点2>:3717 of 0 connections
2021-02-03T18:45:24.234+0800 I NETWORK  [thread1] Dropping all pooled connections to <节点2>:3717(with timeout of 5 seconds)
2021-02-03T18:45:24.234+0800 I NETWORK  [thread1] Ending connection to host <节点2>:3717(with timeout of 5 seconds) due to bad connection status; 0 connections to that host remain open
2021-02-03T18:45:24.234+0800 W NETWORK  [thread1] No primary detected for set mgset-xxxxxxxxxx
2021-02-03T18:45:24.234+0800 E QUERY    [thread1] Error: connect failed to replica set mgset-xxxxxxxxx/<节点1>:3717,<节点2>:3717 :
connect@src/mongo/shell/mongo.js:240:13
@(connect):1:6
exception: connect failed

解决过程

  1. 确认用户名,没有问题
  2. 确认用户权限,没有问题
  3. 确认root用户,有同样的问题
  4. 通过阿里云的云端数据管理工具(DMS)测试连接MongoDB数据库,一切正常
  5. 通过MongoDB查看MongoDB的副本集状态,一切正常
运行 rs.status()
  1. 在阿里云MongoDB管理后台手动进行切换,能正常切换主从节点
  2. 使用与MongoDB数据库相同版本的3.4客户端连接,问题依旧

这就奇怪了,会是什么问题呢?

最后,无意中发现阿里云控制台上显示购买的MongoDB是4.2版本!
而研发团队用的是3.x版本MongoDB!

会不会是服务端和客户端版本不一致导致的呢?

解决方法

重新购买了4.2版本MongoDB,再次连接,一切正常!

所以,原因就是:

手滑买错了服务器版本