镜像同步基础:Harbor复制(Replication)机制原理、基于规则的同步策略、推拉模式对比

2.1 Harbor复制机制核心原理

Harbor的复制(Replication)模块是实现跨实例镜像分发与同步的核心引擎。其本质是一个异步任务调度系统,通过监听规则触发条件,将源Registry中的镜像元数据和Blob层数据迁移至目标Registry。

核心工作流: 规则匹配 → 任务分片 → 元数据同步 → Blob流式传输 → 状态回写

复制过程涉及以下关键组件:

  • Replication Controller: 常驻后台的调度器,负责轮询规则、拆分任务、管理并发。
  • Task Worker Pool: 可配置的并发工作线程池,每个Worker独立处理一个镜像的同步。
  • Transfer Manager: 负责实际的HTTP/HTTPS数据传输,支持Chunked传输与断点续传。
  • Status Recorder: 将每个任务的状态(成功/失败/进行中)持久化到数据库,供API和UI查询。
Harbor复制引擎内部架构 复制规则 (Policy) Replication Controller 任务队列 (Queue) Worker 1 Worker 2 Worker N Transfer Manager (HTTP/HTTPS 流式传输 + 断点续传) Status Recorder
关键设计点: Harbor复制采用“拉模式”作为默认传输方向——由目标实例主动向源实例发起请求。这种设计能有效避免源实例因推送压力过大导致性能抖动,同时便于在目标侧控制同步节奏。

2.2 基于规则的同步策略

Harbor通过复制规则(Replication Policy)实现高度灵活的同步策略。规则定义了“什么镜像”、“从哪里”、“到哪里”、“何时触发”以及“如何同步”五个维度。

2.2.1 规则核心属性

属性维度 配置项 说明
源 源Registry / 项目 / 仓库 / Tag过滤 支持正则表达式匹配仓库名和Tag,例如 nginx:1\.\d+
目标 目标Registry / 项目 / 仓库名重写 支持 {project}、{repository} 等占位符动态映射
触发模式 手动 / 事件驱动 / 定时 事件驱动依赖Webhook,定时依赖Cron表达式
同步模式 推模式 / 拉模式 决定由源主动推还是目标主动拉
覆盖策略 覆盖 / 跳过 / 保留 当目标已存在同名Tag时的处理方式
删除策略 同步删除 / 不同步删除 源端删除镜像后,是否同步删除目标端对应镜像

2.2.2 典型同步策略场景

  • 全量同步: 源项目下所有仓库和Tag全部复制到目标,适用于灾备场景。
  • 增量同步: 仅同步新推送或更新的镜像,通过事件驱动触发,降低带宽消耗。
  • 过滤同步: 使用正则匹配特定版本(如 release-.* 或 v[0-9]+\.[0-9]+),仅同步生产版本。
  • 多级分发: 从中心Registry同步到多个边缘站点,每个站点使用独立的拉规则。
基于规则的同步策略示例 源 Registry 项目: library 镜像: nginx, redis 复制规则引擎 过滤: nginx:1\.\d+ 触发: 事件驱动 目标 Registry 项目: prod-mirror 仅 nginx:1.x 版本 规则效果 源端 library/nginx:1.21 和 library/nginx:1.22 被同步到目标 prod-mirror/nginx:1.21 和 prod-mirror/nginx:1.22 源端 library/redis:latest 因不匹配正则,不会被同步

2.3 推模式 vs 拉模式对比

Harbor支持两种数据传输方向模式,理解其差异对架构设计和故障排查至关重要。

对比维度 推模式(Push) 拉模式(Pull)
发起方 源Registry主动向目标发送数据 目标Registry主动从源拉取数据
网络方向 源 → 目标(出站流量在源侧) 目标 → 源(入站流量在源侧)
防火墙要求 目标需开放端口供源连接 源需开放端口供目标连接
适用场景 中心化分发,源控制同步节奏 边缘站点主动同步,目标控制节奏
负载分布 源侧承担扫描和传输负载 目标侧承担扫描和传输负载
断点续传 支持(基于HTTP Range) 支持(基于HTTP Range)
多目标场景 源需维护多个连接,可能成为瓶颈 各目标独立拉取,源仅需被动响应
常见误区: 推模式并不比拉模式“快”。实际传输速度取决于网络带宽、并发数以及Blob大小。在跨机房或跨云场景中,拉模式通常更稳定,因为目标侧可以更好地控制重试和并发策略。

2.3.1 模式选择决策树

  1. 源侧网络出口带宽有限? → 优先使用拉模式,让目标侧主动拉取,避免源侧出站被打满。
  2. 目标侧防火墙策略严格? → 优先使用推模式,由源侧主动连接目标,减少目标侧入站规则配置。
  3. 需要中心化管控同步进度? → 优先使用推模式,源侧统一调度所有分发任务。
  4. 边缘站点数量多且网络不稳定? → 优先使用拉模式,每个边缘站点独立重试,互不影响。

2.4 复制任务生命周期

每个复制任务从创建到完成经历以下状态转换:

状态 说明 常见停留原因
Pending 任务已创建,等待Worker调度 Worker池满载,等待空闲Worker
In Progress 正在传输Blob层或元数据 大镜像传输中,或网络延迟
Succeeded 所有Blob和Manifest同步完成 —
Failed 传输过程中发生不可恢复错误 认证失败、磁盘空间不足、网络超时
Stopped 用户手动取消或系统强制终止 规则被禁用或超时策略触发
排查提示: 当大量任务卡在 Pending 状态时,应检查 replication.worker.count 配置是否过小。默认值为 10,可根据硬件资源适当调大,但需注意不要超过CPU核心数的2倍。