重要的内容
MongoDB 的主备节点在运行过程中是不固定的,实例重启、升级、节点故障等都有可能导致主备切换,在生产环境应该使用副本集的方式来正确连接MongoDB 来实现高可用。
连接问题
用户可通过 DMS 或 mongo shell 连接 MongoDB 云数据库,以下场景都基于用户使用 mongo shell 连接数据库。
Q: 连接实例提示网络超时?
通过 telnet 来确认是否是网络不通导致的,例如
telnet dds-uf69ba5cf6e123442.mongodb.rds.aliyuncs.com 3717
网络不通可能的原因:
1. ECS 跟 MongoDB 节点不在同一个可用区
2. ECS 跟 MongoDB 节点不在同一个 vpc 环境
Q: 连接实例提示鉴权失败?
可能的原因
1. 密码错误,可在控制台重置 root 密码
2. 连接的用户跟数据库不匹配,比如 root 用户是 admin 数据库下的用户,则使用 root 连接时,必须指定鉴权数据库为 admin3. 客户端版本过低,mongo shell 版本必须是 3.0+,其他语言客户端的版本要求参考 Driver 兼容性文档
Q: 连接 Secondary 执行执行命令时,提示 slaveOk=false 错误?
默认情况下,MongoDB 的读写请求都必须到 Primary 节点,Secondary 默认是
不可读的,除非客户端显式的指定 Secondary 节点可读(通过设置
readPreference)。
mongoshell 连接时,可以执行 rs.slaveOk()来指定备可读
如果想 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: 连接时提示
上述错误通常是实例的连接数已经达到上限,无法再建立更多的网络连接,可在控制台查看实例连接数的使用情况确认。用户使用实例时应该合理的规划并控制实例的连接数,避免因为连接数耗尽而无法连接实例,如果业务上的
确需要更多的网络连接,则需要升级实例的规格。连接数的管理请参考下面『连
接数问题』部分。
连接数问题
Q: 如何查看当前连接
1. 登录阿里云控制台查看
2. 使用 mongo shell 连接实例,执行如下命令,其中 current 代表当前已建立连接数,available 代表当前可用连接数,internal*的连接用于内部管理,用户可忽略。
Q: 如何查看当前连接主要来自哪些 ECS 机器?
mongoshell 或 DMS(如果连接数已满,则只能通过 DMS 来登录查看)连接实例,执行db.runCommand({currentOp: 1, $all: true}),就能输出所有跟该实例建立的所有连接情况,其中 client 字段包含了 ECS 的 ip 地址信息。
有了上述结果,用户就可以根据来源 ip 做进一步的分析,得出各个 ECS 跟实例分别建立了多少连接等信息。
Q: 生产环境连接数快满了,如何限制每个 ECS 到实例的连接数量?
MongoDB 基本所有的 driver 都支持通过Connection String URI 来连接实例,云数据库的连接 URI 已为用户在控制上生成好,加上密码信息就能直接使用。
如果采用 URI 来连接实例的,在 URI 末尾加上&maxPoolSize=xx 来限制到实例的连接数即可,比如你有 10 台 ECS 并发访问实例,实例的最大连接数为 1000,那么每个 ECS 上的连接池的数量要控制在 100 以内。
不同语言的客户端可能封装了不通的连接方式,但也一定有方法指定连接池的数量限制,具体参考各语言客户端的 api 文档。
附在高问题
用率很高,想看看实例正在执行什么
Q:CPU利用率很高,想看看实例正在执行什么操作?
造成实例负载高的典型 case
1. 并发请求的量太大,超出当前规格的服务能力
2. 查询集合时,没有合理的建索引,导致全表扫描或排序
3. 正在跑一些计算量很大的 mapreduce 或者 aggregation 任务
正在执行的操作都包含一个 opid 字段,用户可以根据 opid 字段直接 kill 掉对应的操作
mongo-test:PRIMARY> db.killOp(opid)
仍然无法解决问题
请查看 FAQ 文档,或提交工单。负载高问题
以上内容来自于《云数据库运维实战手册》,可点击https://developer.aliyun.com/topic/download?id=8198下载完整版