【Linux】Rsync + Inotify 实时文件同步案例

Rsync 作为增量传输的标杆工具,加上 Inotify 内核级的事件监控机制,仅需几行脚本即可实现毫秒级触发的实时数据同步;本文将通过从 CentOS 7 源服务器到 Ubuntu 目标服务器的数据实时备份的一个完整案例进行介绍。

1、环境说明

1.1、源服务器 A

  • 操作系统:Centos 7
  • IP:192.168.140.130
  • 目录:/data/
  • 角色:数据变化端

1.2、目标服务器 B

  • 操作系统:Ubuntu 24.04
  • IP:192.168.140.129
  • 目录:/data/centos
  • 角色:数据接收端

2、操作步骤

2.1、目标服务器配置(Ubuntu 接收端)

bash 复制代码
# 步骤1:Ubuntu 安装 rsync
apt update
apt install -y rsync
## 查看版本验证
rsync --version
bash 复制代码
# 步骤2:创建目标目录并设置权限
mkdir -p /data/centos
chmod 755 /data/centos
chown nobody:nogroup /data/centos       # Ubuntu 使用 nogroup
bash 复制代码
# 步骤3:配置 rsync 服务端
## 编辑配置文件 /etc/rsyncd.conf,内容如下:
---
# rsyncd.conf - Ubuntu 接收端配置

uid = nobody
gid = nogroup
use chroot = yes
max connections = 10
strict modes = yes
pid file = /var/run/rsyncd.pid
lock file = /var/run/rsync.lock
log file = /var/log/rsyncd.log
timeout = 300

# 定义同步模块
[data_centos]
    comment = CentOS sync data to Ubuntu
    path = /data/centos
    read only = no
    write only = no
    list = false
    ignore errors
    auth users = sync_user
    secrets file = /etc/rsync.password
    hosts allow = 192.168.140.130   # 只允许源服务器连接
    hosts deny = *
---
bash 复制代码
# 步骤4:创建认证文件
## 创建密码文件(格式:用户名:密码)
echo "sync_user:123456" | tee /etc/rsync.password
## 设置权限(必须 600)
chmod 600 /etc/rsync.password
bash 复制代码
# 步骤5:启动 rsync 守护进程
## 启动 rsync 服务
rsync --daemon --config=/etc/rsyncd.conf
## 查看进程
ps aux | grep rsync
## 查看端口(默认873,或 ss -tlnp | grep rsync)
netstat -tlnp | grep 873
bash 复制代码
# 步骤6:设置开机自启
## 方法1:添加到 rc.local
echo "rsync --daemon" | tee -a /etc/rc.local
chmod +x /etc/rc.local
## 方法2:创建 systemd 服务(此处不展示)

2.2、源服务器A配置( CentOS 7 发送端)

bash 复制代码
# 步骤1:安装 rsync 和 inotify-tools
## 安装 rsync
yum install -y rsync
## 安装 epel 源(inotify-tools 需要)
yum install -y epel-release
## 安装 inotify-tools
yum install -y inotify-tools
## 验证安装
rpm -qa | grep -E "rsync|inotify"
bash 复制代码
# 步骤2:检查内核支持
## 检查 inotify 支持(应该看到以下三个文件:max_queued_events  max_user_instances  max_user_watches)
ls /proc/sys/fs/inotify/
bash 复制代码
# 步骤3:创建密码文件(客户端)
## 注意:客户端只需要密码,不需要用户名
echo "123456" | sudo tee /etc/rsync.password
## 设置权限
sudo chmod 600 /etc/rsync.password
bash 复制代码
# 步骤4:测试手动同步
## 先创建测试数据
sudo mkdir -p /data
echo "test content" | tee /data/test.txt
## 测试 rsync 同步(注意路径末尾的斜杠)
rsync -avz --delete --password-file=/etc/rsync.password /data/ sync_user@192.168.140.129::data_centos
---
# 参数说明:
-a : 归档模式,保持文件属性
-v : 显示详细信息
-z : 传输时压缩
--delete : 删除目标端多余文件
--password-file : 指定密码文件
---
## 在 Ubuntu 服务器B检查文件
ls -la /data/centos/
cat /data/centos/test.txt
bash 复制代码
# 步骤5:创建实时同步脚本
## 创建脚本目录
mkdir -p /scripts
## 创建同步脚本,vi /scripts/inotify_rsync.sh
----
#!/bin/bash

# ========== 配置参数 ==========
# 源目录(注意:末尾斜杠很重要)
SRC_DIR="/data/"

# 目标服务器信息
DST_HOST="192.168.140.129"
DST_MODULE="data_centos"
DST_USER="sync_user"

# 认证文件
PASSWORD_FILE="/etc/rsync.password"

# 日志文件
LOG_FILE="/var/log/rsync_inotify.log"

# rsync 基础参数
# -a : 归档模式(保持权限、时间等)
# -v : 详细输出
# -z : 压缩传输
# --delete : 删除目标端多余文件
# --progress : 显示进度(可选)
# --exclude : 排除不需要同步的目录
RSYNC_OPTS="-avz --delete --password-file=${PASSWORD_FILE}"

# 可选:排除特定目录
# RSYNC_OPTS="-avz --delete --password-file=${PASSWORD_FILE} --exclude='logs/' --exclude='temp/'"

# ========== 日志函数 ==========
log_message() {
    echo "$(date '+%Y-%m-%d %H:%M:%S') - $1" >> ${LOG_FILE}
}

# ========== 执行同步函数 ==========
do_rsync() {
    rsync ${RSYNC_OPTS} ${SRC_DIR} ${DST_USER}@${DST_HOST}::${DST_MODULE} >> ${LOG_FILE} 2>&1
    if [ $? -eq 0 ]; then
        log_message "Sync completed successfully"
    else
        log_message "Sync failed with error code $?"
    fi
}

# ========== 主程序 ==========
log_message "========================================="
log_message "Starting inotify monitoring on: ${SRC_DIR}"
log_message "Target: ${DST_USER}@${DST_HOST}::${DST_MODULE}"
log_message "========================================="

# 先执行一次完整同步,确保目标端数据一致
log_message "Initial full sync..."
do_rsync

# 监控文件系统事件
# -m : 持续监控
# -r : 递归监控子目录
# -q : 安静模式(减少输出)
# --timefmt : 时间格式
# --format : 输出格式
# -e : 监控的事件类型
/usr/bin/inotifywait -mrq \
    --timefmt '%Y-%m-%d %H:%M:%S' \
    --format '%T %w%f - %e' \
    -e close_write,modify,delete,create,attrib,move \
    ${SRC_DIR} | while read EVENT
do
    log_message "Detected: ${EVENT}"
    do_rsync
done
----
bash 复制代码
# 步骤6:赋予执行权限
chmod +x /scripts/inotify_rsync.sh

# 步骤7:测试脚本(前台运行)
## 先在前台测试运行(另开终端,在 /data/ 目录下创建、修改、删除文件,观察脚本输出)
/scripts/inotify_rsync.sh

# 步骤8:后台运行脚本
## 使用 nohup 后台运行
nohup /scripts/inotify_rsync.sh &
## 查看进程
ps aux | grep inotify
bash 复制代码
# 步骤9:设置开机自启
## 方法1:添加到 rc.local
echo "nohup /scripts/inotify_rsync.sh &" | sudo tee -a /etc/rc.local
sudo chmod +x /etc/rc.local
## 方法2:创建 systemd 服务(此处不展示)

2.3、测试

bash 复制代码
### 测试1:文件创建同步 ###
--- 源服务器A
# 创建测试文件
echo "Hello from CentOS" | sudo tee /data/test1.txt
--- 目标服务器B(Ubuntu)
# 检查同步结果
ls -la /data/centos/
cat /data/centos/test1.txt

### 测试2:文件修改同步 ###
--- 源服务器A
# 修改文件内容
echo "Updated content" | sudo tee -a /data/test1.txt
--- 目标服务器B
# 验证内容已更新
cat /data/centos/test1.txt
相关推荐
j_xxx404_7 分钟前
MySQL库操作硬核解析:字符集、校验规则、大小写比较、备份恢复与连接排查
运维·服务器·数据库·人工智能·mysql·ai·oracle
拾贰_C1 小时前
【python | installation 】python 安装 | Windows | 命令使用
linux·数据库·ubuntu
机汇五金_1 小时前
影响交换机箱体使用寿命的几个关键因素
运维·服务器·网络·python
bkspiderx1 小时前
Boa Web服务器HTTPS支持的源码改造方案
服务器·前端·https·web服务器·boa·https支持
无限进步_1 小时前
Linux进程终止——退出码、exit与_exit
linux·运维·服务器
编程大师哥1 小时前
最高效的 IO 并发方案
linux·网络·python
炘爚1 小时前
phase1:基础框架——编译 + MySQL + 登录/注册
linux·c++
小蜗子1 小时前
Windows 11 + RTX 5060 + WSL2 Ubuntu + NVIDIA DGL 容器
linux·运维·ubuntu
Yan-英杰2 小时前
从零玩转搜索引擎 API: 多引擎整合实战
服务器·前端·microsoft
枕星而眠2 小时前
C++ 面向对象核心机制深度解析:多态性、虚函数、虚继承与 final 类
运维·开发语言·c++·后端