TL;DR

  • 场景: 想学习 Netflix 的 EVCache 系统进行自研,但只了解它是「基于 Memcached 的分布式缓存」
  • 结论: 拆解 EVCache/Rend/Memcached/Mnemonic 四层来理解缓存层职责、性能天花板与多可用区复制模型
  • 产出: 实用架构理解框架 + 典型部署路径 + 常见错误速查卡

EVCache

EVCache 是 Netflix 开源的高性能分布式缓存系统,基于 Memcached 的内存存储架构,使用 Spymemcached 客户端实现。

EVCache 名称含义:

  • E: Ephemeral(短暂的)- 数据存储有 TTL
  • V: Volatile(易失的)- 强调非持久化
  • Cache: 内存键值存储

主要特性:

  1. 通过一致性哈希实现线性扩展能力
  2. 多区域部署支持跨数据中心复制
  3. 完整的监控集成
  4. 智能客户端路由,自动处理节点故障和网络分区

性能指标:

  • 单 EVCache 节点集群峰值: 200KB 请求/秒
  • 全球部署: 数千个 memcached 服务器节点
  • 每日峰值: 超过 3000 万次操作
  • 存储对象: 50-1000 亿
  • 每日请求: 近 2 万亿
  • 正常负载下响应延迟: 1-5ms
  • 99% 请求在 20ms 内完成
  • 命中率: 维持在 99%

架构组件

Rend Service

  • Go 语言编写的高性能代理服务
  • 使用 goroutine 和 channel 机制实现轻量级并发处理
  • 内置智能连接池
  • 支持 Memcached 二进制和文本协议
  • 使用一致性哈希做后端节点分布

Memcached

  • 内存分布式键值存储系统
  • 所有数据存储在 RAM 中,响应时间微秒级
  • LRU 淘汰机制
  • 单节点 QPS: 最高 50 万次/秒

Mnemonic

  • 基于 SSD 的嵌入式键值存储引擎
  • 深度集成 RocksDB
  • 优化 SSD 的 Direct I/O
  • 支持 WAL 数据持久化
  • 随机读取延迟 < 1ms

典型部署

单可用区部署

集群启动阶段:

  1. EVCache 服务器实例自动注册到服务注册表
  2. 每个实例携带元数据:IP、端口、内存容量、负载状态、集群名称
  3. 客户端初始化阶段读取服务器列表,建立 TCP 长连接池
  4. 使用一致性哈希环进行虚拟节点分布

多可用区部署

跨可用区复制流程:

  1. 初始写入阶段: 应用发起 SET 操作,数据首先写入本地可用区缓存节点
  2. 元数据复制准备: EVCache 客户端生成包含 Key、操作类型、时间戳、源可用区的复制元数据消息
  3. 跨可用区数据传输: Propagator 通过内部网络向目标区域的 Replication Agent 发送 SET 请求
  4. 目标区域数据更新: Replication Agent 验证请求,在本地缓存集群执行相同的 SET 操作

错误速查

症状根因解决方案
业务将 EVCache 当作强一致持久存储EVCache 本质是 TTL + 易失内存缓存使用数据库作为数据源,缓存仅用于加速
缓存命中率远低于预期Key 设计无热点复用、TTL/容量过小优化 key 设计,设置合理 TTL
可用区故障后其他区域读写延迟飙升多可用区拓扑设计问题本地读取,跨区域仅用于复制
增加或减少节点后缓存命中率显著下降一致性哈希虚拟节点配置不当调整虚拟节点数,使用滚动扩缩容 + 预热策略