AliRedis单机180w QPS, 8台服务器构建1000w QPS Cache集群(转)

本文涉及的产品
云数据库 Redis 版,社区版 2GB
推荐场景:
搭建游戏排行榜
简介:

http://blog.sina.com.cn/s/blog_e59371cc0101br74.html

引言:
        如今redis凭借其高性能的优势, 以及丰富的数据结构作为cache已越来越流行, 逐步取代了memcached等cache产品, 在Twitter,新浪微博中广泛使用,阿里巴巴同样如此. redis已经占据了其不可动摇的地位, 然而在实际的生产环境中, redis也暴露出一些其他问题.如性能瓶颈, 内存冗余, 运维部署复杂等. 本文目的就是分析redis现有的问题, 以及介绍阿里巴巴技术保障团队对redis的改造工作, 使其在生产环境中发挥更大的价值.
 
原生redis的瓶颈: 
1. 单进程单线程, 无法充分发挥服务器多核cpu的性能.
2. 大流量下造成IO阻塞. 同样是由于单进程单线程, cpu在处理业务逻辑的时候,网络IO被阻塞住, 造成无法处理更多的请求.
3. 维护成本高, 如果想要充分发挥服务器的所有资源包括cpu, 网络io等, 就必须建立多个instance, 但此时不可避免会增加维护成本.  拿24核服务器举例来讲, 如果部署24个单机版的instance,理论上可以实现10w*24core= 240wQPS的总体性能.但是每个 instance 有各自独立的数据,占用资源如内存也会同比上升,反过来制约一台服务器又未必能支持这么多的 instance.  如果部署24个Instance来构成单机集群, 虽然可以共享数据,但是因为节点增加, redis的状态通讯更加频繁和费时,性能也下会降很多.  并且两种方式都意味着要维护24个Instance,运维成本都会成倍增加. 

4. 持久化. redis提供了两种save方式 1)save触发. 2)bgsave. 当然也可以使用3)aof来实现持久化, 但是这3点都有弊端.
         1)save:  由于是单进程单线程, redis会阻塞住所有请求, 来遍历所有redisDB, 把key-val写入dump.rdb. 如果内存数据量过大, 会造成短时间几秒到几十秒甚至更长的时间停止服务, 这种方案对于twitter, taobao等大流量的网站, 显然是不可取的.  
         2)bgsave: 在触发bgsave时, redis会fork自身, child进程会进入1)的处理方式,这意味着服务器内存要有一半的冗余才可以, 如今内存已变得越来越廉价, 但是对于存储海量数据的情况,内存以及服务器的成本还是不容忽视的. 
         3)aof:  说到持久化, redis提供的aof算是最完美的方案了, 但是有得必有失, 严重影响性能! 因为redis每接收到一条请求, 就要把命令内容完整的写到磁盘文件, 且不说频繁读写会影响磁盘寿命,写磁盘的时间足以拖垮redis整体性能 . 当然熟悉redis的开发者会想到用appendfsync等参数来调整, 但都不是完美.即使使用 SSD,性能也只是略有提升,并且性价比不高。
 
针对以上几种情况, 阿里技术保障团队做了如下优化手段, 其实这不仅仅只是优化, 而更是一种对redis的改造.
1. 多线程master + N*work 工作模式.master线程负责监听网络事件, 在接收到一个新的连接后, master会把新的fd注册到worker的epoll事件中, 交由worker处理这个fd的所有读写事件, 这样master线程就可以完全被释放出来接收更多的连接, 同时又不妨碍worker处理业务逻辑和IO读写.

采用这种master + N*worker的网络层事件模型,可以实现redis性能的平行扩展. 真正的让redis在面临高并发请求时可以丛容面对.
2. 抛弃save, bgsave, aof等三种模式.采用redisDB lock模式. AliRedis在数据存储层把多DB存储模式转换成HashDb存储, 将key hash到所有RedisDB上, 这样做有一个弊端就是抛弃了select命令, 但与此同时会带来一个更大的好处, 可以逐个DB持久化而不会影响整个系统, 在做持久化的时候AliRedis只需lock住1/N个redisDb, 占用1/m个线程. 在不需要内存冗余的情况下进行持久化, 相比之前提到的弊端, 这种方式可以带来更大的收益, 更丰厚的回报.
3. 重构hiredis客户端, 支持redis-cluster工作模式, 目前hiredis并不支持redis-cluster模式, 阿里技术保障团队对hiredis进行重构,使之支持redis-cluster.
4. 优化jemalloc, 采用大内存页.  Redis在使用内存方面可谓苛刻至极, 压缩, string转number等, 能省就省, 但是在实际生产环境中, 为了追求性能, 对于内存的使用可以适度(不至于如bgsave般浪费)通融处理, 因此AliRedis对jemalloc做了微调, 通过调整pagesize来让一次je_malloc分配更多run空间来储备更多的用户态可用内存, 同时可以减轻换页表的负载, 降低user sys的切换频率, 来提高申请内存的性能, 对jemalloc有兴趣的开发者可以参考jemalloc源码中的bin, run, chunk数据结构进行分析.


通过如上改造, redis可以充分发挥服务器多核的优势, 以及网络IO复用, 特别是节省运维成本, 每台服务器只需维护一个AliRedis实例.

QPS, 8台服务器构建1000w QPS Cache集群" name=image_operate_60451388034980025 alt="AliRedis单机180w QPS, 8台服务器构建1000w QPS Cache集群" src="http://s8.sinaimg.cn/mw690/004cF6UIgy6FibVf6mz47&690" width=690 height=517 action-type="show-slide" action-data="http%3A%2F%2Fs8.sinaimg.cn%2Fmw690%2F004cF6UIgy6FibVf6mz47%26690" real_src="http://s8.sinaimg.cn/mw690/004cF6UIgy6FibVf6mz47&690">

测试环境
CPU: Intel Xeon E5-2630 2.3GHz, *2
KERNEL: 3.2.0
GCC: 4.4.6
Jemalloc: 3.2.0
NIC: Intel 82599EB

测试数据
AliRedis单机版性能数据
thread:            1            2              4            8             12          16             20             24
set/get=1:1    83182  162214  301552 605817 876656 1173748 1551113 1800878

AliRedis集群
8个节点, 20台客户端, 配置相同, cpu全部打满.
set/get=1:1   qps: 10,344,877
 
结论
单机版AliRedis可以实现24核跑满180wQPS性能.
集群版可以实现8台服务器支撑1000wQPS的数据请求.
 
阿里巴巴技术保障团队肩负着支撑阿里技术, 保障系统稳定运行的艰巨使命.不管是双11, 还是双12, 或者其他大促活动, 每个阿里人都在努力且拼命的工作, 拿自己的劳动来捍卫着阿里集团的荣誉.
 
阿里技术-保障奇迹.
                                                                                    阿里技术保障部-系统运营-网络部-子逍


本文转自茄子_2008博客园博客,原文链接:http://www.cnblogs.com/xd502djj/p/3494421.html ,如需转载请自行联系原作者。

相关实践学习
基于Redis实现在线游戏积分排行榜
本场景将介绍如何基于Redis数据库实现在线游戏中的游戏玩家积分排行榜功能。
云数据库 Redis 版使用教程
云数据库Redis版是兼容Redis协议标准的、提供持久化的内存数据库服务,基于高可靠双机热备架构及可无缝扩展的集群架构,满足高读写性能场景及容量需弹性变配的业务需求。 产品详情:https://www.aliyun.com/product/kvstore     ------------------------------------------------------------------------- 阿里云数据库体验:数据库上云实战 开发者云会免费提供一台带自建MySQL的源数据库 ECS 实例和一台目标数据库 RDS实例。跟着指引,您可以一步步实现将ECS自建数据库迁移到目标数据库RDS。 点击下方链接,领取免费ECS&RDS资源,30分钟完成数据库上云实战!https://developer.aliyun.com/adc/scenario/51eefbd1894e42f6bb9acacadd3f9121?spm=a2c6h.13788135.J_3257954370.9.4ba85f24utseFl
目录
相关文章
|
负载均衡 网络协议 Dubbo
微服务架构 | 3. 注册中心与服务发现
注册中心用来集中管理微服务,实现服务的注册,发现,检查等功能;
2425 2
微服务架构 | 3. 注册中心与服务发现
|
关系型数据库 MySQL Docker
6. 修改docker端口 (映射宿主机和docker容器中的端口)
6. 修改docker端口 (映射宿主机和docker容器中的端口)
2403 0
6. 修改docker端口 (映射宿主机和docker容器中的端口)
|
8月前
|
jenkins 测试技术 持续交付
Nestjs如何使用Jest测试代码
使用Jest测试代码的好处有很多 1. 简单易用:Jest提供了简洁的API和友好的命令行界面,使得编写和运行测试代码变得非常容易。它的断言语法清晰明了,减少了编写测试用例的工作量。 2. 自动化和集成:Jest能够自动运行你的测试用例,并提供了丰富的报告和统计信息。它还可以与持续集成工具(如Jenkins、Travis CI等)集成,使得测试过程更加自动化和可靠。 3. 快速和高效:Jest采用了并行执行测试用例的策略,可以更快地执行大量的测试代码。此外,Jest还具有智能的文件监视功能,只运行受影响的测试用例,从而提高了开发效率。
103 0
|
弹性计算 人工智能 运维
阿里云计算巢产品负责人何川:以技术手段解决ISV伙伴的业务难题
阿里云计算巢产品负责人何川带来了题为《以技术手段解决ISV伙伴的业务难题-计算巢产品规划与生态策略解读》的主题分享。
阿里云计算巢产品负责人何川:以技术手段解决ISV伙伴的业务难题
|
11月前
|
机器学习/深度学习 存储 算法
Nest的test中的best是Jest框架
Nest的test中的best是Jest框架 前言 趁着五一放假,花了3天时间给自己之前做的一个小系统基本补完了单元测试,趁此机会>脑袋里对于单元测试的知识还算热乎,来输出一篇比较详细的关于单元测试的文章,以梳理知识,融汇贯通;如果对你有所帮助,当然最好不过🎉
120 0
|
消息中间件 安全 小程序
阿里巴巴高并发架构到底多牛逼?是如何抗住淘宝双11亿级并发量?
前言 众所周知,在Java的知识体系中,并发编程是非常重要的一环,也是面试的必问题,一个好的Java程序员是必须对并发编程这块有所了解的。 然而不论是哪个国家,什么背景的 Java 开发者,都对自己写的并发程序相当自信,但也会在出问题时表现得很诧异甚至一筹莫展。 可见,Java 并发编程显然不是一件能速成的能力,基础打得越好,越全面,在实践中才会有更深刻的理解。 因此,大家不难发现 Java 并发问题一直是各个大厂面试的重点之一。我在平时的面试中,也发现很多候选人对一些基本的并发概念表示没听过,或原理不理解,可能知道一些却又讲不清楚,最终导致面试失败。
|
存储 缓存 NoSQL
|
SQL 负载均衡 Java
为什么要引入分布式任务调度系统?
在开发中,定时任务是一种十分常见的应用场景,比如每天晚上12点同步数据,又或者每隔一个小时拉取一次数据。 在Java中,实现定时任务的方式有很多,最简单的在线程中通过Thread.sleep睡眠线程,或者采用SpringBoot中的@Schedule注解,又或者采用定时线程池ScheduledExecutorService来实现。
|
分布式计算 运维 并行计算
​分布式系统与单节点系统的本质区别是什么?
​分布式系统与单节点系统的本质区别是什么?
284 0
​分布式系统与单节点系统的本质区别是什么?