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 场景中最常见的六类未命中原因:
- TTL 过期(Time-To-Live Expiry):缓存条目存活时间超过预设 TTL,被自动清除。Velero 默认缓存 TTL 为 24 小时,若备份频率低于此值,每次恢复都会触发回源。
- LRU 淘汰(Least Recently Used Eviction):缓存容量达到上限时,最久未访问的条目被驱逐。当并发恢复多个备份集时,热数据可能被冷数据挤出。
- 缓存预热不足(Cold Cache):新部署的 Velero 实例或缓存目录被清理后,所有请求均为首次访问,命中率瞬间归零。
- 备份键不一致(Key Mismatch):缓存键基于备份名称、时间戳或哈希生成。若恢复时使用不同的备份标识(如短名称 vs 完整 UID),则无法命中。
- 缓存分区/分片失效(Shard Invalidation):在多节点 Velero 部署中,缓存未共享或分片策略导致请求路由到无缓存的节点。
- 存储后端变更(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。
3.4 TTL 与 LRU 的协同失效模型
Velero 的缓存并非单一策略,而是 TTL 优先、LRU 兜底的二级失效模型:
- 第一级(TTL):每个条目独立计时,到期后标记为失效。失效条目在下次访问时被惰性删除。
- 第二级(LRU):当缓存总大小超过
maxSize时,即使条目 TTL 未到期,也会被 LRU 淘汰。这保证了缓存不会无限增长。 - 惰性删除:TTL 过期的条目不会立即释放内存,而是在后续访问或淘汰扫描时清理,减少后台开销。
性能陷阱: 当 TTL 设置过长(如 7 天)且缓存容量不足时,LRU 会频繁淘汰热数据,导致“伪未命中”——条目 TTL 未到期但已被挤出。此时应优先扩容缓存容量,而非继续延长 TTL。
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 配置。