57

分布式redis架构设计简介

 6 years ago
source link: http://mp.weixin.qq.com/s/YkygrSjCUJOSOAktdS81aQ
Go to the source link to view the article. You can view the picture content, updated content and better typesetting reading experience. If the link is broken, please click the button below to view the snapshot at that time.

分布式redis架构设计简介

Original 杉枫 探索互联网 2018-01-17 05:19 Posted on

T002R500x500M000000f01724fd7TH.jpg

        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、当redis进行扩容或者缩容时,rehash渐进的对原有数据ht[0]生成到新的ht[1]面,当复制完成后。ht[0]销毁,ht[1]变为ht[0],完成扩容或者缩容过程。

      redis分布式相关:

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

Image

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

Image

       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批量获取。


About Joyk


Aggregate valuable and interesting links.
Joyk means Joy of geeK