Debian inotify更新后如何迁移数据
导读:Debian inotify更新后的数据迁移方案 一、迁移总览与准备 明确迁移路径:源目录(如:/data)→ 目标目录(如:/data_new),或本地 → 远程(如:user@host:/data)。 安装工具:确保系统具备rsync...
Debian inotify更新后的数据迁移方案
一、迁移总览与准备
- 明确迁移路径:源目录(如:/data)→ 目标目录(如:/data_new),或本地 → 远程(如:user@host:/data)。
- 安装工具:确保系统具备rsync与inotify-tools,用于基线全量迁移与变更追平。
- Debian/Ubuntu:sudo apt-get install -y rsync inotify-tools
- 备份与校验:先对关键数据做全量备份,迁移后通过校验和或抽样比对确认一致性。
- 权限与所有权:迁移后保持UID/GID与权限位一致,避免应用异常。
- 变更窗口:尽量在低峰期执行,减少对线上影响。
二、基线全量迁移
- 本地迁移(一次性全量,随后用 inotify 追平增量):
- rsync -aAX --info=progress2 --delete /data/ /data_new/
- 说明:-aAX 保留权限/属主/扩展属性;–delete 保持两端一致;末尾斜杠确保按目录内容同步。
- 远程迁移(一次性全量):
- rsync -avzP --delete /data/ user@host:/data/
- 校验建议:
- 生成校验清单对比:
- find /data -type f -exec sha256sum { } ; | sort > /tmp/src.sha256
- find /data_new -type f -exec sha256sum { } ; | sort > /tmp/dst.sha256
- diff -u /tmp/src.sha256 /tmp/dst.sha256
- 或抽样比对关键文件/子目录。
- 生成校验清单对比:
三、用 inotify 追平增量
- 事件选择建议:优先监听能代表“写入完成”的事件,如close_write,并补充create、delete、move,以降低重复触发与漏同步风险。
- 本地追平脚本(systemd 友好):
- 保存为:/usr/local/bin/inotify-sync.sh
- 内容:
- #!/usr/bin/env bash
set -Eeuo pipefail
SRC=“/data”
DST=“/data_new”
LOG=“/var/log/inotify-sync.log”
exec > > “$LOG” 2> & 1
inotifywait -m -r -e close_write,create,delete,move --format ‘%w%f %e’ “$SRC” | while IFS=’ ’ read -r FILE EVENT; do
case “$EVENT” in
CREATE|MOVED_TO|MODIFY|CLOSE_WRITE)
REL=“${ FILE#$SRC/} ”
mkdir -p “$DST/$(dirname “$REL”)”
rsync -aAX --inplace “$FILE” “$DST/$REL”
; ;
DELETE|MOVED_FROM)
REL=“${ FILE#$SRC/} ”
rm -f “$DST/$REL”
; ;
esac
done
- #!/usr/bin/env bash
- 权限与自启:
- chmod +x /usr/local/bin/inotify-sync.sh
- 创建服务:/etc/systemd/system/inotify-sync.service
- [Unit] Description=Inotify to sync /data → /data_new
After=network.target - [Service] Type=simple ExecStart=/usr/local/bin/inotify-sync.sh Restart=always User=root
- [Install] WantedBy=multi-user.target
- [Unit] Description=Inotify to sync /data → /data_new
- systemctl daemon-reload & & systemctl enable --now inotify-sync.service
- 远程追平脚本(通过 rsync 推送到远端):
- 将上面脚本中的 rsync 行替换为:
- rsync -avzP --inplace “$FILE” “user@host:$DST/${ FILE#$SRC/} ”
- 将上面脚本中的 rsync 行替换为:
- 运行要点:
- 使用**–inplace**减少目标端重写;
- 如需更稳健的重试与退避,可在脚本中加入循环与 sleep;
- 若需守护与日志轮转,可结合 systemd 的 StandardOutput/StandardError 与 logrotate。
四、切换与回滚
- 切换步骤:
- 短暂停止写入或进入维护模式;
- 再次执行一次全量 rsync以追平最后秒级变更:rsync -aAX --delete /data/ /data_new/;
- 原子切换:
- 方式A:mv /data /data_bak & & mv /data_new /data
- 方式B(绑定挂载切换):mount --bind /data_new /data & & umount /data_new
- 启动应用,观察日志与监控。
- 回滚预案:
- 若异常,立即切回:mv /data /data_new & & mv /data_bak /data,并恢复应用。
- 清理:确认稳定后,按需归档或删除**/data_bak**。
五、性能与稳定性调优
- 内核 inotify 限制:监控大量文件时需提升阈值,避免“Too many open files/监控丢失”。
- 查看:cat /proc/sys/fs/inotify/{ max_user_watches,max_queued_events,max_user_instances}
- 临时提升:
- echo 10000000 > /proc/sys/fs/inotify/max_user_watches
- echo 10000000 > /proc/sys/fs/inotify/max_queued_events
- echo 65535 > /proc/sys/fs/inotify/max_user_instances
- 永久生效:/etc/sysctl.d/99-inotify.conf
- fs.inotify.max_user_watches = 10000000
- fs.inotify.max_queued_events = 10000000
- fs.inotify.max_user_instances = 65535
- 执行:sysctl -p /etc/sysctl.d/99-inotify.conf
- 脚本与 rsync 优化:
- 事件去抖:对同一文件短时间多次变更可加入简单延时去抖(如 0.5–2 秒)再触发 rsync;
- 排除无关路径:–exclude ‘*.tmp’ --exclude ‘/cache’;
- 资源控制:限制并发与速率,避免占满 I/O。
声明:本文内容由网友自发贡献,本站不承担相应法律责任。对本内容有异议或投诉,请联系2913721942#qq.com核实处理,我们将尽快回复您,谢谢合作!
若转载请注明出处: Debian inotify更新后如何迁移数据
本文地址: https://pptw.com/jishu/755950.html
