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

來源:互聯網
上載者:User

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

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

 

650) this.width=650;" border="0" src="http://www.bkjia.com/uploads/allimg/131228/224UMI9-0.png" />


原理:通過lvm快照給lvm真身拍個照片,當lvm真身發送改變時,lvm快照把lvm真身改變之前的內容存放在快照上,這樣在lvm快照有效這段時間內,我們看到的lvm快照上的內容始終是lvm真身在建立lvm快照時內容,通過備份lvm快照即可達到線上備份lvm真身的目的。需要注意的是,當lvm快照比lvm真身小時,若lvm真身發生的改變大於lvm快照,則lvm快照將變得無法讀取而失效;  若lvm快照大於等於lvm真身,則不會發生前面的情況。

 

 

用法:

-g 是VG組     -v 是具體的lv邏輯盤

 

 
  1. ./mongolvmbackup.sh -g myvolgroup -v mongodata 

 地址: http://rfyiamcool.blog.51cto.com

指令碼:

 
  1. #!/bin/bash -e 

  2. # Backup the local MongoDB database by: 

  3. #  

  4. #  1  lvm snapshot mongodb's data volume 

  5. #  2  unlock mongodb 

  6. #  3   bzip2 the snapshot into tempdir 

  7. #在壓縮的備份將暫時分級傳輸 

  8. TARGET_DIR=/mnt/mongosnaps 

  9. #保留的天數 

  10. LOCAL_RETENTION_DAYS=7

  11. #壓縮的等級 

  12. COMPRESS_PROG=bzip2

  13. COMPRESS_SUFFIX=tbz2

  14. COMPRESS_LEVEL=6

  15. print_help() { 

  16.   echo 

  17.   echo "$0: -g <lvmgroup> -v <lvmvolume> -b <s3 bucket>" 

  18.   echo 

  19.   echo "Snapshot & compress MongoDB databases present on this host.  Place them in" 

  20.   echo "$TARGET_DIR and create a 'latest' symlink." 

  21.   echo 

  22.   exit 0 

  23. # Check for some required utilities 

  24. command lvcreate --help >/dev/null 2>&1 || { echo "Error: lvcreate is required.  Cannot continue."; exit 1; } 

  25. command lvremove --help >/dev/null 2>&1 || { echo "Error: lvremove is required.  Cannot continue."; exit 1; } 

  26. command $COMPRESS_PROG -V >/dev/null 2>&1 || { echo "Error: compression util required.  Cannot continue."; exit 1; } 

  27. s3bucket=''

  28. vgroup=''

  29. volume=''

  30. while [ $# -gt 0 ] 

  31. do 

  32.   case $1 in 

  33.     -h) print_help ;; 

  34.     --help) print_help ;; 

  35.     -b) s3bucket=$2 ; shift 2 ;; 

  36.     -g) vgroup=$2 ; shift 2 ;; 

  37.     -v) volume=$2 ; shift 2 ;; 

  38.     *) shift 1 ;; 

  39.   esac 

  40. done 

  41. #檢查卷 

  42. if [ "$vgroup" == "" ] 

  43. then 

  44.   echo "No group set, won't continue" 

  45.   exit 1 

  46. fi 

  47. if [ "$volume" == "" ] 

  48. then 

  49.   echo "No volume set, won't continue" 

  50.   exit 1 

  51. fi 

  52. # Check volume is a real LVM volume 

  53. if ! lvdisplay "/dev/$vgroup/$volume" >/dev/null 2>/dev/null 

  54. then 

  55.   echo "/dev/$vgroup/$volume is not a real LVM volume!" 

  56.   exit 1 

  57. fi 

  58. # Figure out where to put it 

  59. date=`date +%F_%H%M` 

  60. targetfile="${volume}-${date}-snap.${COMPRESS_SUFFIX}"

  61. # ============================================================================= 

  62. # Print a meaningful banner! 

  63. echo "==================== LVM MONGODB SNAPSHOT SCRIPT =====================" 

  64. echo 

  65. echo "  Snapshotting: /dev/${vgroup}/${volume}" 

  66. echo "  Target:       ${TARGET_DIR}/${targetfile}" 

  67. echo 

  68. #如果目標檔案夾不存在的話,建立 

  69. if [ ! -d "$TARGET_DIR" ] 

  70. then 

  71.   echo "Your target dir ${TARGET_DIR} doesn't exist and I'm too cowardly to create it" 

  72.   exit 1 

  73. fi 

  74. # 建立快照 

  75. snapvol="$volume-snap"

  76. echo "Freezing MongoDB before LVM snapshot" 

  77. mongo -eval "db.fsyncLock()" 

  78. echo 

  79. echo "Taking snapshot $snapvol" 

  80. lvcreate --snapshot "/dev/$vgroup/$volume" --name "$snapvol" --extents '90%FREE' 

  81. echo 

  82. echo "Snapshot OK; unfreezing DB" 

  83. mongo -eval "db.fsyncUnlock()" 

  84. echo 

  85. echo 

  86. # 掛載LVM快照 

  87. mountpoint=`mktemp -t -d mount.mongolvmbackup_XXX` 

  88. mount -v -o ro "/dev/${vgroup}/${snapvol}" "${mountpoint}" 

  89. echo 

  90. find "$TARGET_DIR" -iname "*-snap.${COMPRESS_SUFFIX}" -mtime +${LOCAL_RETENTION_DAYS} -delete 

  91. echo 

  92. # 按照我們先前設定的比率進行壓縮 

  93. echo "Compressing snapshot into ${TARGET_DIR}/${targetfile}" 

  94. cd "${mountpoint}" 

  95. tar cv * | $COMPRESS_PROG "-${COMPRESS_LEVEL}" -c > "${TARGET_DIR}/${targetfile}" 

  96. echo 

  97. cd - 

  98. cd "$TARGET_DIR" 

  99. rm -vf latest.${COMPRESS_SUFFIX} 

  100. ln -v -s ${targetfile} latest.${COMPRESS_SUFFIX} 

  101. cd - 

  102. echo 

  103. echo 

  104. # 卸載並刪除用於備份的那個快照 

  105. echo "Removing temporary volume..." 

  106. umount -v "$mountpoint" 

  107. rm -rvf "$mountpoint" 

  108. echo 

  109. lvremove -f "/dev/${vgroup}/${snapvol}" 

  110. echo 

  111. echo 

 

 

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

相關文章

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.