3. etcd 备份策略:快照备份、WAL 日志备份、增量备份与全量备份对比

etcd 作为 Kubernetes 集群的“状态中枢”,其数据完整性直接决定了灾备恢复的 RPO(恢复点目标)。不同的备份策略在存储开销、恢复速度、数据一致性保障上差异显著。本章从工程实践角度,系统对比快照备份、WAL 日志备份、增量备份与全量备份四种核心策略,帮助 SRE 根据业务容忍度选择最优组合。

3.1 四种备份策略核心概念

备份类型 数据范围 典型工具/命令 恢复粒度 存储开销
快照备份 etcd 当前完整 KV 状态 + 元数据 etcdctl snapshot save 全量恢复 中等(压缩后通常 50~200 MB)
WAL 日志备份 etcd 写入操作的预写日志文件 文件系统级复制(rsync / cp) 按时间点回放 高(日志持续增长)
增量备份 自上次备份以来的变更事件 etcd 事件流 + 自定义脚本 增量合并恢复 低(仅存储 diff)
全量备份 etcd 数据目录完整副本 文件系统快照 / 冷备 全量替换 高(与数据目录一致)
工程经验: 生产环境推荐“快照备份 + WAL 日志备份”组合策略。快照提供可恢复的基线,WAL 日志提供秒级 RPO 的增量回放能力。纯增量备份在 etcd 场景下实现复杂,通常仅用于跨集群同步。

3.2 快照备份:最可靠的基线

快照备份通过 etcdctl snapshot save 命令生成 etcd 当前数据的一致快照。该命令会触发 etcd 内部的 一致性快照 机制,确保所有已提交的写入操作都被包含在快照文件中。

# 创建快照
ETCDCTL_API=3 etcdctl --endpoints=https://127.0.0.1:2379 \
  --cacert=/etc/kubernetes/pki/etcd/ca.crt \
  --cert=/etc/kubernetes/pki/etcd/server.crt \
  --key=/etc/kubernetes/pki/etcd/server.key \
  snapshot save /backup/etcd-snapshot-$(date +%Y%m%d%H%M%S).db

# 查看快照状态
ETCDCTL_API=3 etcdctl snapshot status /backup/etcd-snapshot-20250321140000.db
关键参数: 快照文件包含所有 key-value 数据、租约信息、成员列表和集群元数据。恢复时无需额外 WAL 日志,可直接启动新 etcd 实例。

3.3 WAL 日志备份:实现秒级 RPO

WAL(Write-Ahead Log)是 etcd 保证数据持久化的核心机制。每次写入操作先追加到 WAL 文件,再应用到内存状态机。备份 WAL 日志可以实现 增量恢复,将 RPO 从小时级降低到秒级。

# 备份 WAL 日志(需停止 etcd 或使用文件系统快照)
# 生产环境建议使用 LVM 快照或云存储快照实现原子备份
cp -r /var/lib/etcd/member/wal /backup/wal-$(date +%Y%m%d%H%M%S)

# 恢复时:先恢复快照,再回放 WAL 日志
# 1. 恢复快照到数据目录
# 2. 将备份的 WAL 日志复制到 member/wal 目录
# 3. 启动 etcd,自动回放未应用的日志条目
注意: WAL 日志备份必须与快照备份的时间点对齐。如果 WAL 日志早于快照时间,回放时会因日志不连续导致数据损坏。建议使用 etcdctl snapshot status 记录快照的 Revision,确保 WAL 日志的起始位置不早于该 Revision。

3.4 增量备份 vs 全量备份:场景与取舍

在 etcd 生态中,“增量备份”通常指通过 Watch API 持续监听 key 变更事件,并将变更记录存储到外部系统(如对象存储、Kafka)。全量备份则是定期对整个数据目录或快照文件进行完整复制。

对比维度 增量备份 全量备份
备份耗时 低(仅传输变更事件) 高(传输全部数据)
恢复复杂度 高(需按顺序合并增量到基线) 低(直接替换数据目录)
数据一致性 依赖事件顺序和幂等性 强一致性(快照保证)
适用场景 跨集群同步、异地灾备 本地恢复、集群重建
存储成本 低(长期保留成本可控) 高(每次全量存储)
实践建议: 不要用纯增量备份替代快照备份。增量备份的恢复链路长,容易因事件丢失或乱序导致数据不一致。正确的做法是:全量快照(每日)+ WAL 日志(持续)+ 增量事件(可选),三层叠加保障。

3.5 备份策略对比总览

etcd 备份策略对比:RPO / RTO / 存储开销 快照备份 RPO:1 小时 ~ 1 天 RTO:5 ~ 15 分钟 存储:中等 一致性:强 推荐:基线备份 WAL 日志备份 RPO:秒级 RTO:10 ~ 30 分钟 存储:高(持续增长) 一致性:强(需对齐) 推荐:增量回放 增量备份 RPO:秒级 ~ 分钟级 RTO:30 分钟 ~ 2 小时 存储:低 一致性:弱(依赖顺序) 推荐:跨集群同步 全量备份 RPO:1 天 RTO:5 ~ 10 分钟 存储:高 一致性:强 推荐:冷备/迁移 推荐组合策略: 快照备份(每日基线)+ WAL 日志备份(持续增量)+ 增量事件(可选跨集群同步) 恢复流程对比 快照 + WAL 恢复 1. 恢复快照到数据目录 2. 复制 WAL 日志到 member/wal 3. 启动 etcd,自动回放日志 全量备份恢复 1. 停止 etcd 服务 2. 替换整个数据目录 3. 启动 etcd,无需额外操作 增量备份恢复 1. 恢复基线快照 2. 按时间顺序回放增量事件 3. 校验最终数据一致性

3.6 备份策略选择矩阵

根据业务对 RPO 和 RTO 的容忍度,SRE 可以选择不同的备份组合。以下矩阵总结了常见场景下的推荐策略:

业务场景 RPO 要求 RTO 要求 推荐备份策略 存储成本
金融核心交易 < 5 秒 < 5 分钟 快照(每小时)+ WAL 日志(持续) 高
电商平台 < 1 分钟 < 15 分钟 快照(每小时)+ WAL 日志(持续) 中高
CI/CD 系统 < 1 小时 < 30 分钟 快照(每 6 小时)+ 全量备份(每日) 中
开发测试环境 < 1 天 < 1 小时 全量备份(每日) 低
跨地域灾备 < 5 分钟 < 1 小时 快照(每小时)+ 增量事件同步 中
常见陷阱: 不要只依赖 WAL 日志备份而不做快照。WAL 日志是 append-only 的,etcd 会定期压缩(compact)旧日志。如果快照间隔过长,压缩后的 WAL 日志可能无法完整回放到最新状态。建议快照频率与 etcd 的 --auto-compaction-retention 参数对齐。

3.7 备份策略自动化示例

以下是一个生产级备份脚本框架,结合快照和 WAL 日志备份:

#!/bin/bash
# etcd 备份脚本:快照 + WAL 日志
# 建议通过 cron 每小时执行

BACKUP_DIR="/backup/etcd"
SNAPSHOT_DIR="${BACKUP_DIR}/snapshots"
WAL_DIR="${BACKUP_DIR}/wal"
ETCD_DATA_DIR="/var/lib/etcd"
RETENTION_DAYS=7

mkdir -p ${SNAPSHOT_DIR} ${WAL_DIR}

# 1. 创建快照
SNAPSHOT_FILE="${SNAPSHOT_DIR}/snapshot-$(date +%Y%m%d%H%M%S).db"
ETCDCTL_API=3 etcdctl snapshot save ${SNAPSHOT_FILE}

# 2. 记录快照 Revision
SNAPSHOT_REV=$(ETCDCTL_API=3 etcdctl snapshot status ${SNAPSHOT_FILE} | awk '{print $5}')
echo "${SNAPSHOT_REV}" > "${SNAPSHOT_FILE}.rev"

# 3. 备份 WAL 日志(使用文件系统快照确保一致性)
# 实际生产环境建议使用 LVM 快照或云存储快照
tar czf "${WAL_DIR}/wal-$(date +%Y%m%d%H%M%S).tar.gz" \
  -C ${ETCD_DATA_DIR}/member wal/

# 4. 清理过期备份
find ${SNAPSHOT_DIR} -name "*.db" -mtime +${RETENTION_DAYS} -delete
find ${WAL_DIR} -name "*.tar.gz" -mtime +${RETENTION_DAYS} -delete
关键指标: 每次备份后应监控以下指标:
• 快照文件大小(异常增长可能预示数据膨胀)
• 快照耗时(超过 5 分钟需排查 etcd 性能)
• WAL 日志增长率(异常突增可能预示写入风暴)
• 备份成功率(低于 99.9% 需触发告警)