跳到主要内容

观察 DataSync:Trafficless Restore 与 PVC 数据同步

DataSync 负责把源集群 PVC 数据同步到目标集群。它通常通过 AppBackupAppRestore 驱动 Velero 完成备份和恢复。

如果需要先理解底层机制,见 数据同步原理

执行链路

  1. DataSync 根据策略触发。
  2. 在源集群创建 AppBackup。
  3. AppBackup 创建 Velero Backup。
  4. 备份数据写入对象存储。
  5. 在目标集群创建 AppRestore。
  6. AppRestore 创建 Velero Restore。
  7. 目标集群 PVC 数据恢复完成。
  8. DataSync 记录 last backup、last restore 和 history。

Trafficless Restore

Trafficless Restore 的目标是让 PVC 数据先到达目标集群,但不让 standby 工作负载提前对外服务。它通常与 ResourceSync 的 standby modifier 一起使用。

无 PVC 时的跳过行为

DataSync 只负责 PVC 数据。如果源端保护范围内没有可恢复 PVC,系统会把本次数据同步收敛为成功跳过:

  • 不创建或触发 AppBackup
  • 不创建 AppRestore
  • 不要求 StorageRepository 已经就绪。
  • DataSync.status.history 记录为 Skipped,统计时计入 completed,不计入 failed。

PVC 发现会同时检查两类来源:

  • 直接匹配保护命名空间和实例 labelSelector 的 PVC。
  • 匹配到的 Pod 所引用的 PVC。

因此,如果实例使用了 label selector,selector 需要能覆盖需要保护的 PVC,或者至少覆盖引用这些 PVC 的 Pod。否则 DataSync 会认为没有可恢复 PVC 并跳过。

跳过指定 PVC

如果只想在数据同步时跳过个别 PVC,例如 bk-job-pv-claim-job-locallicense-pvc-claim,优先在 PVC 上添加 Velero 排除注解:

kubectl -n blueking annotate pvc bk-job-pv-claim-job-local \
velero.io/exclude-from-backup=true --overwrite

kubectl -n blueking annotate pvc license-pvc-claim \
velero.io/exclude-from-backup=true --overwrite

如果该 PVC 仍被工作负载 Pod 通过文件系统备份路径挂载,还需要在工作负载 Pod template 上排除对应 volume 名称。示例:

kubectl -n blueking patch deploy <workload-name> --type merge -p '{
"spec": {
"template": {
"metadata": {
"annotations": {
"backup.velero.io/backup-volumes-excludes": "job-local,license"
}
}
}
}
}'

backup.velero.io/backup-volumes-excludes 的值是 Pod 中的 volume 名称,不是 PVC 名称。执行前用下面命令确认映射:

kubectl -n blueking get pod <pod-name> \
-o jsonpath='{range .spec.volumes[*]}{.name}{" -> "}{.persistentVolumeClaim.claimName}{"\n"}{end}'

查看状态

kubectl get datasync -l testudo.softcdata.com/instance=<name>
kubectl get datasync <name> -o yaml
kubectl get appbackup,apprestore -l testudo.softcdata.com/datasync=<name>

在控制台中,可以从实例详情或任务事件查看同步结果。

任务事件

健康标准

  • 最近一次数据同步成功。
  • DataSync history 中有备份和恢复名称。
  • 目标集群 PVC 已恢复。
  • 目标侧工作负载没有提前对外服务。
  • 对象存储容量增长符合预期。

常见问题

  • 数据量大导致 RPO 达不到策略周期。
  • 目标 StorageClass 不兼容。
  • Velero PodVolumeRestore 失败。
  • 备份成功但目标集群 BSL 不可用。
  • standby Pod 被错误扩容,提前访问外部系统。
  • 实例 label selector 没有命中 PVC 或挂载 PVC 的 Pod,导致 DataSync 被判定为无 PVC 并跳过。