MongoDB云数据库常见问题诊断

本文涉及的产品
云原生多模数据库 Lindorm,多引擎 多规格 0-4节点
云数据库 Redis 版,社区版 2GB
推荐场景:
搭建游戏排行榜
云数据库 MongoDB,通用型 2核4GB
简介: 重要的内容 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数据库入门
MongoDB数据库入门实验。
快速掌握 MongoDB 数据库
本课程主要讲解MongoDB数据库的基本知识,包括MongoDB数据库的安装、配置、服务的启动、数据的CRUD操作函数使用、MongoDB索引的使用(唯一索引、地理索引、过期索引、全文索引等)、MapReduce操作实现、用户管理、Java对MongoDB的操作支持(基于2.x驱动与3.x驱动的完全讲解)。 通过学习此课程,读者将具备MongoDB数据库的开发能力,并且能够使用MongoDB进行项目开发。 &nbsp; 相关的阿里云产品:云数据库 MongoDB版 云数据库MongoDB版支持ReplicaSet和Sharding两种部署架构,具备安全审计,时间点备份等多项企业能力。在互联网、物联网、游戏、金融等领域被广泛采用。 云数据库MongoDB版(ApsaraDB for MongoDB)完全兼容MongoDB协议,基于飞天分布式系统和高可靠存储引擎,提供多节点高可用架构、弹性扩容、容灾、备份回滚、性能优化等解决方案。 产品详情: https://www.aliyun.com/product/mongodb
相关文章
|
11天前
|
存储 JSON NoSQL
【文档数据库】ES和MongoDB的对比
【文档数据库】ES和MongoDB的对比
25 1
|
16天前
|
存储 NoSQL 数据处理
探索MongoDB:灵活、高性能的NoSQL数据库解决方案与应用实践
探索MongoDB:灵活、高性能的NoSQL数据库解决方案与应用实践
|
18天前
|
存储 NoSQL MongoDB
MongoDB数据库
【6月更文挑战第5天】MongoDB数据库
43 1
|
18天前
|
存储 缓存 NoSQL
MongoDB数据库的主要应用场景是什么?
【6月更文挑战第5天】MongoDB数据库的主要应用场景是什么?
63 1
|
19天前
|
存储 数据采集 NoSQL
DTS在迁移大数据量的MongoDB数据库时如何保证数据的准确性和完整性?
【6月更文挑战第4天】DTS在迁移大数据量的MongoDB数据库时如何保证数据的准确性和完整性?
86 1
|
25天前
|
NoSQL MongoDB 数据库
使用MongoDB进行NoSQL数据库管理
【5月更文挑战第29天】MongoDB是流行的NoSQL数据库,以其文档存储、动态模式、高性能和丰富查询功能著称。它采用BSON格式,支持灵活的数据结构。基本操作包括安装、连接、创建数据库和集合、插入/查询/更新/删除文档。最佳实践涉及合理设计数据模型、使用索引、监控调优、备份恢复及确保安全性。MongoDB为复杂应用提供了高效的数据管理解决方案。
|
16天前
|
NoSQL JavaScript 安全
精心操作MongoDB:删除数据库的关键步骤和重要事项
精心操作MongoDB:删除数据库的关键步骤和重要事项
|
16天前
|
NoSQL 测试技术 MongoDB
MongoDB数据库管理:全面掌握mongodump和mongorestore的备份与恢复技巧
MongoDB数据库管理:全面掌握mongodump和mongorestore的备份与恢复技巧
|
26天前
|
NoSQL 安全 MongoDB
MongoDB为提供MongoDB数据库服务的云服务合作伙伴推出认证计划
Certified by MongoDB DBaaS计划还将为云计算合作伙伴提供构建深度技术集成所需的专业支持,同时还将携手MongoDB合作伙伴生态系统(MongoDB Partner Ecosystem)共同推出一系列联合的进入市场举措,使云服务合作伙伴能够助力其客户快速走向成功。
3104 0
|
26天前
|
存储 NoSQL atlas
2024年向量数据库推荐榜单之MongoDB
目前市面上有哪些向量数据库解决方案,可协助您存储和检索高维向量?在推荐优选的几款向量数据库和库之前,我们需要厘清以下这两种技术的差异。
3075 0

相关产品

  • 云数据库 MongoDB 版