背景介绍:
因为备份数据的不断扩大, 需要把现网备份的数据 (2T 左右) 传回到本地进行异地保存. 但是 2T 太大了, 需要进行压缩, 这里采用了 3G 一个压缩包的方式. 以下是压缩脚本
- #!/bin/bash
- # 此脚本是全量压缩 MongoDB 备份的文件
- printf "开始 mongodb 备份压缩 $(date +%Y%m%d_%A_%Z%T)\n"
- cd /data_master/backup/
- tar czf - picdb | split -b 3072m - picdb.tar.gz
- if [ $? != 0 ]
- then
- printf "mongodb 备份压缩失败 $(date +%Y%m%d_%A_%Z%T)\n"
- else
- printf "mongodb 备份压缩完成 $(date +%Y%m%d_%A_%Z%T)\n"
- fi
- echo "剩余容量: `df -h |awk -F'[ ]+''NR==7{print $4}'`"
压缩完的结果就是上图一样, 只是个数较多.
接下来的问题是: 现网网络带宽有限, 如何把这些压缩包传回到本地. 这里采用的 早上 6 点至晚上 10 点, 进行限速传(限速 500KB/s), 晚上 10 点后至早上 6 点采取不限速.
- #!/bin/bash
- # SFTP 传输脚本
- # IP 地址
IP = 本地 IP
# PORT 端口
PORT = 本地端口号
# USER 用户名
USER = 本地用户
# PASSWD 密码
PASSWD = 用户密码
- # 压缩包所在目录
- CLIENTDIR=/data_master/backup/
- #SFTP 服务器待下载目录
- SEVERDIR=/sftp/data_master/
- # 设置当前小时
- # xiaoshi=`date +"%Y-%m-%d %H:%M.%S"|awk -F "[ :]+" '{print $2}'`
- # 待下载文件名
- # FILE=
- while :
- do
- xiaoshi=`date +"%Y-%m-%d %H:%M.%S"|awk -F "[ :]+" '{print $2}'`
- if [ ${xiaoshi} -ge 6 ] && [ ${xiaoshi} -lt 22 ];
- then
- echo "大于 6 时并小于 22 时, 应该执行限速"
- File=`head -1 /home/lsy/Sftp.txt`
- printf "开始传输压缩备份 $(date +%Y%m%d_%A_%Z%T)\n">>/home/lsy/sftp_file.log
- cd ${CLIENTDIR}
lftp -u 用户, 密码 sftp:// 本地 IP 地址: 端口号 <<EOF
- cd ${SEVERDIR}
- lcd ${CLIENTDIR}
- set.NET:limit-rate 500000:500000
- reput ${File}
- by
- EOF
- if [ $? -eq 0 ]
- then
- echo "传输成功. 下面是文件名">>/home/lsy/sftp_file.log
- echo ${File}>>/home/lsy/sftp_file.log
- sleep 3
- else
- echo "传输失败.">>/home/lsy/sftp_file.log
- sleep 5
- exit 2
- fi
- sed -i 1d /home/lsy/Sftp.txt
- printf "传输完成 $(date +%Y%m%d_%A_%Z%T)\n">>/home/lsy/sftp_file.log
- else
- echo "取消限速"
- File=`head -1 /home/lsy/Sftp.txt`
- printf "开始传输压缩备份 $(date +%Y%m%d_%A_%Z%T)\n">>/home/lsy/sftp_file.log
- cd ${CLIENTDIR}
lftp -u 用户, 密码 sftp:// 本地 IP: 端口 <<EOF
- cd ${SEVERDIR}
- lcd ${CLIENTDIR}
- reput ${File}
- by
- EOF
- if [ $? -eq 0 ]
- then
- echo "传输成功. 下面是文件名">>/home/lsy/sftp_file.log
- echo ${File}>>/home/lsy/sftp_file.log
- sleep 3
- else
- echo "传输失败.">>/home/lsy/sftp_file.log
- sleep 5
- exit 2
- fi
- sed -i 1d /home/lsy/Sftp.txt
- printf "传输完成 $(date +%Y%m%d_%A_%Z%T)\n">>/home/lsy/sftp_file.log
- fi
- done
- curl -s "钉钉机器人" -H "Content-Type: application/json" -d "{'msgtype':'text','text': {'content': \"$(date +%Y%m%d-%H%M%S):$(cat /home/lsy/sftp_file.log)\"},'at': {'isAtAll': true} }"
在这里有一点非常需要注意: set.NET:limit-rate 500000:500000 这个参数就是 lftp 进行限速的命令. 网上找了好多文章, 他们在 set.NET:limit-rate 500000,500000 用的是, 号 经过我实测和 man lftp 查看参数, 这里用的是: 希望大家能少采坑.
以上就是我传输的过程和脚本, 希望能够帮助到大家.
来源: http://www.bubuko.com/infodetail-3166953.html