svn异地多机房主从同步需满足版本≥1.7、从库为空、协议统一;确保https连通、pre-revprop-change钩子设为exit 0、账号权限一致;通过svnsync init初始化,post-commit触发同步,并辅以定时补同步与revision校验。

要让 SVN 在异地多机房环境下稳定实现主从同步,核心是确保主库变更能可靠、自动、低延迟地复制到从库,同时兼顾网络不可靠性、权限一致性与操作可维护性。关键不在于“能不能”,而在于“怎么防错”和“怎么兜底”。
主从架构选型与版本约束
SVN 主从同步依赖 svnsync 工具,它要求:
- 主服务器和从服务器的 SVN 版本均 ≥ 1.7(1.6 及以下不支持原子属性同步,会报
W200007错误); - 从库必须为空(首次初始化前不能含任何提交记录),否则需加
--allow-non-empty参数; - 主从仓库路径结构无需一致,但 URL 协议需互通(推荐统一用
http://或https://,避免混用svn://和file://)。
基础服务准备与网络连通
异地多机房意味着网络非内网直连,需提前验证并配置:
- 主库与从库之间必须能双向访问对方的 SVN 服务端口(默认 3690 或 HTTP/HTTPS 端口),建议使用 HTTPS 协议以规避防火墙干扰;
- 若跨公网,优先部署反向代理(如 Nginx)或使用带 TLS 的 VisualSVN Server / Apache + mod_dav_svn,禁用明文 HTTP;
- 云环境需开放安全组规则,本地机房需确认出口 NAT、ACL 或专线策略允许目标端口通信;
- 建议在两端分别执行
curl -I https:///svn/<repo></repo>和curl -I https:///svn/<repo></repo>验证基础可达性。
权限与钩子脚本配置
同步成败常卡在权限细节上,两处必须严格一致:
-
pre-revprop-change:从库仓库
hooks/pre-revprop-change必须存在且可执行,内容仅保留exit 0(Windows 下为.bat文件,内容为exit /b 0); -
认证用户统一:主库与从库需配置相同用户名/密码(如
svnbak),且该用户在主库有读权限、在从库有写权限; -
authz 权限隔离:从库的
authz中不应开放普通用户写权限,仅保留同步专用账号的写入能力,防止误提交污染镜像; -
post-commit 自动触发:主库
hooks/post-commit中添加一行同步命令(推荐带--non-interactive和完整凭证),例如:svnsync sync --non-interactive https://backup.example.com/svn/myrepo --username svnbak --password xxxxx
初始化与日常运维保障
完成配置后,按顺序执行:
- 先在从库执行初始化:
svnsync init https://backup.example.com/svn/myrepo https://master.example.com/svn/myrepo --username svnbak --password xxxxx; - 再手动触发首次全量同步:
svnsync sync https://backup.example.com/svn/myrepo(成功提示 “Committed revision X”); - 为防 post-commit 失败导致漏同步,建议额外配置定时任务(如每5分钟检查并补同步一次);
- 每次主库升级、重启或网络中断恢复后,应校验最新 revision 是否一致(
svn info https://主库/svn/myrepo | grep Revision对比从库)。
异地主从不是一劳永逸的配置,而是需要定期验证、日志监控与失败告警的持续过程。只要版本合规、网络通、权限准、钩子稳,同步本身并不复杂,但容错设计决定可靠性上限。











