sersync不支持单实例多localpath并行监听,因其XML解析仅取第一个localpath节点,属设计限制;必须通过多个独立实例(各配独立配置文件、日志及inotify watcher)实现多目录同步。

sersync 本身不支持单实例多 <localpath> 并行监听 —— 这是硬限制,不是配置问题。 直接在 confxml.xml 里写多个 <localpath> 标签,只有第一个生效;强行加会导致启动失败或静默忽略后续项。
为什么不能直接配多个 localpath
sersync 的 XML 解析逻辑只取第一个 <localpath> 节点,源码中明确做了 getFirstChildElement("localpath") 类似操作。这不是 bug,是设计如此:它定位为“单源目录 + 多目标推送”的轻量同步器,不是通用文件事件总线。
常见错误现象:sersync -d -o confxml.xml 启动后日志无报错,但只有第一个目录有同步行为;ps aux | grep sersync 只看到一个进程,inotify watch 数也远低于预期。
- inotify 机制本身有 per-process 限制(
/proc/sys/fs/inotify/max_user_watches),但即使调高,sersync 也不会自动拆分监听 - 多个
<remote>可以共存(实现一源多目标),但多个<localpath>不行 - 试图用
<filter>匹配不同子路径(如/data/a和/data/b)也不行——它只过滤变更路径,不扩展监听范围
真正能落地的多目录方案:起多个 sersync 实例
每个实例绑定一个独立目录 + 独立配置文件 + 独立日志 + 独立 inotify watcher。这是生产环境唯一稳定、可监控、可伸缩的做法。
实操建议:
- 为每个同步目录建独立子配置,比如
/usr/local/sersync/conf/data_a.xml、/usr/local/sersync/conf/data_b.xml - 每个配置里
<localpath watch="/data/a">和<localpath watch="/data/b">分开写,不要混在一个文件里 - 用
-o参数显式指定配置:sersync -d -o /usr/local/sersync/conf/data_a.xml - 用 systemd 或 supervisor 管理多个实例,避免手动维护;每个服务单元设
Restart=on-failure - 注意
/proc/sys/fs/inotify/max_user_watches要按实例数 × 目录深度预估上调(例如 5 个实例 × 每个目录下 10k 子目录 ≈ 需要 50w)
大规模场景下必须调的内核参数和权限
当目录层级深、文件数量大(>100 万)、变更频繁时,不调参会直接触发 inotify 资源耗尽或 rsync 排队超时。
关键参数和操作:
- 执行
echo 524288 > /proc/sys/fs/inotify/max_user_watches(永久写入/etc/sysctl.conf) - 执行
echo 65536 > /proc/sys/fs/inotify/max_queued_events - 确保 rsync 目标端
rsyncd.conf中max connections≥ 实例数 × 并发线程数(默认<rsync><commonParams params="-az">不带-P,但并发由<rsync><threads>控制,默认 10) -
/etc/rsync.password在源端必须是600权限,且内容仅含密码(如admin),不能带用户名或空格 - 源端运行 sersync 的用户,需对被监听目录有
read+execute权限(stat和readdir才能触发 inotify)
容易被忽略的失败重试与日志盲区
sersync 的失败重试是“队列级”而非“文件级”:它把整个事件批次塞进失败队列,重试时会重新触发 rsync 全量比对该路径,不是只重传失败的那个文件。这意味着:
- 如果某个大文件(如 2GB 日志)传输中断,重试会再次全量拉取,浪费带宽
- 日志默认只记录“start sync”和“finish sync”,不记录具体哪个文件失败;需在
<rsync>块里加verbose="true"并配合logfile路径才看到 rsync -v 输出 - 没有内置的“跳过临时文件”开关(如
*.tmp、.swp),必须靠<filter>显式写死规则,否则编辑器生成的临时文件会反复触发同步 - 若目标端 rsync daemon 挂了,sersync 默认只重试 3 次就进失败队列,不会自动降级为本地暂存 —— 这个行为无法通过配置关闭


















