缓存
Ingress 支持缓存以提高性能并减少后端服务的负载。您可以使用内存缓存或 Redis 进行分布式缓存。
缓存配置
内存缓存
默认情况下,Ingress 使用内存缓存:
yaml
cache:
ttl: 30 # 缓存 TTL(秒)(默认:60)这会在内存中缓存路由决策和其他数据。缓存是每个 Ingress 实例本地的。
Redis 缓存
要在多个 Ingress 实例之间进行分布式缓存,请使用 Redis:
yaml
cache:
ttl: 30
engine: redis
host: 127.0.0.1
port: 6379
password: '123456'
db: 2
prefix: ingress:配置字段
| 字段 | 类型 | 描述 | 默认值 |
|---|---|---|---|
ttl | int | 缓存 TTL(秒) | 60 |
engine | string | 缓存引擎:memory 或 redis | memory |
host | string | Redis 主机(用于 Redis 引擎) | 127.0.0.1 |
port | int | Redis 端口(用于 Redis 引擎) | 6379 |
password | string | Redis 密码(用于 Redis 引擎) | - |
db | int | Redis 数据库编号(用于 Redis 引擎) | 0 |
prefix | string | 缓存键前缀(用于 Redis 引擎) | - |
缓存 TTL
ttl(生存时间)确定缓存项保持有效的时间:
yaml
cache:
ttl: 30 # 缓存项在 30 秒后过期- 较短的 TTL:数据更新,但后端请求更多
- 较长的 TTL:后端请求更少,但数据可能过时
为您的用例选择在新鲜度和性能之间取得平衡的 TTL。
内存缓存
内存缓存是最简单的选项,适用于单实例部署:
yaml
cache:
ttl: 60优点:
- 无外部依赖
- 快速访问
- 简单配置
缺点:
- 不在实例之间共享
- 重启时丢失
- 受可用内存限制
Redis 缓存
Redis 缓存推荐用于多实例部署或需要持久缓存时:
yaml
cache:
ttl: 60
engine: redis
host: redis.example.com
port: 6379
password: your-password
db: 0
prefix: ingress:Redis 配置
- host:Redis 服务器主机名或 IP 地址
- port:Redis 服务器端口(默认:6379)
- password:Redis 密码(可选,如果没有密码则省略)
- db:Redis 数据库编号(0-15,默认:0)
- prefix:所有缓存键的前缀(用于命名空间)
Redis 连接
Ingress 在启动时连接到 Redis。如果 Redis 不可用:
- Ingress 将记录错误
- 它可能会回退到内存缓存(取决于配置)
- 健康检查可能会失败
Redis 键格式
使用前缀时,缓存键格式为:
{prefix}{key}例如,使用 prefix: ingress:,主机路由缓存键 match.host:v2:example.com 变为 ingress:match.host:v2:example.com。其中 v2 表示缓存值结构版本,后续版本可能调整。
缓存内容
Ingress 缓存:
- 路由决策:主机和路径匹配结果
- 服务配置:解析的服务配置
- DNS 解析:解析的后端服务地址
缓存路由决策在以下情况下特别有益:
- 您有复杂的路由规则
- DNS 解析很慢
- 后端服务发现成本很高
缓存失效
缓存条目在以下情况下自动失效:
- TTL 过期:条目在配置的 TTL 后过期
- 配置重新加载:
Reload会执行prepare(),并清空已配置的缓存后端(与启动时一致),因此重载后会清除旧条目;若依赖外部缓存工具,仍建议结合 TTL 做渐进失效。 - 手动失效:某些缓存条目可能在特定事件上失效
缓存性能
监控缓存性能
您可以通过以下方式监控缓存性能:
- 缓存命中率:从缓存提供服务的请求百分比
- 缓存未命中率:需要后端查找的请求百分比
- 缓存大小:缓存中的项目数(用于内存)
优化缓存性能
- 调整 TTL:在新鲜度和性能之间找到正确的平衡
- 多实例使用 Redis:在实例之间共享缓存
- 监控缓存使用:跟踪命中/未命中率
- 设置适当的前缀:使用前缀组织缓存键
最佳实践
- 选择正确的引擎:单实例使用内存,多实例使用 Redis
- 设置适当的 TTL:在新鲜度和性能之间取得平衡
- 使用 Redis 前缀:命名空间缓存键以避免冲突
- 监控 Redis:确保 Redis 可用且性能良好
- 保护 Redis:为 Redis 使用密码和网络安全
- 规划缓存未命中:设计系统以优雅地处理缓存未命中
故障排除
缓存不工作
- 验证缓存配置是否正确
- 检查 TTL 是否设置适当
- 确保 Redis 可访问(如果使用 Redis)
- 检查日志中的缓存相关错误
Redis 连接问题
- 验证 Redis 主机和端口是否正确
- 检查到 Redis 的网络连接
- 验证 Redis 密码(如果需要)
- 确保 Redis 正在运行且可访问
高缓存未命中率
- 考虑增加 TTL
- 检查路由规则是否过于动态
- 验证缓存是否实际被使用
- 审查缓存键模式
内存使用(内存缓存)
- 监控内存使用
- 如果内存受限,考虑减少 TTL
- 切换到 Redis 以更好地管理内存
- 审查缓存的内容