当下大部分公司的业务都采用“云上”的架构,因其自带的一系列功能服务,大大降低了运维成本。但是当经费有限,或者单独采购某项服务显得多余时,如何处理好相关服务使业务正常运行就得自己动手了。
当只有一台服务器,上面搭建了数据库,甚至存放了很多上传的文件,那么这个服务器就显得至关重要。当然可以选择建立快照的方式来备份整个服务器,但是这样等于整个系统都占用了备份容量,有点浪费。这里我们采用 阿里云OSS
来备份数据和文件。(并不是打广告,是刚好使用了这个)
阿里云OSS
是一项文件存储的服务,有本地备份和跨区域备份等机制,不同备份不同价格,具体可以看官网。假设我们已经简单研究过 OSS
服务了,现在开始来写写简单的脚本。这里用的 Shell
和 Python
一同完成。
1、upload.py 上传文件(删除文件)
参考 官方教程 改的一个简单的 Python
脚本,要先安装 SDK
:
pip install oss2
注意Python
的版本
下面 upload.py
主要实现了以下功能:
- 上传需要备份的文件至
OSS
; - 删除本地文件以及
OSS
上不再需要的文件(假设备份超过5天的文件就不再需要了);
import os
import sys
import oss2
import datetime
# 备份文件保留天数
BACKUP_DAYS = 5
# 断点续传大小 10M
MULTIPART_THRESHOLD_SIZE = 1024 * 1024 * 10
# OSS参数设置
access_key_id = '<你的AccessKeyId>'
access_key_secret = '<你的AccessKeySecret>'
bucket_name = '<你的Bucket>'
endpoint = '<你的访问域名>'
# Bucket对象
bucket = oss2.Bucket(oss2.Auth(access_key_id, access_key_secret), endpoint, bucket_name)
# 本地文件地址
filepath = sys.argv[1]
basename = os.path.basename(filepath)
name = basename.split('.')[0]
ext = '.'.join(basename.split('.')[1:]) # 针对 .tar.gz
# 上传文件名字
filename = '%s_%s.%s' % (
name,
datetime.datetime.now().strftime('%Y%m%d'),
ext
)
oss2.resumable_upload(bucket, filename, filepath, multipart_threshold=MULTIPART_THRESHOLD_SIZE)
# 删除本地文件
os.remove(filepath)
# 删除OSS文件
del_file = '%s_%s.%s' % (
name,
(datetime.datetime.now() - datetime.timedelta(days=BACKUP_DAYS)).strftime('%Y%m%d'),
ext
)
bucket.delete_object(del_file)
2、backup.sh 生成备份文件并上传
如果 Shell
脚本玩的溜的话,完全可以把上述 Python
做的事情也做了,但是我不会 ...
下面 backup.sh
主要实现了以下功能:
- 打包压缩需要备份的文件;
- 导出需要备份的数据库,需要的话也可以压缩一下;
- 调用上述
upload.py
上传至OSS
;
# 打包压缩文件
tar -zcPf /home/hei/backup_files.tar.gz /home/hei/need_backup_files
# 导出数据库文件
mysqldump -u[username] -p[password] -h[host] -P[port] [database] > /home/hei/backup.sql
# 上传至OSS
python /home/hei/upload.py '/home/hei/backup_files.tar.gz'
python /home/hei/upload.py '/home/hei/backup.sql'
3、linux crontab
定时任务调用 backup.sh
使用的服务器是 ubuntu-server-18.04
crontab -e
编辑定时任务
...
# m h dom mon dow command
0 0 * * * bash /home/hei/backup.sh
每日的零点执行这个 backup.sh
脚本
后续完善
想到一些有待改进的地方:
- 针对不同文件,分类上传至不同的
bucket
; - 备份的文件,可以只针对每日的增量文件;
- 数据库不同全表备份,也可只针对需要的数据;
**粗体** _斜体_ [链接](http://example.com) `代码` - 列表 > 引用
。你还可以使用@
来通知其他用户。