MongoDB云数据库常见问题诊断

本文涉及的产品
Redis 开源版,标准版 2GB
推荐场景:
搭建游戏排行榜
云数据库 Tair(兼容Redis),内存型 2GB
云数据库 MongoDB,独享型 2核8GB
推荐场景:
构建全方位客户视图
简介: 重要的内容 MongoDB的主备节点在运行过程中是不固定的,实例重启、升级、节点故障等都有可能导致主备切换,在生产环境应该使用副本集的方式来正确连接MongoDB来实现高可用。 连接问题 用户可通过DMS或mongo shell连接MongoDB云数据库,以下场景都基于用户使用mongo sh

重要的内容

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

连接问题

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
AI 代码解读

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

telnet dds-uf69ba5cf6e123442.mongodb.rds.aliyuncs.com 3717
AI 代码解读

网络不通可能的原因:

  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
AI 代码解读

可能的原因

  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
AI 代码解读

默认情况下,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
AI 代码解读

如果想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
AI 代码解读

注意: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
AI 代码解读

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

连接数问题

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)
       }
    
    AI 代码解读

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
        },
        ...
AI 代码解读

有了上述结果,用户就可以根据来源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()
AI 代码解读

造成实例负载高的典型case

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

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

mongo-test:PRIMARY> db.killOp(opid)
AI 代码解读

仍然无法解决问题

请查看[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
目录
打赏
0
0
0
2
9969
分享
相关文章
一个项目用5款数据库?MySQL、PostgreSQL、ClickHouse、MongoDB区别,适用场景
一个项目用5款数据库?MySQL、PostgreSQL、ClickHouse、MongoDB——特点、性能、扩展性、安全性、适用场景比较
数据库数据恢复—MongoDB数据库迁移过程中丢失文件的数据恢复案例
某单位一台MongoDB数据库由于业务需求进行了数据迁移,数据库迁移后提示:“Windows无法启动MongoDB服务(位于 本地计算机 上)错误1067:进程意外终止。”
obdiag:一款OceanBase 数据库诊断的利器
本次分享的主题是obdiag:一款 OceanBase 数据库诊断的利器,由蚂蚁集团 OceanBase 技术专家汤庆分享。主要分为四个部分: 1. OceanBase 概述 2. Obdiag 项目价值 3. Obdiag 设计与实现 4. Obdiag 未来规划
53 14
|
3月前
|
学习 MongoDB:打开强大的数据库技术大门
MongoDB 是一个基于分布式文件存储的文档数据库,由 C++ 编写,旨在为 Web 应用提供可扩展的高性能数据存储解决方案。它与 MySQL 类似,但使用文档结构而非表结构。核心概念包括:数据库(Database)、集合(Collection)、文档(Document)和字段(Field)。MongoDB 使用 BSON 格式存储数据,支持多种数据类型,如字符串、整数、数组等,并通过二进制编码实现高效存储和传输。BSON 文档结构类似 JSON,但更紧凑,适合网络传输。
90 15
阿里云数据库MongoDB版助力信也科技 打造互联网金融企业样板
我们的风控系统引入阿里云数据库MongoDB版后,解决了特征类字段灵活加减的问题,大大提高了开发效率,极大的提升了业务用户体验,获得了非常好的效果
阿里云数据库MongoDB版助力信也科技 打造互联网金融企业样板
Sybase数据恢复—Sybase数据库常见问题之数据库无法启动的恢复案例
Sybase数据库数据恢复环境: Sybase数据库版本:SQL Anywhere 8.0。 Sybase数据库故障&分析: Sybase数据库无法启动。 使用Sybase Central连接报错。 数据库数据恢复工程师经过检测,发现Sybase数据库出现故障的原因是:异常断电造成Sybase数据库无法回写正常数据,导致多个存储页数据不一致,系统表描述和存储表不一致,部分存储页底层数据完全杂乱。
探索云原生数据库:MongoDB Atlas 的实践与思考
【10月更文挑战第21天】本文探讨了MongoDB Atlas的核心特性、实践应用及对云原生数据库未来的思考。MongoDB Atlas作为MongoDB的云原生版本,提供全球分布式、完全托管、弹性伸缩和安全合规等优势,支持快速部署、数据全球化、自动化运维和灵活定价。文章还讨论了云原生数据库的未来趋势,如架构灵活性、智能化运维和混合云支持,并分享了实施MongoDB Atlas的最佳实践。
探索云原生数据库:MongoDB Atlas 的实践与思考
【10月更文挑战第20天】本文探讨了MongoDB Atlas的核心特性、实践应用及对未来云原生数据库的思考。MongoDB Atlas作为云原生数据库服务,具备全球分布、完全托管、弹性伸缩和安全合规等优势,支持快速部署、数据全球化、自动化运维和灵活定价。文章还讨论了实施MongoDB Atlas的最佳实践和职业心得,展望了云原生数据库的发展趋势。
如何监控和诊断 MySQL 数据库的性能问题?
【10月更文挑战第28天】监控和诊断MySQL数据库的性能问题是确保数据库高效稳定运行的关键
532 1
MongoDB 数据库引用
10月更文挑战第20天
44 1

相关产品

  • 云数据库 MongoDB 版
  • AI助理

    你好,我是AI助理

    可以解答问题、推荐解决方案等