5

Python+Shell脚本结合阿里云OSS对象存储定时远程备份网站

 3 years ago
source link: https://zhang.ge/5111.html
Go to the source link to view the article. You can view the picture content, updated content and better typesetting reading experience. If the link is broken, please click the button below to view the snapshot at that time.
neoserver,ios ssh client
Jager · 10月2日 · 2016年Linux本地备份 · 七天循环备份 · 压缩备份 · 网站备份 · 远程备份 9646次已读

导读:毋庸置疑,数据备份是网站可持续性运营中至关重要的一个工作,如果还没有做任何备份机制的网站,建议尽早完善,莫要等到追悔莫及。本文将分享一个安全稳定、快速可靠、花费廉价的备份方案。

一、优点分析

张戈博客在2年前已经分享过一篇关于网站备份的文章:《Linux/vps本地七天循环备份和七牛远程备份脚本》,今天将再次结合这个脚本,将网站数据通过阿里云内网备份到阿里云OSS。

对于阿里云OSS,想必大家都不会陌生,具体功能、特色这里就不赘述了。而利用阿里云OSS备份数据的教程方法,网络上已有不少分享,各种开发语言都有,用起来非常方便。

在我看来,用什么语言都是其次,主要还是看重了阿里云ECS到阿里云OSS可以走内网,相比我之前分享的备份到七牛的方案,速度更快而且流量免费!

我博客之前一直将数据每周一凌晨备份一份到七牛,也不敢每天都备份,因为备份的时候由于服务器上行带宽只有1M,就算是切片上传也会导致此时网站访问缓慢,影响蜘蛛抓取!所以,当我看到OSS可以走内网时,第一个想到的好处就是速度快,不影响服务器公网带宽,对网站的访问毫无影响,超赞!

因此,只建议部署在阿里云ECS(9折优惠码:r9itz9,新购可用)的网站使用OSS来备份,其他产品还要走外网备份到OSS就得不偿失了,还不如用七牛。

二、准备工作

①、开通OSS,并创建备份Bucket

访问阿里云 OSS控制台,点击开通OSS,然后新建一个Bucket(名称自定义),注意选择ECS相同的区域(比如青岛的ECS我就选择华北1),并且选择私有读写权限:

②、创建认证密钥

在OSS控制台的右侧栏,点击安全令牌,创建用于管理OSS的密钥对:

创建得到的密钥对记得备忘一下,因为只能获取一次:

2016-10-29补充:看到倡萌的实践分享,他遇到从OSS界面申请的密钥居然不具备OSS访问权限,所以这里也“盗图”补充一下,如果密钥没有权限请如图添加即可:

三、SDK脚本

我根据OSS的帮助文件,选择了适用范围最广的Python SDK方案,并且额外加入了断点续传和上传百分比功能,测试成功。

①、环境准备

OSS的Python SDK需要用到oss2插件,所以我们先安装一下。

如果服务器上已经安装了pip工具,可直接执行如下命令安装oss2插件:

pip install oss2

若没有,则复制以下命令行到服务器上执行安装:

cd /tmp
wget -O master.zip https://codeload.github.com/aliyun/aliyun-oss-python-sdk/zip/master --no-check-certificate
tar zxf master.zip
cd aliyun-oss-python-sdk-master && python setup.py install && echo "Oss2 install OK" || \
echo "Oss2 install failed"

②、上传脚本

# -*- coding: utf-8 -*-
from __future__ import print_function
import os, sys
import oss2
# 百分比显示回调函数
def percentage(consumed_bytes, total_bytes):
if total_bytes:
rate = int(100 * (float(consumed_bytes) / float(total_bytes)))
print('\r{0}% '.format(rate), end=filePath)
sys.stdout.flush()
# 脚本需要传入5个参数
if ( len(sys.argv) > 5 ):
AccessKeyId = sys.argv[1]
AccessKeySecret = sys.argv[2]
Endpoint = sys.argv[3]
Bucket = sys.argv[4]
filePath = sys.argv[5]
fileName = filePath.split("/")[-1]
else:
print("Example: %s AccessKeyId AccessKeySecret Endpoint Bucket /data/backup.zip" % sys.argv[0])
exit()
# OSS认证并开始上传
auth = oss2.Auth(AccessKeyId , AccessKeySecret)
bucket = oss2.Bucket(auth, Endpoint, Bucket)
oss2.resumable_upload(bucket, fileName, filePath, progress_callback=percentage)
print('\rUpload %s to OSS Success!' % filePath)

使用方法:将上述代码保存为 oss.upload.py,并上传到服务器,执行如下命令可开始上传文件到OSS:

python /data/oss.upload.py 认证ID 认证密钥 oss-cn-qingdao-internal.aliyuncs.com Bucket名称 /data/zhang.ge_1.zip
  • 1~2个参数是认证ID和认证密钥就是前文创建并备忘的密钥对。
  • 第3个参数是青岛区域的OSS内网地址,其他区域请参考OSS帮助文档,自行选择。
  • 第4个参数是前文创建的Bucket名称,比如mybackup1
  • 第5个参数是要上传的本地文件的绝对路径

执行后,就能在OSS的Object界面看到了:

③、下载脚本

其实只需要有个上传脚本即可,因为备份文件可直接从Object界面下载。不过,为了方便在服务器上直接恢复文件,还是弄了一个下载脚本。

# -*- coding: utf-8 -*-
from __future__ import print_function
import os, sys
import oss2
# 百分比显示回调函数
def percentage(consumed_bytes, total_bytes):
if total_bytes:
rate = int(100 * (float(consumed_bytes) / float(total_bytes)))
print('\r{0}% '.format(rate), end=saveFile)
sys.stdout.flush()
# 至少需要5个参数,第六个参数是下载文件的保存路径,若不指定,则保存到脚本所在目录
if ( len(sys.argv) > 5 ):
AccessKeyId = sys.argv[1]
AccessKeySecret = sys.argv[2]
Endpoint = sys.argv[3]
Bucket = sys.argv[4]
fileName = sys.argv[5]
saveFile = sys.argv[6] + fileName
except:
saveFile = './' + fileName
else:
print("Example: %s AccessKeyId AccessKeySecret Endpoint Bucket backup.zip /data/backup.zip" % sys.argv[0])
exit()
auth = oss2.Auth(AccessKeyId , AccessKeySecret)
bucket = oss2.Bucket(auth, Endpoint, Bucket)
oss2.resumable_download(bucket, fileName, saveFile,
store=oss2.ResumableDownloadStore(root='/tmp'),
multiget_threshold=20*1024*1024,
part_size=10*1024*1024,
num_threads=5,progress_callback=percentage)
print('\rDownload %s to %s Success!' % ( fileName, saveFile))

使用方法:

将上述代码保存为 oss.download.py,并上传到服务器,执行如下命令就可以下载OSS文件到本地:

python /data/oss.download.py 认证ID 认证密钥 oss-cn-qingdao-internal.aliyuncs.com Bucket名称 zhang.ge_1.zip /data/zhang.ge_1.zip
  • 1~2个参数是认证ID和认证密钥就是前文创建并备忘的密钥对。
  • 第3个参数是青岛区域的OSS内网地址,其他区域请参考OSS帮助文档,自行选择。
  • 第4个参数是前文创建的Bucket名称,比如mybackup1
  • 第5个参数是存储在OSS的文件名称
  • 第6个参数是保存到本地的文件绝对路径,若不指定则以相同名称保存到脚本相同目录。

好了,以上只是一个上传和下载的脚本,如果你之前已经有了成熟的备份方案,并且本地存储了备份文件,则可以使用上传脚本,结合crontab定时上传到OSS,如果没有请继续往下看。

四、定时备份

有了上传脚本,就可以结合之前张戈博客分享的七天循环备份脚本,实现循环备份到OSS了,既安全还节省OSS空间。

Ps:实际上,一个Python脚本就可以搞定备份压缩和远程上传OSS了,但是之前已经有一个现成的Shell备份脚本了,我就懒得重复造轮子了!

①、适合OSS的七天循环备份脚本

2016年12月16日更新:

1、完善crontab环境变量,解决定时执行中因mysqldump不存在导致备份文件为空的问题;

2、重写Shell脚本,功能没什么变化,也就是看得更顺眼一些。

#!/bin/sh
###################################################################
# Web Backup version 1.0.3 Author: Jager <[email protected]> #
# For more information please visit https://zhang.ge/5111.html #
#-----------------------------------------------------------------#
# Copyright ©2016 zhang.ge. All rights reserved. #
###################################################################
test -f /etc/profile && . /etc/profile >/dev/null 2>&1
baseDir=$(cd $(dirname $0) && pwd)
zip --version >/dev/null || yum install -y zip
ZIP=$(which zip)
TODAY=`date +%u`
PYTHON=$(which python)
MYSQLDUMP=$(which mysqldump)
# 新增的OSS上传文件函数,请按照实际情况修改参数!
uploadToOSS()
$PYTHON $baseDir/oss.upload.py 认证KEY 认证密钥 oss-cn-qingdao-internal.aliyuncs.com Bucket名称 $1
printHelp()
clear
printf '
=====================================Help infomation=========================================
1. Use For Backup database:
The $1 must be [db]
$2: [domain]
$3: [dbname]
$4: [mysqluser]
$5: [mysqlpassword]
$6: [back_path]
For example:./backup.sh db zhang.ge zhangge_db zhangge 123456 /home/wwwbackup/zhang.ge
2. Use For Backup webfile:
The $1 must be [\file]:
$2: [domain]
$3: [site_path]
$4: [back_path]
For example:./backup.sh file zhang.ge /home/wwwroot/zhang.ge /home/wwwbackup/zhang.ge
=====================================End of Hlep==============================================
exit 0
backupDB()
domain=$1
dbname=$2
mysqluser=$3
mysqlpd=$4
back_path=$5
test -d $back_path || (mkdir -p $back_path || echo "$back_path not found! Please CheckOut Or feedback to zhang.ge..." && exit 2)
cd $back_path
$MYSQLDUMP -u$mysqluser -p$mysqlpd $dbname --skip-lock-tables --default-character-set=binary >$back_path/$domain\_db_$TODAY\.sql
test -f $back_path/$domain\_db_$TODAY\.sql || (echo "MysqlDump failed! Please CheckOut Or feedback to zhang.ge..." && exit 2)
$ZIP -Pmypassword -m $back_path/$domain\_db_$TODAY\.zip $domain\_db_$TODAY\.sql && \
uploadToOSS $back_path/$domain\_db_$TODAY\.zip
backupFile()
domain=$1
site_path=$2
back_path=$3
test -d $site_path || (echo "$site_path not found! Please CheckOut Or feedback to zhang.ge..." && exit 2)
test -d $back_path || (mkdir -p $back_path || echo "$back_path not found! Please CheckOut Or feedback to zhang.ge..." && exit 2)
test -f $back_path/$domain\_$TODAY\.zip && rm -f $back_path/$domain\_$TODAY\.zip
$ZIP -Pmypassword -9r $back_path/$domain\_$TODAY\.zip $site_path && \
uploadToOSS $back_path/$domain\_$TODAY\.zip
while [ $1 ]; do
case $1 in
'--db' | 'db' )
backupDB $2 $3 $4 $5 $6
'--file' | 'file' )
backupFile $2 $3 $4
printHelp
printHelp

②、使用方法

将上述代码作如下修改:

I、根据实际情况修改上述代码中的OSS上传函数代码,比如密钥对和Bucket名称(参考前文)

II、替换代码中的mypassword为自己设置的压缩包密码,不修改的话压缩文件解压密码为mypassword

然后,将代码保存为backup.sh,上传到服务器(建议存放到和前文python脚本的相同目录),比如 /data/backup.sh,最后如下添加定时任务:

#编辑crontab
[root@AlyServer ~]# crontab -e
#然后添加如下内容:
#备份数据库(参数依次为:db、域名、数据库名称、数据库用户名、对应密码、备份路径)
10 3 * * * bash /data/backup.sh db zhang.ge zhangge root 123456 /home/wwwbackup/zhang.ge >/dev/null 2>&1
#备份网站文件(参数依次为:file、域名、网站根目录、备份路径)
15 3 * * * bash /data/backup.sh file zhang.ge /home/wwwroot/zhang.ge /home/wwwbackup/zhang.ge >/dev/null 2>&1
#按下键盘esc,输入 :wq 保存crontab即可

本文就不赘述7天循环备份脚本的功能和更详细的使用方法了,若还是不清楚请参考前文:Linux/vps本地七天循环备份和七牛远程备份脚本

全部完成后,就能实现本地7天循环备份和OSS远程备份了!如果,之前已经做了七牛远程备份的可以放心取消了。

在文章的最后,为了方便广大代码小白朋友,特提供本文涉及脚本的打包下载:

折腾吧,骚年!好用的话,有钱的可以打赏,没钱的欢迎点赞,不怕一万多,不嫌一块少。。。


About Joyk


Aggregate valuable and interesting links.
Joyk means Joy of geeK