------ 客户端目录文件变化,实时备份到服务端
================================================================
================================================================
rsync + inotify 实时同步部署操作文档(新手版)
------ 客户端目录文件变化,实时备份到服务端
================================================================
【适用环境】
操作系统 : CentOS 7.x(本机已验证 CentOS 7.9)
两台机器 : 服务端(存备份) / 客户端(放数据)
提前准备 : 两台机器的 root 账号和密码,网络互通
【本文约定】(请按你自己的实际情况替换下面的值)
服务端 IP : 10.10.10.129
客户端 IP : 10.10.10.130
认证用户名 : hu
认证密码 : abc-123
服务端存储目录 : /hu (接收备份的地方)
客户端监控目录 : /hu (放文件的地方,文件变化会被同步)
如果你要改,只需把下面命令里的 IP、用户名、密码、/hu 目录替换成你自己的即可。
================================================================
第一部分 服务端配置(存备份的机器,本文 = 10.10.10.129)
================================================================
【步骤1】登录服务端
用 root 账号 SSH 登录服务端,或直接在服务端本机终端操作。
例如从其他机器登录:
【步骤2】关闭防火墙、SELinux(新手建议直接关,避免同步被拦截)
systemctl stop firewalld
systemctl disable firewalld
sed -i 's/SELINUX=enforcing/SELINUX=disabled/' /etc/selinux/config
【步骤3】安装 rsync(一般系统已自带,执行确认即可)
yum install -y rsync
【步骤4】创建存储备份的目录
mkdir -p /hu
chmod 777 /hu
【步骤5】创建 rsync 配置文件
执行下面整段命令,把配置文件一次性写入 /etc/rsyncd.conf:
cat > /etc/rsyncd.conf <<'EOF'
log file = /var/log/rsyncd.log
pid file = /var/log/rsyncd.pid
lock file = /var/log/rsyncd.lock
secrets file = /etc/rsyncd.pas
motd file = /etc/rsyncd.motd
read only = no
hosts allow = 10.10.10.0/24
list = yes
uid = root
gid = root
use chroot = no
max connections = 4
linux_bak
path = /hu
comment = data backup
auth users = hu
EOF
说明:
-
hosts allow 后面写允许连接的客户端网段(如 10.10.10.0/24)
-
linux_bak 是模块名,客户端同步时要写这个
-
path = /hu 是实际存储备份的目录
-
auth users = hu 是认证用户名
-
uid / gid = root 让备份文件以 root 属主写入,权限更顺
【步骤6】创建认证密码文件(格式:用户名:密码)
echo 'hu:abc-123' > /etc/rsyncd.pas
chmod 600 /etc/rsyncd.pas
cat /etc/rsyncd.pas
注意:密码文件权限一定要 600,否则 rsync 拒绝启动。
【步骤7】创建连接提示文件(可选,可跳过)
echo '### rsync server ready ###' > /etc/rsyncd.motd
【步骤8】启动 rsync 服务并设为开机自启
systemctl start rsyncd
systemctl enable rsyncd
systemctl status rsyncd
【步骤9】确认端口 873 已监听
ss -anpt | grep 873
看到类似下面输出就说明服务端成功了:
LISTEN ... *:873 ... users:(("rsync",...))
================================================================
第二部分 客户端配置(放数据的机器,本文 = 10.10.10.130)
================================================================
【步骤1】登录客户端
【步骤2】关闭防火墙、SELinux(和服务端一样)
systemctl stop firewalld
systemctl disable firewalld
sed -i 's/SELINUX=enforcing/SELINUX=disabled/' /etc/selinux/config
【步骤3】安装编译工具和 rsync
yum install -y gcc make rsync
【步骤4】把 inotify-tools 源码包上传到客户端
方式A:用 WinSCP / Xftp 等工具,把 inotify-tools-3.14.tar.gz
上传到客户机的 /usr/local/bin/ 目录。
方式B:如果你本地能访问源码地址,也可以在客户机直接:
cd /usr/local/bin
wget https://github.com/inotify-tools/inotify-tools/archive/refs/tags/3.14.tar.gz
mv 3.14.tar.gz inotify-tools-3.14.tar.gz
【步骤5】解压并编译安装 inotify-tools
cd /usr/local/bin
tar zxf inotify-tools-3.14.tar.gz
cd inotify-tools-3.14
./configure
make
make install
验证安装成功(能看到 inotifywait 路径即成功):
which inotifywait
输出应为:/usr/local/bin/inotifywait
【步骤6】创建客户端监控目录
mkdir -p /hu
chmod 777 /hu
【步骤7】创建客户端密码文件(这里只写密码,不含用户名)
echo 'abc-123' > /etc/1.pas
chmod 600 /etc/1.pas
cat /etc/1.pas
注意:客户端密码文件 /etc/1.pas 里只写密码(abc-123),
不要写"用户名:密码"的格式。
【步骤8】创建实时同步脚本
执行下面整段命令,写入 /opt/inotify_rsync.sh:
cat > /opt/inotify_rsync.sh <<'EOF'
#!/bin/bash
rsync + inotify 实时同步脚本
监控 /hu 目录,文件变化时实时同步到 服务端IP::linux_bak
/usr/local/bin/inotifywait -mrq -e create,move,delete,modify /hu | while read D E F ; do
rsync -avH --delete --password-file=/etc/1.pas /hu/ hu@10.10.10.129::linux_bak
done
EOF
赋予执行权限:
chmod +x /opt/inotify_rsync.sh
务必注意:命令里的 /hu/ 末尾要带斜杠!
-
写 /hu/ :把 /hu 里面的内容同步到服务端 /hu(正确)
-
写 /hu :会把 /hu 这个文件夹本身同步进去,
导致服务端出现 /hu/hu 嵌套(错误)
【步骤9】启动实时同步脚本
setsid nohup /opt/inotify_rsync.sh > /tmp/inotify.log 2>&1 < /dev/null &
确认监控进程已启动(能看到 inotifywait 进程即成功):
ps -ef | grep inotifywait | grep -v grep
【步骤10】设置开机自启(重启后自动运行)
chmod +x /etc/rc.d/rc.local
echo ' -x /opt/inotify_rsync.sh && setsid /opt/inotify_rsync.sh >/tmp/inotify.log 2>&1 < /dev/null &' >> /etc/rc.d/rc.local
tail -3 /etc/rc.d/rc.local
================================================================
第三部分 验证(测试实时同步是否成功)
================================================================
【测试1】客户端放文件,看服务端是否出现
在客户端 130 执行:
echo 'hello rsync sync test' > /hu/test_1.txt
等 1~2 秒,到服务端 129 查看:
ls -l /hu/
如果看到 test_1.txt 出现在 /hu/ 里,说明"新增同步"成功。
【测试2】客户端删文件,看服务端是否同步删除
在客户端 130 执行:
rm -f /hu/test_1.txt
等 1~2 秒,到服务端 129 查看:
ls -l /hu/
如果 test_1.txt 也从服务端 /hu/ 消失,说明"删除同步"(--delete)成功。
【测试3】手动同步一次(排查问题用)
在客户端 130 执行:
rsync -avH --password-file=/etc/1.pas /hu/ hu@10.10.10.129::linux_bak
出现 "sending incremental file list" 且无报错,说明链路是通的。
================================================================
第四部分 常见问题排查
================================================================
【问题1】同步没反应 / 报 permission denied
检查点:
-
服务端 /etc/rsyncd.pas 权限是否是 600
-
客户端 /etc/1.pas 权限是否是 600
-
服务端 /etc/rsyncd.conf 里 read only 是否为 no
-
客户端密码文件里是否只写了密码(没写用户名)
【问题2】连接超时 / 连不上 873 端口
检查点:
-
服务端是否执行了 systemctl start rsyncd
-
服务端 ss -anpt | grep 873 是否有输出
-
服务端 hosts allow 网段是否包含客户端 IP
-
防火墙是否关闭
【问题3】服务端出现 /hu/hu 嵌套目录
原因:客户端同步脚本里写的是 /hu(无尾斜杠)
解决:把脚本里的 /hu 改成 /hu/ ,并删除服务端多余嵌套目录:
rm -rf /hu/hu
【问题4】修改脚本后不生效
需要先停掉旧进程再重启:
pkill -9 -f inotifywait
pkill -9 -f inotify_rsync.sh
setsid nohup /opt/inotify_rsync.sh > /tmp/inotify.log 2>&1 < /dev/null &
【问题5】如何查看同步日志
tail -f /tmp/inotify.log
以及服务端日志:
tail -f /var/log/rsyncd.log
================================================================
小提示
================================================================
- 密码都是明文存在 /etc/1.pas 和 /etc/rsyncd.pas 里的,
生产环境建议换成 rsync 的 SSH 认证或更安全的方案。
- 如果备份量很大,可以把 hosts allow 收紧到具体客户端 IP,
例如:hosts allow = 10.10.10.130
- 文档中的 IP、用户名、密码、/hu 目录,请按你的实际环境替换。
================================================================
部署完成,祝你顺利!如有问题,对照"常见问题排查"逐步检查。
================================================================
测试两台虚拟机
客户端创建文件

服务端测试 看是否存在文件
