数据库备份恢复自动化(K8s/Operator 视角)

共 19 题
📑 题目列表 19 题
#
★★★

1. k8s 中数据库备份的 CronJob 与快照

在 Kubernetes 中如何用 CronJob 与快照实现数据库备份?

  • CronJob 的定时调度与 Job 生命周期
  • 快照(VolumeSnapshot)与逻辑备份
  • 与 Operator 对比

CronJob 是 Kubernetes 原生定时任务,按 Cron 表达式在指定时间创建 Job 执行备份。数据库备份在 k8s 中主要有两种方式:1)逻辑备份:通过 CronJob 运行 mysqldump/pg_dump 等工具,将数据导出为文件,上传到对象存储(如 S3);2)快照备份:通过 VolumeSnapshot(由 CSI 提供)对数据库的 PV 做时间点存储快照,快速且具备一致性。CronJob 的实现:定义带备份脚本的 Pod 模板,调度到指定时间执行,Job 完成后可自动清理(historyLimit)。用 CronJob 做备份简单直接,但"裸 CronJob"缺乏状态管理——无法感知备份成功与否、无法做重试/告警/保留策略,也难以与数据库状态(如 lock table、一致性)协调。因此生产实践常由 Operator 在 CronJob 之上封装或直接用 Operator 的备份 CR,以获得状态机、重试与告警。快照备份适合"快速、低侵入"的备份,CronJob 适合逻辑导出与上传。

CronJob 提供"定时触发",快照提供"快速一致性捕获"。裸 CronJob 的局限是无状态与缺乏语义,Operator 用 Backup CR 封装后获得状态机、重试与保留策略,是更完善的方案。

apiVersion: batch/v1
kind: CronJob
metadata:
  name: mysql-backup
spec:
  schedule: "0 2 * * *"
  successfulJobsHistoryLimit: 3
  jobTemplate:
    spec:
      template:
        spec:
          restartPolicy: OnFailure
          containers:
          - name: backup
            image: mysql:8.0
            command: ["/bin/sh", "-c"]
            args:
            - mysqldump --all-databases | gzip | aws s3 cp - s3://backups/db-$(date +%F).sql.gz
#
★★★

2. 卷快照(VolumeSnapshot)与存储级备份

什么是卷快照(VolumeSnapshot)?它如何用于存储级备份?

  • VolumeSnapshot 的 API 与 CSI 支持
  • 快照与 PV 的关系、一致性
  • 快照恢复与保留

VolumeSnapshot 是 Kubernetes 原生 API 对象,由 CSI(Container Storage Interface)驱动提供,用于对 PV 创建时间点快照。它由三个资源组成:VolumeSnapshot(声明快照)、VolumeSnapshotClass(定义快照类与参数)、VolumeSnapshotContent(实际快照内容,类似 PV)。创建快照后,可基于快照恢复新 PVC(VolumeSnapshot 作为 dataSource),用于恢复数据库或克隆环境。快照的关键是"一致性":存储级快照捕获的是磁盘状态,若应用(数据库)在快照时正有未刷盘的数据或缓冲,则快照可能不一致。因此应用感知快照(application-consistent snapshot)需要先协调数据库(如 MySQL 的 LOCK TABLES / FLUSH TABLES WITH READ LOCK,或使用 Percona 的转储与快照结合),再触发存储快照,最后解锁。快照的优势是恢复快(秒级)、占用低、对存储层高效;缺点是依赖 CSI 驱动的快照能力,且快照通常不能跨集群/跨存储迁移。保留策略通过快照的删除(清理 VolumeSnapshotContent)实现。

VolumeSnapshot 是"存储级备份"的载体,核心价值是"快速"与"低成本"。但要保证数据一致性,必须与应用协调(应用感知快照),否则恢复出的数据可能损坏。

apiVersion: snapshot.storage.k8s.io/v1
kind: VolumeSnapshot
metadata:
  name: mysql-snap
spec:
  volumeSnapshotClassName: csi-snap-class
  source:
    persistentVolumeClaimName: data-mysql-0
#
★★★

3. Point-in-Time 恢复在 k8s 的自动化

Point-in-Time 恢复(PITR)在 Kubernetes 上如何自动化?

  • PITR 的原理(全量备份 + binlog/WAL 重放)
  • 在 k8s 的自动化流程与 Restore CR
  • 时间点选择与验证

PITR(Point-in-Time Recovery)指恢复到某个特定时间点的数据状态,原理是"全量备份 + 日志重放":先恢复一个全量备份(基础备份),再重放该时间点之后的 binlog/WAL 日志到目标时间点。在 k8s 上,自动化由 Operator 实现:用户通过 Restore/Clone CR 声明"恢复源 + 目标时间点",Operator 创建新集群、从对象存储拉取全量备份、初始化数据、然后重放 WAL/binlog 直到目标时间点,最后将新集群置为可用。关键的自动化点:1)备份与 WAL 归档持续进行(持续写入对象存储);2)记住全量备份与 WAL 的对应关系,保证重放链完整;3)处理时间点选择(如 2024-01-01 12:00:00)与部分恢复(schema 恢复);4)恢复完成后校验数据并更新端点。自动化 PITR 能显著降低 RTO,并把"恢复"从人工操作变成声明式任务。

PITR 的自动化依赖"持续归档日志 + 全量备份 + 重放引擎"。Operator 把"拉备份、初始化、重放日志、就绪"封装为状态机,让用户只需声明目标时间点即可恢复。

apiVersion: postgresql.cnpg.io/v1
kind: Cluster
metadata:
  name: pg-restored
spec:
  bootstrap:
    recovery:
      source: pg-cluster
      recoveryTarget:
        targetTime: "2024-01-01 12:00:00"
  instances: 2
  storage: { size: 100Gi }
#
★★★

4. 备份校验与恢复演练的流水线

如何构建备份校验与恢复演练的流水线?

  • 备份可恢复性验证的必要性
  • 自动化校验流程(恢复 + 校验 + 清理)
  • 与 CI/CD 结合及告警

备份"能备份"不等于"能恢复",必须定期验证。恢复演练流水线一般包含:1)触发:定期(如每月)或在新备份后触发;2)恢复:自动从备份创建一个临时/隔离的恢复集群(或恢复副本);3)校验:在恢复集群上运行数据校验(行数对比、checksum、关键查询、约束检查、SELECT count(*) 对账);4)验证结果:对比源库与恢复库的数据一致性,生成报告;5)清理:删除临时恢复环境,释放资源;6)告警:校验失败触发告警并通知。实现上可结合 CronJob/CI 流水线(如 Jenkins/GitLab CI)与 Operator 的恢复能力,或使用专门的备份验证工具。恢复演练还能量化 RPO/RTO:记录从发起恢复到可用的时间,实测 RTO 是否达标。流水线应隔离在独立命名空间/集群,避免影响生产,并记录演练报告供审计。

校验流水线的核心是"让恢复可重复、可验证、可审计"。只有定期演练并实测 RTO,才能确保灾难发生时备份真的可用。自动化 + 告警是把"备份"从"账面动作"变成"真实保障"。

# 恢复演练流水线:恢复 + 校验 + 清理
steps:
  - name: restore
    run: kubectl apply -f restore-cluster.yaml
  - name: wait-ready
    run: kubectl wait --for=condition=Ready pg/restored --timeout=600s
  - name: verify
    run: |
      kubectl exec pg/restored -- psql -c "SELECT count(*) FROM orders" > restored.txt
      psql -c "SELECT count(*) FROM orders" > prod.txt
      diff restored.txt prod.txt && echo "BACKUP VALID"
  - name: cleanup
    run: kubectl delete -f restore-cluster.yaml
#
★★★

5. 备份策略设计,全量 + 增量 + binlog/WAL 归档的 RPO/RTO 组合与恢复顺序

如何设计全量 + 增量 + binlog/WAL 归档的备份策略,并说明其 RPO/RTO 组合与恢复顺序?

  • 备份金字塔(全量/增量/日志归档)的职责
  • RPO/RTO 与备份频率的关系
  • 恢复顺序(全量→增量→日志)

备份策略由三层构成:全量备份(基础,定期做,如每周)、增量备份(在全量基础上做增量,如每天)、binlog/WAL 日志归档(持续实时记录,如每 5 分钟或持续)。各自职责:全量提供"恢复基线",增量减少每轮备份的数据量,日志归档提供"恢复到任意时间点"的能力(最小 RPO)。RPO/RTO 组合:主业准实时(如日志归档粒度 5 分钟),RPO≈5 分钟;全量+增量+日志可恢复到任意时间点;RTO 由恢复步骤决定——先恢复全量(最慢),叠加增量(次之),最后重放日志(到达目标点),三步串行决定总恢复时间。设计要点:全量备份频率决定"需要重放多少日志"(影响 RTO),日志归档频率决定 RPO;要保证日志连续(无缺口),做好日志的保留与全量/增量的对应关系;恢复顺序固定为"最新全量 → 之后的所有增量 → 目标点的日志"。这套组合在 RPO(更小)、RTO(更快)、存储成本(更省)之间取得平衡。

三层备份是"时间换空间"的经典组合:全量保证基线、增量压缩备份量、日志保证最小 RPO。恢复顺序必须是"全量→增量→日志",且日志必须连续无缺口,否则无法 PITR。

#
★★★

6. K8s 备份为何用 Backup/Restore CRD 而非裸 CronJob?备份 CR 的状态机(Pending/Running/Completed/Failed)如何驱动重试与告警?

为什么 Kubernetes 备份用 Backup/Restore CRD 而非裸 CronJob?备份 CR 的状态机如何驱动重试与告警?

  • CRD 与 CronJob 在状态管理上的差异
  • 备份状态机(Pending/Running/Completed/Failed)
  • 重试、告警与幂等

裸 CronJob 只有"定时执行 Job",没有备份语义:无法记录备份结果、无法区分成功/失败、无法做重试与保留、难以与数据库状态协调。Backup/Restore CRD 把备份建模为"资源",携带 spec(目标、策略、存储)与 status(状态机),Controller 据此调度执行、更新状态、驱动重试与告警。状态机:Pending(已创建等待执行)→ Running(执行中)→ Completed(成功)或 Failed(失败);Failed 可重试(重新入队重跑或由用户重试)。状态机驱动:Controller 依据 status 决定动作——Pending 触发备份任务、Running 持续推进、Completed 触发保留清理与成功通知、Failed 触发告警(如通过事件/Alertmanager)并可选自动重试。此外,CRD 幂等:基于 status 判断是否已执行,避免重复备份。相比裸 CronJob,CRD 让备份可观测(可查询 status)、可编排(关联依赖)、可声明(Spec 描述期望),是生产级备份的基础。

核心差异是"语义与状态"。CRD 把备份变成可管理、可观测、可重试、可告警的状态机资源,而裸 CronJob 只是"无脑定时执行",无法满足生产备份的可靠性要求。

apiVersion: backup.example.com/v1
kind: Backup
metadata:
  name: db-backup-2024-01-01
spec:
  cluster: mysql-cluster
  method: full
  storage: s3://backups
status:
  phase: Running      # Pending -> Running -> Completed/Failed
  startTime: "2024-01-01T02:00:00Z"
  retryCount: 0
#
★★★

7. 应用感知备份(application-consistent snapshot)如何实现?Operator 如何在备份前协调锁表或暂停写入并保证快照内数据一致?

应用感知备份(application-consistent snapshot)如何实现?Operator 如何在备份前协调锁表或暂停写入保证快照一致性?

  • 崩溃一致 vs 应用一致 vs 备份一致
  • 锁表/暂停写入的协调流程
  • Operator 的备份协调逻辑

存储快照默认是"崩溃一致"(crash-consistent):捕获磁盘时内存中未落盘的数据(如 MySQL 的 buffer pool、redo log 缓冲)不在快照中,恢复后可能处于不一致状态。应用感知备份(application-consistent)通过协调应用,让快照时刻应用处于一致状态。对数据库,实现的关键是"在快照前冻结写入并落盘",典型流程:1)Operator 或备份脚本在数据库执行 FLUSH TABLES WITH READ LOCK(MySQL)或 pg_backup_start/SET TRANSACTION READ ONLY 同步机制(PostgreSQL 的 pg_start_backup),使所有数据页落盘并暂停写入;2)在锁表/暂停写入期间触发存储层快照(VolumeSnapshot);3)快照完成后解锁(UNLOCK TABLES / pg_stop_backup),恢复写入。这样快照内的数据页与日志是自洽的,恢复后无需额外修复。Operator 的协调逻辑:备份 CR 触发时,先在该实例执行一致性标记(如通过 predefined 的 SQL 或 postgres 的 backup 协议),再调用 CSI 快照,最后释放锁,并把整个流程纳入状态机。对 PostgreSQL,常配合 WAL 归档实现"快照 + WAL"的完整一致性。

应用一致的本质是"让快照跨越应用的全部一致状态"。锁表(冻结)→ 落盘 → 快照 → 解锁,是保证"快照内数据自洽"的标准流程。Operator 用状态机把锁、快照、解锁串成原子步骤,避免锁与快照错位。

-- MySQL 应用感知快照前的协调
FLUSH TABLES WITH READ LOCK;
-- (此时触发 VolumeSnapshot)
UNLOCK TABLES;
-- PostgreSQL
SELECT pg_backup_start('snapshot', true);
-- (触发 VolumeSnapshot)
SELECT pg_backup_stop();
#
★★

8. 数据库 Operator 的 PITR 能力差异

不同数据库 Operator 的 PITR(Point-in-Time 恢复)能力有何差异?

  • 各 Operator 的备份与 PITR 实现
  • 日志归档与恢复点精度
  • 选型差异

不同 Operator 的 PITR 能力差异主要体现在:日志归档的连续性、恢复点精度、恢复方式与易用性。例如:CloudNativePG(CNPG)原生深度集成 PITR,通过持续 WAL 归档(Barman)支持恢复到任意时间点,恢复点精度可达秒级,且提供 recoveryTarget 声明式恢复;Zalando Postgres Operator 依赖 WAL-E/WAL-G 实现 WAL 归档与 PITR,恢复需手动指定恢复点;Percona Operator for MySQL/PostgreSQL 提供 PITR,通过 binlog/WAL 持续收集实现;而某些简单 Operator 可能只支持全量备份恢复,不支持 PITR。差异还体现在:恢复点精度(秒级 vs 分钟级)、是否支持恢复到指定事务/时间点、WAL 归档的可配置性(保留策略、压缩)、恢复后是否自动更新集群。选型时,若业务对 PITR 要求高(希望随时恢复到任意秒),应选支持持续 WAL 归档 + 高精度恢复点的 Operator(如 CNPG)。

PITR 能力取决于"日志归档的连续性 + 恢复引擎的精度"。评估 Operator 时,重点看它是否持续可靠归档 WAL/binlog、恢复点精度、以及恢复是否声明式可编排。

#
★★

9. 数据库备份的密钥管理与加密配置如何做,密钥轮换与恢复流程如何设计?

数据库备份的密钥管理与加密配置怎么做?密钥轮换与恢复流程如何设计?

  • 备份加密的实现(透明加密/静态加密)
  • 密钥管理(KMS/Secret)与恢复
  • 密钥轮换与恢复流程

备份加密通常指"静态加密"(at-rest encryption):备份文件用加密密钥加密后存储(如对象存储上的加密)。实现方式:1)用 KMS(如 AWS KMS、云厂商 KMS、Vault)管理密钥,备份时用密钥加密,恢复时用密钥解密;2)在 k8s 中用 Secret 配置密钥,但更推荐用 KMS 密钥引用(避免明文落盘)。恢复流程:恢复时需用正确的密钥解密备份,因此密钥必须与备份对应且可恢复——若密钥丢失,备份将无法解密。密钥轮换设计:定期轮换密钥,轮换时用新密钥加密新备份,但旧备份仍用旧密钥(需保留旧密钥用于历史恢复),或采用"信封加密"(envelope encryption):用数据密钥(DEK)加密数据,用主密钥(KEK)加密 DEK,轮换 KEK 时只需重新加密 DEK,无需重加密数据。恢复流程:密钥轮换后,恢复旧备份需能找到当时的 KEK 解密 DEK,所以密钥管理需保留历史版本密钥并支持按版本恢复。业务上应把密钥管理与备份生命周期绑定,避免密钥过期导致备份不可恢复。

备份加密的核心是"密钥可用性"与"密钥轮换不影响历史恢复"。信封加密 + KMS 保留历史密钥版本,是兼顾"安全加密"与"可恢复性"的标准设计。

#
★★

10. 备份数据落地对象存储与生命周期

数据库备份数据如何落地对象存储并管理其生命周期?

  • 对象存储作为备份目标(S3/MinIO)
  • 生命周期策略(归档、冷存、过期删除)
  • 跨区域复制与成本

对象存储(S3、OSS、MinIO、GCS)是备份数据的首选目标,因为它:容量大、便宜、MVCC 支持多版本、天然支持生命周期策略。备份落地:数据库备份通过备份工具(如 WAL-G、Barman、mysqldump 上传)写入对象存储的 bucket,按路径组织(如 bucket/cluster/backup-2024-01-01/)。生命周期管理:通过对象存储的生命周期规则(Lifecycle rule)自动处理——近期备份保留在标准存储(热),较旧备份自动转冷存(如 IA/Glacier/Archive)以降低成本,达到保留期后自动删除。同时可配置跨区域复制(CRR)把备份复制到另一区域,实现容灾与合规。设计要点:备份路径与保留策略对齐(如按日期/版本组织),生命周期规则与备份保留策略一致,对关键备份设多版本或不可变(immutable)保护,监控存储用量与成本。对象存储的 versioning 与 lifecycle 能实现"自动归档 + 自动清理 + 防误删"。

对象存储的价值在于"低成本 + 生命周期自动化"。把备份分层级(热/温/冷)并配置生命周期规则,能自动归档、降本、清理过期备份,同时用跨区域复制保障容灾。

// S3 生命周期规则示例
{
  "Rules": [
    {
      "ID": "backup-tier",
      "Filter": { "Prefix": "backups/" },
      "Status": "Enabled",
      "Transitions": [
        { "Days": 30, "StorageClass": "STANDARD_IA" },
        { "Days": 90, "StorageClass": "GLACIER" }
      ],
      "Expiration": { "Days": 365 }
    }
  ]
}
#
★★

11. 恢复演练的可观测与告警

恢复演练的可观测性与告警如何设计?

  • 演练状态与指标的可观测
  • 成功/失败告警
  • 演练报告与审计

恢复演练的可观测性指"演练过程可追踪、结果可量化、状态可查询"。设计要点:1)指标:演练的 RTO(恢复耗时)、成功率、备份可用性、恢复集群健康状态等,通过 Prometheus 采集并展示;2)日志:记录演练的每一步(恢复开始、就绪、校验、清理)及耗时,便于排障;3)状态:用 Backup/Restore CR 的 status 直观展示演练状态,或通过 Dashboard 展示;4)告警:演练失败、备份不可恢复、RTO 超阈值、恢复集群异常时触发告警(Alertmanager、邮件、IM),通知负责人;5)审计:保留演练记录与校验报告,供合规审计与复盘。告警应区分"备份缺失""校验失败""恢复超时"等不同级别,并关联到负责人。通过持续演练与可观测,能提前发现备份链路问题,避免灾难时才发现备份不可用。

可观测性让"演练"从黑盒变成可量化、可审计的过程。核心是"指标 + 日志 + 状态 + 告警"四件套,把演练失败当生产事故对待,及时暴露备份风险。

#
★★

12. K8s 数据库备份方案,Velero、K10、云原生备份 Operator(Percona/CloudNativePG)的差异与选型?

对比 Velero、K10 与云原生备份 Operator(Percona/CloudNativePG)在数据库备份上的差异与选型?

  • 各方案的定位与能力
  • 数据库感知备份 vs 通用备份
  • 选型原则

Velero 是 Kubernetes 通用备份/恢复工具,用于备份整个集群资源(Pod、部署、PV 快照),主要做"应用的迁移与灾难恢复",对数据库的备份是"存储级快照 + 资源备份",不做数据库逻辑备份,也不了解数据库一致性(除非配合应用 Hook)。K10(Kasten)是商用 K8s 数据管理平台,提供应用感知备份、数据库集成(通过 Kanister 蓝图)、跨集群恢复、策略管理,比 Velero 更企业级。CNPG/Percona 等数据库 Operator 是针对数据库的深度备份:了解数据库语义,提供逻辑备份、PITR、WAL 归档、一致性协调、恢复编排。选型:若只需"资源级迁移与灾难恢复",Velero 足够;若需"企业级数据管理 + 数据库感知 + 策略",选 K10;若需"数据库强语义的备份(PITR、逻辑备份、一致性)",选数据库 Operator(CNPG/Percona)。实践中常组合:Operator 负责数据库 PITR,Velero/K10 负责集群级资源与配置备份。选择依据是"备份粒度和数据库语义需求"。

差异本质是"备份的粒度和数据库感知程度":Velero 是资源级通用备份,K10 是数据管理平台(含数据库集成),Operator 是数据库深度备份。按"是否需要 PITR/逻辑备份/一致性"选型,常组合使用。

#
★★

13. 备份的验证与恢复演练,如何自动化"备份可恢复性"验证(恢复时间目标 RTO 实测)?

如何自动化验证"备份可恢复性"并实测恢复时间目标(RTO)?

  • 可恢复性验证的自动化流程
  • RTO 实测方法
  • 持续验证与告警

自动化恢复可恢复性验证的核心是"把备份真实恢复一次并校验"。流程:1)定时(如每天/每周)从最新备份自动创建一个隔离的恢复环境(独立命名空间/集群);2)执行恢复(全量+增量+日志),期间记录时间戳;3)校验恢复环境的数据(count、checksum、约束、关键查询)与源库一致性;4)计算 RTO(从发起恢复到恢复环境可用的耗时),与目标阈值对比;5)清理临时环境;6)成功/失败结果写入报告并告警。实现上可用 CronJob 或 CI 流水线,配合 Operator 的 Restore CR 或备份工具完成恢复。RTO 实测 = 收到恢复请求 → 拉取备份 → 初始化 → 重放日志 → 就绪可用的总耗时。通过持续演练,能发现备份链路(存储、网络、密钥)与恢复脚本的问题,并量化 RTO 是否达标。若 RTO 超阈值,需优化(如并行恢复、更快的备份存储、减少日志重放量)。

可恢复性验证的本质是"真实恢复 + 校验 + 计时"。自动化地把"恢复"变成 CI 动作,用 RTO 实测值驱动优化,是备份可靠性的正确度量。

#
★★

14. 云原生备份,Velero/K10 与数据库 Operator 的备份接口?

Velero/K10 与数据库 Operator 的备份接口如何协同?

  • 通用备份工具的 Hook/Plugin 机制
  • 数据库 Operator 的备份接口(CRD/API)
  • 组合使用方式

Velero/K10 作为通用备份工具,通过插件(Plugin)和 Hook 机制与数据库协作:Velero 支持 Pre/Post Restore Hooks(在备份/恢复前后执行命令,如先执行 FLUSH TABLES WITH READ LOCK 再快照、完成后解锁),也支持自定义插件;K10 通过 Kanister 蓝图(Blueprint)定义数据库的备份/恢复动作(如执行 mysqldump 或协调副本)。数据库 Operator(CNPG/Percona)则提供专门的备份接口(Backup CR、Restore CR、PITR API),由 Operator 自己调度备份与恢复。协同方式:可在 Velero/K10 的 Hook 中调用数据库 Operator 的备份命令(如先触发 Operator 的备份,再备份资源);或让 Operator 负责"数据库数据备份",Velero/K10 负责"集群资源与配置备份",分工明确。K10 的 Kanister 蓝图能编排数据库感知操作,比 Velero 的简单 Hook 更细粒度。综上,通用备份工具通过 Hook/蓝图接口与数据库感知的 Operator 协作,实现"数据备份 + 资源备份"的完整覆盖。

协同本质是"通用层(资源/快照)+ 数据库层(语义/一致性)"的分工。Hook/Plugin/Blueprint 是通用工具与数据库对接的接口,让通用工具能调用数据库感知的备份动作。

#
★★

15. 物理备份(快照/克隆)与逻辑备份(mysqldump/pg_dump)的一致性保证与锁影响

物理备份(快照/克隆)与逻辑备份(mysqldump/pg_dump)在一致性保证与锁影响上有何差异?

  • 物理备份的崩溃一致与应用一致
  • 逻辑备份的一致性(transaction-consistent)与锁
  • 两者的性能影响与适用场景

物理备份(VolumeSnapshot/克隆、文件级拷贝)直接复制数据文件,速度快、占用小,但默认是"崩溃一致"——若要应用一致需配合锁表/一致性协调(如 FLUSH TABLES WITH READ LOCK 或 pg_start_backup)。逻辑备份(mysqldump/pg_dump)通过读取数据导出 SQL/数据文件,能保证"事务一致"(transaction-consistent):mysqldump 用 --single-transaction 基于 MVCC 得到一致快照,pg_dump 默认即一致快照。锁影响:逻辑备份在读取时可能加锁(mysqldump 不带 single-transaction 会加表锁,影响写入;pg_dump 默认对 DDL 有短暂锁),物理备份本身不锁表,但一致性协调阶段(FLUSH TABLES WITH READ LOCK)会短暂阻塞写入。性能影响:物理备份快、对在线负载影响小(快照)、恢复快;逻辑备份慢、耗费 CPU/IO、恢复慢,但可跨版本/跨平台恢复、便于局部恢复。适用:物理备份适合"快速、大规模、RTO 敏感"的全量备份;逻辑备份适合"跨版本迁移、逻辑过滤、局部恢复、小规模"场景。生产常组合:物理快照做快速全量,逻辑备份+binlog 做逻辑层面与 PITR。

差异核心是"一致性来源"与"锁影响":物理备份靠存储快照+协调,逻辑备份靠 MVCC 事务快照。物理备份快但需协调锁,逻辑备份有事务一致性但慢且可能锁,按场景组合。

#
★★

16. 全量加增量加日志归档的备份链如何管理保留策略?增量依赖全量时过期删除的顺序与孤儿备份如何处理?

全量 + 增量 + 日志归档的备份链如何管理保留策略?增量依赖全量时过期删除的顺序与孤儿备份如何处理?

  • 备份链的依赖关系(增量依赖全量)
  • 保留策略与删除顺序
  • 孤儿备份的识别与处理

备份链中,增量备份依赖其基础全量(或上一级增量),日志归档依赖全量与增量来定位恢复点。保留策略管理要考虑"依赖完整性":删除备份时,不能删除仍被增量/日志依赖的备份,否则恢复链断裂。删除顺序:先删最旧的、且不再被任何后续备份依赖的备份;通常策略是"先底层后……"——实际上应"先删孤儿(无依赖的过期备份),再逐级向前清理",确保删除后仍有一条完整可用链。孤儿备份:指其依赖的备份已被删除、或已不再被任何保留策略引用的备份,无法用于恢复。处理:定期扫描,识别并标记孤儿备份(其依赖已缺失),可安全清理以释放空间;或用"最小保留链"算法——从最新备份向前回溯,保留组成完整恢复链所需的全部备份,其余过期备份删除。实现上,用备份元数据(记录每个备份的父备份/依赖)驱动依赖图,删除时做可达性(图遍历)判断,避免误删。

关键是把"备份链"当作依赖图管理:删除前判断可达性,从未被依赖的过期备份开始清理,并周期扫描孤儿备份。保留策略应保证"任意保留点都能完整恢复"。

#

17. 备份数据的安全,加密、跨区域复制与勒索软件防护(immutable backup)如何落地?

备份数据的安全如何落地:加密、跨区域复制与勒索软件防护(immutable backup)?

  • 备份加密(静态与传输)
  • 跨区域复制容灾
  • 不可变备份(immutable/WORM)防勒索

备份数据安全的三层:1)加密:静态加密(备份文件用 KMS 密钥加密存储)与传输加密(上传走 TLS/HTTPS),确保备份在存储和传输中不可被窃取;2)跨区域复制:把备份复制到另一区域/站点,实现容灾与合规,避免单区域故障丢失备份;3)勒索软件防护(immutable backup):用不可变(immutable/WORM)存储,使备份在保留期内不可修改、不可删除,即使生产被勒索软件加密,攻击者也无法篡改或删除备份,从而可恢复。落地方式:对象存储的 object lock(WORM)或独立的不可变备份存储、备份文件的 ACL 与最小权限、备份账号与生产账号隔离、备份的定期恢复演练。设计要点:备份系统与生产系统隔离(含网络、账号、权限),备份具备不可变属性,加密密钥独立管理,防止攻击者"连同备份一起删/加密"。

防护核心是"让备份成为攻击者无法触及的城堡":加密保证不可读,跨区域复制保证不可丢,immutable 保证不可删不可改。三者共同抵御数据丢失与勒索威胁。

#

18. 备份的加密与跨区域复制,合规与容灾?

备份的加密与跨区域复制如何满足合规与容灾需求?

  • 加密与合规(数据保护法规)
  • 跨区域复制与容灾
  • 合规要求(审计、密钥管理)

备份加密主要满足合规需求:数据保护法规(如 GDPR、等保、行业合规)要求敏感数据(尤其备份,因备份泄露面更大)必须加密存储,并记录访问审计。做法:备份静态加密(KMS 管理的密钥)、传输加密(TLS)、密钥轮换、访问审计日志。跨区域复制满足容灾需求:将备份复制到不同区域/站点,保证在本地区域故障(地震、网络、机房)时,其他区域仍有可用备份可恢复,同时满足合规对"异地容灾/数据驻留"的要求。合规还要求:密钥管理符合规范(KMS 集中管理、权限隔离、审计)、备份保留符合法规期限、跨区域复制的数据主权(数据不能跨不合规的国境)。设计上,把"加密 + 复制 + 保留 + 审计"作为备份策略的内置属性,用策略(Policy)统一管理,并出具合规报告。

加密主要服务于"合规"(防泄露、可审计),跨区域复制主要服务于"容灾"(防单点故障)。两者共同构成备份安全的"合规 + 容灾"双翼,并需满足数据主权与审计要求。

#

19. 多集群备份的命名空间与集群维度如何隔离?备份数据的租户权限与跨集群恢复如何设计?

多集群备份在命名空间与集群维度如何隔离?备份数据的租户权限与跨集群恢复如何设计?

  • 备份的命名空间隔离与集群隔离
  • 租户权限模型(RBAC)
  • 跨集群恢复

多集群备份的隔离分两个维度:1)命名空间维度:备份按命名空间隔离,每个租户/应用的备份存储在其命名空间对应的路径/存储,避免互相覆盖;2)集群维度:不同集群的备份分开存储(如 S3 按集群前缀/路径组织),防止跨集群混淆。租户权限:用 RBAC 控制"谁能发起备份、谁能查看/删除备份、谁能恢复",备份存储的访问权限(object storage 的 ACL/IAM)按租户最小化授权,避免租户间越权。跨集群恢复:把备份数据(对象存储)在目标集群拉取,用备份的命名空间偏移/重映射(如把备份 tenant-a 恢复到命名空间 tenant-a-dev)实现迁移;恢复时需校验权限与数据一致性,并处理命名空间冲突。设计要点:备份元数据携带集群/命名空间/租户标识,存储按集群-命名空间-租户分层组织,跨集群恢复通过映射规则实现,审计记录每次备份与恢复。

隔离的核心是"按集群/命名空间分桶 + 按租户最小权限"。跨集群恢复通过"存储可访问 + 命名空间映射 + 权限校验"实现,需清晰标识备份归属。