MongoDB 云数据库常见问题诊断

重要的内容


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


连接问题


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

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

MongoDB 云数据库常见问题诊断MongoDB 云数据库常见问题诊断

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

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


网络不通可能的原因:


1. ECS MongoDB 节点不在同一个可用区

2. ECS MongoDB 节点不在同一个 vpc 环境


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

MongoDB 云数据库常见问题诊断

可能的原因

1. 密码错误,可在控制台重置 root 密码

2. 连接的用户跟数据库不匹配,比如 root 用户是 admin 数据库下的用户,则使用 root 连接时,必须指定鉴权数据库为 admin3. 客户端版本过低,mongo shell 版本必须是 3.0+,其他语言客户端的版本要求参考 Driver 兼容性文档


Q:  连接 Secondary 执行执行命令时,提示 slaveOk=false 错误?
MongoDB 云数据库常见问题诊断
默认情况下,MongoDB 的读写请求都必须到 Primary 节点,Secondary 默认是
不可读的,除非客户端显式的指定 Secondary 节点可读(通过设置
readPreference)。
mongoshell 连接时,可以执行 rs.slaveOk()来指定备可读


MongoDB 云数据库常见问题诊断


如果想 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-uf6
9ba5cf6e123441.mongodb.rds.aliyuncs.com:3717   --authenticationDatabase
admin -u system -p xxx


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


Q:  连接时提示

MongoDB 云数据库常见问题诊断


上述错误通常是实例的连接数已经达到上限,无法再建立更多的网络连接,可在控制台查看实例连接数的使用情况确认。用户使用实例时应该合理的规划并控制实例的连接数,避免因为连接数耗尽而无法连接实例,如果业务上的

确需要更多的网络连接,则需要升级实例的规格。连接数的管理请参考下面『连
接数问题』部分。


连接数问题      


 Q:  如何查看当前连接     


1. 登录阿里云控制台查看

2. 使用 mongo shell 连接实例,执行如下命令,其中 current 代表当前已建立连接数,available 代表当前可用连接数,internal*的连接用于内部管理,用户可忽略。

MongoDB 云数据库常见问题诊断

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

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


MongoDB 云数据库常见问题诊断

MongoDB 云数据库常见问题诊断


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


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


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


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


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


附在高问题

用率很高,想看看实例正在执行什么 

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

MongoDB 云数据库常见问题诊断

造成实例负载高的典型 case


1. 并发请求的量太大,超出当前规格的服务能力

2. 查询集合时,没有合理的建索引,导致全表扫描或排序

3. 正在跑一些计算量很大的 mapreduce 或者 aggregation 任务


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

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


仍然无法解决问题


请查看 FAQ 文档,或提交工单。 负载高问题


以上内容来自于《云数据库运维实战手册》,可点击https://developer.aliyun.com/topic/download?id=8198下载完整版

 

上一篇:mysql的cardinality异常,导致索引不可用


下一篇:使用RestTemplate消费Hybris User API获取指定用户的信息