面试题答案
一键面试高效热备份策略
- 使用 mongodump 工具:
- 在每个分片的主节点上,定期(如每天凌晨业务低峰期)运行
mongodump
命令。例如,对于分片shard1
的主节点shard1 - primary:27017
,命令如下:
mongodump --uri="mongodb://shard1 - primary:27017" --out=/backup/path/shard1 - `date +\%Y\%m\%d\%H\%M\%S`
- 这样能以时间戳命名备份文件夹,方便管理不同时间的备份数据。
- 在每个分片的主节点上,定期(如每天凌晨业务低峰期)运行
- 压缩备份数据:
- 备份完成后,使用
gzip
等压缩工具对备份文件夹进行压缩。例如:
tar -czvf shard1 - `date +\%Y\%m\%d\%H\%M\%S`.tar.gz /backup/path/shard1 - `date +\%Y\%m\%d\%H\%M\%S`
- 这可以显著降低存储成本。
- 备份完成后,使用
- 分布式存储备份数据:
- 将压缩后的备份文件存储到分布式文件系统(如 Ceph 等)或云存储(如 Amazon S3)中。分布式存储能提供高可用性和扩展性,且云存储通常有按存储量计费的模式,适合控制成本。
故障恢复方案
- 节点宕机:
- 技术方案:
- 如果是分片主节点宕机,副本集会自动选举新的主节点。在备份脚本中,可以设置重试机制。例如,使用
while
循环,当mongodump
命令失败时,等待一段时间(如 5 分钟)后重试,最多重试 3 次。
- 如果是分片主节点宕机,副本集会自动选举新的主节点。在备份脚本中,可以设置重试机制。例如,使用
- 操作步骤:
- 在备份脚本中添加如下代码(以 bash 脚本为例):
retries=0 while [ $retries -lt 3 ]; do mongodump --uri="mongodb://shard1 - primary:27017" --out=/backup/path/shard1 - `date +\%Y\%m\%d\%H\%M\%S` if [ $? -eq 0 ]; then break fi retries=$((retries + 1)) sleep 300 done if [ $retries -eq 3 ]; then echo "Failed to backup after 3 retries for shard1" fi
- 技术方案:
- 网络分区:
- 技术方案:
- 监控网络连接状态,使用
ping
或更专业的网络监控工具(如 Nagios 等)。当检测到网络分区时,暂停备份任务,并记录当前备份进度。网络恢复后,从记录的进度处继续备份。
- 监控网络连接状态,使用
- 操作步骤:
- 在备份脚本开始处添加网络监控代码(以 bash 脚本为例):
while true; do ping -c 1 shard1 - primary &> /dev/null if [ $? -eq 0 ]; then break fi sleep 60 done
- 对于记录备份进度,可以在
mongodump
命令中使用--query
选项,结合$gt
操作符,从上次备份中断的文档 ID 处继续备份。例如,如果上次备份到document_id = 100
,则:
mongodump --uri="mongodb://shard1 - primary:27017" --collection=your_collection --query='{"_id": {"$gt": 100}}' --out=/backup/path/shard1 - `date +\%Y\%m\%d\%H\%M\%S`
- 为保证数据完整性和一致性,在备份完成后,对备份数据进行校验。可以使用
md5sum
或sha256sum
等工具对备份文件生成校验和,并与之前备份的校验和对比,若不一致则重新备份。例如:
md5sum shard1 - `date +\%Y\%m\%d\%H\%M\%S`.tar.gz > shard1 - `date +\%Y\%m\%d\%H\%M\%S`.md5
- 技术方案: