linux服务-rsync+inotify文件同步-rsync
rsync+inotify 实战示例-Rsync
一、工作原理
Rsync 同步的核心优势是 “增量传输” + “差异对比”,而非全量复制;双向同步则是基于 “两端各自监控 + 单向同步” 的组合逻辑,实现数据互相同步。先明确核心原理,再看具体部署,理解更透彻。
1.1、Rsync 核心工作原理
-
差异对比机制
- Rsync 同步时不会直接复制所有文件,而是通过 “校验和对比” 识别差异:
- 源端对文件分块计算 “弱校验和”(如 Adler-32)和 “强校验和”(如 MD5);
- 将校验和信息发送到目标端;
- 目标端对本地对应文件同样分块计算校验和,与源端对比;
- 仅传输 “校验和不匹配的分块”(差异数据),而非整个文件。
- Rsync 同步时不会直接复制所有文件,而是通过 “校验和对比” 识别差异:
-
增量传输优势
- 首次同步:无差异,全量传输文件(基础数据);
- 后续同步:仅传输修改 / 新增 / 删除的部分,网络带宽占用极低(比 SCP 快 3-10 倍);
- 支持断点续传:传输中断后,重新同步时仅补传未完成的分块。
-
同步模式分类
模式 传输方向 核心逻辑 适用场景 本地同步 本地 → 本地 直接对比本地文件校验和,复制差异数据 本地目录备份 远程同步(SSH) 本地 ↔ 远程 通过 SSH 隧道传输校验和和差异数据,无需额外部署 Rsync 服务 跨主机少量文件同步、临时同步 远程同步(Rsync 协议) 本地 ↔ 服务端 源端(客户端)与目标端(Rsync 服务端)直接通信,支持权限控制、IP 限制 生产环境长期同步、大量文件同步
1.2、双向同步
-
同步原理
Rsync 本身仅支持 单向同步,双向同步是通过 “两端各自部署监控 + 单向同步脚本” 实现的闭环:
- 主机 A 部署脚本:监控本地目录变化,将差异同步到主机 B;
- 主机 B 部署脚本:监控本地目录变化,将差异同步到主机 A;
- 核心保障:通过
--delete参数确保 “两端文件完全一致”,通过过滤规则(如排除临时文件)避免同步冲突。
-
双向同步无冲突条件
- 同一时间仅一端修改同一文件(日常场景满足);
- 过滤临时文件(如 vi 临时文件、日志缓存文件),避免中间状态同步;
- 目录权限一致(均为 root 可读写),避免同步时权限不足导致的差异。
二、配置示例
2.1、环境准备
| 角色 | IP 地址 | 同步目录 | 核心组件 |
|---|---|---|---|
| Rsync 服务端(主机 B) | 192.168.189.133 | /data/sync_dir | Rsync 服务(接收同步请求),监控本地变化,推送到服务端 |
| Rsync 客户端(主机 A) | 192.168.189.129 | /data/sync_dir | Rsync 客户端 + inotify-tools(监控变化) |
2.2、部署步骤(rsync协议)
2.2.1、服务端配置
-
原理前置:服务端核心作用 , 暴露同步目录(模块),接收客户端的同步请求;
- 通过配置文件控制客户端权限(IP 限制、用户名密码认证);
- 存储同步数据,与客户端交互校验和信息。
-
具体部署
-
两台主机都需要安装,一样的步骤
-
安装 Rsync:
yum install -y rsync -
创建 Rsync 配置文件
vi /etc/rsyncd.conf # 全局配置:服务运行身份(root 确保权限足够) uid = root gid = root # 关闭 chroot,避免目录权限限制 use chroot = no # 最大并发连接数(防止过载) max connections = 10 # 服务进程 PID 文件 pid file = /var/run/rsyncd.pid # 锁文件(避免并发冲突) lock file = /var/run/rsync.lock # 同步日志(便于排查) log file = /var/log/rsyncd.log # 忽略非致命错误(如个别文件权限不足) ignore errors # 允许客户端写入(双向同步必需,否则客户端无法推送数据) read only = no # 允许客户端查看服务端可用模块 list = yes # 允许的客户端网段(白名单,提高安全性) hosts allow = 192.168.189.0/24 # 拒绝其他所有网段 hosts deny = * # 同步模块(客户端通过模块名访问服务端目录) [sync_module] # 服务端实际同步目录 path = /data/sync_dir # 模块描述 comment = Bidirectional sync directory auth users = xiong # 密码文件(存储用户名:密码) secrets file = /etc/rsyncd.secrets -
创建密码文件
# 格式:用户名:密码(客户端需用相同密码) echo "xiong:123456" > /etc/rsyncd.secrets # 权限必须 600(Rsync 要求,否则服务启动失败,防止密码泄露) chmod 600 /etc/rsyncd.secrets -
创建同步目录并授权:
mkdir -p /data/sync_dir chown -R root:root /data/sync_dir chmod 755 /data/sync_dir # 确保读写权限 -
启动 Rsync 服务并设置开机自启:
systemctl start rsyncd systemctl enable rsyncd systemctl status rsyncd # 确认状态为 active (running)
-
2.2.2、客户端配置
-
原理前置:客户端核心作用 主机:192.168.189.129
- 通过 inotify-tools 监控本地目录变化(创建 / 删除 / 修改);
- 触发 Rsync 客户端,与服务端交互校验和,传输差异数据;
- 支持免密认证(通过密码文件),实现自动同步。
-
具体部署
-
安装依赖(Rsync + inotify-tools):
yum install -y rsync inotify-tools -
创建密码文件 <-- 两台都需要加
# 仅保存密码(与服务端密码一致,无需用户名) echo "123456" > /etc/rsync_client.secrets chmod 600 /etc/rsync_client.secrets # 权限必须 600,防止泄露 -
双向同步脚本(主机 A ↔ 主机 B)
-
脚本原理: 两端各自监控本地目录,触发单向同步,形成 “主机 A→主机 B” 和 “主机 B→主机 A” 的双向闭环
-
主机 A 双向脚本(推送到主机 B)
vi /data/rsync_bidir_A.sh ======================================== #!/bin/bash LOCAL_DIR="/data/sync_dir/" REMOTE_SERVER="192.168.189.133" MODULE_NAME="sync_module" USER="xiong" SECRET_FILE="/etc/rsync_client.secrets"RSYNC_OPTS="-avz --delete --password-file=$SECRET_FILE" EXCLUDE="--exclude='*.swp' --exclude='.*.swp' --exclude='*.swo' --exclude='.*.swo'" INOTIFY_EVENTS="create,delete,modify" INOTIFY_OPTS="-m -r -e $INOTIFY_EVENTS"# 检查本地目录 if [ ! -d "$(dirname $LOCAL_DIR)" ]; thenecho "[$(date)] 错误:本地目录不存在!" >> /var/log/rsync_bidir_A.log 2>&1exit 1 fi# 初始化全量同步(A→B) echo "[$(date)] 初始化同步到主机 B" >> /var/log/rsync_bidir_A.log rsync $RSYNC_OPTS $EXCLUDE $LOCAL_DIR $USER@$REMOTE_SERVER::$MODULE_NAME >> /var/log/rsync_bidir_A.log 2>&1# 监控本地变化,推送到 B echo "[$(date)] 开始监控本地目录(A→B)" >> /var/log/rsync_bidir_A.log inotifywait $INOTIFY_OPTS $(dirname $LOCAL_DIR) | while read -r dir events file; doif [[ $file == *.swp || $file == .*.swp || $file == *.swo || $file == .*.swo ]]; thenecho "[$(date)] 忽略临时文件:$events $file" >> /var/log/rsync_bidir_A.logcontinuefiecho "[$(date)] 本地事件:$events $file" >> /var/log/rsync_bidir_A.logsleep 1rsync $RSYNC_OPTS $EXCLUDE $LOCAL_DIR $USER@$REMOTE_SERVER::$MODULE_NAME >> /var/log/rsync_bidir_A.log 2>&1echo "[$(date)] A→B 同步完成" >> /var/log/rsync_bidir_A.log done -
主机 B 双向脚本(推送到主机 A) <-- 两台主机都需要执行 1-3
-
主机 B 需同时作为 “客户端”,监控自身目录变化推送到主机 A,步骤:
-
主机 B 安装 inotify-tools:
yum install -y inotify-tools -
创建密码文件:
echo "123456" > /etc/rsync_client.secrets chmod 600 /etc/rsync_client.secrets -
创建脚本
vi /data/rsync_bidir_B.sh ==================================== #!/bin/bash LOCAL_DIR="/data/sync_dir/" REMOTE_SERVER="192.168.189.129" # 主机 A IP MODULE_NAME="sync_module" # 主机 A 需部署 Rsync 服务,模块名一致 USER="xiong" # 主机 A Rsync 服务的认证用户名 SECRET_FILE="/etc/rsync_client.secrets"RSYNC_OPTS="-avz --delete --password-file=$SECRET_FILE" EXCLUDE="--exclude='*.swp' --exclude='.*.swp' --exclude='*.swo' --exclude='.*.swo'" INOTIFY_EVENTS="create,delete,modify" INOTIFY_OPTS="-m -r -e $INOTIFY_EVENTS"# 检查本地目录 if [ ! -d "$(dirname $LOCAL_DIR)" ]; thenecho "[$(date)] 错误:本地目录不存在!" >> /var/log/rsync_bidir_B.log 2>&1exit 1 fi# 初始化全量同步(B→A) echo "[$(date)] 初始化同步到主机 A" >> /var/log/rsync_bidir_B.log rsync $RSYNC_OPTS $EXCLUDE $LOCAL_DIR $USER@$REMOTE_SERVER::$MODULE_NAME >> /var/log/rsync_bidir_B.log 2>&1# 监控本地变化,推送到 A echo "[$(date)] 开始监控本地目录(B→A)" >> /var/log/rsync_bidir_B.log inotifywait $INOTIFY_OPTS $(dirname $LOCAL_DIR) | while read -r dir events file; doif [[ $file == *.swp || $file == .*.swp || $file == *.swo || $file == .*.swo ]]; thenecho "[$(date)] 忽略临时文件:$events $file" >> /var/log/rsync_bidir_B.logcontinuefiecho "[$(date)] 本地事件:$events $file" >> /var/log/rsync_bidir_B.logsleep 1rsync $RSYNC_OPTS $EXCLUDE $LOCAL_DIR $USER@$REMOTE_SERVER::$MODULE_NAME >> /var/log/rsync_bidir_B.log 2>&1echo "[$(date)] B→A 同步完成" >> /var/log/rsync_bidir_B.log done
-
-
-
2.2.3、脚本授权与测试
-
脚本授权(所有主机)
chmod +x /data/rsync_uni_sync.sh /data/rsync_bidir_A.sh /data/rsync_bidir_B.shA主机有两个脚本 rsync_uni_sync.sh <--单向脚本rsync_bidir_A.sh <--双向脚本A主机有一个脚本 rsync_bidir_B.sh <--双向脚本共用的配置文件, 权限都是600 [root@node1 etc]# ll rsyncd.conf rsyncd.secrets rsync_client.secrets -rw------- 1 root root 7 11月 16 13:21 rsync_client.secrets -rw------- 1 root root 1055 11月 16 13:23 rsyncd.conf -rw------- 1 root root 13 11月 16 13:12 rsyncd.secrets -
测试用户是否正常
rsync -avz --exclude='*.swp' --password-file=/etc/rsync_client.secrets /data/sync_dir/ xiong@192.168.189.133::sync_module# A\B两台都能列出来就成功了 sent 327 bytes received 73 bytes 38.10 bytes/sec total size is 55 speedup is 0.14 -
测试双向同步(两端均执行)
# 主机 A 后台运行 nohup ./rsync_bidir_A.sh # 主机 B 后台运行 nohup ./rsync_bidir_B.sh # 两边都添加删除文件试试 -
配置自启 双向, 单向仅记录一下
vi /etc/systemd/system/rsync_bidir.service [Unit] Description=Rsync Bidirectional Sync (A ↔ B) After=network.target rsyncd.service # 网络和 Rsync 服务就绪后启动[Service] Type=simple # 以 root 身份运行(确保权限) User=root Group=root # 工作目录 WorkingDirectory=/data # 脚本绝对路径 ExecStart=/bin/bash /data/rsync_bidir_A.sh # 失败时自动重启 Restart=on-failure # 重启间隔 3 秒 RestartSec=3 StandardOutput=append:/var/log/rsync_bidir_service.log[Install] WantedBy=multi-user.target # 多用户模式下启动 -
启动服务
# 重新加载配置 systemctl daemon-reload # 启动服务 systemctl start rsync_bidir # 查看状态 systemctl status rsync_bidir # 开机自启 systemctl enable rsync_bidir
三、核心优势与注意事项
-
与 SSH 方式对比(Rsync 原生协议优势)
- 无需配置 SSH 免密,通过用户名密码认证,更安全可控;
- 服务端可限制客户端 IP、访问权限,适合生产环境;
- 传输效率与 SSH 一致,支持压缩、增量同步。
-
注意事项
- 密码文件权限必须为 600,否则 Rsync 拒绝执行;
- 双向同步时,两端需同时部署监控脚本,避免同步冲突;
- 过滤规则需包含 vi 临时文件,防止编辑时文件丢失;
- 服务端
read only = no必须开启,否则客户端无法写入。
-
排查问题
- 同步失败:查看日志
/var/log/rsync_*.log,检查服务端是否启动、密码是否正确; - 服务启动失败:查看 Systemd 错误日志
/var/log/rsync_bidir_service_error.log; - 事件未捕获:确认 inotify-tools 已安装,本地目录权限正确。
- 同步失败:查看日志
