实用脚本能自动管理MongoDB吗?

wen 实用脚本 4

本文目录导读:

实用脚本能自动管理MongoDB吗?

  1. 自动化备份与恢复
  2. 自动化索引管理
  3. 自动清理过期数据(TTL 或定时任务)
  4. 监控与告警脚本
  5. 自动用户权限管理
  6. 定期数据压缩(Power of 2 或 collMod)
  7. 自动化调度(Crontab 示例)
  8. 最佳实践建议

是的,可以通过编写实用脚本来自动化管理 MongoDB 的许多日常任务,MongoDB 提供了丰富的命令行工具和驱动程序接口,使得自动化运维成为可能。

以下是几个常见的自动化管理场景及对应的实用脚本示例:

自动化备份与恢复

使用 mongodumpmongorestore 工具。

备份脚本 (Shell):

#!/bin/bash
# 备份所有数据库到带日期的目录
BACKUP_DIR="/backups/mongodb"
DATE=$(date +%Y%m%d_%H%M%S)
DB_HOST="localhost"
DB_PORT="27017"
# 创建备份
mongodump --host $DB_HOST --port $DB_PORT --out "$BACKUP_DIR/$DATE"
# 保留最近7天的备份,删除更早的
find $BACKUP_DIR -type d -mtime +7 -exec rm -rf {} \;
echo "Backup completed: $BACKUP_DIR/$DATE"

恢复脚本 (Shell):

#!/bin/bash
# 从指定备份目录恢复
RESTORE_DIR="/backups/mongodb/20250326_120000"
mongorestore --drop --dir $RESTORE_DIR

自动化索引管理

使用 mongosh 脚本监控和创建索引。

创建索引脚本 (JavaScript for mongosh):

// ensure_indexes.js
db = db.getSiblingDB('myapp');
// 为常用查询创建索引
db.users.createIndex({ email: 1 }, { unique: true });
db.orders.createIndex({ status: 1, date: -1 });
db.products.createIndex({ category: 1, price: 1 });
// 检查缺失索引(需要开启 profiling)
// db.setProfilingLevel(2);
// 分析慢查询日志...
print('Indexes created successfully');

执行: mongosh --quiet ensure_indexes.js

自动清理过期数据(TTL 或定时任务)

方案 A:利用 MongoDB TTL 索引(推荐)

// 自动删除 24 小时前的日志
db.logs.createIndex({ createdAt: 1 }, { expireAfterSeconds: 86400 });

不需要额外脚本,MongoDB 后台线程会自动清理。

方案 B:定时清理脚本 (Shell + mongosh)

#!/bin/bash
# 删除旧数据
mongosh --quiet <<EOF
use your_database;
db.collection.deleteMany({ 
    status: "temporary", 
    createdAt: { \$lt: new Date(Date.now() - 2 * 3600 * 1000) } 
});
EOF

配合 cron 定时执行:crontab -e 添加 0 */6 * * * /path/to/cleanup.sh

监控与告警脚本

检查副本集健康状态 (Python 示例)

#!/usr/bin/env python3
from pymongo import MongoClient
import smtplib
client = MongoClient('mongodb://localhost:27017/')
repl_status = client.admin.command('replSetGetStatus')
# 检查每个成员状态
for member in repl_status['members']:
    if member['stateStr'] != 'PRIMARY' and member['stateStr'] != 'SECONDARY':
        print(f"ALERT: Member {member['name']} in state {member['stateStr']}")
        # 发送告警邮件
        # send_alert(f"Node {member['name']} is unhealthy")
print(f"Replica set has {len(repl_status['members'])} members, ok.")

自动用户权限管理

创建/轮换用户密码脚本:

use admin;
// 创建应用只读用户(Idempotent 写法)
if (!db.getUser('app_readonly')) {
    db.createUser({
        user: 'app_readonly',
        pwd: 'secure_password_here',  // 建议从环境变量读取
        roles: [{ role: 'read', db: 'myapp' }]
    });
    print('User created');
}

定期数据压缩(Power of 2 或 collMod)

压缩集合脚本:

// run_compact.js
use myapp;
db.runCommand({ compact: 'orders' });  // 会阻塞操作,建议维护窗口执行

或使用碎片整理:db.collection.aggregate([{$merge: {into: "orders"}}])

自动化调度(Crontab 示例)

# 每天凌晨2点备份
0 2 * * * /opt/scripts/mongo_backup.sh >> /var/log/mongo_backup.log 2>&1
# 每6小时清理一次临时数据
0 */6 * * * /opt/scripts/mongo_cleanup.sh
# 每5分钟检查副本集健康状态
*/5 * * * * /opt/scripts/mongo_health_check.py

最佳实践建议

  1. 使用配置管理工具:对于复杂部署(如 Kubernetes),推荐使用 Operator 或 Ansible/Chef 进行声明式管理。
  2. 安全考虑:不要在脚本中硬编码密码,使用环境变量、Vault 或 MongoDB Atlas/AWS Secrets Manager。
  3. 幂等性:确保脚本可以重复安全执行(如创建索引时检查是否存在)。
  4. 日志记录:给脚本添加详细的日志输出,便于问题排查。
  5. 错误处理:添加 set -e(Shell)或 try-catch(Python)确保失败时退出或告警。

简单的备份/清理任务用 Shell 脚本配合 cron 最快捷,复杂的运维逻辑推荐用 Python(pymongo)或 Go(mongo-go-driver)编写,这些脚本可以很好地将 MongoDB 管理从手工操作转化为自动化流程。

抱歉,评论功能暂时关闭!