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

发布于:2025-07-21 ⋅ 阅读:(16) ⋅ 点赞:(0)

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

NAME
       rsync — a fast, versatile, remote (and local) file-copying tool
       //一种快速、通用、远程(和本地)的文件复制工具
​
SYNOPSIS
       Local:  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::DEST
               rsync [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 events
        do
                rsync -a --delete ~/app/ backup主机ip:~/backup
                echo "`date +%F\ %T`出现事件$events" >> /var/log/rsync.log 2>&1
        done

chmod +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/

网站公告

今日签到

点亮在社区的每一天
去签到