读:《得物自建Redis设计》

77 阅读13分钟

自建 Redis 系统是得物 DBA 团队自研高性能分布式 KV 缓存系统,目前管理的 ECS 内存总容量超过数十TB,数百多个 Redis 缓存集群实例,数万多个 Redis 数据节点,其中内存规格超过 1T 的大容量集群多个。

架构设计

采用Proxy架构,包含ConfigServer、Proxy等等核心组件,还包括一个具备实例自动化部署,资源管理,诊断与分析等重要功能在内的完善的自动化运维平台(有点像管理后台)

核心组件

  • ConfigServer

  • Redis-Proxy

  • Redis-Server

9929fce5258b2fabdf353c0a6ab3b54f5590d7810841d107ed01a10fbcb28690.jpg

ConfigServer

Raft协议实现自身的高可用

主要作用:

  • 组件的增加,删除并向redisProxy进行实例推送

  • Redis-Server实例手动主从切换,水平扩容与数据迁移等功能操作

上面这个应该是集成了运维的一些操作能力

  • 负责 Redis-Server 实例故障检测与自动故障转移(主节点故障后自动主从切换)

ConfigServer的架构图如下

a68e114d21cd2def197913d7118de30d8c0af11fb1f35f06d3f7207b929e94fc.jpg

故障检测与转移

会对每个Group的Master节点定期探活,故障的时候就会执行主从切换

实现思路参考Redis Sentinel。但是ConfigServer是用go实现的

多协程:go支持协程,所以这个是每个group都开启一个协程来检测Redis-Server的状态

自定义通讯协议: 在 Redis Sentinel 中,Sentinel 之间通过 Redis-Server 节点交换元数据信息,来发现负责同一个 Redis-Server 的 Sentinel 节点,以及交换观察的节点状态;而在 ConfigServer 中,ConfigServer 之间是采用自定义 TCP 协议直接通讯,交换信息更高效,也能缩短故障切换时间。

Sentinel相关功能:主观下线和客观下线。自动选主

Redis-Proxy

Proxy 支持 Redis RESP 协议,业务访问 Proxy 就像访问一个单点 Redis 服务一样,业务可以把一个自建 Redis 集群当作一个容量无限大的单点 Redis 实例即可。

  • 没看懂这个组件的实际含义,需要阅读别的proxy的作用

这个Proxy来说就是套了一层,增加了别的处理的能力。

实现了同城双活,实现单写就进读

  • 通过容器的 ServiceName 实现同 AZ Proxy 节点优先访问 (优先)。

  • 通过云厂商的 PrivateZone 实现智能 DNS 解析(容器和非容器应用都行)。

Redis-Server

  • 采用至少一主一从的部署方案,并且主从节点跨可用区部署,分别部署在与业务对应的可用区。

Redis-Proxy

  • Redis-Proxy 同样采用多可用区部署,与业务可用区相同。

  • 各可用区 Proxy 将写请求自动路由到主节点,依然写主节点。

  • 读请求优先就近访问本可用区从节点,本可用区无可用从节点时,支持自动访问主节点或优先访问其他可用区从节点。

异步双写

以从云 Redis 迁移到自建 Redis 为例,迁移期间 Proxy 同时写云 Redis 和自建 Redis,保证两边数据实时一致,从而可以随时回滚,做到平滑迁移。

  • 同时,提供数据比对工具,用于双写期间数据对比,随时观察两边数据一致性情况;数据对比支持多种策略,包括对比类型、对比长度或元素数量。

Redis-Server

  • 基于开源Redis,增加槽slot同步迁移与异步迁移等相关功能

  • 使用了Async-Fork:在aof和rdb中减少耗时,不会造成业务性能抖动

  • 数据迁移:用于水平拓展,key的重新分配

    • 同步迁移:会阻塞别的命令的获取(单线程)

    • 异步迁移:对方返回ack之后就结束了

自动化运维平台

自建 Redis 系统拥有功能完善的自动化运维平台。其主要功能包括:缓存实例自动化部署、快速水平扩容与垂直扩容、多维度资源管理、诊断与分析等。

运维平台架构

自建 Redis 自动化运维平台包括Redis 管控平台、Kv-Admin、Kv-Agent、Prometheus 等组件,部署架构如下图所示:

6d474667eefef6ba1632d6aad2f4248ab733cdb0a97d232e4febd279a8935537.jpg

Redis 管控平台

Redis 管控平台是自建 Redis 综合运维管理平台,自建 Redis 的可视化操作均在 Redis 管控平台上完成,包括实例部署、扩容、数据迁移等在内的所有日常运维操作均可在管理平台上完成。

Kv-Admin

Kv-Admin 是自动化运维平台的核心组件,负责处理所有前端发送过来的请求,核心功能包括:

  • 负责完成实例部署时任务调度、机器推荐、端口分配、SLB 推荐与绑定。

  • 实例列表展示、实例基本信息查询。

  • 数据离线分析与保存。

  • 资源池管理及生成资源报表。

Kv-Agent

每个 ECS 上会部署一个 Kv-Agent 组件,Kv-Agent 负责完成实例部署、实例启停等操作;基于心跳元数据的 Exporter 自动注册与解除;

同时,Kv-Agent 包含 Exporter 模块,负责 Redis-Server 节点的监控信息采集,然后将数据规范化后通过端点暴露给 Prometheus。

APM / Prometheus

APM 监控平台或者 Prometheus 负责从 Exporter 暴露的端点拉取监控数据;自建 Redis 监控与告警均接入公司 APM 平台。

实例自动化部署

一个缓存实例的部署非常复杂,涉及机器选择、配置文件准备、节点安装与启动、槽位分配、主从关系设置、SLB 分配与绑定、以及相关组件的部署等一系列动作。

自动化运维平台支持安装包版本管理,在部署页面选择合适的包版本、配置对应实例可用区、规格等基本信息后,一键操作即可完成 ConfigServer、Redis-Proxy、Redis-Server 等组件的部署,自动完成组件部署过程中涉及的上述机器推荐、配置文件准备、节点安装与启动等所有过程。

952676a3035b0d3d7c72412e918646288adf3406326be41c9070c07aa7269ed1.jpg

为了保证实例中所有组件的高可用,自动化部署过程中包含一些必要的部署规则​:

  • ConfigServer 组件会部署在三个不同的可用区。

  • 避免同一个集群实例的多个 Redis-Server、Redis-Proxy 节点部署在相同的 ECS 上,每个 ECS 上可部署的同一个集群实例的 Server 或 Proxy 组件数量可配置。

  • 每个 ECS 最多分配总内存容量的 90%,预留一定的数据增长空间。

  • 根据 ECS 可用内存,优先推荐剩余可用内存多的 ECS。

  • 根据 Group 数量,自动均衡分配每个 Group 负责的 slot 数量。

  • 根据 SLB 近三天的流量峰值,自动绑定最优的 SLB。

实例扩容

当业务数据增长导致实例内存使用率超过一定阈值后,根据单节点分配的最大内存、实例的 Group 数量等情况综合考虑,运维可选择为实例进行垂直扩容或者水平扩容。

垂直扩容​,即动态修改单节点的 Maxmemory 参数,提高单节点的容量。

水平扩容​,即增加实例的 Group 数量,对应增加主从节点数量,然后重新进行 slot 分配和对应的数据迁移动作。

一般来说,当单节点规格小于 4G 时,会优先考虑垂直扩容,简单快速,对业务无任何影响。

自动化运维平台支持方便的垂直扩容和水平扩容操作。

对于垂直扩容​,运维平台支持批量调整实例 Redis-Server 节点的容量。

对于水平扩容​,同实例初始部署一样,运维平台支持新增 Redis-Server 节点的自动化部署、主从关系设置等,同时支持按照实例总节点数重新自动均衡分配每个 Group 负责的 slot 数量,并自动完成数据迁移,数据迁移进度可视化。

资源管理

自建 Redis 运维平台目前管理的 ECS 超过数千台,运维平台支持 ECS 资源批量添加、资源分配、资源锁定、资源推荐等资源管理功能,以及提供资源利用率报表。

运维平台支持 ECS 可用内存的管理与分配,运维平台记录每台 ECS 的剩余可分配内存容量,Redis-Server 实例部署时,优先推荐剩余可分配内存多的 ECS,分配出去的 ECS 更新对应的可用内存容量。

Redis-Proxy 和 ConfigServer 部署时,优先推荐部署的实例数量较少的 ECS。

诊断与分析

计算实例综合得分​:运维平台通过分析所有实例关键监控指标前一天的峰值,再根据各项指标的权重,每天自动计算所有实例的得分,根据各实例的得分即可快速了解各实例的使用健康度。

参与计算得分的关键指标包括:Proxy CPU、Redis CPU、Redis 内存使用率、Proxy 占用内存、Proxy GC 次数、最大 RT、Redis 流入流量、Redis 流出流量等。

慢日志: 运维平台支持 Redis-Server 记录的慢日志和 Redis-proxy 记录的慢日志查询。

RDB 离线分析: 运维平台支持生成 RDB 文件,并自动进行数据离线分析。分析结果包含 Top100 Value 最大的 Key 和元素个数最多的 Key;每种类型 Key,不同 Key 前缀包含的 Key 数量等。

四、监控与告警

自建 Redis 系统接入 APM 监控平台,提供了各种维度的监控指标和告警功能,及时对异常情况进行预警,当出现问题时,也能帮助快速定位问题。

监控

ECS:CPU、系统 Load、内存、网络流量、网络丢包、磁盘 IO 等。

Proxy:QPS、TP999/TP9999/TP100、连接数、CPU、 内存、GC、Goroutine 数量等。

Server:CPU、内存、网络、连接数、QPS、Key 数量、命中率、访问 RT等。

告警

自建 Redis 包含大量的告警指标:

  • ECS CPU 使用率、内存使用率、系统 Load(5 分钟平均值)、流量。

  • SLB 流量。

  • Server、Proxy、ConfigServer 节点宕机。

  • 主节点缺失从节点、主节点可用区不一致、主从角色切换

五、稳定性治理

资源隔离

自建 Redis 目前所有组件都是部署在 ECS 上,为了提高资源利用率节约成本,大部分业务域的 Redis 集群都是混布的。自建 Redis 运维平台目前管理 ECS 超过数千台,接入的业务也涵盖营销、风控、算法、投放、社区、大数据等等,每个业务的实例等级、QPS、流量等指标各有差异,少数业务 Redis 可能存在突发写入流量高、Proxy CPU毛刺等现象,可能会引起相同 ECS 上其他实例性能抖动。

按标签分类: 为了方便资源隔离与资源分配时管理,所有 ECS 资源按标签进行分类管理​,针对特殊需求业务、大流量实例、通用资源池等划分不同的资源标签,实例部署时选择合适的标签、或者频繁出现告警时调整到对应资源池进行隔离,避免相互影响。

Proxy CPU 限制: 为了防止单个 Redis-Proxy 进程抢占过多 CPU 资源,Redis-Proxy 支持配置 Golang GOMAXPROCS 参数来设置单个进程允许使用的最大 CPU 核数。

巡检

为了提前发现潜在的风险,除了日常告警外,我们支持自动巡检工具和巡检信息页面,建立了定期巡检机制。

实例综合得分排名: 运维平台通过分析所有实例关键监控指标前一天的峰值,再根据各项指标的权重,每天自动计算所有实例的得分,在巡检信息页面进行展示,通过得分排序即可快速发现风险实例。

ECS 资源大盘: 实时展示所有 Redis-Proxy 和 Redis-Server 使用 ECS 的重要指标,通过排序即可快速浏览各 ECS 各项重要指标,如 CPU 使用率、内存使用率、IOPS 使用率、磁盘读取/写入、上传/下载带宽等。

自动巡检工具: 定期检查所有实例的配置、节点数量等基本信息,对于如从节点缺失、可用区不一致、节点配置不一致等异常情况进行提示。

故障演练

为了提高自建 Redis 系统在异常场景下的可用性、检验自建 Redis 系统在各异常场景的恢复时间,我们不定期进行多次故障演练

故障演练涵盖所有组件在ECS、网络、磁盘等出现故障的场景,以及多个组件组合同时出现这些故障的场景。

经过故障演练检验,自建 Redis 系统 Redis-Server 主节点故障恢复时间 12s,Redis-Proxy 故障业务恢复时间 5s 内。

总结

得物自建 Redis 系统是一个超大规模分布式 KV 缓存系统​,管理数十 TB 内存容量、数百个集群实例、数万个数据节点,单集群最大内存规格超过 1TB。

核心架构采用 Proxy 模式,三大组件各司其职:

  • ConfigServer​: 基于 Raft 协议实现高可用,负责组件管理、故障检测与自动主从切换

  • Redis-Proxy​: 支持 RESP 协议,实现请求路由、同城双活、异步双写等高级特性

  • Redis-Server​: 基于开源 Redis 增强,支持 Async-Fork 减少性能抖动、槽位同步/异步迁移

技术亮点包括:

  • Async-Fork 技术​: 优化 AOF/RDB 持久化,避免业务性能抖动

  • 同城双活架构​: 通过 ServiceName 和智能 DNS 解析实现单写就近读

  • 异步双写能力​: 支持平滑迁移,提供数据比对工具保障一致性

自动化运维平台功能完善,涵盖实例一键部署、智能扩容(垂直/水平)、多维度资源管理、RDB 离线分析、慢日志查询、实例综合得分计算等,大幅提升运维效率。

稳定性保障体系健全:

  • 资源隔离​: 按标签分类管理 ECS,Proxy 支持 CPU 限制

  • 监控告警​: 覆盖 ECS、Proxy、Server 全维度指标

  • 定期巡检​: 自动巡检工具 + 实例得分排名 + ECS 资源大盘

  • 故障演练​: 主节点故障恢复时间 12s,Proxy 故障恢复 5s 内

未来规划

  • 热 Key 访问一直是 Redis 使用中对业务影响较大的一个问题,未来我们考虑支持热 Key 统计与读热 Key 本地缓存。

    • 这个可以看有赞的热key方案
  • Golang 版本 Proxy 在高 QPS 请求时,GC 是性能提升的一个瓶颈,未来考虑使用 Rust 重构 Proxy。