Linux 通过Rsync+Inotify实现本、异地远程数据实时同步功能
一、方案概述
在Linux环境下的数据备份场景中,传统的定时rsync同步方式存在同步延迟高、无法实时感知文件变化的问题。结合Rsync高效的数据传输能力和Inotify内核级别的文件系统事件监控能力,可以实现本地或异地服务器的数据实时同步,适用于网站文件备份、分布式系统文件一致性维护等场景。
二、核心组件介绍
1. Rsync
Rsync是一款快速、通用的文件同步工具,支持本地复制和远程同步,采用增量传输算法,仅传输文件中变化的部分,大幅降低网络带宽消耗。它可以通过ssh协议或自带的rsyncd守护进程进行数据传输,适合大文件、多文件的同步场景。
2. Inotify
Inotify是Linux内核2.6.13及以上版本提供的文件系统事件监控机制,能够实时监控文件或目录的创建、删除、修改、移动等操作,并触发对应的用户态程序响应,是实现实时同步的核心监控组件。
三、环境准备
以下为本次示例的环境配置,可根据实际需求调整:
源服务器(需要同步数据的服务器):IP为192.168.0.100,系统为CentOS 7
目标服务器(接收同步数据的服务器):IP为192.168.0.101,系统为CentOS 7
需要同步的源目录:/data/source/
目标服务器存放同步数据的目录:/data/backup/
两台服务器都需要确保内核支持Inotify,可通过以下命令验证:
ll /proc/sys/fs/inotify/
如果输出包含max_queued_events、max_user_instances、max_user_watches三个文件,说明内核已支持Inotify。
四、Rsync配置(目标服务器)
1. 安装Rsync
在目标服务器执行以下命令安装Rsync:
yum install -y rsync
2. 配置Rsync守护进程
编辑Rsync配置文件/etc/rsyncd.conf,添加以下内容:
uid = root gid = root use chroot = no max connections = 10 strict modes = yes pid file = /var/run/rsyncd.pid lock file = /var/run/rsync.lock log file = /var/log/rsyncd.log [backup] path = /data/backup/ comment = Backup Directory ignore errors read only = no write only = no hosts allow = 192.168.0.100 hosts deny = * list = false auth users = rsync_user secrets file = /etc/rsync.pass
3. 配置认证密码
创建密码文件/etc/rsync.pass,添加用户名和密码,格式为用户名:密码:
echo "rsync_user:123456" > /etc/rsync.pass chmod 600 /etc/rsync.pass
4. 启动Rsync服务
systemctl start rsyncd systemctl enable rsyncd
五、源服务器配置
1. 安装Rsync和Inotify-tools
源服务器需要安装Rsync用于数据传输,安装Inotify-tools用于调用内核Inotify接口:
yum install -y rsync inotify-tools
2. 配置Rsync认证密码
创建密码文件,仅存储目标服务器配置的密码,无需用户名:
echo "123456" > /etc/rsync.pass chmod 600 /etc/rsync.pass
3. 编写实时同步脚本
创建同步脚本/usr/local/bin/inotify_rsync.sh,内容如下:
#!/bin/bash # 源目录 SRC_DIR="/data/source/" # 目标服务器Rsync模块信息 DEST_RSYNC="rsync_user@192.168.0.101::backup" # Rsync密码文件 RSYNC_PASS="/etc/rsync.pass" # Inotify监控事件类型 INOTIFY_EVENTS="create,delete,move,modify,attrib" # 配置rsync密码文件环境变量 export RSYNC_PASSWORD=$(cat $RSYNC_PASS) # 启动inotify监控,触发rsync同步 inotifywait -mrq --timefmt '%d/%m/%y %H:%M' --format '%T %w%f' -e $INOTIFY_EVENTS $SRC_DIR | while read DATE TIME FILE do rsync -avz --delete --progress $SRC_DIR $DEST_RSYNC --password-file=$RSYNC_PASS > /dev/null 2>&1 done
给脚本添加执行权限:
chmod +x /usr/local/bin/inotify_rsync.sh
4. 后台运行同步脚本
nohup /usr/local/bin/inotify_rsync.sh > /var/log/inotify_rsync.log 2>&1 &
可将启动命令添加到/etc/rc.d/rc.local实现开机自启。
六、功能验证
1. 本地文件变化验证
在源服务器的/data/source/目录下创建测试文件:
touch /data/source/test.txt echo "hello rsync inotify" > /data/source/test.txt
在目标服务器的/data/backup/目录下查看,可发现test.txt文件已同步,且内容一致。
2. 删除文件验证
在源服务器删除测试文件:
rm -f /data/source/test.txt
目标服务器对应文件也会被同步删除,说明--delete参数生效。
七、注意事项
如果同步目录包含大量文件,需要调整Inotify的内核参数,避免监控队列溢出,可修改/etc/sysctl.conf添加:
fs.inotify.max_queued_events = 16384 fs.inotify.max_user_instances = 1024 fs.inotify.max_user_watches = 1048576
执行sysctl -p生效配置。
Rsync同步时如果使用ssh协议,无需配置rsyncd守护进程,但每次同步需要输入ssh密码,可通过ssh免密登录优化。
生产环境中建议给同步脚本增加异常重启机制,避免进程意外退出导致同步中断。