廊坊信息港
时尚
当前位置:首页 > 时尚

AliRedis单机180wQPS8台服

发布时间:2019-05-14 22:36:54 编辑:笔名

引言:

如今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写入b.如果内存数据量过大,会造成短时间几秒到几十秒甚至更长的时间停止服务,这种方案对于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实例.

测试环境

CPU: Intel Xeon E 2.3GHz, *2

KERNEL: 3.2.0

GCC: 4.4.6

Jemalloc: 3.2.0

NIC: Intel 82599EB

测试数据

AliRedis单机版性能数据

thread:

set/get=1: 301552 605817 876656

AliRedis集群

8个节点, 20台客户端,配置相同, cpu全部打满.

set/get=1:1qps: 10,344,877

结论

单机版AliRedis可以实现24核跑满180wQPS性能.

集群版可以实现8台服务器支撑1000wQPS的数据请求.

阿里巴巴技术保障团队肩负着支撑阿里技术,保障系统稳定运行的艰巨使命.不管是双11,还是双12,或者其他大促活动,每个阿里人都在努力且拼命的工作,拿自己的劳动来捍卫着阿里集团的荣誉.

阿里技术-保障奇迹.

阿里技术保障部-系统运营-络部-子逍

工业设计公司
安卓游戏开发
捕鱼上下分