1

当下大部分公司的业务都采用“云上”的架构,因其自带的一系列功能服务,大大降低了运维成本。但是当经费有限,或者单独采购某项服务显得多余时,如何处理好相关服务使业务正常运行就得自己动手了。

当只有一台服务器,上面搭建了数据库,甚至存放了很多上传的文件,那么这个服务器就显得至关重要。当然可以选择建立快照的方式来备份整个服务器,但是这样等于整个系统都占用了备份容量,有点浪费。这里我们采用 阿里云OSS 来备份数据和文件。(并不是打广告,是刚好使用了这个)

阿里云OSS 是一项文件存储的服务,有本地备份和跨区域备份等机制,不同备份不同价格,具体可以看官网。假设我们已经简单研究过 OSS 服务了,现在开始来写写简单的脚本。这里用的 ShellPython 一同完成。

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
  • 备份的文件,可以只针对每日的增量文件;
  • 数据库不同全表备份,也可只针对需要的数据;

ARS_HEI
25 声望1 粉丝

No cafe && cola, Before 1AM