1. 背景介绍
1.1 业务背景
公司作为安防行业头部企业,研发中心遍布全球。受限于内部网络安全策略,各中心仅能访问本地 SVN 服务。随着跨区域协作项目增多,现有的“孤岛式”代码管理导致异地协作效率低下,迫切需要一套能跨中心同步且保证代码版本绝对一致的分布式方案 。
1.2 业务场景
| 场景/商业模式 | 描述 | 商业价值 |
|---|---|---|
| 标准服务 | 单中心内部开发,访问本地 SVN。 | 基础研发保障。 |
| 跨中心协作(本次范围) | 多中心针对同一项目代码库进行并发提交,需确保版本强一致性(CP)。 | 打破区域限制,提升全球协同效率。 |
2. 产品概述
2.1 产品定位
在跨区域网络隔离场景下,提供分布式SVN代码库的版本锁与高效同步能力,服务全球研发人员的一款数据一致性中间件。
2.2 服务对象
- 研发人员:在本地中心提交代码,无感知跨中心冲突。
- 运维/配置管理:负责同步状态监控与故障恢复。
2.3 产品逻辑
系统采用“本地提交 + 全局仲裁 + 异步补偿”的架构:
- 全局仲裁(CP核心) :任何中心的提交动作必须先获取全局分布式锁。
- 本地预转储:获取锁后,数据写入本地库。
- 高速同步:利用二进制差分技术将版本号及数据同步至其他中心;同步时机——提交成功在post-commit脚本中发起同步。
2.4 角色术语
| 角色 | 定义 | 职责 |
|---|---|---|
| Global Lock (G-Lock) | 全局分布式锁 | 确保同一时间只有一个中心能执行 Commit 操作 。 |
| Local Mirror | 本地代码镜像 | 各中心本地的 SVN 实例。 |
| Sync Agent | 同步代理 | 负责版本数据的分发、压缩与导入。 |
3. 需求说明
3.1 需求列表
| 模块 | 需求名称 | 目标 | 优先级 |
|---|---|---|---|
| 并发控制 | 全局提交仲裁锁 | 确保并发提交时强一致性(CP),禁止版本跳跃。 | PO (最高) |
| 数据传输 | 高效增量同步引擎 | 实现版本数据的高速传输与全量/增量导入。 | P1 |
| 容灾恢复 | 快速一致性修复工具 | 服务崩溃后,自动比对各中心版本号并强制对齐。 | P1 |
| 监控告警 | 同步延迟与锁定监控 | 实时监控各中心同步状态。 | P2 |
3.2 需求明细
3.2.1 全局提交仲裁锁(CP优先原则)
- 需求描述:
-
- 当研发中心 A 触发
svn commit时,系统必须拦截并向“全局仲裁中心”请求该 Repo 的唯一提交锁。 - 若研发中心 B 同时提交,因锁已被 A 占用,B 的提交必须立即失败并返回提示:“当前代码库正在由其他中心同步中,请稍后再试”。
- 一致性校验:提交前必须校验本地版本号是否等于全局最高版本号,若不一致则强制要求
update。
- 当研发中心 A 触发
- 原型示意:
3.2.2 高效增量同步引擎
- 需求描述:
-
- 传输层:支持
Zstd或LZ4高压缩比算法减少跨海缆带宽占用。 - 数据层:采用
SVN Admin Dump --incremental模式,仅提取增量修订版 。 - 导入层:目标中心接收后,采用流水线作业,边下载边
load,减少磁盘 I/O 等待。
- 传输层:支持
3.2.3 快速恢复补救方案
- 需求描述:
-
- 断点续传:同步过程中网络中断,恢复后支持从上次失败的版本号继续拉取。
- 强制重同步(Force Sync) :若本地库损坏,支持一键从其他中心拉取全量快照进行覆盖恢复。
- 日志追溯:记录每次 G-Lock 的获取时间、持有中心及释放状态,方便审计 。
3.3 非功能需求
- 性能:单次版本同步(100MB以内)在跨中心延迟 200ms 下,需在 10s 内完成对齐。
- 可靠性:仲裁中心需部署高可用集群,防止单点故障导致全球无法提交。
- 安全性:中心间数据传输必须经过 TLS 加密。
3.4 状态机与异常处理设计(基于 svnrdump + hook 机)
本章节基于 svnrdump + pre-commit / post-commit hook + 异步同步任务 的实际技术方案,对状态机、锁语义和异常处理进行修订与细化,确保方案可直接实现。
3.4.1 分布式 SVN 群组模型
- 一个 分布式 SVN 群组(SVN Group) 包含多个 SVN 仓库节点
- 任意时刻:
-
- 仅允许一个 Master Node(最近一次成功提交的节点)
- 群组维护一个 全局版本号(group_revision)
入组规则:
- 第一个加入群组的仓库可为非空库
- 后续加入群组的仓库 必须为空库,通过全量同步完成初始化
3.4.2 Repo / 群组状态机
| 状态 | 含义 | 是否允许提交 | 说明 |
|---|---|---|---|
| READY | 群组版本一致 | ✅ | 正常可提交 |
| LOCKED | 有节点持有提交锁 | ❌(其他节点) | 锁与 node_id 绑定 |
| SYNCING | post-commit 同步任务执行中 | ❌ | 防止版本前移 |
| DEGRADED | 部分节点未同步 | ❌ | 允许释放锁 |
| BROKEN | 群组元数据异常 | ❌ | 仅允许运维介入 |
3.4.3 提交锁(Commit Lock)语义(核心)
锁模型
- 锁粒度:SVN Group 级
- 锁字段:
group_id + holder_node_id + lease_expire_at - 锁模式:租约锁(Lease) ,支持超时回收
pre-commit 阶段逻辑(强校验)
- 判断当前仓库是否属于某分布式 SVN 群组
- 若是:
-
- 校验是否已持有提交锁
- 若未持有锁:
-
-
- 尝试获取锁(若锁已释放或超时)
-
-
- 校验:
local_max_revision == group_revision
- 校验:
- 校验通过:
-
- 更新群组
master_node_id = current_node - 放行 commit
- 更新群组
- 校验失败:
-
- 直接拒绝提交(返回明确错误原因)
⚠️ pre-commit 阶段 不做任何同步行为,只做一致性与锁校验。
3.4.4 post-commit 阶段逻辑(状态推进)
- 本地 commit 成功
- 必须成功更新群组
group_revision = local_max_revision
-
- 若失败:
-
-
- 标记群组状态为
BROKEN - 阻断后续所有提交
- 标记群组状态为
-
- 查询所有从节点(slave nodes)版本号
- 为每个 在线且版本落后 的节点生成异步同步任务:
-
- 同步方式:
svnrdump dump --incremental→svnrdump load
- 同步方式:
- post-commit 结束,不阻塞用户返回
3.4.5 同步任务状态机(svnrdump)
| 状态 | 含义 |
|---|---|
| CREATED | 已创建任务 |
| RUNNING | dump / load 执行中 |
| SUCCESS | 同步完成 |
| FAILED_NET | 网络不可达 |
| FAILED_TIMEOUT | 网络超时 |
3.4.6 提交锁释放规则(关键修订)
后台任务统一管理锁释放:
- 若 所有同步任务 SUCCESS:
-
- 释放提交锁
holder_node_id = null
- 若存在失败任务:
-
FAILED_NET:
-
-
- 本次忽略该节点
-
-
FAILED_TIMEOUT:
-
-
- 自动重试 3 次
- 仍失败则忽略该节点
-
-
- 无论是否存在失败节点,均释放提交锁
设计目的:保证 CP 前提下避免全局阻塞。
3.4.7 节点主动追赶机制(Anti-Entropy)
每个 SVN 仓库本地部署 版本检查服务:
- 执行周期:每 60 秒
- 检查条件:
-
local_revision < group_revision- 且当前无同步任务执行
- 行为:
-
- 主动向
master_node_id发起同步请求 - 同步方式仍使用 svnrdump 增量模式
- 主动向
最终保证:所有在线节点 最终追平群组版本。
3.4.8 关键异常场景补充
| 场景 | 处理策略 |
|---|---|
| pre-commit 后节点崩溃 | 锁租约到期后可被其他节点获取 |
| post-commit 更新版本失败 | 群组标记 BROKEN,禁止提交 |
| master 节点下线 | 从节点通过版本检查服务触发追赶 |
| 锁释放前节点失联 | 后台任务或租约回收 |
5. 设计取舍与非目标
5.1 设计取舍
- 选择 svnrdump 而非文件级 rsync:
-
- 保留 SVN revision 语义
- 支持精确版本对齐
- 锁释放不等待所有节点同步成功:
-
- 明确选择 CP + 最终补偿
- 通过主动追赶避免长期不一致
5.2 非目标(Non-Goals)
- 不支持多 Master 并发提交
- 不支持离线提交后自动合并
- 不保证所有节点实时可见最新版本
- 不解决 SVN 本身的分支 / merge 冲突
4. 人员&排期
| 阶段 | 任务 | Q1 | Q2 | Q3 |
|---|---|---|---|---|
| 阶段 1 | 分布式锁逻辑研发 & 环境搭建 | ● | ||
| 阶段 2 | 增量传输优化与二进制差分测试 | ● | ||
| 阶段 3 | 容灾恢复工具与压力测试 | ● |