3. 缓存命中基础概念

在 Velero 灾备场景中,缓存命中率直接决定了恢复速度与 API 服务器负载。理解缓存命中的定义、未命中根因以及失效策略,是定位“恢复慢、API 高负载”类故障的前提。

3.1 缓存命中率定义

缓存命中率(Cache Hit Ratio)衡量缓存系统从存储层返回请求数据的效率。在 Velero 上下文中,命中率指从本地缓存(通常是 Velero 的 .velero/cache 目录或 CSI 快照缓存)直接返回备份清单、对象元数据或快照映射的比例。

指标 公式 Velero 场景示例
缓存命中率 命中次数 / (命中次数 + 未命中次数) × 100% 从本地缓存读取备份对象列表 vs 回源到对象存储
字节命中率 缓存提供字节数 / 总请求字节数 × 100% 从缓存读取快照元数据 vs 从远端存储拉取完整清单
对象命中率 缓存对象数 / 总请求对象数 × 100% 从本地缓存返回的 Kubernetes 资源对象数
性能调优目标: Velero 灾备恢复场景下,缓存命中率应长期维持在 ≥ 95%。低于 85% 时,需立即排查缓存失效策略或存储后端延迟。

3.2 缓存未命中(Cache Miss)的常见原因

缓存未命中意味着请求的数据不在缓存中,必须回源到对象存储或快照后端,导致恢复延迟增加 3–10 倍。以下是 Velero 场景中最常见的六类未命中原因:

  1. TTL 过期(Time-To-Live Expiry):缓存条目存活时间超过预设 TTL,被自动清除。Velero 默认缓存 TTL 为 24 小时,若备份频率低于此值,每次恢复都会触发回源。
  2. LRU 淘汰(Least Recently Used Eviction):缓存容量达到上限时,最久未访问的条目被驱逐。当并发恢复多个备份集时,热数据可能被冷数据挤出。
  3. 缓存预热不足(Cold Cache):新部署的 Velero 实例或缓存目录被清理后,所有请求均为首次访问,命中率瞬间归零。
  4. 备份键不一致(Key Mismatch):缓存键基于备份名称、时间戳或哈希生成。若恢复时使用不同的备份标识(如短名称 vs 完整 UID),则无法命中。
  5. 缓存分区/分片失效(Shard Invalidation):在多节点 Velero 部署中,缓存未共享或分片策略导致请求路由到无缓存的节点。
  6. 存储后端变更(Backend Change):对象存储桶名称、区域或访问路径变更后,缓存中的旧路径映射全部失效。
故障排查重点: 在 Velero 恢复性能调优中,TTL 过期 和 LRU 淘汰 占缓存未命中原因的 70% 以上。优先检查这两个维度的配置与日志。

3.3 缓存失效策略(TTL、LRU)

缓存失效策略决定了数据何时被移除。Velero 的本地缓存同时使用 TTL 和 LRU 两种策略,理解其协同机制是调优的关键。

3.3.1 TTL(Time-To-Live)策略

TTL 为每个缓存条目设置一个固定的存活时间。Velero 默认 TTL 为 24h,可通过环境变量 VELERO_CACHE_TTL 调整。

参数 默认值 调优建议
VELERO_CACHE_TTL 24h 若备份频率为每天一次,建议设为 48h 以覆盖跨日恢复
VELERO_CACHE_MAX_SIZE 1GiB 根据备份集大小调整,建议为最大备份清单的 3 倍
VELERO_CACHE_DIR ~/.velero/cache 确保目录位于高性能磁盘(如 SSD 或 tmpfs)

3.3.2 LRU(Least Recently Used)策略

当缓存达到容量上限时,LRU 策略淘汰最久未访问的条目。Velero 使用近似 LRU 算法(基于 Go 的 lru 库),在 O(1) 时间复杂度内完成淘汰决策。

  • 淘汰阈值:缓存使用量达到 maxSize 的 90% 时触发淘汰。
  • 淘汰批次:每次淘汰最旧的 10% 条目,避免频繁驱逐。
  • 冷热数据分离:频繁访问的备份元数据(如最近 7 天的备份清单)应主动预热,避免被冷数据挤出。
调优公式: 缓存容量 = (最大备份清单大小 × 备份保留数) × 1.5 安全系数。例如:每个备份清单 50 MiB,保留 30 个备份,则建议缓存容量为 50 × 30 × 1.5 = 2250 MiB ≈ 2.2 GiB。
缓存命中与失效策略流程 恢复请求到达 查询本地缓存 命中? 缓存命中 → 直接返回 缓存未命中 → 回源存储 写入缓存(TTL 重置) TTL 过期 / LRU 淘汰检查 TTL 超时 → 条目标记失效 LRU 淘汰 → 移除最久未访问

3.4 TTL 与 LRU 的协同失效模型

Velero 的缓存并非单一策略,而是 TTL 优先、LRU 兜底的二级失效模型:

  • 第一级(TTL):每个条目独立计时,到期后标记为失效。失效条目在下次访问时被惰性删除。
  • 第二级(LRU):当缓存总大小超过 maxSize 时,即使条目 TTL 未到期,也会被 LRU 淘汰。这保证了缓存不会无限增长。
  • 惰性删除:TTL 过期的条目不会立即释放内存,而是在后续访问或淘汰扫描时清理,减少后台开销。
性能陷阱: 当 TTL 设置过长(如 7 天)且缓存容量不足时,LRU 会频繁淘汰热数据,导致“伪未命中”——条目 TTL 未到期但已被挤出。此时应优先扩容缓存容量,而非继续延长 TTL。
TTL 与 LRU 协同失效时间线 T0 T1 T2 T3 条目 A(TTL=24h) TTL 过期 条目 B(TTL=48h) LRU 淘汰 条目 C(TTL=24h) 惰性删除(访问时) TTL 过期后条目仍占用内存,直到被访问或 LRU 淘汰扫描才真正释放

3.5 缓存命中故障排查清单

当 Velero 恢复性能下降时,按以下清单快速定位缓存问题:

步骤 检查项 命令/方法 预期结果
1 当前缓存命中率 velero restore describe <name> --details 缓存命中率 ≥ 95%
2 缓存目录大小 du -sh ~/.velero/cache 小于 maxSize 的 90%
3 TTL 配置 echo $VELERO_CACHE_TTL 大于备份间隔
4 LRU 淘汰日志 grep "evict" /var/log/velero.log 无频繁淘汰记录
5 缓存键一致性 velero backup get --show-labels 恢复使用的备份名称与缓存键匹配
快速验证: 执行 velero restore create --from-backup <backup-name> --wait 并观察 --details 输出中的 cache_hit 与 cache_miss 计数。若 miss 计数持续增长,优先检查 TTL 和 LRU 配置。