这里使用LVM 逻辑磁盘对 Mongodb进行超速备份,mongodb到了几十G以上,用mongodb工具备份的速度,会让我们感到相当蛋疼的慢,这时候我们可以进行mongdb的data目录进行LVM快照备份。
原理:通过lvm快照给lvm真身拍个照片,当lvm真身发送改变时,lvm快照把lvm真身改变之前的内容存放在快照上,这样在lvm快照有效的这段时间内,我们看到的lvm快照上的内容始终是lvm真身在创建lvm快照时内容,通过备份lvm快照即可达到在线备份lvm真身的目的。需要注意的是,当lvm快照比lvm真身小时,若lvm真身发生的改变大于lvm快照,则lvm快照将变得无法读取而失效; 若lvm快照大于等于lvm真身,则不会发生前面的情况。
|
用法:
-g 是VG组 -v 是具体的lv逻辑盘
- ./mongolvmbackup.sh -g myvolgroup -v mongodata
地址: http://rfyiamcool.blog. 脚本: [Shell] 纯文本查看 复制代码 #!/bin/bash -e
# Backup the local MongoDB database by:
#
#
# 1 lvm snapshot mongodb's data volume
# 2 unlock mongodb
# 3 bzip2 the snapshot into tempdir
#在压缩的备份将暂时分级传输
TARGET_DIR=/mnt/mongosnaps
#保留的天数
LOCAL_RETENTION_DAYS=7
#压缩的等级
COMPRESS_PROG=bzip2
COMPRESS_SUFFIX=tbz2
COMPRESS_LEVEL=6
print_help() {
echo
echo "$0: -g <lvmgroup> -v <lvmvolume> -b <s3 bucket>"
echo
echo "Snapshot & compress MongoDB databases present on this host. Place them in"
echo "$TARGET_DIR and create a 'latest' symlink."
echo
exit 0
}
# Check for some required utilities
command lvcreate --help >/dev/null 2>&1 || { echo "Error: lvcreate is required. Cannot continue."; exit 1; }
command lvremove --help >/dev/null 2>&1 || { echo "Error: lvremove is required. Cannot continue."; exit 1; }
command $COMPRESS_PROG -V >/dev/null 2>&1 || { echo "Error: compression util required. Cannot continue."; exit 1; }
s3bucket=''
vgroup=''
volume=''
while [ $# -gt 0 ]
do
case $1 in
-h) print_help ;;
--help) print_help ;;
-b) s3bucket=$2 ; shift 2 ;;
-g) vgroup=$2 ; shift 2 ;;
-v) volume=$2 ; shift 2 ;;
*) shift 1 ;;
esac
done
#检查卷
if [ "$vgroup" == "" ]
then
echo "No group set, won't continue"
exit 1
fi
if [ "$volume" == "" ]
then
echo "No volume set, won't continue"
exit 1
fi
# Check volume is a real LVM volume
if ! lvdisplay "/dev/$vgroup/$volume" >/dev/null 2>/dev/null
then
echo "/dev/$vgroup/$volume is not a real LVM volume!"
exit 1
fi
# Figure out where to put it
date=`date +%F_%H%M`
targetfile="${volume}-${date}-snap.${COMPRESS_SUFFIX}"
# =============================================================================
# Print a meaningful banner!
echo "==================== LVM MONGODB SNAPSHOT SCRIPT ====================="
echo
echo " Snapshotting: /dev/${vgroup}/${volume}"
echo " Target: ${TARGET_DIR}/${targetfile}"
echo
#如果目标文件夹不存在的话,创建
if [ ! -d "$TARGET_DIR" ]
then
echo "Your target dir ${TARGET_DIR} doesn't exist and I'm too cowardly to create it"
exit 1
fi
# 创建快照
snapvol="$volume-snap"
echo "Freezing MongoDB before LVM snapshot"
mongo -eval "db.fsyncLock()"
echo
echo "Taking snapshot $snapvol"
lvcreate --snapshot "/dev/$vgroup/$volume" --name "$snapvol" --extents '90%FREE'
echo
echo "Snapshot OK; unfreezing DB"
mongo -eval "db.fsyncUnlock()"
echo
echo
# 挂载LVM快照
mountpoint=`mktemp -t -d mount.mongolvmbackup_XXX`
mount -v -o ro "/dev/${vgroup}/${snapvol}" "${mountpoint}"
echo
find "$TARGET_DIR" -iname "*-snap.${COMPRESS_SUFFIX}" -mtime +${LOCAL_RETENTION_DAYS} -delete
echo
# 按照我们先前设置的比率进行压缩
echo "Compressing snapshot into ${TARGET_DIR}/${targetfile}"
cd "${mountpoint}"
tar cv * | $COMPRESS_PROG "-${COMPRESS_LEVEL}" -c > "${TARGET_DIR}/${targetfile}"
echo
cd -
cd "$TARGET_DIR"
rm -vf latest.${COMPRESS_SUFFIX}
ln -v -s ${targetfile} latest.${COMPRESS_SUFFIX}
cd -
echo
echo
# 卸载并删除用于备份的那个快照
echo "Removing temporary volume..."
umount -v "$mountpoint"
rm -rvf "$mountpoint"
echo
lvremove -f "/dev/${vgroup}/${snapvol}"
echo
echo
|