【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
相关推荐
xhbh6665 小时前
光纤端口映射完全教程:光猫虚拟服务器配置+免费穿透工具实战
运维·服务器·网络·智能路由器·端口映射·流量端口转发·ssh端口转发
初雪云5 小时前
让安卓发版再简单一点,体验一键自动化发布
android·运维·自动化
charlie1145141915 小时前
嵌入式Linux嵌入式Linux驱动开发:设备树驱动改造——从硬编码到设备树的实战之旅
linux·运维·驱动开发
随身数智备忘录5 小时前
MES安灯管理程序这套方法,专治MES安灯管理程序中的流程空转
大数据·服务器·网络
随身数智备忘录6 小时前
lpa分层审核指标怎么设?拆解关键指标,看lpa分层审核指标如何应对标准不一与责任虚化
服务器
有味道的男人6 小时前
1688 跨境 API:多语言、跨境代采、独立站商品同步方案
java·服务器·前端
Hoxy.R6 小时前
银河麒麟 V10 离线安装 s3cmd 踩坑记录+存储负载均衡测试
linux·运维·华为·存储
AC赳赳老秦6 小时前
OpenClaw与思维导图工具联动:自动生成工作规划脑图、拆解任务节点,适配职场管理
java·大数据·服务器·数据库·python·php·openclaw
rGzywSmDg6 小时前
如何在Dev-C++中选择TDM-GCC编译器
linux·jvm·c++