超简单的 rsync 命令,实现文件的增量同步
一. 模拟环境
1. 备份服务器:192.168.0.99
2. 应用服务器A:192.168.0.1
3. 应用服务器B:192.168.0.2
预期目标是将服务器A和B中的指定目录同步到备份服务器。
二. 实现过程
1. 创建账号
为了便于各应用服务器引用备份服务,最好在备份服务器上创建一个专用账号,避免root账号的泄露风险。
下面的操作都是在备份服务器上执行。
useradd baker
其中的 baker 就是新创建的账号名称,可以改成其他喜欢的名称。
passwd baker
设置 baker 的密码,会提示输入两次。
2. 创建备份目录
在备份服务器上,创建一个接收备份数据的目录:
cd /home
mkdir bakroot
chown -R baker.baker ./bakroot
以上命令创建了一个备份目录:/home/bakroot,并将该目录的拥有者修改为 baker 用户。
到此为止,备份服务器的操作就完成了,剩下的都在应用服务器上进行。
3. 创建密钥对
登录到应用服务器A,执行以下命令:
ssh-keygen
一路回车,最后会在默认的 ~/.ssh/ 目录下创建两个文件:
其中的 id_rsa 为私钥,id_rsa.pub 为公钥。
4. 发布公钥
这个步骤很重要,目的就是将自己的公钥分享给备份服务器,最终实现 rsync 指令的免密操作。
ssh-copy-id -i ~/.ssh/id_rsa.pub baker@192.168.0.99
其中的 baker 是备份服务器上创建的账号名称,后面的IP是备份服务器的IP地址,根据实际情况进行调整。
上面的命令执行后,会要求输入 baker 用户的密码,验证通过后,就会将本地的 id_rsa.pub 公钥文件分享给备份服务器。
实际上,会在备份服务器的 baker 用户的主目录下,自动创建一个白名单文件,如:/home/baker/.ssh/authorized_keys
而文件的内容其实就是应用服务器分享过去的 id_rsa.pub 公钥文件的内容。
5. 执行同步操作
到此为止,前期的准备工作就全部完成了,可以开开心心的进行免密的数据同步了。
继续停留在应用服务器上。
安装 rsync:
yum install rsync -y
执行同步:
rsync -avz --delete -e ssh /home/files baker@192.168.0.99:/home/bakroot/
执行完成后,备份服务器的目录变化:
/home/bakroot/files
如果将上面的命令稍微修改一下:
rsync -avz --delete -e ssh /home/files/ baker@192.168.0.99:/home/bakroot/
就是在源目录后面增加了一个斜线,和上面的命令相比,此时就会只同步 files 目录下的子目录和文件,而不会包括 files 目录本身。
6. 保留备份文件
细心分析一下就会有个疑问:在进行同步后,应用服务器上的新文件就会覆盖掉备份服务器上的旧文件,一旦新文件出现问题,该如何恢复到之前某一天的旧文件呢?
强大的 rsync
早就考虑到了这个问题,就是: --backup
参数,缩写:-B
。
意思就是当备份目录中的文件被新文件覆盖时,会自动将旧文件进行备份。
这里要注意 --delete
掉的文件是不在备份的范畴之内的,就是说如果使用了 --delete
参数,那么备份目录中多余的文件将直接被删除,不会进行备份,所以 --delete
参数要慎重使用。
开启 --backup
后,默认情况下会自动将旧文件进行重命名:原文件名 + ~ ,就是在原文件名字后面增加波浪线。
最佳实践是在开启 --backup
后,再配置另一个参数:--backup-dir
,指定旧文件的归档目录,建议使用当前日期作为名词来自动创建这个归档目录,这样的话就会在每天执行同步脚本时,都会将所有被覆盖的旧文件单独转存到当天的归档目录内,便于日后根据最近的日期恢复归档文件。
命令示例:
rsync -avz --delete --backup --backup-dir=/home/bakroot/ -e ssh /home/files baker@192.168.0.99:/home/bakroot/
7. 其他备份
重复 3、4、5
步骤,将服务器B的目录按同样的方式完成同步。
三. 完整脚本
分享一个本人正在线上环境使用的同步脚本:
#!/bin/bash
# 定义当前日期
TODAY="$(date +%Y%m%d)"
# 定义源目录和目标目录
SOURCE_DIR="/home/web/ROOT"
DEST_SER="baker@192.168.0.99"
DEST_DIR="/home/bakroot/webser/"
BAKS_DIR="/home/bakroot/webser/lost/$TODAY"
# 定义日志文件路径
LOG_FILE="/home/logs/rsync/webser_$TODAY.log"
# 确保备份目录存在
ssh $DEST_SER "mkdir -p $BAKS_DIR"
# 执行 rsync 命令
rsync -avz --delete --backup --backup-dir=$BAKS_DIR -e ssh $SOURCE_DIR $DEST_SER:$DEST_DIR >> $LOG_FILE 2>&1
版权声明: 本文为博主 网无忌 原创文章,欢迎转载,但请务必标注原文链接。