分布式 Redis 架构设计简介

2018-01-18 10:50:19来源:http://mp.weixin.qq.com/s/YkygrSjCUJOSOAktdS81aQ作者:人点击

分享

REmote DIctionary Server(Redis) 是一个由Salvatore Sanfilippo写的key-value存储系统。Redis是一个开源的使用ANSI C语言编写、遵守BSD协议、支持网络、可基于内存亦可持久化的日志型、Key-Value数据库,并提供多种语言的API。它通常被称为数据结构服务器,因为值(value)可以是 字符串(String), 哈希(Map), 列表(list), 集合(sets) 和 有序集合(sorted sets)等类型。


线上服务qps 2万/s,即每分钟12万次请求,吞吐量是相当大的,存储是线上服务稳定核心,用好redis十分重要。业务上redis作为主要存储,深入了解他有助于更好的使用,出现一些问题可以有深入一些的理解以及方便和存储维护方沟通。了解了存储才能用合理应用,对业务进行合理规划,在出现问题时也能从容进行应对。


redis架构设计特点:


1、redis由非阻塞单线程模式实现。编程简洁不易出bug,而且qps不低,可以说是极高,另一个无阻塞单线程是nginx,所以说单线程不一定性能差,关键是要看怎样合理使用,设计架构。非阻塞io各个操作系统下


2、命令式设计,客户端与服务端交互采用命令式进行交互,客户端发送命令到服务端,服务端接收命令后根据命令类型优先级进行相应解析处理。


3、单线程设计,大的数据请求会阻塞后续请求,以致后续整体tp99都会降低使用时需要注意。


4、超时数据会单独存储,采用定时过期以及访问时过期两种方式。定时过期是随机随段进行过期,非全部遍历进行过期处理。访问时过期,访问数据时,入数据过期进行过期处理。


5、hash数据结构,hash是kv存储基石,时间复杂度o(n),高效数据结构,快速读写都是通过hash数据机构作为基础实现。


6、当red is进行扩容或者缩容时 ,rehash渐进的对原有数据ht[0]生成到新的 ht[1]面,当复制完成后。ht[0]销毁,ht[1]变为ht[0],完成扩容或者缩容过程。


redis分布式相关:


1、codis集群方案通过codis-proxy代理来管理redis分片,通过代理方式能实现无需客户端更新的升级扩容,以及有问题节点替换处理。通过zookeeper来存储集群元信息。



2、redis3.0 提供redis cluster集群方案,官方集群方案采用p2p形式。每个节点存储其他节点信息,当数据请求不在节点时,节点返回数据所在节点,通过两次请求完成数据获取。架构好处是非中心架构,通过grossip协议来同步获取集群信息。缺点是集群分片节点过多(比如分片多于600),会导致集群节点间通信过多导致集群性能下降。



3、单机不能处理超越内存数据量问题,分布式集群方式解决。分布式有cluster和集中存储元数据两种方式。redis分布式一个重要概念是slot,由槽组成分片,多个分片构成集群。


4、集群监控,内存、连接数、超时时间,这是管理平台设计时需要考虑的,通过配置平台实现配置下发以及集群状态管理。


5、存储系统,当下设计重点热点处理,自动扩容。实际使用时避免单点,热升级,热点分裂。当访问量或数据减少后为了节省资源,增加资源利用率要进行所容。


redis使用时需要注意和避免的问题:


1、限制key长度特别是在lrange命令下,数据条数过多会阻塞redis访问。导致其他命令阻塞导致tp99上升。


2、限制单个value大小,业务使用存储一个值有几兆大,访问频率低没有问题,当新上key key访问次数加大,相应接口tp99由毫秒到几秒。


3、单个key避免读写热电,写热点包含单个key长度写的特别大,再有就是进行访问计数器计算计算写的特别频繁也是热点。


4、读的分片热点可以通过动态扩容解决,但单个key热点只能增加slave个数并且客户端增加随机访问master以及slave来分散访问热点,再有就是热key通过本地缓存来避免redis热点数据。会导致tp99升高,双11压测线上服务全线性能不行,是热点key。


5、一次redis整个集群吞吐量下降,mGet了太多数据,618前扩容成为压垮redis的最后一根稻草,过多key拉取会阻塞redis集群。业务涉及要尽量避免过多mGet批量获取。


最新文章

123

最新摄影

闪念基因

微信扫一扫

第七城市微信公众平台