背景:mongodb大量数据情况下备份难问题
痛点:由于业务增长,数据量增长到百G或者T级别,使用传统的mongodump已经无法满足,使用延时节点备份也只能保存很短时间的数据。针对这种情况只能着手从存储布局。如果对硬盘读写速度没有很强烈的需求,那么使用ceph rbd块或者云盘上很不错的选择。可以使用rbd或者云盘的快照功能进行文件系统级别快照备份。但是到达T级别数据量显然ssd是更好的选择。大多数情况下只能使用物理ssd盘,无法像rbd或者云盘等方便快照。
解决思路:从文件系统布局,使用lvm snapshot功能对文件系统进行快照
环境介绍:
系统 | k8s版本 | mongo地址规划 | 盘符(容量均为20G) | lvm配置 |
---|---|---|---|---|
CentOS Linux release 7.7.1908 (Core) | v1.18.10 | 192.168.86.36:27017 | sdb | 否 |
CentOS Linux release 7.7.1908 (Core) | v1.18.10 | 192.168.86.36:27018 | sdc | 否 |
CentOS Linux release 7.7.1908 (Core) | v1.18.10 | 192.168.86.36:27019 | sdd、sde | 是 |
CentOS Linux release 7.7.1908 (Core) | v1.18.10 | 192.168.86.36:27020 | sdd、sde | 挂载快照数据使用 |
1、环境部署
1、硬盘配置
#mongodb01和mongodb02数据目录配置
mkfs.xfs /dev/sdb
mkfs.xfs /dev/sdc
mkdir -p /data/mongodb01
mkdir -p /data/mongodb02
mount /dev/sdb /data/mongodb01
mount /dev/sdc /data/mongodb02
#mongodb03数据目录配置
pvcreate /dev/sdd
vgcreate mongodb03 /dev/sdd
lvcreate -L 19.5G -n mongodb03 mongodb03
vgextend mongodb03 /dev/sde
mkfs.xfs /dev/mongodb03/mongodb03
mkdir -p /data/mongodb03
mount /dev/mongodb03/mongodb03 /data/mongodb03
2、部署mongodb ,只部署mongodb27017-27019 ;参考:静态pod+hostPath部署高可用集群
3、数据准备
use duanshuaixing-mongodb
for(i=1; i<=50000;i++){ db.user.insert( {name:'mongodb-lvmtest'+i, age:i} ) }
use duanshuaixing-mongodb02
for(i=1; i<=50000;i++){ db.user.insert( {name:'mongodb-lvmtest02'+i, age:i} ) }
二、备份和恢复
1、使用lvm对mongodb03打快照
#创建快照
lvcreate -L +19G -n mongodb03snapsrc -s /dev/mongodb03/mongodb03
#查看快照
lvdisplay
lsblk
2、误删除数据
rs0:PRIMARY> use duanshuaixing-mongodb02
rs0:PRIMARY> db.dropDatabase()
3、下线所有mongodb节点
4、挂载mongodb03 lvm快照到文件系统
mkdir /data/mongodb03-lvm-snapshot
mount -o rw,nouuid /dev/mongodb03/mongodb03snapsrc /data/mongodb03-lvm-snapshot
5、恢复方式1
直接拷贝数目录到原有数据库目录,拷贝完成后启动全部节点
6、恢复方式2、启动192.168.86.36:27020,数据目录使用/data/mongodb03-lvm-snapshot ,在新启动数据库内修改主节点信息并删除其余从节点(节点网络互通的情况下会导致原有集群内节点被移除,请慎重操作)
mongo 192.168.86.36:27020
rs0:OTHER> rs.slaveOk()
rs0:OTHER> use admin
rs0:OTHER> db.auth('root','rootPassw0rd')
1>获取副本集配置
rs0:OTHER> cfg=rs.conf()
2>查看配置节点
rs0:OTHER> printjson(cfg)
3>重新配置节点
rs0:OTHER> cfg.members[0].host="192.168.86.36:27020"
rs0:OTHER> rs.reconfig(cfg, {force : true})
4>查看数据库是否存在且数据正常
rs0:SECONDARY> show dbs
rs0:SECONDARY> use duanshuaixing-mongodb02
rs0:SECONDARY> db.user.find().count()
5>删除member为1、2的节点
rs0:SECONDARY> cfg.members.splice(1,1)
rs0:SECONDARY> rs.reconfig(cfg, {force : true})
rs0:SECONDARY> cfg.members.splice(2,1)
rs0:SECONDARY> rs.reconfig(cfg, {force : true})
rs0:PRIMARY> rs.status()
6.1、关于删除节点的恢复的相关问题:
1>重新配置节点后可以不移除节点, 把丢失的库或者数据使用mongodump导出再导入到原有的集群
2>不移除节点需要在mongodump完成后停掉新启动的mongodb,并卸载快照挂载
3>如果使用移除节点方法需要重新加回节点,加回节点后从集群移除新启动的mongodb,同时下线服务并卸载快照挂载