面试题答案
一键面试MongoDB 服务端配置
- 确保MongoDB处于一致性状态:
- 在进行文件系统快照之前,需要让MongoDB处于一个一致性状态,可使用
fsync
命令将所有内存中的数据刷新到磁盘。在MongoDB shell中执行以下命令:
- 在进行文件系统快照之前,需要让MongoDB处于一个一致性状态,可使用
db.fsyncLock();
- 此命令会锁定数据库,阻止写操作,确保所有数据都同步到磁盘,保证数据的一致性。
2. 记录当前的oplog位置: - 记录当前的操作日志(oplog)位置,以便在恢复时能够从该点继续应用操作日志。在MongoDB shell中执行:
var res = db.getSisterDB("local").oplog.rs.find().sort({$natural: -1}).limit(1);
printjson(res);
- 记录下`ts`字段的值,这个值代表了操作日志的时间戳,用于恢复时的点。
文件系统层面操作
- 创建文件系统快照:
- 这一步骤取决于使用的文件系统和存储系统。例如,在支持快照功能的存储系统(如ZFS文件系统)上,可以使用相应的命令创建快照。
- 对于ZFS文件系统,假设MongoDB的数据存储在
/data/mongodb
挂载点,对应的ZFS数据集为zroot/data/mongodb
,创建快照的命令如下:
zfs snapshot zroot/data/mongodb@mongodb_backup_snapshot
- 在其他支持快照的存储系统(如LVM)上,也有类似的创建快照流程,需要先确定卷组和逻辑卷等信息,然后使用`lvcreate -s`命令创建逻辑卷快照。
2. 解锁MongoDB: - 在成功创建文件系统快照后,需要解锁MongoDB,允许其继续正常操作。在MongoDB shell中执行:
db.fsyncUnlock();
- 此时MongoDB恢复正常读写操作。
3. 备份快照数据:
- 将文件系统快照中的数据备份到其他存储介质或位置。可以通过挂载快照(如果支持挂载操作,如ZFS快照可挂载),然后使用cp
、rsync
等工具将数据复制到备份存储。
- 例如,对于ZFS快照,先挂载快照:
mkdir /mnt/mongodb_backup
zfs mount zroot/data/mongodb@mongodb_backup_snapshot /mnt/mongodb_backup
- 然后使用`rsync`备份数据:
rsync -avz /mnt/mongodb_backup/ /backup/storage/mongodb_backup/
- 完成备份后,卸载挂载的快照:
umount /mnt/mongodb_backup
zfs umount zroot/data/mongodb@mongodb_backup_snapshot
恢复操作(简述)
- 恢复数据文件:
- 将备份的快照数据恢复到MongoDB的数据目录。
- 重放oplog:
- 使用记录的oplog位置,从该点开始重放操作日志,使数据恢复到最新状态。在恢复后的MongoDB环境中,通过
mongorestore
等工具结合记录的oplog位置进行oplog重放。
- 使用记录的oplog位置,从该点开始重放操作日志,使数据恢复到最新状态。在恢复后的MongoDB环境中,通过