数据库开发者社区 > 正文

MongoDB云数据库常见问题诊断

简介: 重要的内容 MongoDB的主备节点在运行过程中是不固定的,实例重启、升级、节点故障等都有可能导致主备切换,在生产环境应该使用副本集的方式来正确连接MongoDB来实现高可用。 连接问题 用户可通过DMS或mongo shell连接MongoDB云数据库,以下场景都基于用户使用mongo sh
+关注继续查看

重要的内容

MongoDB的主备节点在运行过程中是不固定的,实例重启、升级、节点故障等都有可能导致主备切换,在生产环境应该使用副本集的方式来正确连接MongoDB来实现高可用。

连接问题

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

Q: 连接实例提示网络超时?

# /u01/mongodb_current/bin/mongo --host dds-uf69ba5cf6e123442.mongodb.rds.aliyuncs.com:3717 --authenticationDatabase admin -u root -p xxx
MongoDB shell version: 3.2.3
DB Prefix:
connecting to: 10.1.2.8:3717/admin
2016-05-31T15:25:58.940+0800 W NETWORK  Failed to connect to 10.1.2.8:3717 after 5000 milliseconds, giving up.
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
    at connect (src/mongo/shell/mongo.js:181:14)
    at (connect):1:6 at src/mongo/shell/mongo.js:181
exception: connect failed

通过telnet来确认是否是网络不通导致的,例如

telnet dds-uf69ba5cf6e123442.mongodb.rds.aliyuncs.com 3717

网络不通可能的原因:

  1. ECS跟MongoDB节点不在同一个可用区
  2. ECS跟MongoDB节点不在同一个vpc环境

Q: 连接实例提示鉴权失败?

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

可能的原因

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

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

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

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

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

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

如果想mongo shell一直连接到Priamry节点,可通过如下方式连接

mongo --host 副本集名称/节点1,节点2 --authenticationDatabase admin -u system -p xxx

例如

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的主备节点在运行过程中是不固定的,实例重启、升级、节点故障等都有可能导致主备切换,在生产环境应该使用副本集的方式来正确连接MongoDB来实现高可用。

Q: 连接时提示Connection reset by peers?

$mongo --host dds-uf69ba5cf6e123442.mongodb.rds.aliyuncs.com:3717 --authenticationDatabase admin -u root -p xxx
MongoDB shell version: 3.2.3
connecting to: 10.1.2.8:3717/test
2016-05-31T16:25:58.940+0800 I NETWORK  Socket recv() errno:54 Connection reset by peer ç
2016-05-31T16:25:58.940+0800 I NETWORK  SocketException: remote: 10.1.2.8:3717 error: 9001 socket exception [RECV_ERROR] server [10.1.2.8:3717]
2016-05-31T16:25:58.940+0800 I NETWORK  DBClientCursor::init call() failed

上述错误通常是实例的连接数已经达到上限,无法再建立更多的网络连接,可在控制台查看实例连接数的使用情况确认。用户使用实例时应该合理的规划并控制实例的连接数,避免因为连接数耗尽而无法连接实例,如果业务上的确需要更多的网络连接,则需要升级实例的规格。连接数的管理请参考下面『连接数问题』部分。

连接数问题

Q: 如何查看当前连接数?

  1. 登录阿里云控制台查看
  2. 使用mongo shell连接实例,执行如下命令,其中current代表当前已建立连接数,available代表当前可用连接数,internal*的连接用于内部管理,用户可忽略。

          mongo-test:PRIMARY> db.serverStatus().connections
          {
            "current" : 0,
            "available" : 2000,
            "internal_current" : 3,
            "internal_available" : 497,
            "totalCreated" : NumberLong(21)
          }
    

Q: 如何查看当前连接主要来自哪些ECS机器?

mongoshell或DMS(如果连接数已满,则只能通过DMS来登录查看)连接实例,执行db.runCommand({currentOp: 1, $all: true}),就能输出所有跟该实例建立的所有连接情况,其中client字段包含了ECS的ip地址信息。

> db.runCommand({currentOp: 1, $all: true})
{
    "inprog" : [
        {
            "desc" : "conn20",
            "threadId" : "140353731274496",
            "connectionId" : 20,
            "client" : "10.1.2.7:28788",
            "active" : false
        },
        ...

有了上述结果,用户就可以根据来源ip做进一步的分析,得出各个ECS跟实例分别建立了多少连接等信息。

Q: 生产环境连接数快满了,如何限制每个ECS到实例的连接数量?

MongoDB基本所有的driver都支持通过Connection String URI来连接实例,云数据库的连接URI已为用户在控制上生成好,加上密码信息就能直接使用。

如果采用URI来连接实例的,在URI末尾加上&maxPoolSize=xx来限制到实例的连接数即可,比如你有10台ECS并发访问实例,实例的最大连接数为1000,那么每个ECS上的连接池的数量要控制在100以内。

不同语言的客户端可能封装了不通的连接方式,但也一定有方法指定连接池的数量限制,具体参考各语言客户端的api文档。

负载高问题

Q: CPU利用率很高,想看看实例正在执行什么操作?

mongo shell连接实例,执行db.currentOp()

mongo-test:PRIMARY> db.currentOp()

造成实例负载高的典型case

  1. 并发请求的量太大,超出当前规格的服务能力
  2. 查询集合时,没有合理的建索引,导致全表扫描或排序
  3. 正在跑一些计算量很大的mapreduce或者aggregation任务

正在执行的操作都包含一个opid字段,用户可以根据opid字段直接kill掉对应的操作

mongo-test:PRIMARY> db.killOp(opid)

仍然无法解决问题

请查看FAQ文档,或提交工单。

版权声明:本文内容由阿里云实名注册用户自发贡献,版权归原作者所有,阿里云开发者社区不拥有其著作权,亦不承担相应法律责任。具体规则请查看《阿里云开发者社区用户服务协议》和《阿里云开发者社区知识产权保护指引》。如果您发现本社区中有涉嫌抄袭的内容,填写侵权投诉表单进行举报,一经查实,本社区将立刻删除涉嫌侵权内容。

相关文章
阿里云数据库MongoDB助力南瓜电影提升开发效率——为超8000万观众量身打造沉浸式体验
阿里云数据库MongoDB助力南瓜电影提升开发效率——为超8000万观众量身打造沉浸式体验
114 0
《阿里云数据库 MongoDB 专属集群版》电子版地址
《阿里云数据库 MongoDB 专属集群版》PPT
44 0
云数据库MongoDB FAQ
云数据库MongoDB FAQ
188 0
MongoDB 云数据库常见问题诊断
MongoDB 云数据库常见问题诊断
289 0
阿里云新品发布会周刊第119期 丨 云数据库MongoDB新品发布会
新产品、新版本、新技术、新功能、价格调整,评论在下方,下期更新!关注更多新品发布会!
252 0
阿里云新品发布会周刊第78期 丨 云数据库 MongoDB 新版本+电力虚拟配网调度员新品发布来了!
11.25&11.27日,阿里云新品发布会将迎来云数据库 MongoDB 新版本+电力虚拟配网调度员新品发布会。想了解更多内容还请预约直播间!
21606 0
云数据库 MongoDB新建标签的操作步骤来啦!
在实例数量较多的情况下,您可以创建多个标签,为实例绑定不同的标签对其进行分类,后续可通过标签筛选实例。
599 0
云数据库 MongoDB重置密码的操作步骤来啦!
如果您忘记账号的密码、需要修改旧密码,或者在创建实例的时候没有设置密码,您可以重新设置实例的密码。
654 0
从事前到事后,云数据库 Redis & MongoDB 安全体系全揭秘!
相比自建,阿里云数据库针对控制链路和数据链路提供了多个维度的安全保障体系,更好的保障客户的数据安全,本文将为您详细介绍云数据库Redis&MongoDB的安全体系。
2394 0
全球独家 | 赋予企业级开源无限可能,阿里云首发云数据库MongoDB 4.2版本
11月26日,阿里云与知名开源数据库软件公司MongoDB在京举办战略合作发布会,全球独家首发云数据库MongoDB 4.2最新版本。根据双方达成的战略合作协议,阿里云已成为全球唯一可提供最新MongoDB服务的云厂商。
6284 0
如何设置云数据库MongoDB监控报警?
本文将为大家介绍云数据库MongoDB实例的监控与报警相关操作。 进入实例的详情页面,点击左侧的监控信息。在这里可以看到,MongoDB所提供的一些监控指标。上面这一行是针对MongoDB资源本身的CPU、内存、IOPS及磁盘的使用情况监控;下面这一行是针对WiredTiger引擎本身的一些属性监控。
1033 0
云数据库mongoDB如何切换网络类型?
本文为大家介绍云数据库mongoDB的网络类型切换功能。 目前,阿里云对外提供经典网络和VPC网络两种网络类型。为确保内网能够顺利连接,云服务器ECS和云数据库mongoDB必须处在相同的网络类型下,才能够进行内网连通。
854 0
数据库领域前沿技术分享与交流
热门文章
热门讨论
+关注
张友东(林青)
阿里云高级技术专家
文章
问答
视频
相关电子书
更多
饿了么高级架构师陈东明:MongoDB是如何逐步提高可靠性的
立即下载
低代码开发师(初级)实战教程
立即下载
阿里巴巴DevOps 最佳实践手册
立即下载
相关镜像