Redis如何应对海量请求?
# 回答话术
可以在客户端和 Redis 真实节点之间,加上一层代理服务。
- 负责在客户端和 Redis 节点之间转发请求和响应。客户端只和代理服务打交道,代理收到客户端的请求之后,再转发到对应的 Redis 节点上,节点返回的响应再经由代理转发返回给客户端。
- 负责监控集群中所有 Redis 节点状态,如果发现有问题节点,及时进行主从切换。
- 维护集群的元数据。这个元数据主要就是集群所有节点的主从信息,以及槽和节点关系映射表。
像开源的 Redis 集群方案 twemproxy 和 Codis,都是这种架构的。另外像分库分表中间件 ShardingSphere Proxy 原理同样如此。
这个架构最大的优点是对客户端透明,在客户端视角来看,整个集群和一个超大容量的单节点 Redis 是一样的。并且,由于分片算法是代理服务控制的,扩容也比较方便,新节点加入集群后,直接修改代理服务中的元数据就可以完成扩容。
不过,这个架构的缺点也很突出,增加了一层代理转发,每次数据访问的链路更长了,必然会带来一定的性能损失。而且,代理服务本身又是集群的一个单点,当然,我们可以把代理服务也做成一个集群来解决单点问题。
扩展文章,得物 Redis 缓存架构,基本上与上面讲的架构模型一致,详情查看:得物 Redis 设计与实践 (opens new window)
# 问题详解
# 1. 客户端嵌入寻址服务
除了上面这种架构外,还有另外一种方式是,不用这个代理服务,把代理服务的寻址功能前移到客户端中去。客户端在发起请求之前,先去查询元数据,就可以知道要访问的是哪个分片和哪个节点,然后直连对应的 Redis 节点访问数据。JAVA 客户端 Jedis 就支持这个功能。
当然,客户端不用每次都去查询元数据,因为这个元数据是不怎么变化的,客户端可以自己缓存元数据,这样访问性能基本上和单机版的 Redis 是一样的。如果某个分片的主节点宕机了,新的主节点被选举出来之后,更新元数据里面的信息。对集群的扩容操作也比较简单,除了迁移数据的工作必须要做以外,更新一下元数据就可以了。
虽然说,这个元数据服务仍然是一个单点,但是它的数据量不大,访问量也不大,相对就比较容易实现。我们可以用 ZooKeeper、etcd 甚至 MySQL 都能满足要求。
这个方案应该是最适合超大规模 Redis 集群的方案了,在性能、弹性、高可用几方面表现都非常好,缺点是整个架构比较复杂,客户端不能通用,需要开发定制化的 Redis 客户端,只有规模足够大的企业才负担得起。
# 2. 抬头看世界,云厂商都怎么做?
为了贴合真实场景,我直接看了对应云厂商的集群版本。看完之后,心里久久不能平静。不得不说,钱到位,给你安排的明明白白的。
国内几个大的云厂商,比如阿里、腾讯等部署架构我也看了,基本就上和咱们回答话术中说的一致,通过添加代理服务解决海量访问等问题。
# 3. 阿里云云数据库 Redis 版
# 3.1. 集群模式
集群模式数据将会自动分片,系统将提供数据均衡,数据迁移功能。
集群模式的命令相对于非集群模式有一定的兼容性,主要体现在跨 Slot(槽位)数据访问。
# 3.2. 集群规格
分片规格(GB):1、2、4、8、12、16、20、24、32、40、48、64
分片数量:1、3、5、8、12、16、24、32、40、48、64、80、96、128
副本数量:1、2、3、4、5
看到这个分片规格和分片数我都要跪了,只要钱到位,啥都能给你整出来。对了,每个分片的 QPS 大概在 8-10万,记住是每个分片,不是整个集群!
# 3.3. 副本说明
副本数等于1时,Redis 提供数据主从实时热备,提供数据高可靠和高可用(同一可用区内,跨服务器高可用),HA 系统监测到节点故障后,会将请求切换到从节点,并且新增一个从节点加入到系统。
副本数大于1时,Redis 提供数据主从实时热备,并且提供从节点只读功能。
# 3.4. 代理模式部署架构
# 4. 腾讯云云数据库 Redis 版
腾讯云的云数据 Redis 版本基本和阿里云的类似,这里就不一一介绍了。
# 5. 云厂商 Redis 提供了哪些能力?
# 5.1. 海量并发
标准版性能高达10万+ QPS 并发响应,集群版随着分片线性增长,最大支持千万级 QPS。超高的性能可以满足用户绝大部分场景需求。
单节点支持 10000 连接数(最大可调整到40000)以及 10万+ 的 QPS 性能。如果是集群版,分片数量 * 单节点分片性能。
# 5.2. 突发流量
读扩展:热 Key 场景,支持动态增加副本扩展读性能,最大支持5副本,提供最大50W的热 Key 读取性能。
写扩展:集群版的性能 = 分片数 * 单分片性能。性能水平扩展线性增长,支持从3分片到128分片扩展。
扩容、缩容,规格变更过程业务几乎无感知,保证服务最大可用性。
# 5.3. 容灾能力
云数据库 Redis 采用双机热备架构,主机故障后,访问秒级切换到备机,整个过程用户无需做任何处理。节省了开发主从系统带来的人力和时间成本。
# 5.4. 性能监控
系统监控:实例使用过程中完全透明,支持通过腾讯云可观测平台配置告警规则,提供多达30余项的自动化监控指标。辅助您随时掌控云数据库 Redis 服务的运行状态,快速排障解决问题。
数据库智能管家(TencentDB for DBbrain,DBbrain):可实时监控诊断数据库实例异常,包括:慢日志分析、大 Key 及热 Key 分析、延迟分析等,自动生成健康报告,给出专家级的优化建议,帮助您及时优化数据库性能。
管控类 API 接口:云数据库 Redis 提供了一整套完备的管控类 API 接口,用于实现一系列的资源自主管理和运维功能。