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
