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

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.dtcms.com/a/340252.html

相关文章:

  • 【Tech Arch】Apache HBase分布式 NoSQL 数据库
  • 签名应用APP分发平台的微服务化部署是什么?其有哪些优势?
  • 微服务自动注册到ShenYu网关配置详解
  • mysql数据恢复
  • WT2606B 驱屏语音芯片新增蓝牙功能:功能集成一体化,产品升级自动化,语音交互无线化,场景应用普适化!
  • Java 性能优化实战(二):JVM 调优的 5 个核心维度
  • 2.Shell脚本修炼手册之---创建第一个 Shell 脚本
  • Windows 11 安装 Miniconda + Mamba,配置国内源
  • KV cache
  • java八股文-JVM相关面试题-参考回答
  • 计算机视觉 图片处理 在骨架化过程中,每次迭代都会从图像的边缘移除一层像素,直到只剩下单像素宽度的骨架
  • 机器学习--数据清洗—(续篇)
  • 【论文阅读】Multi-metrics adaptively identifies backdoors in Federated Learning
  • Python文件操作与异常处理详解 :基础方法、注意事项及os模块常用功能
  • day31 SQLITE
  • 百度Q2财报:总营收327亿 AI新业务收入首次超100亿
  • 前端-JavaScript笔记(核心语法)
  • Go语言数据类型全解析
  • 线程安全的产生以及解决方案
  • 记一次pnpm start启动异常
  • 学习设计模式《二十三》——桥接模式
  • 算法实战入门第二篇:链表结构与五大经典应用
  • 如何制作免费的比特币冷钱包
  • C++中的 Eigen库使用
  • 机器学习算法核心总结
  • AI全栈工程师:重塑软件开发全生命周期的未来革命
  • Nginx目录结构与配置文件全解析
  • 3-1〔OSCP ◈ 研记〕❘ WEB应用攻击▸理论概述 OWASP
  • 【LeetCode 热题 100】279. 完全平方数——(解法三)空间优化
  • Windows 中的“计数器”