连接与登录:第一步要稳
每天上班第一件事,不是泡咖啡,而是连上 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" } ]
})
谁需要改数据,再单独授权。账号密码统一记录在密码管理工具里,别贴在显示器旁边。