29.Linux rsync+inotify解决同步数据实时性
Linux : rsync+inotify解决同步数据实时性
Rsync 核心概念与配置指南
Rsync 简介
Rsync 是 Linux 系统下的数据镜像备份工具,支持远程同步、本地复制,并可与 SSH 或其它 Rsync 主机同步。它是一个快速增量备份工具,广泛应用于数据同步和备份场景。
核心特性
- 完整镜像:支持镜像保存整个目录树和文件系统
- 属性保持:保持原有文件的权限、时间、软硬链接等属性
- 安装简便:无需特殊权限即可安装使用
- 高效传输:
- 首次同步全量复制,后续只传输修改过的文件
- 支持传输过程中的压缩和解压缩,节省带宽
- 安全可靠:支持通过 SCP、SSH 或直接 socket 连接传输
- 匿名传输:支持匿名传输,便于网站镜像
认证协议
Rsync 支持两种认证协议:
- SSH 协议:无需启动 Rsync 守护进程,只需远程主机的用户名和密码
- Rsync 协议:需要启动 Rsync 守护进程
SSH 认证协议与 SCP 原理相同,若需免密同步可使用 ssh-keygen
建立安全通道。
工作模式
模式 | 命令格式 | 描述 | 应用场景 |
---|---|---|---|
1. 本地同步 | rsync [OPTION]... SRC DEST | 在同一台机器上同步文件和目录。 | 本地备份、拷贝大量文件(比 cp 更高效)。 |
2. 推送到远程 | rsync [OPTION]... SRC [USER@]HOST:DEST | 将本地文件推送到远程服务器。 | 上传网站代码、备份数据到远程备份服务器。 |
3. 拉取到本地 | rsync [OPTION]... [USER@]HOST:SRC DEST | 将远程服务器的文件拉取到本地。 | 下载服务器日志、从备份服务器恢复文件。 |
本地同步
[root@xieyuhui2 test1]# rsync -avz /test1/ /test2/
远程传输
[root@xieyuhui2 test1]# rsync -avz /test1/ root@192.168.100.30:/test3/
本地获取
[root@xieyuhui2 ~]# rsync -avz root@192.168.100.30:/test3/ /test1/
选项 (短格式) | 选项 (长格式) | 功能描述 | 示例与说明 |
---|---|---|---|
-a | –archive | 归档模式。这是最常用的选项,相当于 r和p的组合。保留符号链接、权限、属主、组、时间戳等。 | rsync -a source/ dest/ 用于完整的目录镜像备份。 |
-v | –verbose | 详细模式。输出同步过程的详细信息。 | rsync -av source/ dest/ 可以叠加使用 -vv 或 -vvv 来获得更详细的输出。 |
-z | –compress | 压缩传输。在传输过程中对数据进行压缩,以节省带宽。 | rsync -az source/ user@remote:dest/ 在远程同步时特别有用。 |
-r | –recursive | 递归同步。同步目录时,会同步其下的所有子目录和文件。 | rsync -r source_dir/ dest_dir/ 注意:-a 选项已包含此功能,所以 -a 和 -r 通常不同时使用。 |
-h | –human-readable | 人性化显示。以易读的格式(如K, M, G)输出数字信息。 | rsync -ahv source/ dest/ 在查看传输进度和大小时非常方便。 |
–progress | –progress | 显示传输进度。显示每个文件的传输进度百分比和总体传输情况。 | rsync -av --progress source/ dest/ 对于大文件同步,可以直观地看到进度。 |
-P | (无等价长格式) | 等价于 --partial --progress。保留部分传输的文件并显示进度。 | rsync -aP source/ dest/ 断点续传非常有用,如果传输中断,下次会用 -P 从中断处继续。 |
–delete | –delete | 删除目标端多余的文件。使目标成为源的精确镜像 | rsync -a --delete source/ dest/ 这会删除目标目录中存在而源目录中不存在的文件。 |
Rsync + Inotify 实时同步
传统 Rsync 的局限性:
- 需要扫描所有文件进行比对,文件量大会非常耗时
- 无法实时监测和同步数据,可能导致数据不一致
解决方案:
- Inotify 是 Linux 内核提供的文件系统事件监控机制(2.6.13+内核支持)
- Inotify-tools 是利用此机制的第三方监控软件
- 两工具结合可实现文件系统变化时实时触发 Rsync 同步
实时同步配置要点
目标服务器配置:
- 安装 Rsync 服务端软件
- 配置
/etc/rsyncd.conf
:定义日志文件、PID文件、认证文件、同步模块等 - 创建认证文件并设置权限(600)
- 启动 Rsync 服务并设置开机自启
源服务器配置:
- 安装 Rsync 和 Inotify-tools
- 创建认证密码文件并设置权限
- 编写监控脚本,主要功能:
- 使用
inotifywait
监控指定目录的文件变化 - 检测到修改、删除、创建、属性变更时触发 Rsync 同步
- 记录同步日志到指定文件
- 使用
- 使用 nohup 后台运行脚本并设置开机启动
应用场景
- 网站内容实时同步
- 重要数据实时备份
- 多服务器间数据一致性维护
- 大规模文件系统的增量备份
优势总结
- 实时性:文件变化立即触发同步,保证数据最新
- 高效性:只同步变化文件,节省带宽和时间
- 可靠性:保持文件属性和权限不变
- 自动化:全程无需人工干预,降低维护成本
- 灵活性:支持多种同步模式和认证方式
首先需要配置时钟同步,将源服务器作为时钟服务器
源服务器
[root@xieyuhui2 ~]# vim /etc/chrony.conflocal stratum 10 #取消注释
修改后重启服务
[root@xieyuhui2 ~]# systemctl restart chronyd
[root@xieyuhui2 ~]# systemctl enable chronyd
[root@xieyuhui2 ~]# hwclock -w
源服务器关闭防火墙和selinux
目标服务器
[root@xieyuhui3 ~]# vim /etc/chrony.conf
重启服务
[root@xieyuhui3 ~]# systemctl restart chronyd
[root@xieyuhui3 ~]# systemctl enable chronyd
[root@xieyuhui3 ~]# hwclock -w
查看同步时钟服务器是否成功
目标服务器关闭防护墙和selinux
编辑目标服务器的rsyncd.conf配置文件
[root@xieyuhui3 ~]# vim /etc/rsyncd.conf
创建用户认证文件
[root@xieyuhui3 ~]# vim /etc/rsync.passadmin:redhat
设置文件权限,只有所有者有权限操作
[root@xieyuhui3 ~]# chmod 600 /etc/rsync*
启动rsync服务并设置开机自启
[root@xieyuhui3 ~]# rsync --daemon
[root@xieyuhui3 ~]# vim /etc/rc.d/rc.localrsync --daemon --config=/etc/rsyncd.conf
查看服务是否开启
[root@xieyuhui3 ~]# netstat -tulnp | grep 873
源服务器
开始前配置网络yum源(wget -O /etc/yum.repos.d/CentOS-Base.repo https://mirrors.aliyun.com/repo/Centos-7.repo)
[root@xieyuhui2 ~]# yum install epel-release -y
由于server自带因此不需要安装rsync服务,如果没有则需要安装
创建认证密码的文件
[root@xieyuhui2 ~]# vim /etc/rsync.pass
redhat
设置文件权限,只有所有者有权限
[root@xieyuhui2 ~]# chmod 600 /etc/rsync.pass
在源服务器上测试
[root@xieyuhui2 ~]# rsync -avH --port 873 --progress --delete /test2/ admin@192.168.100.30::etc_from_client --password-file=/etc/rsync.pass
在目标服务器上查看是否同步成功
[root@xieyuhui3 ~]# cd /test1
[root@xieyuhui3 test1]# ls
file1
安装inotify工具
[root@xieyuhui2 ~]# yum install make gcc gcc-c++ inotify-tools -y
写同步脚本(最重要的一步)
先创建一个目录
[root@xieyuhui2 ~]# mkdir /xieyu
[root@xieyuhui2 ~]# cd /xieyu
[root@xieyuhui2 xieyu]# touch inotify.sh
[root@xieyuhui2 xieyu]# chmod +x /xieyu/inotify.s
编辑脚本文件
[root@xieyuhui2 xieyu]# vim inotify.sh
运行脚本
[root@xieyuhui2 ~]# nohup bash /xieyu/inotify.sh &
查看进程
[root@xieyuhui2 test2]# ps -ef | grep inotify
在源服务器上创建文件测试
[root@xieyuhui2 test2]# touch file2 file3
源服务器创建文件后将文件同步到目标服务器上
设置脚本开机自动启动
[root@xieyuhui2 ~]# chmod +x /etc/rc.d/rc.local
[root@xieyuhui2 ~]# vim /etc/rc.d/rc.localnohup /bin/bash /xieyu/inotify.sh &
补充:
Rsync 服务端配置参数详解
配置参数 | 示例值 | 分类 | 说明 |
---|---|---|---|
log file | /var/log/rsyncd.log | 全局参数 | 指定 Rsync 守护进程的日志文件路径。服务启动后会自动创建该文件。 |
pidfile | /var/run/rsyncd.pid | 全局参数 | 指定存储 Rsync 守护进程 PID 的文件路径。用于管理服务进程。 |
lock file | /var/run/rsync.lock | 全局参数 | 指定锁文件路径。用于控制并发连接,支持 max connections 参数。 |
secrets file | /etc/rsync.pass | 全局参数 | 重要:指定用户认证文件路径。该文件需手动创建,格式为 用户名:密码 。 |
模块名称 | [etc_from_client] | 模块参数 | 定义一个同步模块的名称,客户端通过此名称访问该模块。 |
path | /tmp/ | 模块参数 | 核心参数:指定服务端用于接收同步数据的实际目录路径。 |
comment | sync etc from client | 模块参数 | 模块的注释描述,方便管理员理解该模块的用途。 |
uid | root | 模块参数 | 设置 Rsync 守护进程在接收文件时使用的用户身份。 |
gid | root | 模块参数 | 设置 Rsync 守护进程在接收文件时使用的用户组身份。 |
port | 873 | 模块参数 | 指定 Rsync 守护进程监听的端口号(默认是 873)。 |
ignore errors | (无值) | 模块参数 | 设置是否忽略 I/O 错误。启用后,在传输过程中遇到的错误将被忽略。 |
use chroot | no | 模块参数 | 出于安全考虑,是否在传输前将客户端 chroot 到模块路径。设为 no 可支持备份软链接。 |
read only | no | 模块参数 | 定义模块是否为只读。no 表示允许客户端上传(推送)数据到服务端。 |
list | no | 模块参数 | 设置是否在客户端请求时列出该模块。no 表示隐藏模块,增强安全性。 |
max connections | 200 | 模块参数 | 设置该模块允许的最大同时连接数,用于控制负载。 |
timeout | 600 | 模块参数 | 设置空闲连接超时时间(秒),超过该时间无活动则断开连接。 |
auth users | admin | 模块参数 | 指定允许访问该模块的用户名(在 secrets file 中定义),多个用户用逗号分隔。 |
hosts allow | 192.168.100.10 | 模块参数 | 设置允许连接该模块的客户端 IP 地址或网段,多个用逗号分隔。优先级高于 hosts deny 。 |
hosts deny | 192.168.1.1 | 模块参数 | 设置禁止连接该模块的客户端 IP 地址或网段,多个用逗号分隔。 |
脚本变量定义部分
变量名 (Variable) | 示例值 (Example Value) | 说明 (Description) |
---|---|---|
host | 192.168.100.30 | 目标服务器IP地址。这是备份服务器或接收数据服务器的地址。 |
src | /test2 | 源目录。在源服务器上需要被监控并进行实时同步的目录路径。必须确保此目录存在。 |
des | etc_from_client | Rsync 模块名。必须与目标服务器上 rsyncd.conf 配置文件中定义的模块名称完全一致。 |
password | /etc/rsync.pass | 密码文件路径。该文件包含进行 Rsync 认证所需的密码。文件权限通常应设置为 600 。 |
user | admin | 认证用户名。必须与目标服务器 rsyncd.conf 中 auth users 参数指定的用户名以及密码文件中的用户名一致。 |
inotifywait | /usr/bin/inotifywait | inotifywait 命令的完整路径。指定 inotifywait 工具的位置,确保脚本能找到该命令。 |
inotifywait
命令参数详解
该命令负责监控文件系统的变化。
选项/参数 | 说明 |
---|---|
-m | --monitor 。持续监控。发现一个事件后不退出,而是继续监控。这是实现实时性的关键。 |
-r | --recursive 。递归监控。监控指定目录下的所有子目录。 |
-q | --quiet 。安静模式。减少不必要的输出,只输出关键信息。 |
–timefmt ‘%Y%m%d %H:%M’ | 指定时间格式。输出时间时,将按照 年 月日 时 :分 的格式显示。 |
–format ‘%T %w%f%e’ | 指定输出格式。%T 输出时间;%w 输出路径;%f 输出文件名;%e 输出事件类型。格式化为 时间 路径/文件 事件 。 |
-e modify,delete,create,attrib | -e 指定要监控的事件。这里监控: • modify: 文件内容被修改。 • delete: 文件被删除。 • create: 文件被创建。 • attrib: 文件属性(如权限)被更改。 |
$src | 要监控的源目录路径 |
循环与 rsync
命令部分
inotifywait
监控到事件后,会将信息通过管道 |
传递给 while read
循环进行处理。
组件 | 说明 |
---|---|
while read files; do … done | 循环。持续读取 inotifywait 输出的每一行信息,并将其赋值给变量 $files 。 |
rsync -avzP --delete --timeout=100 | 同步命令。当有任何文件事件发生时,触发此命令进行同步: • -a: 归档模式,保持所有文件属性。 • -v: 详细输出。 • -z: 压缩传输。 • -P: 显示进度并保持部分传输的文件(支持断点续传)。 • –delete: 镜像同步。删除目标端有而源端没有的文件,确保两端完全一致。使用时需谨慎! • –timeout=100: 设置 I/O 超时时间为 100 秒,防止网络不佳时命令无限挂起。 |
–password-file=${password} | 从指定的密码文件(/etc/rsync.pass )中读取密码,用于非交互式认证,实现自动化。 |
user@user@user@host::$dest | 同步目标地址。格式为 用户名@目标服务器IP::模块名 。这是使用 Rsync 守护进程模式的标准连接格式。 |