潘森 技术演进介绍
3.1 自建 Redis 系统架构
下图为自建 Redis 系统架构示意图:
自建 Redis 架构示意图
自建 Redis 集群由 Redis-server、Redis-proxy、ConfigServer 等核心组件组成。
Redis-server 为数据存储组件,支持一主多从,主从多可用区部署,提供高可用、高性能的服务;
Redis-proxy 为代理组件,业务通过 proxy 可以像使用单点实例一样访问 Redis 集群,使用更简单,并且在 Redis-proxy 上提供同区优先就近读、key 维度或者命令维度限流等高级功能;
ConfigServer 为负责 Redis 集群高可用的组件。
自建 Redis 接入方式支持通过域名 + LB、service、SDK 直连(推荐)等多种方式访问 Redis 集群。
自建 Redis 系统还包含一个功能完善的自动化运维平台,其主要功能包括:
Redis 集群实例从创建、proxy 与 server 扩缩容、到实例下线等全生命周期自动化运维管理能力;
业务需求自助申请工单与工单自动化执行;
资源(包含 ECS、LB)精细化管理与自动智能分配能力、资源报表统计与展示;
ECS 资源定期巡检、自动均衡与节点智能调度;
集群大 key、热 key 等诊断与分析,集群数据自助查询。
下面将就一些重要的最新技术演进进行详细介绍。
3.2 接入方式演进
自建 Redis 提升稳定性的非常重要的一个技术演进就是自研 DRedis SDK,业务接入自建 Redis 方式从原有通过域名 + LB 的方式访问演进为通过 DRedis SDK 连接 proxy 访问。
LB 接入问题
在自建 Redis 初期,为了方便业务使用,使用方式保持与云 Redis 一致,通过 LB 对 proxy 做负载均衡,业务通过域名(域名绑定集群对应 LB)访问集群,业务接入简单,像使用一个单点 Redis 一样使用集群,并且与云 Redis 配置方式一致,接入成本低。
随着自建 Redis 规模增长,尤其是大流量业务日渐增多,通过 LB 接入方式的逐渐暴露出很多个问题,部分问题还非常棘手:
自建 Redis 使用的单个 LB 流量上限为 5Gb,阈值比较小,对于一些大流量业务单个 LB 难以承接其流量,需要绑定多个 LB,增加了运维复杂度,而且多个 LB 时可能会出现流量倾斜问题;
LB 组件作为访问入口,可能会受到网络异常流量攻击,导致集群访问受损;
由于 Redis 访问均是 TCP 连接,LB 摘流业务会有秒级报错。
DRedis 接入
自建 Redis 通过自研 DRedis SDK,通过 SDK 直连 proxy,不再强依赖 LB,彻底解决 LB 瓶颈和稳定性风险问题,同时,DRedis SDK 默认优先访问同可用区 proxy,天然支持同城双活就近读。
DRedis SDK 系统设计图如下所示:
Redis-proxy 启动并且获取到集群拓扑信息后,自动注册到注册中心;可通过管控白屏化操作向配置中心配置集群使用的 proxy 分组与权重、就近读规则等信息;DRedis SDK 启动后,从配置中心获取到 proxy 分组与权重、就近读规则,从注册中心获取到 proxy 节点信息,然后与对应 proxy 节点建立连接;应用通过 DRedis SDK 访问数据时,DRedis SDK 通过加权轮询算法获取一个 proxy 节点(默认优先同可用区)及对应连接,进行数据访问。
DRedis SDK 并且对原生 RESP 协议进行了增强,添加了一部分自定义协议,支持业务灵活开启就近读能力,对于满足就近读规则的 key 访问、或者通过注解指定的就近读请求,DRedis SDK 通过自定义协议信息,通知 proxy 在执行对应请求时,优先访问同可用区 server 节点。
DRedis SDK 目前支持 Java、Golang、C++(即将上线)三种开发语言。
Java SDK 基于 Redisson 客户端二次开发,后续还会新增基于 Jedis 二次开发版本,供业务灵活选择,并且集成到 fusion 框架中
Golang SDK 基于 go-Redis v9 进行二次开
C++ SDK 基于 brpc 二次开发
DRedis 接入优势
业务通过 DRedis SDK 接入自建 Redis,在稳定性、性能等方面都能得到大幅提升,同时能降低使用成本。
社区某应用升级后,业务 RT 下降明显,如下图所示:
DRedis 接入现状
DRedis SDK 目前在公司内部大部分业务域的应用完成升级。
Java 和 Golang 应用目前接入上线超过 300+。
