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 缓存生命周期与失效机制
三种缓存的生命周期管理遵循不同的失效策略,但都围绕 时间 和 事件 两个维度展开。
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 或更高。