温馨提示×

ubuntu定时同步数据方法

小樊
47
2025-11-16 15:37:13
栏目: 智能运维

Ubuntu 定时同步数据的实用方案

一、方案总览与选型

  • 推荐以 rsync 为核心,配合 SSH 做安全传输,使用 cron 实现定时任务;适合绝大多数备份与镜像场景,稳定、可审计、易维护。
  • 如需更高实时性,可在源端用 inotify 监听目录变化,触发 rsync 执行,实现近实时同步(定时+触发双保险)。
  • 若以 FTP 为传输通道,可用 lftprsync 通过 FTP 协议同步,适合已有 FTP 环境的过渡方案。

二、快速上手 rsync + SSH + cron

  • 安装与版本确认
    • 两端安装:sudo apt update && sudo apt install -y rsync
    • 版本确认:rsync --version
  • 配置 SSH 免密登录(源端执行)
    • 生成密钥:ssh-keygen -t rsa
    • 分发公钥:ssh-copy-id user@dest_ip(如端口非默认:ssh-copy-id -p 30110 user@dest_ip)
  • 手动验证一次
    • 示例:rsync -avz -e “ssh -p 30110” /data/src/ user@dest_ip:/data/dst/
  • 创建同步脚本(便于日志与维护)
    • /usr/local/bin/sync_data.sh
      #!/usr/bin/env bash
      LOG="/var/log/sync_data.log"
      echo "$(date '+%F %T'): START" >> "$LOG"
      rsync -avz --delete \
        -e "ssh -i /home/user/.ssh/id_rsa -p 30110" \
        /data/src/ user@dest_ip:/data/dst/ >> "$LOG" 2>&1
      echo "$(date '+%F %T'): END (exit=$?)" >> "$LOG"
      
    • 赋权:chmod +x /usr/local/bin/sync_data.sh
  • 配置定时任务
    • 系统级:编辑 /etc/crontab
      */5 * * * * root /usr/local/bin/sync_data.sh
      
    • 或用户级:crontab -e(注意使用命令绝对路径,可用 which rsync 获取)
      */5 * * * * /usr/bin/rsync -avz --delete -e "ssh -i /home/user/.ssh/id_rsa -p 30110" /data/src/ user@dest_ip:/data/dst/
      
  • 常用 rsync 选项说明
    • -a 归档模式(保留权限、属主、时间戳等)
    • -v 详细输出
    • -z 压缩传输
    • –delete 目标端删除源端不存在的文件(谨慎使用,确保方向正确)

三、进阶 实时触发同步 inotify + rsync

  • 安装 inotify-tools
    • sudo apt install -y inotify-tools
  • 事件监听脚本(示例)
    #!/usr/bin/env bash
    SRC="/data/src"
    DST="user@dest_ip:/data/dst"
    SSH_OPTS="-i /home/user/.ssh/id_rsa -p 30110"
    LOG="/var/log/sync_inotify.log"
    
    inotifywait -m -r -q --timefmt '%F %T' --format '%T %w%f %e' \
      -e create,delete,moved_to,close_write,attrib "$SRC" | while IFS=' ' read -r ts file event; do
        echo "[$ts] $event on $file, sync..." >> "$LOG"
        rsync -avz --delete -e "ssh $SSH_OPTS" "$SRC/" "$DST/" >> "$LOG" 2>&1
    done
    
  • 运行方式
    • 直接前台运行调试:bash sync_inotify.sh
    • 生产建议用 systemd 或 supervisor 托管为常驻服务,异常自动重启
  • 内核参数与性能
    • 检查与调优:/proc/sys/fs/inotify/{max_queued_events,max_user_instances,max_user_watches}
    • 大量小文件场景可适当增大,避免 Event Queue Overflow

四、常见场景与命令模板

  • 非默认 SSH 端口
    • rsync -avz -e “ssh -p 30110” /src/ user@ip:/dst/
  • 拉取模式(从远端拉到本地)
    • rsync -avz user@ip:/src/ /dst/
  • 仅做增量、不删除
    • rsync -avzu /src/ user@ip:/dst/(-u 跳过较新的目标文件)
  • 同步并删除目标端多余文件
    • rsync -avz --delete /src/ user@ip:/dst/
  • 定时示例
    • 5 分钟:*/5 * * * * /usr/local/bin/sync_data.sh
    • 每天 02:00:0 2 * * * /usr/local/bin/sync_data.sh
  • 日志与审计
    • 建议在脚本中统一输出到 /var/log/sync_*.log,并定期轮转(如 logrotate)

五、排错与最佳实践

  • 先手动跑通再上定时:确认 SSH 免密、端口、目录权限均正确
  • 使用命令绝对路径:which rsync、which bash,写入 cron 更可靠
  • 谨慎使用 –delete:先去掉演练,确认方向正确再加
  • 大量小文件或高并发写入:考虑 inotify 触发 + 定时全量兜底
  • 失败告警:脚本捕获退出码,结合邮件/企业微信/钉钉 webhook 通知
  • 安全性:限制 SSH 登录用户与密钥权限,仅开放必要目录与端口

0