以两台服务器为例,一台为主服务器A,另一台为从服务器B。现在从服务器想要定时同步得到主服务器A中的数据库或者指定的网站全部目录。一开始我是想着部署Rsync或Syncthing,但是由于小陶现在所有的服务器都不走公网而是部署在内网(见文《小陶为了防止自己服务器公网IP暴露,直接不用公网,境内外路线全部内网穿透》),所以会出现各种奇奇怪怪的问题,比如22端口SSH不咋顶用,又或者配置出现各种问题。小陶突然想到自己的服务器有自动备份任务,备份是上传到七牛云、多吉云、腾讯云的对象存储桶。于是我就想着既然在桶里,不如直接下载下来恢复到数据库或者网站目录不就行了吗?于是说干就干,还真被我干出来了!由于小陶现在也不用七牛云作为正儿八经的静态资源存储,因此创建的存储桶为私有,并且限制了可以访问的IP(理论上只设置从服务器B的IP可以访问就可以了),可以避免被盗刷。 此外,私有空间的文件对象必须获得拥有者的授权才能访问,相对来说还是安全很多。公开空间和私有空间介绍
现在的思路是:主服务器A备份包——>(上传)七牛云(下载)<——从服务器B

数据库恢复的效果如下,当然也支持直接下载备份的网站目录然后解压覆盖到从服务器中。本文就来详细介绍一下该如何操作。

准备工作
主服务器A创建自动备份到七牛云,可以是数据库或者网站。这里小陶是都进行了备份:

然后就是在服务器B中创建一个虚拟环境,我的服务器是Debian12,可以看之前的文章《在服务器上使用python虚拟环境pip安装库并运行自己的py脚本》,本文就不做过多的介绍。
创建好虚拟环境(例如名称为back_rec
)之后,在终端激活环境再安装以下必要的Python库:
pip install -i https://pypi.tuna.tsinghua.edu.cn/simple qiniu requests tqdm
七牛云对象存储绑定域名
七牛云如何绑定域名我就不做过多介绍了,因为官方有很详细的说明。最重要的是得到CNAME解析地址。如果得到了cname地址,不论你是使用七牛云自己的融合CDN还是别的CDN,都是可以的。小陶选择的是上海云盾CDN,因为流量是免费的。

在上海云盾启用之后,应该是下面的样子。

需要注意,上海云盾的话是由内置的WAF规则集,需要自动去关掉一些设置,以免被拦截。具体的设置我也不再赘述,可以联系云盾客服进行沟通。

服务器B的数据同步请求
现在我使用的功能是比较全面的,主要有两个,第一个是数据库的同步,第二个是图床站目录的同步。
为了让代码具有比较强的拓展性,把目录等设置成下面的样子:
# 同步备份文件任务配置
backup_tasks = [
{ # 数据库备份任务
'remote_dir': 'bt_backup/database/mysql/www_52txr_cn/', #七牛云的数据库备份路径
'local_storage': '/www/backup/database/backfrom76', #下载到服务器的路径
'extract_to': None, # 数据库不需要文件解压路径
'type': 'database'
},
{ # 站点备份任务
'remote_dir': 'bt_backup/site/imgbed.52txr.cn/', # 七牛云的网站目录备份路径
'local_storage': '/www/backup/site/backfrom76', # 下载到服务器的路径
'extract_to': '/www/wwwroot/imgbed.52txr.cn', # 解压到的路径
'type': 'site'
}
]
完整的代码如下,可以保存到服务器/www/wwwroot/MyPythonScripts/synchronous76.py
:
处理任务:bt_backup/www_52txr_cn/
下载 www_52txr_cn_2025-03-08_xxxxxxxx_mysql_data.sql.gz: 0%| | 0.00/5.81M [00:00<?, ?B/s]
下载 www_52txr_cn_2025-03-08_xxxxxxxx_mysql_data.sql.gz: 0%| | 8.19k/5.81M [00:00<02:05, 46.3kB/s]
下载 www_52txr_cn_2025-03-08_xxxxxxxx_mysql_data.sql.gz: 10%|▏ | 598k/5.81M [00:00<00:01, 2.64MB/s]
下载 www_52txr_cn_2025-03-08_xxxxxxxx_mysql_data.sql.gz: 74%|▋| 4.30M/5.81M [00:00<00:00, 15.8MB/s]
下载 www_52txr_cn_2025-03-08_xxxxxxxx_mysql_data.sql.gz: 100%|█| 5.81M/5.81M [00:00<00:00, 13.9MB/s]
文件下载成功:/www/backup/www_52txr_cn_2025-03-08_xxxxxxxx_mysql_data.sql.gz
SQL文件已解压到:/www/backup/www_52txr_cn_2025-03-xxxxxxxx_mysql_data.sql
数据库恢复成功
临时文件已清理
处理任务:bt_backup/site/imgbed.52txr.cn/
文件下载成功:/www/web_imgbed.52txr.cn_xxxxxxxx_Yxxx.tar.gz
文件已解压到:/www/imgbed_52txr_cn
压缩文件已清理
----------------------------------------------------------------------------
★[2025-03-08 15:52:07] Successful
----------------------------------------------------------------------------