MongoDB副本集部署后仅在Secondary节点执行备份的Shell脚本
如何在MongoDB副本集的Secondary节点自动执行备份
我之前处理过不少这类副本集备份的需求,确实因为Primary/Secondary角色会动态切换,硬编码IP的方案根本不耐用,必须靠动态识别来解决。下面给你一套经过验证的实操方案:
核心思路
通过MongoDB内置的副本集状态查询命令,实时获取当前所有Secondary节点的信息,挑选合适的节点后远程执行备份操作,完全不需要人工干预角色变化。
1. 自动识别Secondary节点
可以用mongo shell命令直接查询副本集状态,筛选出状态为SECONDARY的节点。比如在脚本里执行这条命令:
# 获取所有Secondary节点的host:port列表(返回格式是数组字符串) SECONDARY_LIST=$(mongo --eval "rs.status().members.filter(m => m.stateStr === 'SECONDARY').map(m => m.host)" --quiet) # 提取第一个可用的Secondary节点(如果有多个,也可以按延迟排序选最优的) TARGET_SECONDARY=$(echo $SECONDARY_LIST | awk -F'[",]' '{print $2}')
如果你的副本集开启了权限验证,记得加上--username和--password参数,比如:
SECONDARY_LIST=$(mongo --username your_user --password your_pwd --authenticationDatabase admin --eval "rs.status().members.filter(m => m.stateStr === 'SECONDARY').map(m => m.host)" --quiet)
2. 远程登录Secondary节点执行备份
拿到目标节点的host:port后,提取IP地址(如果是域名直接用域名也可以),然后通过SSH免密登录执行mongodump备份:
# 提取IP地址(拆分host和port) SECONDARY_IP=$(echo $TARGET_SECONDARY | cut -d':' -f1) # 执行mongodump备份(这里以备份指定数据库为例,按需调整参数) ssh your_ssh_user@$SECONDARY_IP "mongodump \ --db your_target_db \ --out /data/backups/mongo_$(date +%Y%m%d_%H%M) \ --readPreference secondary \ --oplog"
这里的--oplog参数很重要(MongoDB 4.2+支持),它会记录备份期间的操作日志,让备份文件是时间点一致性的,恢复的时候能还原到备份完成的瞬间状态。
3. 优化与容错处理
- 多Secondary节点选择:如果副本集有多个Secondary,建议选延迟最低的节点,避免备份影响业务:
TARGET_SECONDARY=$(mongo --eval "rs.status().members.filter(m => m.stateStr === 'SECONDARY').sort((a,b) => a.msDelay - b.msDelay)[0].host" --quiet) - 免密SSH配置:确保执行脚本的机器能免密登录所有副本集节点,避免备份过程中需要输入密码。
- 定时备份:把脚本加到
crontab里,比如每天凌晨2点执行:0 2 * * * /path/to/your/mongo_backup_script.sh >> /var/log/mongo_backup.log 2>&1 - 异常检测:脚本里可以加判断,如果没有找到Secondary节点,就发送告警邮件或者日志记录,避免备份失败没人知道:
if [ -z "$TARGET_SECONDARY" ]; then echo "$(date): 未找到可用的Secondary节点,备份失败" >> /var/log/mongo_backup_error.log # 这里可以加邮件告警逻辑,比如用mail命令 exit 1 fi
内容的提问来源于stack exchange,提问作者VarYaz
相关产品推荐
相关产品推荐

