仙桃市护送信息网

rsync结合 inotfiy 实现实时备份的问题

2026-03-30 22:37:01 浏览次数:0
详细信息

rsync 结合 inotify 实现实时备份是一个经典方案,但实践中会遇到一些常见问题。以下是主要问题及解决方案:

一、常见问题

1. 事件丢失问题

2. 递归监控性能问题

3. 同步冲突问题

方法2:延迟同步(推荐)

sleep 2 && rsync -avz --delete source/ dest/


### 4. **权限问题**
- **现象**:执行脚本的用户无权限访问某些文件
```bash
# 方案1:使用sudo(需配置免密)
sudo inotifywait -mrq -e modify,create,delete /root/data

# 方案2:调整目录权限
setfacl -R -m u:backupuser:rx /sensitive/data

二、生产环境优化方案

1. 使用 sersync(推荐)

# 下载安装
wget https://github.com/wsgzao/sersync/raw/master/sersync2.5.4_64bit_binary_stable_final.tar.gz
tar -zxvf sersync2.5.4_64bit_binary_stable_final.tar.gz
cd GNU-Linux-x86/

# 配置 confxml.xml
<localpath watch="/data">
    <remote ip="192.168.1.100" name="backup"/>
</localpath>

# 启动
./sersync2 -r -d

2. 增强脚本示例

#!/bin/bash
# realtime_backup.sh

SRC_DIR="/data"
DST_DIR="/backup"
LOG_FILE="/var/log/realtime_backup.log"
RSYNC_OPTIONS="-avz --delete --partial --timeout=300"
INOTIFY_EVENTS="modify,create,delete,move"

# 确保目录存在
mkdir -p $SRC_DIR $DST_DIR

# 初始完整同步
echo "$(date) 开始初始同步..." >> $LOG_FILE
rsync $RSYNC_OPTIONS $SRC_DIR/ $DST_DIR/ >> $LOG_FILE 2>&1
echo "$(date) 初始同步完成" >> $LOG_FILE

# 实时监控
inotifywait -mrq --timefmt '%Y-%m-%d %H:%M:%S' \
  --format '%T %w%f %e' \
  -e $INOTIFY_EVENTS $SRC_DIR | while read DATE TIME FILE EVENT
do
    # 防抖动:等待0.5秒处理连续事件
    sleep 0.5

    echo "$DATE $TIME 事件: $EVENT 文件: $FILE" >> $LOG_FILE

    # 根据事件类型处理
    case $EVENT in
        MODIFY|CREATE|DELETE|MOVED_TO|MOVED_FROM)
            # 使用 --relative 保持目录结构
            rsync $RSYNC_OPTIONS --relative "$FILE" $DST_DIR/ >> $LOG_FILE 2>&1
            ;;
    esac
done

3. 使用 incron(系统级方案)

# 安装
apt-get install incron  # Debian/Ubuntu
yum install incron      # RHEL/CentOS

# 配置
echo "/data IN_MODIFY,IN_CREATE,IN_DELETE /usr/bin/rsync -avz /data/ /backup/" >> /var/spool/incron/root
systemctl enable --now incrond

三、监控与维护

1. 资源监控脚本

#!/bin/bash
# monitor_inotify.sh

# 检查inotify进程
if ! pgrep -f "inotifywait" > /dev/null; then
    echo "inotify进程已停止,重启中..." | mail -s "备份监控告警" admin@example.com
    systemctl restart realtime-backup
fi

# 检查磁盘空间
DISK_USAGE=$(df -h /backup | awk 'NR==2 {print $5}' | sed 's/%//')
if [ $DISK_USAGE -gt 90 ]; then
    echo "备份磁盘使用率: ${DISK_USAGE}%" | mail -s "磁盘空间告警" admin@example.com
fi

2. 日志轮转配置

# /etc/logrotate.d/realtime_backup
/var/log/realtime_backup.log {
    daily
    rotate 30
    compress
    missingok
    notifempty
    create 640 root root
    postrotate
        systemctl reload realtime-backup > /dev/null 2>&1 || true
    endscript
}

四、最佳实践建议

分层监控策略

网络优化

# SSH压缩和优化
RSYNC_RSH="ssh -c aes128-gcm@openssh.com -o Compression=yes"

# 带宽限制
rsync --bwlimit=10000  # 限制10MB/s

容错处理

# 重试机制
max_retries=3
for i in $(seq 1 $max_retries); do
    rsync [options] && break
    sleep $((i*5))
done

使用系统服务管理

# /etc/systemd/system/realtime-backup.service
[Unit]
Description=Realtime Backup Service

[Service]
Type=simple
ExecStart=/usr/local/bin/realtime_backup.sh
Restart=always
RestartSec=10

[Install]
WantedBy=multi-user.target

五、替代方案

方案 优点 缺点
lsyncd 配置简单,支持多目标 资源占用相对高
syncthing 跨平台,双向同步 需要独立服务
drbd 块级同步,数据强一致 配置复杂
ceph/rbd 企业级,高可用 需要集群环境

推荐对于中小规模场景使用 lsyncd,大规模场景考虑分布式存储方案。

相关推荐