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

Linux: rsync+inotify实时同步及rsync+sersync实时同步

rsync + sersync 和 rsync + inotify 是两种常用的实时文件同步方案,用于监控源目录变化并自动同步到目标位置。以下是对两者的详细对比和配置指南:

核心区别

方案原理优点缺点
rsync + inotify使用 Linux 内核的 inotify 监控文件变化,触发 rsync 同步原生支持,无需额外依赖需手动编写脚本,稳定性依赖实现
rsync + sersync基于 inotify 和 rsync,封装为独立工具,提供更完善的错误处理和配置配置简单,稳定性高需要额外安装第三方工具

一、rsync + inotify 方案

rsync介绍

  • rsync的好姐妹

    • sync 同步:刷新文件系统缓存,强制将修改过的数据块写入磁盘,并且更新超级块。

    • async 异步:将数据先放到缓冲区,再周期性(一般是30s)的去同步到磁盘。

    • rsync 远程同步:remote synchronous

  • rsync的特点

    • 可以镜像保存整个目录树和文件系统

    • 可以保留原有的权限(permission,mode),owner,group,时间(修改时间,modify time),软硬链接,文件acl,文件属性(attributes)信息等

    • 传输==效率高==,使用同步算法,只比较变化的(增量备份)

      file1.txt file2.txt file3.txt(A服务器)

      rsync实现数据同步 => 只同步file3.txt => 增量备份

      file1.txt file2.txt(B服务器)

    • 支持匿名传输,方便网站镜像;也可以做验证,加强安全

rsync的语法

  • man rsync

NAMErsync — a fast, versatile, remote (and local) file-copying tool//一种快速、通用、远程(和本地)的文件复制工具
​
SYNOPSISLocal:  rsync [OPTION...] SRC... [DEST]
​Access via remote shell://通过远程shell访问(命令)Pull: rsync [OPTION...] [USER@]HOST:SRC... [DEST]Push: rsync [OPTION...] SRC... [USER@]HOST:DEST
​Access via rsync daemon://通过后台程序访问(作为服务)Pull: rsync [OPTION...] [USER@]HOST::SRC... [DEST]rsync [OPTION...] rsync://[USER@]HOST[:PORT]/SRC... [DEST]Push: rsync [OPTION...] SRC... [USER@]HOST::DESTrsync [OPTION...] SRC... rsync://[USER@]HOST[:PORT]/DEST
  • rsync命令参数

    -v      详细模式输出-a      归档模式,递归的方式传输文件,并保持文件的属性,equals -rlptgoD-r      递归拷贝目录-l      保留软链接-p      保留原有权限-t      保留原有时间(修改)-g      保留属组权限-o      保留属主权限-D      等于--devices  --specials    表示支持b,c,s,p类型的文件-R      保留相对路径-H      保留硬链接-A      保留ACL策略-e      指定要执行的远程shell命令-E      保留可执行权限-X      保留扩展属性信息  a属性

inotify 介绍 

 inotify 是 Linux 内核提供的一种强大的文件系统监控机制,允许应用程序监听文件或目录的各种变化事件(如创建、修改、删除等)。它是实现实时文件同步、日志监控、自动备份等功能的基础。

  1. 工作原理

    • 内核维护一个事件队列,应用程序通过 inotify 接口读取队列中的事件。
    • 应用程序可以对特定文件或目录添加 “监控手表”(watch descriptor),并指定监听的事件类型。
# inotifywait --help
-m 保持监控状态
-r 递归监控
-q 只打印事件
-e 指定事件事件:
move	移动
delete	删除
create	创建
modify	修改
attrib	属性信息

server服务器上的~/app/目录的文件和backup主机上的~/backup目录实时同步

环境:

server 10.1.1.1 #替换为自己虚拟机实际ip地址
backup 10.1.1.250 #替换为自己虚拟机实际ip地址

分析:
rsync本身不可以做到数据的实时同步,需要借助第三方工具,intotify工具。实现线上环境目录发生改变立马同步到backup主机,是单向同步。

当然也可以制定crontab定时任务配置,每分钟执行一次shell脚本,shell脚本里面编写通过rsync远程同步命令

配置步骤

  1. 安装依赖

    # Ubuntu/Debian
    sudo apt install inotify-tools rsync# CentOS/RHEL
    sudo yum install inotify-tools rsync

 安装完后,就会产生下面两个命令

/usr/local/bin/inotifywait      等待
/usr/local/bin/inotifywatch     看守

      2. 编写脚本来同步

vim ~/1.sh#!/bin/bash
/usr/local/bin/inotifywait -mrq -e modify,delete,create,attrib,move ~/app/ |while read eventsdorsync -a --delete ~/app/ backup主机ip:~/backupecho "`date +%F\ %T`出现事件$events" >> /var/log/rsync.log 2>&1donechmod +x 1.sh    # 添加可执行权限
./1.sh  &    # 在后台运行

--delete 参数:如果目标目录里的数据比源目标多,那么需要删除无用的相关的数据

     3. 测试验证
server上操作目录:

mkdir ~/app/bbb{1..3}
rm -f ~/app/file{1..3}

backup上检查目录:

ll ~/backup/

server上查看日志记录 

tail -f /var/log/rsync.log
2018-08-29 11:13:35出现事件/app/java_project/ CREATE,ISDIR bbb1
2018-08-29 11:13:35出现事件/app/java_project/ CREATE,ISDIR bbb2
2018-08-29 11:13:35出现事件/app/java_project/ CREATE,ISDIR bbb3
2018-08-29 11:14:15出现事件/app/java_project/ DELETE file1
2018-08-29 11:14:15出现事件/app/java_project/ DELETE file2
2018-08-29 11:14:15出现事件/app/java_project/ DELETE file3

rsync + sersync 实时同步

一、环境准备

服务器角色

  • 源服务器(Master):产生数据变化的服务器
  • 目标服务器(Slave):接收同步数据的服务器

软件依赖

  • 两台服务器均需安装:rsync
  • 仅源服务器需安装:sersync

二、安装步骤

1. 安装 rsync(所有服务器)
# Ubuntu/Debian
sudo apt install rsync# CentOS/RHEL
sudo yum install rsync
2. 配置 SSH 免密登录(源→目标)

在源服务器执行:

# 生成密钥对
ssh-keygen -t rsa -b 4096# 将公钥复制到目标服务器
ssh-copy-id root@目标服务器IP

验证免密登录:

ssh root@目标服务器IP  # 应无需输入密码
3. 安装 sersync(仅源服务器)
# 下载并解压(以 2.5.4 版本为例)
wget https://github.com/wsgzao/sersync/archive/refs/tags/2.5.4.tar.gz
tar -zxvf 2.5.4.tar.gz
cd sersync-2.5.4/
cp -r bin /usr/local/sersync# 添加执行权限
chmod +x /usr/local/sersync/sersync2

三、配置 sersync

1. 创建配置文件
nano /usr/local/sersync/confxml.xml

配置示例(同步 /data/www 到目标服务器的 /backup/www):

<sersync><localpath watch="/data/www">  <!-- 源目录 --><remote ip="目标服务器IP" name="www"/>  <!-- 目标服务器和模块名 --></localpath><rsync><commonParams params="-artuz"/>  <!-- rsync 参数:归档、递归、压缩、更新 --><auth start="false" users="root" passwordfile="/etc/rsync.passwd"/>  <!-- 认证(SSH模式无需) --><userDefinedPort start="false" port="874"/>  <!-- 自定义端口(SSH模式无需) --><timeout start="false" time="100"/>  <!-- 超时设置 --><ssh start="true"/>  <!-- 启用 SSH 模式 --></rsync><failLog path="/var/log/rsync_fail.log" timeToExecute="60"/>  <!-- 失败日志和重试时间 --><crontab start="false" schedule="600">  <!-- 定时全量同步(可选) --><crontabfilter start="false"/></crontab><plugin start="false" name="command"/>
</sersync>

四、启动服务

1. 首次全量同步
/usr/local/sersync/sersync2 -d -r -o /usr/local/sersync/confxml.xml

参数说明:

  • -d:后台运行
  • -r:启动时先执行一次全量同步
  • -o:指定配置文件路径
2. 验证同步

在源服务器创建测试文件:

touch /data/www/test.txt

检查目标服务器是否存在相同文件:

ls /backup/www/

五、管理命令

# 启动服务
/usr/local/sersync/sersync2 -d -o /usr/local/sersync/confxml.xml# 停止服务
pkill sersync2# 查看日志
tail -f /var/log/rsync_fail.log

六、常见配置优化

1. 排除特定文件 / 目录

在 <localpath> 节点下添加 <exclude>

<localpath watch="/data/www"><remote ip="目标服务器IP" name="www"/><exclude expression="\.log$"/>  <!-- 排除 .log 结尾的文件 --><exclude expression="^temp/"/>  <!-- 排除 temp 目录 -->
</localpath>
2. 增加日志详细度

修改 <failLog> 节点:

<failLog path="/var/log/rsync_fail.log" timeToExecute="60"/>
3. 启用定时全量同步

修改 <crontab> 节点(每 600 秒执行一次全量同步):

<crontab start="true" schedule="600"><crontabfilter start="false"/>
</crontab>

七、故障排查

  1. 检查服务状态

    ps -ef | grep sersync
    
  2. 查看同步日志

    tail -f /var/log/rsync_fail.log
    
  3. 手动执行 rsync 测试

    rsync -avz /data/www/ root@目标服务器IP:/backup/www/
http://www.xdnf.cn/news/15832.html

相关文章:

  • Claude Code 逆向工程分析,探索最新Agent设计
  • 【机器学习深度学习】量化与选择小模型的区别:如何理解两者的优势与局限?
  • Day1||Vue指令学习
  • PyTorch的基础概念和复杂模型的基本使用
  • Facebook 开源多季节性时间序列数据预测工具:Prophet 快速入门 Quick Start
  • macOs上交叉编译ffmpeg及安装ffmpeg工具
  • 测试中的bug
  • 基于深度学习的自然语言处理:构建情感分析模型
  • urllib.parse.urlencode 的使用详解
  • AI+预测3D新模型百十个定位预测+胆码预测+去和尾2025年7月20日第144弹
  • Uniapp 纯前端台球计分器开发指南:能否上架微信小程序 打包成APP?
  • 安全信息与事件管理(SIEM)系统架构设计
  • 【前端】懒加载(组件/路由/图片等)+预加载 汇总
  • AI绘画生成东汉末年赵云全身像的精细提示词
  • 四、多频技术与复杂场景处理
  • 基于卷积傅里叶分析网络 (CFAN)的心电图分类的统一时频方法
  • SpringBoot3集成MapstructPlus
  • GaussDB select into和insert into的用法
  • 基于智慧经营系统的学校住宿登记报表分析与应用探究-毕业论文—仙盟创梦IDE
  • Qt--Widget类对象的构造函数分析
  • 上电复位断言的自动化
  • 网络安全初级(前端页面的编写分析)
  • Java 递归方法详解:从基础语法到实战应用,彻底掌握递归编程思想
  • C++STL系列之list
  • Spring Boot 第一天知识汇总
  • UE5多人MOBA+GAS 26、为角色添加每秒回血回蓝(番外:添加到UI上)
  • redis-plus-plus安装与使用
  • 【vue-7】Vue3 响应式数据声明:深入理解 reactive()
  • 敏捷开发的历史演进:从先驱实践到全域敏捷(1950s-2025)
  • ubuntu 24.04 xfce4 钉钉输入抢焦点问题