自建 Redis 系统是得物 DBA 团队自研高性能分布式 KV 缓存系统,目前管理的 ECS 内存总容量超过数十TB,数百多个 Redis 缓存集群实例,数万多个 Redis 数据节点,其中内存规格超过 1T 的大容量集群多个。
架构设计
采用Proxy架构,包含ConfigServer、Proxy等等核心组件,还包括一个具备实例自动化部署,资源管理,诊断与分析等重要功能在内的完善的自动化运维平台(有点像管理后台)
核心组件
-
ConfigServer
-
Redis-Proxy
-
Redis-Server
ConfigServer
Raft协议实现自身的高可用
主要作用:
-
组件的增加,删除并向redisProxy进行实例推送
-
Redis-Server实例手动主从切换,水平扩容与数据迁移等功能操作
上面这个应该是集成了运维的一些操作能力
- 负责 Redis-Server 实例故障检测与自动故障转移(主节点故障后自动主从切换)
ConfigServer的架构图如下
故障检测与转移
会对每个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 等组件,部署架构如下图所示:
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 等组件的部署,自动完成组件部署过程中涉及的上述机器推荐、配置文件准备、节点安装与启动等所有过程。
为了保证实例中所有组件的高可用,自动化部署过程中包含一些必要的部署规则:
-
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。