墙内外服务器数据异地备份方案

作者:wiLdGoose 发布时间:May 15, 2020 分类:技术 Technology

我们的宣传口号是:与墙斗,其乐无穷。

1、墙内服务器

1.1、需求与掣肘

需要对服务器数据进行异地备份,数据量级:GB 级。收费的阿里云 OSS 等用不起,土豪请自便。免费的 Google Drive 连不上。

1.2、方案选型

一番折腾后最终选定七牛云免费 10G 对象存储。不够用就建多个账号,用不同的 butket 来备份。

1.3、准备工具

  • 七牛云账号一枚
  • 安装 qshell
  • 本地备份脚本,若无可参考本文 2.4 部分

1.4、实施细节

下载并设置脚本:

wget -c http://devtools.qiniu.com/qshell-linux-x64-v2.4.1.zip
unzip qshell-linux-x64-v2.4.1.zip
mv qshell-linux-x64-v2.4.1 qshell
chmod +x qshell

前往七牛云密钥管理,找到 AccessKey 与 SecretKey:

添加七牛云账号鉴权:

/path/to/qshell account <AccessKey> <SecretKey> <账户标识>

确认一下:

/path/to/qshell user ls
Name: xxxx
AccessKey: xxxx
SecretKey: xxxx

七牛官方建议大于 100MB 的文件使用 rput 来代替 fput 来实现上传。由于备份文件普通较大,这里统一使用 rput:

/path/to/qshell rput xxxx qshell-linux-x64-v2.4.1.zip /root/qshell-linux-x64-v2.4.1.zip
Uploading /root/qshell-linux-x64-v2.4.1.zip => xxxx : qshell-linux-x64-v2.4.1.zip ...

Put file /root/qshell-linux-x64-v2.4.1.zip => xxxx : qshell-linux-x64-v2.4.1.zip success!
Hash: lhKbzJ8255w0m4BKgtYpPthvU5Mc
Fsize: 9739680 ( 9.29 MB )
MimeType: application/zip
Last time: 23.54 s, Average Speed: 413.8 KB/s

上传多个备份文件,我的思路是:

  • 用 bash 脚本跑批
  • 事先 tar 到一个文件中,再用 qshell 上传

提供上述第二个方案的初步思路:

tar czf /www/backup/`date +%Y%m%d`.tar.gz /www/backup/site/*`date +%Y%m%d`* /www/backup/database/*`date +%Y%m%d`*
/path/to/qshell rput xxxx `date +%Y%m%d`.tar.gz /www/backup/`date +%Y%m%d`.tar.gz
rm -f /www/backup/`date +%Y%m%d`.tar.gz

至于循环备份,七牛云提供对象存储的生命周期管理。设置一下就行了:

Update:这个生命周期管理不靠谱,发现设置为一天删除也会一直存下去的情况。手动修改前述脚本如下:

#!/bin/bash
date=`date +%Y%m%d`
deldate=`date -d -5day +%Y%m%d`
/path/to/qshell delete xxxx $deldate.tar.gz
tar czf /www/backup/$date.tar.gz /www/backup/site/*$date* /www/backup/database/*$date*
/path/to/qshell rput xxxx $date.tar.gz /www/backup/$date.tar.gz
rm -f /www/backup/$date.tar.gz

2、墙外服务器

2.1、需求与掣肘

也是需要对服务器数据进行异地备份,数据量级:GB 级。优先选择免费的存储,回国较快即可。

2.2、方案选型

经测试,Google Drive 是第一选择。

2.3、准备工具

2.4、实施细节

若暂无本地备份策略,直接按这个链接的步骤操作即可;若已有本地备份策略,可在 backup.sh 的 BACKUP 数组变量中指定需要异地备份的文件路径,诸如:

BACKUP[0]="/data/backup/www_bak_`date +%Y%m%d`.tgz"
BACKUP[1]="/data/backup/db_bak_`date +%Y%m%d`.tgz"

可根据实际情况修改变量。

关于循环备份的事,若非自有脚本解决,可使用 backup.sh 的相关功能,配置以下两项即可:

LOCALAGEDAILIES(指定多少天之后删除本地旧的备份文件,默认为 7 天)
DELETE_REMOTE_FILE_FLG(删除 Google Drive 或 FTP 上备份文件的 FLG,true 为删除,false 为不删除)

最后,crontab 就略了。别忘记添加环境变量:

SHELL=/bin/bash
PATH=/bin:/sbin:/usr/bin:/usr/sbin:/usr/local/bin:/usr/local/sbin:~/bin
MAILTO=root
HOME=/root

我在实际配置过程中,曾遇到这样的报错:

Backup progress start
mysql is not installed. Install it and try again

最后在上面的环境变量基础上加上 mysql 的路径得以解决。

crontab -e

头部添加环境变量:

SHELL=/bin/bash
PATH=/bin:/sbin:/usr/bin:/usr/sbin:/usr/local/bin:/usr/local/sbin:~/bin:/usr/local/mysql/bin
MAILTO=root
HOME=/root

- EOF -

通过 lftp 备份文件及删除过期文件的自动化小脚本

作者:wiLdGoose 发布时间:August 27, 2019 分类:技术 Technology

可以看作是这篇文章的升级版本。这里感谢 druggo 留言提醒,让我决定抽时间折腾一下 lftp。

整个过程其实非常简单,照例自己马克一下。

安装 lftp 客户端:

yum -y install lftp

安装后使用过程中遇到报错:

Fatal Error: Certificate Verification: Not Trusted

原因是远端 FTP 服务器使用了自签发 SSL 证书,可以这样解决:

vim /etc/lftp.conf

在文件最后增加一行:

set ssl:verify-certificate no

改造后的脚本:

#!/bin/bash
date=`date +%Y%m%d`
deldate=`date -d -{NUMBER}day +%Y%m%d`
lftp ftp://{FTP_USER}:{FTP_PASSWD}@{HOST}:{PORT} <<!
cd /
lcd /data/backup
mrm *$deldate*
mput *$date*
exit
!

当然 lftp 还有一个更好用的指令:mirror。这里不用的原因是本地存储的时间与远端不一致。

依然是 3 点注意事项:

1、脚本中花括号内容替换为对应的变量;
2、cd 是远程的目录,lcd 是本地目录;
3、备份文件名需符合 date +%Y%m%d 这样的规则。

通过 FTP 备份文件及删除过期文件的自动化小脚本

作者:wiLdGoose 发布时间:May 7, 2019 分类:技术 Technology

对于不能 SSH 的场景的确够麻烦,rsync 又嫌麻烦,只能 FTP 了。

以下是自己马克用的。

#!/bin/bash
date=`date +%Y%m%d`
deldate=`date -d -{NUMBER}day +%Y%m%d`
ftp -inp<<!
open {HOST} {PORT}
user {FTP_USER} {FTP_PASSWD}
cd /
lcd /data/backup
mdelete *$deldate*
mput *$date*
close
bye
!

注意几点:

1、脚本中花括号内容替换为对应的变量;
2、cd 是远程的目录,lcd 是本地目录;
3、备份文件名需符合 date +%Y%m%d 这样的规则。

为 Oneinstack 增加通过 FTP 备份到远端主机的功能

作者:wiLdGoose 发布时间:April 27, 2019 分类:技术 Technology

Oneinstack 有一个备份配置脚本:backup_setting.sh 及备份脚本:backup.sh。目前已经支持本地备份、远端主机备份及诸如阿里云、七牛云等各种云的备份。虽然同时支持多种方式进行备份,但同一种备份方式只能选一次,譬如不能同时向两个远端主机进行备份,且只能通过 ssh 方式。在比较看重异地灾备的情况下,多远端主机备份的需求不能满足;在不方便开启外网 ssh 的情况下,这个脚本也不能满足。

面对前述情况我做了一些调整:

1、Oneinstack 自带备份脚本只进行本地备份和各种云的备份。默认本地备份路径是 /data/backup,通过观察备份文件名的规律可得出:

ls -lah /data/backup/*20190101*

可匹配到当日备份成功的新文件。

2、远端备份机搭建 FTP 服务,一般 VPS 需要开启被动模式支持,防火墙配置好被动模式的端口段。

3、本地提前安装好 FTP 客户端:

yum -y install ftp

需要每向一台远端备份机上传,便增加一个脚本:

#!/bin/bash
ftp -n<<!
open REMOTE_HOST_IP REMOTE_PORT
user FTP_USER FTP_PASSWD
binary
hash
cd /
lcd /data/backup
prompt
mput *$(date "+%Y%m%d")*
close
bye
!

注意自行修改脚本中大写字母部分的配置,也可拎出来做变量配置。若有问题可在 ftp 后面加 -v 或 -d 参数,输出对端返回和打开 debug 模式,以进一步调试。

测试通过后就可以放 crontab 了,需要备份到几个地方就开几个脚本。再也不用担心神马地震、海啸、核武,美滋滋。

- EOF -

SQL Server 数据库异地备份策略优化

作者:wiLdGoose 发布时间:January 8, 2008 分类:技术 Technology

前段时间折腾了一个 SQL Server 数据库异地备份解决方案,使用了一些不够完美不够和谐的方法完成了设计需求。昨天看到一款软件叫做 NcFTP,经过思考,有了下面的优化方案。

原先的方案需要在双方服务器上安置批处理并加入计划任务,他们之间的先后顺序是没有握手联系的,只能依靠时间来排序。最佳途径应该还是只在一台服务器上安置批处理。原先需要在备份服务器上通过 curl 来 pull 当天的备份,现在有了 NcFTP,我们可以让数据库服务器主动 push 备份文件到备份服务器上。

@set ftp_ip=0.0.0.0
@set ftp_port=1234
@set ftp_user=this_is_ftp_user
@set ftp_passwd=this_is_ftp_passwd
@set ncftp_path=C:/Program Files/NcFTP

"%ncftp_path%ncftpput.exe" -u %ftp_user% -p %ftp_passwd% -P %ftp_port% %ftp_ip%/tmp.rar

而删除备份服务器上的旧备份文件,也可以抛弃 Henry Xu 同学用 C++ 写的程序了,可以使用 Resource kit 里的命令 FORFILES。

阅读剩余部分...

  1. 1
  2. 2