歡迎來到Linux教程網
Linux教程網
Linux教程網
Linux教程網
您现在的位置: Linux教程網 >> UnixLinux >  >> Linux基礎 >> 關於Linux

使用LVM對Mongodb進行速度快照和壓縮備份

這裡使用LVM 邏輯磁盤對 Mongodb進行超速備份,mongodb到了幾十G以上,用mongodb工具備份的速度,會讓我們感到相當蛋疼的慢,這時候我們可以進行mongdb的data目錄進行LVM快照備份。

lvm 參考下我的另一個文章  http://rfyiamcool.blog.51cto.com/1030776/959704

原理:通過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.51cto.com

腳本:

#!/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

本文出自 “峰雲,就她了。” 博客,請務必保留此出處http://rfyiamcool.blog.51cto.com/1030776/1195201

Copyright © Linux教程網 All Rights Reserved