Rsync 数据同步 + Inotify 实时监控 完整版实操笔记3

一、基础介绍

1. Rsync 概述

rsync 是开源轻量级增量数据同步工具 ,支持本地、远程、守护进程三种工作模式;只同步变化的数据 ,传输效率远高于 cp/scp,常用于服务器备份、集群文件同步。

  • 全量同步:完整复制所有文件
  • 增量同步:仅同步新增、修改、删除的文件

2. 三大工作模式

  1. 本地同步 :等价于 cp 命令,本机目录 / 文件互相同步
  2. 远程同步 :等价于 scp 命令,跨主机传输(基于 SSH 协议)
  3. 守护进程模式(rsyncd) :服务端监听 873 端口,客户端主动拉取 / 推送数据,企业主流备份方案

3. 辅助查询命令

bash

运行

复制代码
cat /etc/os-release   # 查看系统发行版本(CentOS/RedHat等)
uname -r              # 查看Linux内核版本

二、Rsync 常用参数 & 符号规则

1. 核心高频参数

表格

参数 作用
-a 归档模式,等价 -rlptgoD,保留权限、属主、时间、软链接等属性
-v 可视化输出,显示同步详情
-z 传输时压缩数据,节省带宽
--delete 删除目标端多余文件(以源目录为准,只增减文件,不修改文件内容)
--exclude=文件/目录 同步时排除指定文件 / 目录
--bwlimit=数值 限制传输速度,单位 KB/s

2. 目录尾部 / 关键区别(必考)

  • 源目录/:只同步目录内所有内容,不同步目录本身
  • 源目录(无 /):将整个目录 + 内部文件一起同步

示例:data/ 同步内容;data 同步整个 data 目录


三、模式一:本地数据同步(实操)

环境准备

bash

运行

复制代码
# 创建测试目录与文件
mkdir data yunjisuan
touch data/file{1..5}.txt
ls data/

1. 基础本地同步

bash

运行

复制代码
# 同步 data 目录内所有内容 到 yunjisuan
rsync -avz data/ yunjisuan/

2. 加上 --delete(以源为准,清理目标多余文件)

bash

运行

复制代码
# 在目标目录创建多余文件
touch yunjisuan/del.txt
# 同步并删除目标端多余文件
rsync -avz --delete data/ yunjisuan/

效果yunjisuan/del.txt 会被自动删除,两端目录完全一致。

3. 排除指定文件同步

bash

运行

复制代码
# 同步时排除 file3.txt
rsync -avz --exclude=file3.txt data/ yunjisuan/

4. 限制传输速度

bash

运行

复制代码
# 限速 100KB/s 同步
rsync -avz --bwlimit=100 data/ yunjisuan/

四、模式二:远程 SSH 同步(等价 scp,无需配置服务)

环境说明

  • 服务端 IP:192.168.91.140
  • 客户端:当前主机
  • 前提:两台机器网络互通、SSH 互通、关闭防火墙 / 放行 22 端口

1. 推送数据(本地 → 远程服务器)

bash

运行

复制代码
# 格式:rsync -avz 本地目录 远程用户@远程IP:远程目录
rsync -avz yunjisuan/ root@192.168.91.140:/root

执行后输入对方主机 root 密码,完成同步。

2. 拉取数据(远程服务器 → 本地)

bash

运行

复制代码
# 格式:rsync -avz 远程用户@远程IP:远程目录 本地目录
rsync -avz root@192.168.91.140:/root/yunjisuan/ ./data/

3. 组合参数(删除多余文件 + 限速 + 排除文件)

bash

运行

复制代码
rsync -avz --delete --exclude=file1.txt --bwlimit=200 yunjisuan/ root@192.168.91.140:/root

五、模式三:Rsync 守护进程模式(rsyncd,企业重点)

架构说明

  • 服务端(监听 873 端口):配置 rsyncd、密码文件、共享目录
  • 客户端:免密推送 / 拉取数据,无需登录 SSH
  • 端口:默认 873/tcp

前置准备(服务端 & 客户端均执行)

bash

运行

复制代码
# 安装rsync(系统一般默认自带)
yum install rsync -y
# 关闭防火墙/放行873端口(二选一)
systemctl stop firewalld
# 或永久放行873端口
firewall-cmd --permanent --add-port=873/tcp
firewall-cmd --reload

🔹 第一步:服务端完整配置(IP:192.168.91.146)

1. 创建程序专用用户(不可登录系统)

bash

运行

复制代码
# -M 不创建家目录  -s 指定禁止登录shell
useradd -M -s /sbin/nologin rsync
# 查看用户
id rsync
2. 创建共享目录,并修改属主属组

bash

运行

复制代码
mkdir -p /backup
# 递归修改目录所有者为 rsync
chown -R rsync:rsync /backup/
ls -ld /backup/
3. 编写 Rsync 主配置文件 /etc/rsyncd.conf

bash

运行

复制代码
vi /etc/rsyncd.conf

粘贴以下完整配置(带注释):

ini

复制代码
# 全局配置段
fake super = yes          # 允许非root用户操作备份目录文件
uid = rsync               # 运行进程的用户
gid = rsync               # 运行进程的组
use chroot = no           # 不锁定根目录(内网环境关闭)
max connections = 200      # 最大客户端连接数
timeout = 300             # 连接超时时间,单位秒
pid file = /var/run/rsyncd.pid  # 进程PID文件
lock file = /var/run/rsync.lock # 进程锁文件
log file = /var/log/rsyncd.log  # 日志文件路径

# 模块配置段 [backup] 模块名,客户端调用必须一致
[backup]
path = /backup/           # 模块对应的真实共享目录
ignore errors             # 传输过程忽略无关错误
read only = false         # false=可读可写;true=只读
list = false              # 禁止客户端查看模块列表(安全加固)
hosts allow = 192.168.91.0/24  # 允许192.168.91网段所有主机访问
hosts deny = 0.0.0.0/32   # 拒绝所有其他IP
auth users = rsync_backup # 虚拟认证用户(系统不存在该用户)
secrets file = /etc/rsync.password # 虚拟用户密码文件
4. 创建虚拟用户密码文件

bash

运行

复制代码
vi /etc/rsync.password
# 格式:虚拟用户名:密码
rsync_backup:123456
5. 密码文件降权(权限必须 600,否则同步失败

bash

运行

复制代码
chmod 600 /etc/rsync.password
ls -l /etc/rsync.password
6. 启动 Rsync 守护进程 & 开机自启

bash

运行

复制代码
# 启动守护进程
rsync --daemon

# 设置开机自启(CentOS7+)
echo "rsync --daemon" >> /etc/rc.local
chmod +x /etc/rc.local

# 检查进程 & 监听端口(873)
ss -antup | grep rsync
ps aux | grep rsync
7. 查看日志(排错用)

bash

运行

复制代码
tail -f /var/log/rsyncd.log

🔹 第二步:客户端配置(免密同步)

客户端无需启动 rsync 服务,只需要创建纯密码文件

bash

运行

复制代码
# 创建密码文件,只写密码,不要写用户名
echo "123456" > /etc/rsync.password

# 强制降权为600(必填项)
chmod 600 /etc/rsync.password
ls -l /etc/rsync.password

🔹 第三步:客户端实操同步命令

1. 推送数据(客户端目录 → 服务端 backup 模块)

格式rsync -avz 本地目录 虚拟用户@服务端IP::模块名 --password-file=密码文件

bash

运行

复制代码
# 把本地 yunjisuan/ 内容推送到服务端 /backup
rsync -avz yunjisuan/ rsync_backup@192.168.91.146::backup --password-file=/etc/rsync.password
2. 追加常用参数组合

bash

运行

复制代码
# 推送 + 删除服务端多余文件 + 限速100KB/s + 排除file2.txt
rsync -avz --delete --bwlimit=100 --exclude=file2.txt yunjisuan/ rsync_backup@192.168.91.146::backup --password-file=/etc/rsync.password
3. 拉取数据(服务端模块 → 客户端本地)

bash

运行

复制代码
rsync -avz rsync_backup@192.168.91.146::backup/ ./data/ --password-file=/etc/rsync.password

六、Inotify 文件实时监控(搭配 Rsync 实现实时同步

1. Inotify 介绍

inotify 是 Linux 内核自带的文件 / 目录实时监控工具 ,可监控:文件创建、删除、修改、移动、权限变更等事件。 常和 rsync 结合:监控目录变化 → 触发 rsync 自动同步,实现准实时备份。

2. 安装工具

bash

运行

复制代码
yum install inotify-tools -y

3. inotifywait 核心参数详解

表格

参数 作用
-m 持续监控(默认监控一次就退出)
-r 递归监控子目录
-q 静默模式,减少冗余输出
-e 指定要监控的事件
--timefmt 自定义时间输出格式
--format 自定义监控日志输出格式

4. 监控事件(Events)

plaintext

复制代码
create      # 文件/目录被创建
delete      # 文件/目录被删除
modify      # 文件内容被修改
attrib      # 文件权限/属性变更
move_to     # 文件移入监控目录
move_from   # 文件移出监控目录
close_write # 可写文件关闭(修改完成,最常用触发同步)

七、Inotify 基础实操案例

环境准备

bash

运行

复制代码
mkdir data
touch data/test.txt

案例 1:基础持续监控(创建、删除、修改事件)

bash

运行

复制代码
# 持续递归监控 data 目录,监控 创建/删除/修改 事件
inotifywait -mqr -e create,delete,modify data/

测试 :新开终端,在 data 里新建 / 删除 / 修改文件,查看监控输出。

案例 2:自定义时间 + 输出格式

bash

运行

复制代码
inotifywait -mqr \
--timefmt "%Y-%m-%d %H:%M:%S" \
--format "%T 事件:%e  文件:%w%f" \
-e create,delete,modify,move data/
  • %T:调用时间格式
  • %w:文件所在目录
  • %f:文件名

案例 3:后台运行监控,日志写入文件

bash

运行

复制代码
# 后台监控删除事件,日志存入 inotify.log
nohup inotifywait -mq -e delete --timefmt %Y-%m-%d --format '%T-%w%f' data/ &> inotify.log &

# 查看监控日志
tail -f inotify.log

八、企业组合方案:Inotify + Rsync 实时同步脚本(重点)

需求:监控客户端 yunjisuan 目录,一旦文件变化,自动调用 rsync 推送到服务端

1. 编写实时同步脚本 inotify_rsync.sh

bash

运行

复制代码
vi /root/inotify_rsync.sh

写入内容:

bash

运行

复制代码
#!/bin/bash
# 定义监控目录
MON_DIR="/root/yunjisuan"
# 定义rsync同步命令
RSYNC_CMD="rsync -avz --delete $MON_DIR/ rsync_backup@192.168.91.146::backup --password-file=/etc/rsync.password"

# 持续监控目录变化,触发同步
inotifywait -mqr -e create,delete,modify,move,attrib $MON_DIR | while read line
do
    # 每次事件触发,执行同步
    $RSYNC_CMD
done

2. 授权 & 后台运行脚本

bash

运行

复制代码
chmod +x /root/inotify_rsync.sh

# 后台执行
nohup /root/inotify_rsync.sh &

# 查看后台进程
ps aux | grep inotify_rsync

3. 功能测试

  1. 在客户端 yunjisuan 目录 新建 / 修改 / 删除文件
  2. 查看服务端 /backup 目录,文件自动同步
  3. 查看 rsync 日志排查问题:tail -f /var/log/rsyncd.log

4. 脚本开机自启

bash

运行

复制代码
echo "/root/inotify_rsync.sh &" >> /etc/rc.local
chmod +x /etc/rc.local

九、常见报错 & 排错总结

  1. rsync 密码文件权限报错 现象:password file must not be other-accessible 解决:服务端 + 客户端密码文件必须 chmod 600

  2. 连接不上 873 端口 解决:放行防火墙 873 端口、检查 rsync --daemon 是否启动

  3. 目录同步带 / 和不带 / 混淆 记忆:有斜杠同步内容,无斜杠同步整个目录

  4. inotify 监控无输出 解决:检查目录路径、事件参数、是否加 -m 持续监控


十、知识点总结

  1. Rsync 三种模式:本地同步、远程 SSH 同步、守护进程 873 端口同步
  2. 核心参数:-avz --delete --exclude --bwlimit
  3. 守护进程关键点:专用系统用户、虚拟用户、密码文件 600 权限、模块名一致
  4. Inotify 核心:-mqr 持续静默监控,搭配事件触发动作
  5. 企业经典组合:Inotify(监控变化) + Rsync(增量同步) 实现实时备份
相关推荐
凡人叶枫21 小时前
Effective C++ 条款23:宁以 non-member、non-friend 替换 member 函数
linux·开发语言·c++·嵌入式开发
不会C语言的男孩1 天前
Linux 系统编程 · 第 4 章:文件属性与元数据
linux·c语言·开发语言
小生不才yz1 天前
Shell脚本精读 · S02-03 | 词拆分、通配符与未加引号的变量
linux
2601_961845421 天前
法考真题及答案解析|历年真题|资料已整理
linux·windows·ubuntu·macos·centos·gnu
A_humble_scholar1 天前
Linux(七)调度器:从硬件矛盾到进程切换的底层逻辑
linux·服务器·网络
Urbano1 天前
工装 T 恤、Polo 衫全生产工序、痛点解析及多品牌自动化设备应用方案
运维·自动化
AOwhisky1 天前
Redis 学习笔记(第一期):概述、安装配置与核心理论
运维·数据库·redis·笔记·学习·云计算
❀抽抽1 天前
证件照制作API接入指南:700+规格一键生成
大数据·网络·人工智能
Promise微笑1 天前
绝缘油介损(油介损)测试仪的深层机理、技术演进与精准诊断策略
大数据·网络·人工智能
AOwhisky1 天前
Redis 学习笔记(第四期):高可用与集群(哨兵 + Cluster + 容器化)
linux·运维·数据库·redis·笔记·学习·缓存