rsync + sersync
和 rsync + inotify
是两种常用的实时文件同步方案,用于监控源目录变化并自动同步到目标位置。以下是对两者的详细对比和配置指南:
核心区别
方案 | 原理 | 优点 | 缺点 |
---|---|---|---|
rsync + inotify | 使用 Linux 内核的 inotify 监控文件变化,触发 rsync 同步 |
原生支持,无需额外依赖 | 需手动编写脚本,稳定性依赖实现 |
rsync + sersync | 基于 inotify 和 rsync ,封装为独立工具,提供更完善的错误处理和配置 |
配置简单,稳定性高 | 需要额外安装第三方工具 |
一、rsync + inotify 方案
rsync介绍
rsync的好姐妹
sync 同步:刷新文件系统缓存,强制将修改过的数据块写入磁盘,并且更新超级块。
async 异步:将数据先放到缓冲区,再周期性(一般是30s)的去同步到磁盘。
rsync 远程同步:remote synchronous
rsync的特点
可以镜像保存整个目录树和文件系统
可以保留原有的权限(permission,mode),owner,group,时间(修改时间,modify time),软硬链接,文件acl,文件属性(attributes)信息等
传输==效率高==,使用同步算法,只比较变化的(增量备份)
file1.txt file2.txt file3.txt(A服务器)
rsync实现数据同步 => 只同步file3.txt => 增量备份
file1.txt file2.txt(B服务器)
支持匿名传输,方便网站镜像;也可以做验证,加强安全
rsync的语法
man rsync
NAME
rsync — a fast, versatile, remote (and local) file-copying tool
//一种快速、通用、远程(和本地)的文件复制工具
SYNOPSIS
Local: rsync [OPTION...] SRC... [DEST]
Access via remote shell:
//通过远程shell访问(命令)
Pull: rsync [OPTION...] [USER@]HOST:SRC... [DEST]
Push: rsync [OPTION...] SRC... [USER@]HOST:DEST
Access via rsync daemon:
//通过后台程序访问(作为服务)
Pull: rsync [OPTION...] [USER@]HOST::SRC... [DEST]
rsync [OPTION...] rsync://[USER@]HOST[:PORT]/SRC... [DEST]
Push: rsync [OPTION...] SRC... [USER@]HOST::DEST
rsync [OPTION...] SRC... rsync://[USER@]HOST[:PORT]/DEST
rsync命令参数
-v 详细模式输出
-a 归档模式,递归的方式传输文件,并保持文件的属性,equals -rlptgoD
-r 递归拷贝目录
-l 保留软链接
-p 保留原有权限
-t 保留原有时间(修改)
-g 保留属组权限
-o 保留属主权限
-D 等于--devices --specials 表示支持b,c,s,p类型的文件
-R 保留相对路径
-H 保留硬链接
-A 保留ACL策略
-e 指定要执行的远程shell命令
-E 保留可执行权限
-X 保留扩展属性信息 a属性
inotify
介绍
inotify
是 Linux 内核提供的一种强大的文件系统监控机制,允许应用程序监听文件或目录的各种变化事件(如创建、修改、删除等)。它是实现实时文件同步、日志监控、自动备份等功能的基础。
工作原理
- 内核维护一个事件队列,应用程序通过
inotify
接口读取队列中的事件。 - 应用程序可以对特定文件或目录添加 “监控手表”(watch descriptor),并指定监听的事件类型。
- 内核维护一个事件队列,应用程序通过
# inotifywait --help
-m 保持监控状态
-r 递归监控
-q 只打印事件
-e 指定事件
事件:
move 移动
delete 删除
create 创建
modify 修改
attrib 属性信息
server服务器上的~/app/目录的文件和backup主机上的~/backup目录实时同步
环境:
server 10.1.1.1 #替换为自己虚拟机实际ip地址
backup 10.1.1.250 #替换为自己虚拟机实际ip地址
分析:
rsync本身不可以做到数据的实时同步,需要借助第三方工具,intotify工具。实现线上环境目录发生改变立马同步到backup主机,是单向同步。
当然也可以制定crontab定时任务配置,每分钟执行一次shell脚本,shell脚本里面编写通过rsync远程同步命令
配置步骤
安装依赖:
# Ubuntu/Debian sudo apt install inotify-tools rsync # CentOS/RHEL sudo yum install inotify-tools rsync
安装完后,就会产生下面两个命令
/usr/local/bin/inotifywait 等待
/usr/local/bin/inotifywatch 看守
2. 编写脚本来同步
vim ~/1.sh
#!/bin/bash
/usr/local/bin/inotifywait -mrq -e modify,delete,create,attrib,move ~/app/ |while read events
do
rsync -a --delete ~/app/ backup主机ip:~/backup
echo "`date +%F\ %T`出现事件$events" >> /var/log/rsync.log 2>&1
done
chmod +x 1.sh # 添加可执行权限
./1.sh & # 在后台运行
--delete 参数:如果目标目录里的数据比源目标多,那么需要删除无用的相关的数据
3. 测试验证
server上操作目录:
mkdir ~/app/bbb{1..3}
rm -f ~/app/file{1..3}
backup上检查目录:
ll ~/backup/
server上查看日志记录
tail -f /var/log/rsync.log
2018-08-29 11:13:35出现事件/app/java_project/ CREATE,ISDIR bbb1
2018-08-29 11:13:35出现事件/app/java_project/ CREATE,ISDIR bbb2
2018-08-29 11:13:35出现事件/app/java_project/ CREATE,ISDIR bbb3
2018-08-29 11:14:15出现事件/app/java_project/ DELETE file1
2018-08-29 11:14:15出现事件/app/java_project/ DELETE file2
2018-08-29 11:14:15出现事件/app/java_project/ DELETE file3
rsync + sersync
实时同步
一、环境准备
服务器角色:
- 源服务器(Master):产生数据变化的服务器
- 目标服务器(Slave):接收同步数据的服务器
软件依赖:
- 两台服务器均需安装:
rsync
- 仅源服务器需安装:
sersync
二、安装步骤
1. 安装 rsync(所有服务器)
# Ubuntu/Debian
sudo apt install rsync
# CentOS/RHEL
sudo yum install rsync
2. 配置 SSH 免密登录(源→目标)
在源服务器执行:
# 生成密钥对
ssh-keygen -t rsa -b 4096
# 将公钥复制到目标服务器
ssh-copy-id root@目标服务器IP
验证免密登录:
ssh root@目标服务器IP # 应无需输入密码
3. 安装 sersync(仅源服务器)
# 下载并解压(以 2.5.4 版本为例)
wget https://github.com/wsgzao/sersync/archive/refs/tags/2.5.4.tar.gz
tar -zxvf 2.5.4.tar.gz
cd sersync-2.5.4/
cp -r bin /usr/local/sersync
# 添加执行权限
chmod +x /usr/local/sersync/sersync2
三、配置 sersync
1. 创建配置文件
nano /usr/local/sersync/confxml.xml
配置示例(同步 /data/www
到目标服务器的 /backup/www
):
<sersync>
<localpath watch="/data/www"> <!-- 源目录 -->
<remote ip="目标服务器IP" name="www"/> <!-- 目标服务器和模块名 -->
</localpath>
<rsync>
<commonParams params="-artuz"/> <!-- rsync 参数:归档、递归、压缩、更新 -->
<auth start="false" users="root" passwordfile="/etc/rsync.passwd"/> <!-- 认证(SSH模式无需) -->
<userDefinedPort start="false" port="874"/> <!-- 自定义端口(SSH模式无需) -->
<timeout start="false" time="100"/> <!-- 超时设置 -->
<ssh start="true"/> <!-- 启用 SSH 模式 -->
</rsync>
<failLog path="/var/log/rsync_fail.log" timeToExecute="60"/> <!-- 失败日志和重试时间 -->
<crontab start="false" schedule="600"> <!-- 定时全量同步(可选) -->
<crontabfilter start="false"/>
</crontab>
<plugin start="false" name="command"/>
</sersync>
四、启动服务
1. 首次全量同步
/usr/local/sersync/sersync2 -d -r -o /usr/local/sersync/confxml.xml
参数说明:
-d
:后台运行-r
:启动时先执行一次全量同步-o
:指定配置文件路径
2. 验证同步
在源服务器创建测试文件:
touch /data/www/test.txt
检查目标服务器是否存在相同文件:
ls /backup/www/
五、管理命令
# 启动服务
/usr/local/sersync/sersync2 -d -o /usr/local/sersync/confxml.xml
# 停止服务
pkill sersync2
# 查看日志
tail -f /var/log/rsync_fail.log
六、常见配置优化
1. 排除特定文件 / 目录
在 <localpath>
节点下添加 <exclude>
:
<localpath watch="/data/www">
<remote ip="目标服务器IP" name="www"/>
<exclude expression="\.log$"/> <!-- 排除 .log 结尾的文件 -->
<exclude expression="^temp/"/> <!-- 排除 temp 目录 -->
</localpath>
2. 增加日志详细度
修改 <failLog>
节点:
<failLog path="/var/log/rsync_fail.log" timeToExecute="60"/>
3. 启用定时全量同步
修改 <crontab>
节点(每 600 秒执行一次全量同步):
<crontab start="true" schedule="600">
<crontabfilter start="false"/>
</crontab>
七、故障排查
检查服务状态:
ps -ef | grep sersync
查看同步日志:
tail -f /var/log/rsync_fail.log
手动执行 rsync 测试:
rsync -avz /data/www/ root@目标服务器IP:/backup/www/