svn多机集群必须采用apache+mod_dav_svn协议,通过主从同步、nginx路由写请求至主节点、共享元数据与zookeeper租约机制保障一致性。

要让 SVN 服务端支持动态负载均衡的多机集群架构,不能只靠单台 svnserve 或 Apache 简单部署,必须从协议层、数据同步、请求分发和故障切换四个维度协同设计。核心不是“多个 SVN 实例并存”,而是“写入集中、读取分散、状态一致、自动兜底”。
选对协议模式:必须用 Apache + mod_dav_svn
svnserve 协议(端口 3690)不支持 HTTP 层负载均衡与细粒度路由,无法对接 Nginx/SLB;而 Apache 模式基于标准 HTTP/HTTPS,天然兼容反向代理与健康检查。企业级集群唯一可行路径是:
- 所有 SVN 服务器统一使用 Apache + mod_dav_svn 提供服务,绑定不同后端 IP 和相同虚拟主机名(如 svn.example.com)
- 禁用 svnserve,避免协议混用导致权限或锁机制冲突
- Apache 配置中启用
SVNParentPath统一管理多个仓库,便于横向扩展
构建主从+同步机制:写主+读从+自动校验
集群不是简单复制,而是明确角色分工。主节点处理 commit、lock、log 等写操作;从节点仅响应 GET /checkout、/info、/log 等只读请求。关键动作包括:
- 主节点开启
svnsync或自定义 post-commit hook,每次提交后触发增量同步到所有从节点(推荐 rsync + inotify 实时捕获变更) - 从节点定期运行
svnlook youngest对比本地最新版本号,若落后则自动拉取缺失 revision(可用 recovery.sh 脚本实现) - 所有节点共享同一套 authz 权限文件与 LDAP 认证后端,避免授权不一致
接入动态负载均衡器:支持健康检查与权重调度
用 Nginx 或云厂商 SLB(如阿里云 ALB、AWS NLB)做七层/四层入口,配置要点:
- 监听 HTTPS 443 端口,后端指向各 Apache 节点的 443 或 80 端口
- 启用主动健康检查:每 5 秒请求
GET /svn/healthz(可由 Apache 的 mod_status 或自定义 CGI 返回 200) - 对写操作(如 POST /!svn/me、PUT /!svn/wrk)做 URL 匹配,强制路由至主节点(通过 Nginx 的 if + proxy_pass 实现)
- 读请求采用加权轮询,从节点性能强的可设更高 weight
保障一致性与灾备:元数据分离 + 自动切换
单纯文件同步不足以应对并发锁、revision 冲突等场景。必须引入外部协调机制:
- 将 SVN 元数据(revprops、locks、db/txn-protorevs)存于共享存储(如 NFSv4 或云文件存储),所有节点挂载只读,主节点独占写入
- 使用 ZooKeeper 或 etcd 维护主节点租约(lease),超时未续租则触发自动选举新主(配合 systemd 或 supervisor 启停服务)
- 全量备份每天归档至对象存储(OSS/S3),备份脚本中嵌入
svnadmin verify校验完整性
不复杂但容易忽略:动态负载均衡不是配置完 Nginx 就算完成,真正的难点在于写操作路由一致性、revision 全局单调递增、以及主从切换时未提交事务的兜底处理。建议先在两节点环境跑通 svnsync + Nginx 路由 + healthz 检查,再逐步加入租约管理和共享元数据层。











