MongoDB运维日常管理实用指南

连接与登录:第一步要稳

每天上班第一件事,不是泡咖啡,而是连上 MongoDB 看看状态。用 mongo 客户端连接时,记得带上认证信息,尤其是生产环境:

mongo --host 192.168.1.100:27017 -u admin -p --authenticationDatabase admin

输完命令,输入密码,进去了才算踏实。有时候密码记错,或者网络不通,就得先查防火墙和 mongod 是否在跑。

查看数据库状态:别等报警才动手

进去之后,先运行 db.serverStatus() 看一眼整体情况:

db.serverStatus().connections

重点关注 connections 的 current 和 available,如果 current 接近 available,说明连接快满了,得查应用有没有连接泄漏。

再看看内存使用:

db.serverStatus().mem

mapped、virtual、resident 这几个值要看趋势,突然飙升可能有问题。特别是 mapped 超过物理内存时,磁盘 IO 会变高,页面加载就开始卡。

监控慢查询:提前发现性能瓶颈

有个同事上周反馈订单查询变慢,一查日志,原来是没加索引。mongod 的 slow query log 得开着,阈值设成 100ms 比较合理:

db.setProfilingLevel(1, { slowms: 100 })

然后去查看 profile 记录:

use test
db.system.profile.find().sort({ts: -1}).limit(5)

看到 type: 'COLSCAN' 就要警惕,全表扫描了。赶紧补个索引:

db.orders.createIndex({ orderId: 1 })

备份不能偷懒:删库跑路真会发生

上周隔壁组误删了个集合,还好有备份。每天凌晨跑一次 mongodump 是基本操作:

mongodump --host localhost:27017 --out /backup/mongo/$(date +\%Y%m%d)

配合 crontab,定时执行:

0 2 * * * /usr/bin/mongodump --host localhost:27017 --out /backup/mongo/$(date +\%Y%m%d)

备份完记得压缩,不然磁盘撑不住。有条件的话,把备份传到异地服务器或对象存储。

清理旧数据:别让日志吃光硬盘

有些项目喜欢往 MongoDB 里写日志,时间一长,collection 能到上百 GB。定期清理老数据很有必要:

db.logs.deleteMany({ timestamp: { $lt: new Date(Date.now() - 30*24*60*60*1000) } })

也可以用 TTL 索引自动过期:

db.logs.createIndex({ "timestamp": 1 }, { expireAfterSeconds: 2592000 })

设置完就不用管了,系统自己清理。

检查复制集状态:主从同步别掉链子

如果用了复制集,每天得瞄一眼同步状态:

rs.status()

看 members 里的 state 是否正常。主节点是 1,从节点是 2,要是看到 8 或者 STARTUP2 卡住,就得查日志找原因。常见的是网络延迟大,或者从节点磁盘满了。

权限管理:最小权限原则

开发要权限,不能直接给 root。创建只读账号:

use admin
db.createUser({
  user: "dev_read",
  pwd: "secure_password",
  roles: [ { role: "read", db: "orders" } ]
})

谁需要改数据,再单独授权。账号密码统一记录在密码管理工具里,别贴在显示器旁边。