当前位置: 首页 > java >正文

29.Linux rsync+inotify解决同步数据实时性

Linux : rsync+inotify解决同步数据实时性

Rsync 核心概念与配置指南

Rsync 简介

Rsync 是 Linux 系统下的数据镜像备份工具,支持远程同步、本地复制,并可与 SSH 或其它 Rsync 主机同步。它是一个快速增量备份工具,广泛应用于数据同步和备份场景。

核心特性
  1. 完整镜像:支持镜像保存整个目录树和文件系统
  2. 属性保持:保持原有文件的权限、时间、软硬链接等属性
  3. 安装简便:无需特殊权限即可安装使用
  4. 高效传输
    • 首次同步全量复制,后续只传输修改过的文件
    • 支持传输过程中的压缩和解压缩,节省带宽
  5. 安全可靠:支持通过 SCP、SSH 或直接 socket 连接传输
  6. 匿名传输:支持匿名传输,便于网站镜像
认证协议

Rsync 支持两种认证协议:

  1. SSH 协议:无需启动 Rsync 守护进程,只需远程主机的用户名和密码
  2. 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 同步
实时同步配置要点

目标服务器配置

  1. 安装 Rsync 服务端软件
  2. 配置 /etc/rsyncd.conf:定义日志文件、PID文件、认证文件、同步模块等
  3. 创建认证文件并设置权限(600)
  4. 启动 Rsync 服务并设置开机自启

源服务器配置

  1. 安装 Rsync 和 Inotify-tools
  2. 创建认证密码文件并设置权限
  3. 编写监控脚本,主要功能:
    • 使用 inotifywait 监控指定目录的文件变化
    • 检测到修改、删除、创建、属性变更时触发 Rsync 同步
    • 记录同步日志到指定文件
  4. 使用 nohup 后台运行脚本并设置开机启动
应用场景
  • 网站内容实时同步
  • 重要数据实时备份
  • 多服务器间数据一致性维护
  • 大规模文件系统的增量备份
优势总结
  1. 实时性:文件变化立即触发同步,保证数据最新
  2. 高效性:只同步变化文件,节省带宽和时间
  3. 可靠性:保持文件属性和权限不变
  4. 自动化:全程无需人工干预,降低维护成本
  5. 灵活性:支持多种同步模式和认证方式
首先需要配置时钟同步,将源服务器作为时钟服务器

源服务器

[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/模块参数核心参数:指定服务端用于接收同步数据的实际目录路径。
commentsync etc from client模块参数模块的注释描述,方便管理员理解该模块的用途。
uidroot模块参数设置 Rsync 守护进程在接收文件时使用的用户身份。
gidroot模块参数设置 Rsync 守护进程在接收文件时使用的用户组身份。
port873模块参数指定 Rsync 守护进程监听的端口号(默认是 873)。
ignore errors(无值)模块参数设置是否忽略 I/O 错误。启用后,在传输过程中遇到的错误将被忽略。
use chrootno模块参数出于安全考虑,是否在传输前将客户端 chroot 到模块路径。设为 no 可支持备份软链接。
read onlyno模块参数定义模块是否为只读。no 表示允许客户端上传(推送)数据到服务端。
listno模块参数设置是否在客户端请求时列出该模块。no 表示隐藏模块,增强安全性。
max connections200模块参数设置该模块允许的最大同时连接数,用于控制负载。
timeout600模块参数设置空闲连接超时时间(秒),超过该时间无活动则断开连接。
auth usersadmin模块参数指定允许访问该模块的用户名(在 secrets file 中定义),多个用户用逗号分隔。
hosts allow192.168.100.10模块参数设置允许连接该模块的客户端 IP 地址或网段,多个用逗号分隔。优先级高于 hosts deny
hosts deny192.168.1.1模块参数设置禁止连接该模块的客户端 IP 地址或网段,多个用逗号分隔。

脚本变量定义部分

变量名 (Variable)示例值 (Example Value)说明 (Description)
host192.168.100.30目标服务器IP地址。这是备份服务器或接收数据服务器的地址。
src/test2源目录。在源服务器上需要被监控并进行实时同步的目录路径。必须确保此目录存在。
desetc_from_clientRsync 模块名。必须与目标服务器上 rsyncd.conf 配置文件中定义的模块名称完全一致。
password/etc/rsync.pass密码文件路径。该文件包含进行 Rsync 认证所需的密码。文件权限通常应设置为 600
useradmin认证用户名。必须与目标服务器 rsyncd.confauth users 参数指定的用户名以及密码文件中的用户名一致。
inotifywait/usr/bin/inotifywaitinotifywait 命令的完整路径。指定 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 守护进程模式的标准连接格式。
http://www.xdnf.cn/news/18314.html

相关文章:

  • 3D检测笔记:相机模型与坐标变换
  • 详解 scikit-learn 数据预处理工具:从理论到实践
  • CS+ for CC编译超慢的问题该如何解决
  • Day23 双向链表
  • 计算机网络--HTTP协议
  • 亚马逊新品爆单策略:从传统困境到智能突破
  • 【Grafana】grafana-image-renderer配合python脚本实现仪表盘导出pdf
  • 给你的Unity编辑器添加实现类似 Odin 的 条件显示字段 (ShowIf/HideIf) 功能
  • word——如何给封面、目录、摘要、正文设置不同的页码
  • 路由器NAT的类型测定
  • vue:vue中的ref和reactive
  • 【LLMs篇】18:基于EasyR1的Qwen2.5-VL GRPO训练
  • 层在init中只为创建线性层,forward的对线性层中间加非线性运算。且分层定义是为了把原本一长个代码的初始化和运算放到一个组合中。
  • 机械革命电竞控制台一直加载无法点击故障
  • MySQL事务及原理详解
  • 牛津大学xDeepMind 自然语言处理(3)
  • 工业电脑选得好生产效率节节高稳定可靠之选
  • C/C++ 与嵌入式岗位常见笔试题详解
  • Mac电脑上虚拟机共享文件夹权限问题
  • vscode连接docker
  • WIFI国家码修改信道方法_高通平台
  • 精品方案 | GCKontrol与OMNeT++联合仿真在机载网络性能分析中的应用
  • mvdr波束形成
  • Linux系统之部署nullboard任务管理工具
  • ios八股文 -- Objective-c
  • iOS 应用上架常见问题与解决方案,多工具组合的实战经验
  • Node.js中的Prisma应用:现代数据库开发的最佳实践
  • 单片机通信协议核心关系梳理笔记(UART/USART/232/485/SPI/12C/LIN/BLE/WIFI)
  • leetcode7二分查找_69 and 34
  • 链表的核心:“增删改查”