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
}
四、最佳实践建议
分层监控策略
- 重要目录:实时同步
- 次要目录:定时同步(每5分钟)
- 日志目录:每天归档同步
网络优化
# 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,大规模场景考虑分布式存储方案。