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

linux服务-rsync+inotify文件同步-rsync

rsync+inotify 实战示例-Rsync

一、工作原理

Rsync 同步的核心优势是 “增量传输” + “差异对比”,而非全量复制;双向同步则是基于 “两端各自监控 + 单向同步” 的组合逻辑,实现数据互相同步。先明确核心原理,再看具体部署,理解更透彻。

1.1、Rsync 核心工作原理

  • 差异对比机制

    • Rsync 同步时不会直接复制所有文件,而是通过 “校验和对比” 识别差异:
      • 源端对文件分块计算 “弱校验和”(如 Adler-32)和 “强校验和”(如 MD5);
      • 将校验和信息发送到目标端;
      • 目标端对本地对应文件同样分块计算校验和,与源端对比;
      • 仅传输 “校验和不匹配的分块”(差异数据),而非整个文件。
  • 增量传输优势

    • 首次同步:无差异,全量传输文件(基础数据);
    • 后续同步:仅传输修改 / 新增 / 删除的部分,网络带宽占用极低(比 SCP 快 3-10 倍);
    • 支持断点续传:传输中断后,重新同步时仅补传未完成的分块。
  • 同步模式分类

    模式传输方向核心逻辑适用场景
    本地同步本地 → 本地直接对比本地文件校验和,复制差异数据本地目录备份
    远程同步(SSH)本地 ↔ 远程通过 SSH 隧道传输校验和和差异数据,无需额外部署 Rsync 服务跨主机少量文件同步、临时同步
    远程同步(Rsync 协议)本地 ↔ 服务端源端(客户端)与目标端(Rsync 服务端)直接通信,支持权限控制、IP 限制生产环境长期同步、大量文件同步

1.2、双向同步

  • 同步原理

    Rsync 本身仅支持 单向同步,双向同步是通过 “两端各自部署监控 + 单向同步脚本” 实现的闭环:

    • 主机 A 部署脚本:监控本地目录变化,将差异同步到主机 B;
    • 主机 B 部署脚本:监控本地目录变化,将差异同步到主机 A;
    • 核心保障:通过 --delete 参数确保 “两端文件完全一致”,通过过滤规则(如排除临时文件)避免同步冲突。
  • 双向同步无冲突条件

    • 同一时间仅一端修改同一文件(日常场景满足);
    • 过滤临时文件(如 vi 临时文件、日志缓存文件),避免中间状态同步;
    • 目录权限一致(均为 root 可读写),避免同步时权限不足导致的差异。

二、配置示例

2.1、环境准备

角色IP 地址同步目录核心组件
Rsync 服务端(主机 B)192.168.189.133/data/sync_dirRsync 服务(接收同步请求),监控本地变化,推送到服务端
Rsync 客户端(主机 A)192.168.189.129/data/sync_dirRsync 客户端 + inotify-tools(监控变化)

2.2、部署步骤(rsync协议)

2.2.1、服务端配置
  • 原理前置:服务端核心作用 , 暴露同步目录(模块),接收客户端的同步请求;

    • 通过配置文件控制客户端权限(IP 限制、用户名密码认证);
    • 存储同步数据,与客户端交互校验和信息。
  • 具体部署

    1. 两台主机都需要安装,一样的步骤

    2. 安装 Rsync: yum install -y rsync

    3. 创建 Rsync 配置文件

      vi /etc/rsyncd.conf
      # 全局配置:服务运行身份(root 确保权限足够)
      uid = root
      gid = root
      # 关闭 chroot,避免目录权限限制
      use chroot = no 
      # 最大并发连接数(防止过载)
      max connections = 10 
      # 服务进程 PID 文件
      pid file = /var/run/rsyncd.pid 
      # 锁文件(避免并发冲突)
      lock file = /var/run/rsync.lock
      # 同步日志(便于排查) 
      log file = /var/log/rsyncd.log 
      # 忽略非致命错误(如个别文件权限不足)
      ignore errors 
      # 允许客户端写入(双向同步必需,否则客户端无法推送数据)
      read only = no
      # 允许客户端查看服务端可用模块  
      list = yes 
      # 允许的客户端网段(白名单,提高安全性)
      hosts allow = 192.168.189.0/24
      # 拒绝其他所有网段
      hosts deny = * # 同步模块(客户端通过模块名访问服务端目录)
      [sync_module]
      # 服务端实际同步目录
      path = /data/sync_dir 
      # 模块描述
      comment = Bidirectional sync directory 
      auth users = xiong
      # 密码文件(存储用户名:密码)
      secrets file = /etc/rsyncd.secrets 
      
    4. 创建密码文件

      # 格式:用户名:密码(客户端需用相同密码)
      echo "xiong:123456" > /etc/rsyncd.secrets
      # 权限必须 600(Rsync 要求,否则服务启动失败,防止密码泄露)
      chmod 600 /etc/rsyncd.secrets
      
    5. 创建同步目录并授权:

      mkdir -p /data/sync_dir
      chown -R root:root /data/sync_dir
      chmod 755 /data/sync_dir  # 确保读写权限
      
    6. 启动 Rsync 服务并设置开机自启:

      systemctl start rsyncd
      systemctl enable rsyncd
      systemctl status rsyncd  # 确认状态为 active (running)
      
2.2.2、客户端配置
  • 原理前置:客户端核心作用 主机:192.168.189.129

    • 通过 inotify-tools 监控本地目录变化(创建 / 删除 / 修改);
    • 触发 Rsync 客户端,与服务端交互校验和,传输差异数据;
    • 支持免密认证(通过密码文件),实现自动同步。
  • 具体部署

    • 安装依赖(Rsync + inotify-tools): yum install -y rsync inotify-tools

    • 创建密码文件 <-- 两台都需要加

      # 仅保存密码(与服务端密码一致,无需用户名)
      echo "123456" > /etc/rsync_client.secrets
      chmod 600 /etc/rsync_client.secrets  # 权限必须 600,防止泄露
      
    • 双向同步脚本(主机 A ↔ 主机 B)

      1. 脚本原理: 两端各自监控本地目录,触发单向同步,形成 “主机 A→主机 B” 和 “主机 B→主机 A” 的双向闭环

      2. 主机 A 双向脚本(推送到主机 B)

        vi /data/rsync_bidir_A.sh
        ========================================
        #!/bin/bash
        LOCAL_DIR="/data/sync_dir/"
        REMOTE_SERVER="192.168.189.133"
        MODULE_NAME="sync_module"
        USER="xiong"
        SECRET_FILE="/etc/rsync_client.secrets"RSYNC_OPTS="-avz --delete --password-file=$SECRET_FILE"
        EXCLUDE="--exclude='*.swp' --exclude='.*.swp' --exclude='*.swo' --exclude='.*.swo'"
        INOTIFY_EVENTS="create,delete,modify"
        INOTIFY_OPTS="-m -r -e $INOTIFY_EVENTS"# 检查本地目录
        if [ ! -d "$(dirname $LOCAL_DIR)" ]; thenecho "[$(date)] 错误:本地目录不存在!" >> /var/log/rsync_bidir_A.log 2>&1exit 1
        fi# 初始化全量同步(A→B)
        echo "[$(date)] 初始化同步到主机 B" >> /var/log/rsync_bidir_A.log
        rsync $RSYNC_OPTS $EXCLUDE $LOCAL_DIR $USER@$REMOTE_SERVER::$MODULE_NAME >> /var/log/rsync_bidir_A.log 2>&1# 监控本地变化,推送到 B
        echo "[$(date)] 开始监控本地目录(A→B)" >> /var/log/rsync_bidir_A.log
        inotifywait $INOTIFY_OPTS $(dirname $LOCAL_DIR) | while read -r dir events file; doif [[ $file == *.swp || $file == .*.swp || $file == *.swo || $file == .*.swo ]]; thenecho "[$(date)] 忽略临时文件:$events $file" >> /var/log/rsync_bidir_A.logcontinuefiecho "[$(date)] 本地事件:$events $file" >> /var/log/rsync_bidir_A.logsleep 1rsync $RSYNC_OPTS $EXCLUDE $LOCAL_DIR $USER@$REMOTE_SERVER::$MODULE_NAME >> /var/log/rsync_bidir_A.log 2>&1echo "[$(date)] A→B 同步完成" >> /var/log/rsync_bidir_A.log
        done
        
      3. 主机 B 双向脚本(推送到主机 A) <-- 两台主机都需要执行 1-3

        1. 主机 B 需同时作为 “客户端”,监控自身目录变化推送到主机 A,步骤:

        2. 主机 B 安装 inotify-tools:yum install -y inotify-tools

        3. 创建密码文件:

          echo "123456" > /etc/rsync_client.secrets 
          chmod 600 /etc/rsync_client.secrets
          
        4. 创建脚本

          vi /data/rsync_bidir_B.sh
          ====================================
          #!/bin/bash
          LOCAL_DIR="/data/sync_dir/"
          REMOTE_SERVER="192.168.189.129"  # 主机 A IP
          MODULE_NAME="sync_module"  # 主机 A 需部署 Rsync 服务,模块名一致
          USER="xiong"  # 主机 A Rsync 服务的认证用户名
          SECRET_FILE="/etc/rsync_client.secrets"RSYNC_OPTS="-avz --delete --password-file=$SECRET_FILE"
          EXCLUDE="--exclude='*.swp' --exclude='.*.swp' --exclude='*.swo' --exclude='.*.swo'"
          INOTIFY_EVENTS="create,delete,modify"
          INOTIFY_OPTS="-m -r -e $INOTIFY_EVENTS"# 检查本地目录
          if [ ! -d "$(dirname $LOCAL_DIR)" ]; thenecho "[$(date)] 错误:本地目录不存在!" >> /var/log/rsync_bidir_B.log 2>&1exit 1
          fi# 初始化全量同步(B→A)
          echo "[$(date)] 初始化同步到主机 A" >> /var/log/rsync_bidir_B.log
          rsync $RSYNC_OPTS $EXCLUDE $LOCAL_DIR $USER@$REMOTE_SERVER::$MODULE_NAME >> /var/log/rsync_bidir_B.log 2>&1# 监控本地变化,推送到 A
          echo "[$(date)] 开始监控本地目录(B→A)" >> /var/log/rsync_bidir_B.log
          inotifywait $INOTIFY_OPTS $(dirname $LOCAL_DIR) | while read -r dir events file; doif [[ $file == *.swp || $file == .*.swp || $file == *.swo || $file == .*.swo ]]; thenecho "[$(date)] 忽略临时文件:$events $file" >> /var/log/rsync_bidir_B.logcontinuefiecho "[$(date)] 本地事件:$events $file" >> /var/log/rsync_bidir_B.logsleep 1rsync $RSYNC_OPTS $EXCLUDE $LOCAL_DIR $USER@$REMOTE_SERVER::$MODULE_NAME >> /var/log/rsync_bidir_B.log 2>&1echo "[$(date)] B→A 同步完成" >> /var/log/rsync_bidir_B.log
          done
          
2.2.3、脚本授权与测试
  1. 脚本授权(所有主机)

    chmod +x /data/rsync_uni_sync.sh /data/rsync_bidir_A.sh /data/rsync_bidir_B.shA主机有两个脚本 rsync_uni_sync.sh <--单向脚本rsync_bidir_A.sh  <--双向脚本A主机有一个脚本  rsync_bidir_B.sh  <--双向脚本共用的配置文件,  权限都是600
    [root@node1 etc]# ll rsyncd.conf rsyncd.secrets rsync_client.secrets
    -rw------- 1 root root    7 1116 13:21 rsync_client.secrets
    -rw------- 1 root root 1055 1116 13:23 rsyncd.conf
    -rw------- 1 root root   13 1116 13:12 rsyncd.secrets
    
  2. 测试用户是否正常

    rsync -avz --exclude='*.swp' --password-file=/etc/rsync_client.secrets /data/sync_dir/ xiong@192.168.189.133::sync_module# A\B两台都能列出来就成功了
    sent 327 bytes  received 73 bytes  38.10 bytes/sec
    total size is 55  speedup is 0.14
    
  3. 测试双向同步(两端均执行)

    # 主机 A 后台运行
    nohup ./rsync_bidir_A.sh
    # 主机 B 后台运行
    nohup ./rsync_bidir_B.sh
    # 两边都添加删除文件试试
    
  4. 配置自启 双向, 单向仅记录一下

    vi /etc/systemd/system/rsync_bidir.service
    [Unit]
    Description=Rsync Bidirectional Sync (A ↔ B)
    After=network.target rsyncd.service  # 网络和 Rsync 服务就绪后启动[Service]
    Type=simple
    # 以 root 身份运行(确保权限)
    User=root
    Group=root
    # 工作目录
    WorkingDirectory=/data
    # 脚本绝对路径
    ExecStart=/bin/bash /data/rsync_bidir_A.sh
    # 失败时自动重启
    Restart=on-failure  
    # 重启间隔 3 秒
    RestartSec=3
    StandardOutput=append:/var/log/rsync_bidir_service.log[Install]
    WantedBy=multi-user.target  # 多用户模式下启动
    
  5. 启动服务

    # 重新加载配置
    systemctl daemon-reload
    # 启动服务
    systemctl start rsync_bidir
    # 查看状态
    systemctl status rsync_bidir
    # 开机自启
    systemctl enable rsync_bidir
    

三、核心优势与注意事项

  • 与 SSH 方式对比(Rsync 原生协议优势)

    • 无需配置 SSH 免密,通过用户名密码认证,更安全可控;
    • 服务端可限制客户端 IP、访问权限,适合生产环境;
    • 传输效率与 SSH 一致,支持压缩、增量同步。
  • 注意事项

    • 密码文件权限必须为 600,否则 Rsync 拒绝执行;
    • 双向同步时,两端需同时部署监控脚本,避免同步冲突;
    • 过滤规则需包含 vi 临时文件,防止编辑时文件丢失;
    • 服务端 read only = no 必须开启,否则客户端无法写入。
  • 排查问题

    • 同步失败:查看日志 /var/log/rsync_*.log,检查服务端是否启动、密码是否正确;
    • 服务启动失败:查看 Systemd 错误日志 /var/log/rsync_bidir_service_error.log
    • 事件未捕获:确认 inotify-tools 已安装,本地目录权限正确。
http://www.dtcms.com/a/617769.html

相关文章:

  • 机器学习之ravel()的作用
  • Wi-Fi 7路由器性能分析:从传输速率到多设备协同全面解析
  • 【Java手搓RAGFlow】-1- 环境准备
  • 审计部绩效考核关键指标与综合评估方法
  • Photoshop - Photoshop 工具栏(29)钢笔工具
  • 营销型网站策划方案大德通众包做网站怎么样
  • 使用 Web Workers 提升前端性能:让 JavaScript 不再阻塞 UI
  • HTTP与HTTPS深度解析:从明文传输到安全通信
  • 知识图谱与语言教育:AI如何重构小语种学习的基础设施
  • 在 Hadoop 生态使用 JuiceFS,并为Hive提供HDFS存储安装指南
  • Hive内置函数
  • 瑞丽航空公司官方网站网络推广的好处
  • [ROS2]启动文件格式
  • 实现链式结构二叉树--递归中的暴力美学(第13讲)
  • Mac 目录树结构与基础 Linux 指令指南
  • 【大模型面经】千问系列专题面经
  • 什么网站访问量前端开发入门培训
  • Vue 项目实战《尚医通》,获取当前账户就诊人信息并展示出来,笔记42
  • MYSQL的页
  • 企业架构:数字化转型时代业务与IT的战略连接器
  • 【解决】RESP.app GUI for Redis 连接不上redis服务器
  • PyTorch入门学习: 加载数据
  • Reactor反应堆
  • 【C++】C++11:智能指针
  • 把网站做成手机版创意设计师
  • 条件前缀|同余优化|栈
  • 做淘客app要网站吗大数据精准营销策略
  • 对于数据结构:链式二叉树的超详细保姆级解析—中
  • 多模态大模型对齐陷阱:对比学习与指令微调的“内耗“问题及破解方案
  • 关键词解释:F1值(F1 Score)