3. 缓存基础概念:Envoy 缓存类型与生命周期

在 Envoy 的灾备与高可用架构中,缓存是降低上游负载、提升故障切换速度的关键手段。Envoy 并非一个通用缓存代理,但其内部集成了三种核心缓存类型:路由缓存、DNS 缓存和 TLS 会话缓存。理解每种缓存的存储对象、生命周期和失效机制,是进行命中率巡检与调优的前提。

3.1 三种缓存类型概述

缓存类型 存储对象 核心用途 默认容量 典型 TTL
路由缓存 路由表匹配结果(VirtualHost、Cluster、WeightedCluster) 加速请求路由决策,避免每次请求都遍历全部路由规则 无上限(受内存限制) 由路由配置变更触发失效
DNS 缓存 上游集群域名解析结果(IP 地址列表) 减少 DNS 查询频率,避免 DNS 故障导致服务中断 每个集群最多 10000 条 由 DNS 记录 TTL 决定(默认 60s)
TLS 会话缓存 SSL/TLS 握手会话参数(Session ID / Session Ticket) 复用 TLS 握手,降低新连接建立延迟 默认 2048 条 由 Session Timeout 控制(默认 24h)
巡检要点: 灾备场景下,DNS 缓存和路由缓存的命中率直接影响故障切换速度。若 DNS 缓存未命中导致频繁上游 DNS 查询,可能因 DNS 故障而放大灾备切换延迟。

3.2 路由缓存(Route Cache)

Envoy 的路由引擎在收到请求时,会根据请求的 :authority、path、method 等头部匹配路由规则。路由缓存存储的是 匹配结果,即从路由表到目标 Cluster 的映射关系。该缓存由 Envoy 内部的路由表更新机制自动管理。

  • 缓存键:请求的 Host、Path、HTTP Method 组合。
  • 失效条件:当通过 xDS(如 RDS、VHDS)动态更新路由配置时,Envoy 会清空并重建路由缓存。
  • 灾备意义:在灾备切换时,若路由规则发生变化(例如将流量切至备用集群),路由缓存会立即失效并重新填充,确保新路由规则即时生效。
调优参数: 路由缓存无直接容量配置参数,但可通过 route_config_initial_fetch_timeout 和 route_config_retry 控制首次加载行为。在灾备场景下,建议将 initial_fetch_timeout 设置为 5s 以上,避免因 xDS 短暂不可用导致路由表加载失败。

3.3 DNS 缓存(DNS Cache)

当 Envoy 使用 STRICT_DNS 或 LOGICAL_DNS 集群类型时,会定期解析上游域名。DNS 缓存存储解析结果,避免每次健康检查或新建连接都触发 DNS 查询。

参数 默认值 灾备调优建议
dns_resolution_timeout 5s 灾备场景建议提升至 10s,避免 DNS 超时导致集群不可用
dns_refresh_rate 60s 若上游 DNS 记录变更频繁,可缩短至 30s;灾备切换时建议手动触发刷新
dns_failure_refresh_rate 5s(指数退避) 保持默认,避免 DNS 故障时频繁重试
dns_cache_size 10000 若集群数量超过 1000,建议增大至 50000
避坑指南: 在灾备切换时,若备用集群的 DNS 记录尚未更新,Envoy 的 DNS 缓存可能仍指向旧 IP。建议在灾备演练前通过 POST /drain_listeners?inboundonly 或重启 Envoy 来强制刷新 DNS 缓存。

3.4 TLS 会话缓存(TLS Session Cache)

Envoy 作为反向代理与上游服务建立 TLS 连接时,会缓存会话参数以复用握手。TLS 会话缓存分为 服务端缓存(Envoy 作为 TLS 服务端)和 客户端缓存(Envoy 作为 TLS 客户端)。

  • Session ID 缓存:基于 Session ID 的复用,由 Envoy 内部维护。
  • Session Ticket 缓存:基于 Session Ticket 的复用,需要上游服务支持。
  • 灾备意义:在灾备切换后,若上游集群 IP 发生变化,旧的 TLS 会话缓存会失效,导致新连接需要完整握手,增加延迟。
参数 默认值 说明
max_session_cache_size 2048 最大缓存会话数,超过后按 LRU 淘汰
session_timeout 24h 会话超时时间,超时后需重新握手
disable_stateless_session_resumption false 是否禁用无状态会话恢复(Session Ticket)

3.5 缓存生命周期与失效机制

三种缓存的生命周期管理遵循不同的失效策略,但都围绕 时间 和 事件 两个维度展开。

Envoy 缓存生命周期与失效机制 路由缓存 失效条件: xDS 路由配置更新 手动触发 RDS 刷新 DNS 缓存 失效条件: DNS 记录 TTL 到期 DNS 解析失败后退避 TLS 会话缓存 失效条件: Session Timeout 到期 LRU 淘汰 / 连接关闭 公共生命周期阶段 阶段 1:缓存填充 阶段 2:缓存命中 阶段 3:缓存失效 说明:三种缓存均遵循“填充 → 命中 → 失效”的循环,但失效触发条件各不相同

3.6 缓存命中率与灾备切换的关系

在灾备切换过程中,缓存命中率的变化是判断切换是否平稳的关键指标:

  • 路由缓存命中率下降:可能意味着路由规则变更后,新规则尚未被请求触发填充,导致大量请求走慢路径。
  • DNS 缓存命中率下降:切换后上游域名解析结果变化,旧缓存失效,新缓存尚未建立,导致 DNS 查询激增。
  • TLS 会话缓存命中率下降:切换后上游 IP 变更,旧会话无法复用,新连接需完整 TLS 握手,增加延迟。
巡检指标: 建议在 Prometheus 中监控以下指标:
envoy_http_downstream_rq_xx(路由缓存间接影响)、envoy_cluster_upstream_cx_active(TLS 会话复用情况)、envoy_cluster_dns_query_count(DNS 查询频率)。当 DNS 查询频率在切换后 30s 内超过正常值 3 倍时,应触发告警。

3.7 缓存配置示例(YAML)

以下是一个典型的 Envoy 配置片段,展示了 DNS 缓存和 TLS 会话缓存的关键参数设置:

static_resources:
  clusters:
  - name: upstream_cluster
    type: STRICT_DNS
    connect_timeout: 5s
    dns_resolution_config:
      dns_resolution_timeout: 10s
      dns_refresh_rate: 30s
      dns_failure_refresh_rate:
        base_interval: 5s
        max_interval: 30s
    upstream_connection_options:
      tls_session_cache_config:
        max_session_cache_size: 4096
        session_timeout: 3600s
    load_assignment:
      cluster_name: upstream_cluster
      endpoints:
      - lb_endpoints:
        - endpoint:
            address:
              socket_address:
                address: api.example.com
                port_value: 443
调优建议: 在灾备场景下,建议将 dns_refresh_rate 设置为 30s,并将 dns_resolution_timeout 提升至 10s,以平衡 DNS 查询频率和超时容忍度。TLS 会话缓存大小建议根据上游连接数调整为 4096 或更高。