MongoDB 副本集物理备份和恢复

概述

MongoDB 部署在docker里,MongoDB的数据在创建docker时,通过逻辑卷进行管理和存储。当数据量过大(TB级)时,通过mongodump的逻辑备份方式,效率上已经能满足需求,所以需要提供物理备份的功能,本文主要整理MongoDB副本集通过磁盘快照的进行物理备份和恢复的方法。


副本集备份步骤

找到MongoDB副本集的hidden节点,在该节点上执行备份操作

  1. 查询当前docker数据挂在卷的VG name
lvdisplay -C |grep dockerId |awk '{print $2}'
  1. 创建磁盘快照
lvcreate -s -L 1024MB -n dockerId-snap /dev/data_vg/dockerId
  1. 创建快照需要挂载的目录,并将快照挂载在该目录
mkdir -p /tmp/snap
mount /dev/jvirt_vg/dockerId-snap /tmp/snap/dockerId-snap -o nouuid,norecovery,ro
  1. 将快照中MongoDB的data目录进行打包,可以拷贝到其他物理机存储,也可以上传到云存储进行备份
tar -cf MongoDB_backup.tar -C /tmp/snap/dockerId-snap data/
  1. umount磁盘快照挂载的目录
umount /tmp/snap/dockerId-snap
  1. 删除磁盘快照
lvremove -f /dev/jvirt_vg/dockerId-snap

恢复副本集步骤
  1. 创建一个MongoDB的docker, 将快照打包的数据恢复到该docker MongoDB的data目录
tar -C /mnt/docker_path -xf MongoDB_backup.tar
  1. 登录docker内,修改MongoDB启动的默认配置文件,将replSet配置项注释掉,然后根据mongod.conf启动mongod
  2. 登录MongoDB,删除local库
    注:不可以直接删除data目录下的local文件夹,会导致mongod启动失败
mongo
use local
db.dropDatabase()
  1. 将第二步中注释掉的replSet配置恢复,根据mongod.conf重启mongod,此时登录MongoDB,会发现MongoDB是一个干净的单节点库,不包含任何副本集配置等信息
  2. 初始化副本集信息,先初始化当前恢复数据的节点(一个节点),然后在创建两个MongoDB的docker,通过rs.add()添加到该副本集中

问:为什么不直接用rs.initiate()直接初始化3个节点呢,分别设定primary、secondary和hidden角色
答:直接初始化3个节点,不敢十分确定,当前已经恢复数据的节点能被选为primary,万一当前节点竞选primary失败,数据就全部被回滚了,所以通过后续rs.add()更稳妥一些

rs.initiate()
rs.add()
  1. 等待数据同步,后续添加的两个节点状态分别由recovering变为secondary,恢复完成
参考资料:

LVM原理及配置
Restore a Replica Set from MongoDB Backups

你可能感兴趣的:(MongoDB 副本集物理备份和恢复)