rsync + inotify 实时同步部署操作文档(新手版)

------ 客户端目录文件变化,实时备份到服务端

================================================================

================================================================

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 登录服务端,或直接在服务端本机终端操作。

例如从其他机器登录:

ssh root@10.10.10.129

【步骤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】登录客户端

ssh root@10.10.10.130

【步骤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

================================================================

小提示

================================================================

  1. 密码都是明文存在 /etc/1.pas 和 /etc/rsyncd.pas 里的,

生产环境建议换成 rsync 的 SSH 认证或更安全的方案。

  1. 如果备份量很大,可以把 hosts allow 收紧到具体客户端 IP,

例如:hosts allow = 10.10.10.130

  1. 文档中的 IP、用户名、密码、/hu 目录,请按你的实际环境替换。

================================================================

部署完成,祝你顺利!如有问题,对照"常见问题排查"逐步检查。

================================================================

测试两台虚拟机

客户端创建文件

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

相关推荐
hey you~13 天前
云客服会话数据实时同步,数据库架构怎么设计?
消息队列·数据库架构·高可用·实时同步·最终一致性·云客服·会话数据
xhbh66614 天前
服务器数据备份方法梳理,本地与异地备份实操思路
数据备份·文件备份·系统备份·同步备份·80km备份
爱网络爱Linux15 天前
【系列】每天一个 Linux 命令(53)startx 命令
linux·rhce·rhca·linux运维·linux命令大全·红帽认证
xhbh66615 天前
Excel 备份文件路径详解,xlk 备份与自动恢复文件区分
数据备份·文件备份·系统备份·同步备份·80km备份
xhbh66615 天前
Word 备份文件路径详解,区分备份副本与自动恢复文件
数据备份·文件备份·系统备份·同步备份·80km备份
xhbh66617 天前
主流系统备份软件横向评测:从大型集群到终端备份选型
自动化·数据备份·文件备份·系统备份·同步备份·备份软件
xhbh66617 天前
中小企业 Redis 运维,如何安全归档 RDB、AOF 备份文件?
运维·数据库·缓存·数据备份·文件备份·同步备份·号码备份
xhbh66617 天前
终端与服务器数据防护,多备份的存储规划思路
数据备份·文件备份·备份电脑数据·同步备份软件·80km备份
xhbh66618 天前
个人相册轻量化备份方案:自动增量备份落地实操
自动化·数据备份·文件备份·相册照片怎么备份·同步备份·文件夹自动备份