全部产品
阿里云办公

连接问题

更新时间:2017-12-04 17:15:32

用户可以通过DMS或Mongo shell连接MongoDB云数据库,以下场景都基于用户使用Mongo shell连接数据库。

连接实例提示网络超时?

  1. # /u01/mongodb_current/bin/mongo --host dds-uf69ba5cf6e123442.mongodb.rds.aliyuncs.com:3717 --authenticationDatabase admin -u root -p xxx
  2. MongoDB shell version: 3.2.3
  3. DB Prefix:
  4. connecting to: 10.1.2.8:3717/admin
  5. 2016-05-31T15:25:58.940+0800 W NETWORK Failed to connect to 10.1.2.8:3717 after 5000 milliseconds, giving up.
  6. 2016-05-31T15:25:58.943+0800 E QUERY Error: couldn't connect to server 10.1.2.8:3717 (10.1.2.8), connection attempt failed
  7. at connect (src/mongo/shell/mongo.js:181:14)
  8. at (connect):1:6 at src/mongo/shell/mongo.js:181
  9. exception: connect failed

通过telnet来确认是否是网络不通导致的,例如telnet dds-uf69ba5cf6e123442.mongodb.rds.aliyuncs.com 3717

网络不通可能的原因:

  • ECS跟MongoDB节点不在同一个可用区。
  • ECS跟MongoDB节点不在同一个vpc环境。
  1. org.springframework.data.mongodb.UncategorizedMongoDbException: Timeout while receiving message; nested exception is com.mongodb.MongoSocketReadTimeoutException: Timeout while receiving message

解决办法:

  • 建议您检查下是否有慢查询,如果有,建议进行添加索引优化。具体方法请参见:分析数据库慢请求
  • 检查下应用端连接池的配置,如超时时间的设置,如果设置过低,建议调大些。具体方法请参见:连接数问题

连接实例提示鉴权失败?

  1. $mongo --host dds-uf69ba5cf6e123442.mongodb.rds.aliyuncs.com:3717 --authenticationDatabase admin -u root -p xxx
  2. MongoDB shell version: 3.2.3
  3. connecting to: 10.1.2.8:3717/test
  4. 2016-05-31T15:50:18.623+0800 E QUERY Error: 18 Authentication failed.
  5. at DB._authOrThrow (src/mongo/shell/db.js:1271:32)
  6. at (auth):6:8
  7. at (auth):7:2 at src/mongo/shell/db.js:1271
  8. exception: login failed

可能的原因:

  • 密码错误,可在控制台重置root密码。
  • 连接的用户跟数据库不匹配,比如root用户是admin数据库下的用户。使用root连接时,必须指定鉴权数据库为admin。
  • 客户端版本过低,Mongo shell版本必须是3.0+,其他语言客户端的版本要求参考Driver兼容性文档

连接Secondary执行执行命令时,提示slaveOk=false错误?

  1. $mongo --host dds-uf69ba5cf6e123442.mongodb.rds.aliyuncs.com:3717 --authenticationDatabase admin -u root -p xxx
  2. MongoDB shell version: 3.2.3
  3. connecting to: 10.1.2.8:3717/test
  4. mongo-9551:SECONDARY> show dbs
  5. 2016-05-31T15:54:13.527+0800 E QUERY Error: listDatabases failed:{ "ok" : 0, "errmsg" : "not master and slaveOk=false", "code" : 13435 }
  6. at Error (<anonymous>)
  7. at Mongo.getDBs (src/mongo/shell/mongo.js:47:15)
  8. at shellHelper.show (src/mongo/shell/utils.js:630:33)
  9. at shellHelper (src/mongo/shell/utils.js:524:36)
  10. at (shellhelp2):1:1 at src/mongo/shell/mongo.js:47

默认情况下,MongoDB的读写请求都必须到Primary节点,Secondary默认是不可读的,除非客户端显式的指定Secondary节点可读(通过设置readPreference指定某个节点可读)。

Mongo shell连接时,可以执行rs.slaveOk()来指定备可读:

  1. $mongo --host dds-uf69ba5cf6e123442.mongodb.rds.aliyuncs.com:3717 --authenticationDatabase admin -u system -p xxx
  2. MongoDB shell version: 3.2.3
  3. connecting to:10.1.2.8:3717/test
  4. mongo-9551:SECONDARY> rs.slaveOk()
  5. mongo-9551:SECONDARY> show dbs
  6. admin 0.000GB
  7. hello 0.000GB
  8. local 0.000GB
  9. test 0.000GB

如果要Mongo shell一直连接到Priamry节点,可通过如下方式连接:

  1. mongo --host 副本集名称/节点1,节点2 --authenticationDatabase admin -u system -p xxx
  2. 例如
  3. mongo --host mg-100101/dds-uf69ba5cf6e123442.mongodb.rds.aliyuncs.com:3717,dds-uf69ba5cf6e123441.mongodb.rds.aliyuncs.com:3717 --authenticationDatabase admin -u system -p xxx

注意:MongoDB的主备节点在运行过程中是不固定的,实例重启、升级、节点故障等都有可能导致主备切换。在生产环境不要直连Primary,要正确连接复制集请参考:MongoDB如何实现读写分离

其他连接问题请参考: