超简单的 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
posted @ 2024-09-23 16:42  网无忌  阅读(145)  评论(0编辑  收藏  举报