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

  • 时间:
  • 浏览:0
  • 来源:uu快3计划师_uu快3app苹果_全天计划

测试数据 AliRedis单机版性能数据

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

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

引言:

        如今redis凭借其高性能的优势, 以及充足的数据形状作为cache已如此流行, 逐步取代了memcached等cache产品, 在Twitter,新浪微博中广泛使用,阿里巴巴同样如此. redis是原困居于了其不可动摇的地位, 然而在实际的生产环境中, redis也暴露出什儿 什儿 问提.如性能瓶颈, 内存冗余, 运维部署简化等. 本文目的只是我分析redis现有的问提, 以及介绍阿里巴巴技术保障团队对redis的改造工作, 使其在生产环境中发挥更大的价值.

 

原生redis的瓶颈: 

1. 单应用应用线程池池单应用线程池池, 无法充挂接挥服务器多核cpu的性能.

2. 大流量下造成IO阻塞. 同样是是原困单应用应用线程池池单应用线程池池, cpu在除理业务逻辑的日后,网络IO被阻塞住, 造成无法除理更多的请求.

3. 维护成本高, 是原困想要充挂接挥服务器的所有资源包括cpu, 网络io等, 就还要建立多个instance, 但此时不可除理会增加维护成本.  拿24核服务器举例来讲, 是原困部署2六个 单机版的instance,理论上还要实现10w*24core= 240wQPS的总体性能.因此每个 instance 有个人独立的数据,占用资源如内存也会同比上升,反过来制约一台服务器又如此多能支持如此多的 instance.  是原困部署2六个 Instance来构成单机集群, 嘴笨 还要共享数据,因此是原困节点增加, redis的请况通讯更加频繁和费时,性能也下会降只是我有.  因此并算是办法都原困要维护2六个 Instance,运维成本还里能 成倍增加. 



通过如上改造, redis还要充挂接挥服务器多核的优势, 以及网络IO复用, 不怎么是节省运维成本, 每台服务器只需维护六个 AliRedis实例.

QPS, 8台服务器构建4000w QPS Cache集群" name=image_operate_40045138400349400025 alt="AliRedis单机1400w QPS, 8台服务器构建4000w 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-26400 2.3GHz, *2

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读写.

AliRedis集群

结论 单机版AliRedis还要实现24核跑满1400wQPS性能.

采用什儿 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数据形状进行分析.