假设我有 4 个 VPS。在其中每一个中,以下 cron 命令每周运行一次,用于本地备份:
0 0 * * 6 zip -r /root/backups/dirs/html-$(date +\%F-\%T-).zip /var/www/html
1 0 * * 6 find /root/backups/dirs/* -mtime +30 -exec rm {} \;
0 0 * * 6 mysqldump -u root -pPASSWORD --all-databases > /root/backups/db/db-$(date +\%F-\%T-).sql
1 8 * * 6 find /root/backups/db/* -mtime +30 -exec rm {} \;
我希望将每个本地备份的副本(来自 4 个 VPS 中的每一个)发送到第五个VPS,我将使用它作为中央备份环境。发送应尽可能安全(在合理的范围内)。
如何使用 rsync 自动(也按计划)完成此操作?
(或者也许是SCP?)
答案1
假设每个备份都是一个文件(通过归档上面的两个文件),SCP将会比同步因为除了传输文件之外,它所做的总体工作较少。
就自动化而言,您需要进行设置以便:
- 第五个 VPS 可以连接到其他 4 个 VPS,无需密码即可作为可以读取备份的用户(管理起来稍微容易一些,但编码更困难)。
- 其他四个 VPS 可以连接到第五个,无需密码,最好每个都有一个单独的帐户(管理稍微困难,但更容易编码)。
两者的首选方法通常是未加密的 SSH 密钥。完成后,您可以设置一个 cron 作业(在案例 1 中的第五个 VPS 上,或在案例 2 中的其他 4 个 VPS 中),将最新的备份传输到所需位置。
下面是第二个选项的快速但肮脏的 shell 脚本,它将把目录中的最新文件复制到远程系统:
#!/bin/bash
file=`ls -t "${1}" | head -n 1`
scp -pCB "${1}"/"${file}" ${2}
使用存储备份的目录路径作为第一个参数,并将user@host:/path
指向第五个 VPS 上的位置的字符串作为第二个参数来运行该命令,会将最新的备份从本地系统复制到第五个 VPS。
-p
SCP 选项将保留 mtime(因此您仍然可以使用相同的命令find
来精简旧备份),-C
启用压缩(这可能会或可能不会提高性能,并-B
防止它提示任何内容。
答案2
在此阶段为每个客户端 VPS 创建单独的用户。这不是绝对必要的,但万一某个 VPS 受到攻击,您肯定不希望它能够读取(或写入)来自其他机器的备份。
假设您有帐户虚拟专用网1 虚拟专用网2,在备份服务器 VPS 上。
将每个 VPS 设置为使用证书而不是密码通过 ssh 访问备份服务器 VPS:
- 创建一个用户(例如“备份”)(并非绝对必要)。
ssh-keygen
在每个 VPS 上 为用户“备份”创建一组 ssh 密钥。- 将 的内容附加
~/backup/.ssh/id_rsa.pub
到~/<vps-user>/.ssh/authorized_keys
每个 VPS 帐户的 。确保只有该用户可读 (chmod 600 ~<vps-user>/.ssh/authorized_keys
)
从每个 VPS,您现在应该能够从“备份”帐户 ssh 到备份服务器 vps 帐户...
在 VPS 服务器计算机上为每个客户端计算机创建一个目录以写入其备份,并使其仅适用于该客户端的 VPS 帐户,例如:
mkdir /var/spool/big-backups/vps1; chown vps1 /var/spool/big-backups/vps1; chmod 600 /var/spool/big-backups/vps1;
在每个 vps 上为用户“backup”创建一个 cronjob
rsync -avz /root/backups/db/ -e "ssh -l vps1" /root/backups/ /var/spool/big-backups/vps1/"
:。显然,将此安排在客户端 VPS 计算机上的本地备份作业之后。 (z
如果您的文件已经压缩,则 rsync 上的标志是不可取的,您的数据库备份不在您的示例中......)
如果您愿意,您可以使用scp
代替rsync
(我不知道为什么您会这样做,但它们都可以工作)。