Redis服务支持5000万的QPS,有什么好的思路?
2017-12-13 18:18
302 查看
5000W QPS 量确实比较大,在当前的架构下,就以开源的redis cluster为例,假设每个节点跑8W QPS,那么也需要 5000/8 = 600+的节点,而Gossip在超过百级别节点的时候成本就越来越高,表现也越来越差了,所以用redis cluster来解这个问题不大靠谱,不靠谱的主要原因是Gossip的通信机制。
对于几个大厂来说,阿里云ApsaraDB for Redis/ApsaraCache用的是自研的集群方案(架构类似Codis),RedisLabs也是这个架构,AWS用的是开源的Redis Cluster,其他大厂就不清楚了。proxy+redis-server的架构可以做到线性的扩容,不用担心节点间的通讯压力,因为proxy做了分片,虽然也需要全局的Config Server/Zookeeper来维护数据分片信息,但是总体而言通信成本几乎为0,所以这种架构撑5000W QPS理论上是没有问题的。
这种架构还有一个优点就是可以把proxy当成一个中间件,在这个中间件上你可以做任何事情,比如可以把集群和主从的兼容性做到几乎一致、可以做无缝扩缩容、安全策略等等,redis cluster因为缺少了这么一个中间层就很难做这类事情(现在也有项目给redis cluster做一层proxy),当然因为带了proxy,带宽和CPU基本也是double的,对资源的消耗会大很多。
回到5000W这个问题上,理论上没问题不代表实际没问题,在几百个节点的集群中,由于节点数变多,fail的几率也大大变高;数据倾斜的问题也依然存在(访问热点导致的单个分片节点跑满,比如秒杀);而且由于redis跑满时70-80%的cpu会消耗在内核网络栈上,所以当一个机器的CPU跑满时,cpu system和softirq会居高不下,对主机的稳定性是个巨大的挑战;另外对机房各个层次的交换机也会有巨大的挑战;总而言之,服务的SLA是很难得到满足的,为了保证SLA,可能需要上百台机器来部署几百个分片以分担5000W的压力,这个成本也不是一般小厂能承担的。而且节点数多的时候,对一些跨机指令是不友好的,比如mget,当节点数变多的时候会存在mget
hole的问题,延迟与单节点相比会是原来的1/2次方倍,比如9个节点,mget的延迟就是原来的3倍,100个节点,延迟就是原来的10倍,懂概率的同学可以自己算一下。
那到底如何彻底解决5000W这个问题呢,这里还是需要引入新技术的,比如智能网卡、用户态tcp/ip协议栈、多线程redis(减少分片数量,兼容性依然100%),纯用户态协议栈可以做到单机600W QPS(64 core)左右,用intel iWARP这个值可能能达到1500W QPS左右(把7层网络栈都offload到网卡),这样3-4台baremetal机器就能达到你说的要求;上层交换机也要用最新的机房建设标准,而且redis源码本身也要做很多的适配和重构;产品形态也要做相应改进,比如我们为了支持热key就做了读写分离这种产品形态。
对于几个大厂来说,阿里云ApsaraDB for Redis/ApsaraCache用的是自研的集群方案(架构类似Codis),RedisLabs也是这个架构,AWS用的是开源的Redis Cluster,其他大厂就不清楚了。proxy+redis-server的架构可以做到线性的扩容,不用担心节点间的通讯压力,因为proxy做了分片,虽然也需要全局的Config Server/Zookeeper来维护数据分片信息,但是总体而言通信成本几乎为0,所以这种架构撑5000W QPS理论上是没有问题的。
这种架构还有一个优点就是可以把proxy当成一个中间件,在这个中间件上你可以做任何事情,比如可以把集群和主从的兼容性做到几乎一致、可以做无缝扩缩容、安全策略等等,redis cluster因为缺少了这么一个中间层就很难做这类事情(现在也有项目给redis cluster做一层proxy),当然因为带了proxy,带宽和CPU基本也是double的,对资源的消耗会大很多。
回到5000W这个问题上,理论上没问题不代表实际没问题,在几百个节点的集群中,由于节点数变多,fail的几率也大大变高;数据倾斜的问题也依然存在(访问热点导致的单个分片节点跑满,比如秒杀);而且由于redis跑满时70-80%的cpu会消耗在内核网络栈上,所以当一个机器的CPU跑满时,cpu system和softirq会居高不下,对主机的稳定性是个巨大的挑战;另外对机房各个层次的交换机也会有巨大的挑战;总而言之,服务的SLA是很难得到满足的,为了保证SLA,可能需要上百台机器来部署几百个分片以分担5000W的压力,这个成本也不是一般小厂能承担的。而且节点数多的时候,对一些跨机指令是不友好的,比如mget,当节点数变多的时候会存在mget
hole的问题,延迟与单节点相比会是原来的1/2次方倍,比如9个节点,mget的延迟就是原来的3倍,100个节点,延迟就是原来的10倍,懂概率的同学可以自己算一下。
那到底如何彻底解决5000W这个问题呢,这里还是需要引入新技术的,比如智能网卡、用户态tcp/ip协议栈、多线程redis(减少分片数量,兼容性依然100%),纯用户态协议栈可以做到单机600W QPS(64 core)左右,用intel iWARP这个值可能能达到1500W QPS左右(把7层网络栈都offload到网卡),这样3-4台baremetal机器就能达到你说的要求;上层交换机也要用最新的机房建设标准,而且redis源码本身也要做很多的适配和重构;产品形态也要做相应改进,比如我们为了支持热key就做了读写分离这种产品形态。
相关文章推荐
- 制作包含redis和mqtt的Docker镜像-支持多服务
- 准备写一个智能提示的控件,大家有什么好的思路
- SpringBoot 支持 redis 多数据库或redis多服务 自由切换路由,saas多租户支持.
- 当服务QPS增高时我们做什么
- JPush apns ios推送通知服务支持badge+1了大家有什么看法
- 当服务QPS增高时我们做什么
- 微服务给我们带来了什么
- 生活服务APP开发该注意什么问题?
- 那些支持着JobDeer的开源项目和云服务
- 基于Mesos、Docker、Marathon实现的可伸缩微服务思路
- 访问vm_cnetos 远程Redis服务。Connect to Remote Redis Server
- redis图形化客户端无法连接redis服务
- SQL SERVER 2005本机Web服务支持(实战篇)
- Redis Sentinel服务配置
- WFS服务不支持字段别名及其他问题
- .无法激活服务,因为它不支持 ASP.NET 兼容性
- 什么是链接诱饵,链接诱饵建设思路与作用
- .NET微服务 容器化.NET应用架构指南(支持.NET Core2)
- 决策支持系统是什么?
- 小娜老师的讲义-创建支持SSH服务的镜像