前言
公司业务中使用的备份工具一直是alicloud-duplicity
,一直也没研究。后来业务出问题了,看了看,原来是基于duplicity
开发的,使用了半天,感觉很不错,我感觉他的特点有:
- 加密备份
- 支持多种协议
- 内置了主流的存储商的
backends
:Azure
、AWS S3
、onedrive
- 支持增量备份
问题
-
duplicity
官方没提供阿里云OSS
的backends
,所以才有了alicloud-duplicity
,但alicloud-duplicity
项目已经停更好久了,但也仅限于Python2
,所以我在alicloud-duplicity的
基础上适配了Python3,目前没什么问题,项目地址duplicity -
恢复时的小问题:恢复没有“增量”恢复的概念(至少我没找到),只能恢复到一个本地空目录,如果是非空目录,需要加上参数
--force
。这个我感觉是个最大的不足,举例来说:增量备份一个小文件small.file
,在另一台机子上你想获取最新的备份数据(除了这个小文件,其余文件在本地都已经存在),恢复时,会全量从远端下载所有的文件,虽然你只是想得到small.file
这个小文件。
安装
- 安装依赖:
apt install gettext librsync-dev python3-dev -y
或yum install librsync-devel python3-dev gettext -y
pip
依赖:pip install future fasteners oss2
- 克隆代码:
git clone https://github.com/steinvenic/duplicity
慢的话用加速源git clone https://github.com.cnpmjs.org/steinvenic/duplicity.git
- 安装:python setup.py install
- 验证: duplicity -V
使用
因为支持的协议和厂商太多了,这里只拿阿里云OSS
和亚马逊的S3
举例
阿里云
- 鉴权
echo "
[oss]
endpoint=oss-cn-shanghai.aliyuncs.com
access_key_id=YOUR KEY ID
access_key_secret=YOUR KEY SECTER">~/.alicloud.cfg
-
加密秘钥
export PASSPHRASE=YOUR PASSWORT
,这个是自己的加密密码,解密的时候需要用到 -
全量备份:
duplicity full /etc/ oss://nj-test/etc_bak
-
增量备份:
duplicity incre /etc/ oss://nj-test/etc_bak
-
恢复:
duplicity restore oss://nj-test/etc_bak /etc/
-
恢复到指定时间点 :
duplicity restore --force -t 2021-07-21T13:15:00 oss://nj-test/etc_bak ./etc
-
恢复到相对时间点 :
duplicity restore --force -t 20D oss://nj-test/etc_bak ./etc
,恢复20天前的数据,D
表示天,M
表示分钟 -
--volsize=200
,指定卷大小为200MB -
排除某个目录:
duplicity full /root/tmp/ --exclude '/root/tmp/frp*' boto3+s3://cf-nj
,备份的路径要用绝对路径
亚马逊S3
- 鉴权
mkdir ~/.aws
echo "
[default]
region=cn-north-1
aws_access_key_id = YOUR KEY ID
aws_secret_access_key = YOUR KEY SECTER">~/.aws/credentials
-
安装依赖
pip install boto3
-
全量备份:
duplicity full /etc/ boto3+s3://nj-test/etc_bak
后面的用法就一样了,不写了
恢复数据到个人NAS
我用的nextcloud
,支持webdav
协议,所以只要使用davfs2
将文件挂载到本地,改成自己的webdav
地址就可以了
安装davfs2
:apt-get install davfs2 -y && mkdir /nc
挂载:mount -t davfs http://nc.824809799.xyz:8000/remote.php/dav/files/eric /nc
恢复:duplicity restore --force oss://nj-test/tmp /nc/tmp