svnsync双向同步搭建异地容灾SVN版本库方案
svnsync为单向只读复制工具,不支持双向同步。异地容灾采用主备切换加单向同步与手动接管方案:明确主备角色,备库初始化只读镜像并配置钩子,建立单向同步链路,切换时人工干预,避免权限与钩子配置错误。
首先需要明确结论:svnsync 工具本质上并不支持真正的双向同步。它的设计初衷十分清晰——作为一个单向、只读的复制工具,用于搭建主从备份(master-slave)。从源仓库向目标仓库单向推送变更,这才是它的本职工作。如果强行追求“双向”,只会引发版本历史冲突、修订版本号错乱以及 svn:sync-* 属性污染等一系列问题。Subversion 官方对此早已给出定论:不推荐,也不保障双向场景。
不过,如果你的目标是实现异地容灾——即当主站点宕机时,能够快速切换到备用站点,并尽可能保持数据一致性——完全可以换一种思路:采用“主备切换 + 单向同步 + 手动接管”的方案。这套方案既务实又落地,运行逻辑非常清晰明了。
一、明确主备角色与网络可达性
首先选定一台稳定的服务器作为主库(Production),另一台异地机房的机器作为备库(DR Site)。两者之间需要满足以下几个基本条件:
- 主库能通过网络访问备库(HTTP/HTTPS 或 svn:// 协议);
- 备库能反向访问主库(主要用于故障后的手动回切或验证,并非实时同步的必需品);
- 主库和备库的 SVN 版本最好保持一致(至少 1.4 以上版本),避免属性兼容问题。
二、在备库初始化只读镜像
备库必须是全新创建的空库,并且需要配置一个专门的钩子,允许 svnsync 写入元数据。具体操作步骤如下:
- 创建空库:
svnadmin create /path/to/backup_repo; - 进入
hooks/目录,将pre-revprop-change.tmpl复制为pre-revprop-change(Linux)或pre-revprop-change.bat(Windows); - 编辑该文件,确保最后一行是
exit 0(Linux)或exit /b 0(Windows),切记不加任何条件判断; - 赋予执行权限:
chmod a+x pre-revprop-change(Linux)或确认 bat 文件能被 svn 进程调用(Windows)。
三、建立单向同步链路
所有操作均在备库所在机器上执行。首先初始化同步关系:
svnsync init http://dr-server:8080/svn/backup_repo svn://master-server/svn/main_repo
输入主库的读账号和备库的写账号。建议使用独立且低权限的账号,例如 sync_reader 和 sync_writer。然后进行首次全量同步:
svnsync sync http://dr-server:8080/svn/backup_repo
后续的增量同步(可以定时运行)使用如下命令:
svnsync sync --non-interactive http://dr-server:8080/svn/backup_repo --username sync_writer --password xxx
四、实现容灾切换能力
备库默认是只读的(svnsync 不开放提交入口)。切换时需要人工干预,具体流程如下:
- 先停止主库服务,确认没有新的提交产生;
- 在备库的 hooks 中,临时移除或重命名
pre-revprop-change,防止意外属性修改造成干扰; - 修改备库的
conf/authz和conf/passwd,启用正常开发用户的写权限; - 更新客户端工作副本的 URL,指向备库地址(可以使用
svn switch --relocate或重新 checkout); - 可选步骤:通过
svnadmin dump+load将主库最后的几个 revision 补充到备库,确保数据零丢失。
五、避免常见陷阱
以下错误几乎都源于权限或钩子配置不当:
- “DA V request failed; pre-revprop-change hook failed”:检查备库的
pre-revprop-change文件是否存在、是否可执行、是否返回 0; - 同步卡在 rev 0 或报 auth 失败:确认主库提供读权限、备库提供写权限,且账号密码未被 svn cache 缓存干扰(加
--no-auth-cache参数); - 备库无法提交:这是正常现象,svnsync 镜像库默认就是禁写的,切换时才开放,不要提前开启;
- 时间不同步导致 propset 失败:主备服务器的系统时间误差应尽量小。
这项技术并不复杂,但容易被忽略的是:容灾的真正价值不在于“自动双向”,而在于“可控、可验证、可回退”的单向镜像,再加上一个明确的切换流程。真正可靠的异地容灾,靠的是定期演练切换,而不是依赖工具自动兜底。

游乐网为非赢利性网站,所展示的游戏/软件/文章内容均来自于互联网或第三方用户上传分享,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系youleyoucom@outlook.com。
同类文章
面向对象编程:继承与方法重写入门教程:核心概念、操作步骤与结果验证
从父类与子类的关系入手,理解继承、方法重写和多态的基本机制,通过完整代码示例完成继承结构创建、方法重写与运行验证,并梳理常见错误和使用注意事项。
Python应用打包与部署入门教程:核心概念、操作步骤与结果验证
从 Python 应用打包的基本概念入手,介绍项目环境准备、依赖管理、构建发布包、安装部署以及运行结果验证,并梳理常见打包失败与部署问题,帮助初学者完成从源码到可部署应用的完整流程。
Python CLI 开发避坑指南:从环境配置到参数解析的实战排查
本文聚焦 Python 命令行工具(CLI)开发中最高频的故障点,按执行链路梳理从环境配置、参数解析、路径处理到异常调试的完整排查流程。通过具体代码示例与终端输出对照,提供可复现的修复方案,帮助开发者快速定位 ModuleNotFoundError、参数校验失败及跨平台兼容性问题,构建更健壮的命令行
Python CLI 开发:从参数解析到工程化发布的完整路径
本文以 Python 命令行工具开发为切入点,从项目结构搭建与虚拟环境配置入手,深入讲解 argparse 参数解析与子命令设计。通过一个完整的日志分析工具案例,演示输入校验、错误处理与异常捕获的最佳实践,最后覆盖打包发布流程与常见排查技巧,帮助开发者构建健壮、易用的 CLI 应用。
Python 模块与包的工程化实践:结构、依赖与排错指南
本文从项目目录规范与模块导入机制切入,详细阐述虚拟环境的配置、第三方包的管理策略以及完整案例的模块化拆分方法。通过具体代码示例展示如何构建高内聚低耦合的代码结构,并针对 ModuleNotFoundError、ImportError 及依赖冲突等常见工程问题提供系统化的排查与解决方案,帮助开发者建立
- 热门数据榜
1
2
3
4
5
6
7
8
9
10
相关攻略
2026-10-08 18:33
2026-10-01 18:40
2026-10-01 18:35
2026-10-01 18:30
2026-10-01 18:25
2026-10-01 18:20
2026-10-01 18:15
2026-10-01 18:10
热门教程
- 游戏攻略
- 安卓教程
- 苹果教程
- 电脑教程

