您的位置:首页 > 数据库 > Redis

基于Redis搭建高可用集群,redis集群,哨兵,雪崩,穿透,击穿

2020-03-05 19:51 621 查看

一. Redis集群

redis有哪几种集群

  • 主从模式 ,哨兵模式,codis

redis主动同步机制

  • RDB 全量同步:从服务器把有的数据全部丢弃,让主服务把所有数据全部发给他

  • AOF 增量同步:主服务器只发送从服务器缺少的数据

redis主从同步应该采用哪种方式

  • 主从刚刚连接的时候,进行全量同步;全同步结束后,进行增量同步。
  • 当然,如果有需要,slave 在任何时候都可以发起全量同步。
  • redis 策略是,无论如何,首先会尝试进行增量同步,如不成功,要求从机进行全量同步。

redis主从

  • 写主库、读从库,减轻服务器读压力
  • 缺点:但是redis主从不能自动切换master,所以master如果挂掉了,整个集群都不可以写入啦

哨兵模式如何解决主从问题

  • 当用Redis做主从方案时,假如master宕机,Redis本身无法自动进行主备切换

  • 而Redis-sentinel本身也是一个独立运行的进程,它能监控多个master-slave集群,发现master宕机后能进行自动切换。

sentinel原理

  • sentinel负责持续监控主节点的健康,当主节挂掉时,自动选择一个最优的从节点切换成主节点
  • 从节点来连接集群时会首先连接sentinel,通过sentinel来查询主节点的地址
  • 当主节点发生故障时,sentinel会将最新的主节点地址告诉客户端,可以实现无需重启自动切换redis

sentinel缺点

  • redis的slave和master数据时完全一样的,但是有个问题,redis数据时存储在内存中
  • 内存空间有限,所以哨兵模式不能处理大的数据量

codis

  • 为什么会出现codis
  • 在大数据高并发场景下,单个redis实例往往会无法应对
  • 首先redis内存不易过大,内存太大会导致rdb文件过大,导致主从同步时间过长
  • 其次在CPU利用率中上,单个redis实例只能利用单核,数据量太大,压力就会特别

codis部署方案

  • 单个codis代理支撑的QPS比较有限,通过启动多个codis代理可以显著增加整体QPS
  • 多codis还能起到容灾功能,挂掉一个codis代理还有很多codis代理可以继续服务

    codis分片的原理
  • codis负责将特定key转发到特定redis实例,codis默认将所有key划分为1024个槽位
  • 首先会对客户端传来的key进行crc32计算hash值,然后将hash后的整数值对1024进行取模,这个余数就是对应的key槽
  • 每个槽位都会唯一映射到后面的多个redis实例之一,codis会在内存中维护槽位和redis实例的映射关系
  • 这样有了上面key对应的槽位,那么它应该转发到那个redis实例就很明确了
  • 槽位数量默认是1024,如果集群中节点较多,建议将这个数值大一些,比如2048,4096

二. redis五种数据结构

说明:

1. redis中所有数据结构都以唯一的key字符串作为名称,然后通过这个唯一的key来获取对应的value
2. 不同的数据类型数据结构差异就在于value的结构不一样

1、 字符串(string)

1)value的数据结构(数组)

1. 字符串value数据结构类似于数组,采用与分配容易空间来减少内存频繁分配
2. 当字符串长度小于1M时,扩容就是加倍现有空间
3. 如果字符串长度操作1M时,扩容时最多扩容1M空间,字符串最大长度为 512M

2)字符串的使用场景(缓存)

1. 字符串一个常见的用途是缓存用户信息,我们将用户信息使用JSON序列化成字符串
2. 取用户信息时会经过一次反序列化的过程

2、list(列表)

1)value的数据结构(双向链表)

1. 列表的数据结构是双向链表,这意味着插入和删除的时间复杂度是0(1),索引的时间复杂 度位0(n)
2. 当列表弹出最后一个元素后,该数据结构会被自动删除,内存被回手

2)列表的使用场景(队列、栈)

3、hash(字典)

1)value的数据结构(HashMap)

1. redis中的字典也是HashMap(数组+列表)的二维结构
2. 不同的是redis的字典的值只能是字符串

2)hash的使用场景(缓存)

1. hash结构也可以用来缓存用户信息,与字符串一次性全部序列化整个对象不同,hash可以对每个字段进行单独存储
2. 这样可以部分获取用户信息,节约网络流量
3. hash也有缺点,hash结构的存储消耗要高于单个字符串

4、set(集合)

1)value的数据结构(字典)

  1. redis中的集合相当于一个特殊的字典,字典的所有value都位null
  2. 当集合中的最后一个元素被移除后,数据结构会被自动删除,内存被回收

2)set使用场景

1. set结构可以用来存储某个活动中中奖的用户ID,因为有去重功能,可以保证同一用户不会中间两次

5、zset(有序集合)

1)value的数据结构(跳跃列表)

1.zset一方面是一个set,保证了内部的唯一性
2. 另一方面它可以给每一个value赋予一个score,代表这个value的权重
3. zset内部实现用的是一种叫做“跳跃列表”的数据结构
4. zset最后一个元素被移除后,数据结构就会被自动删除,内存也会被回收

2)zset应用场景

1. 粉丝列表:value(粉丝ID),score(关注时间),这样可以轻松按关注事件排序
2. 学生成绩:value(学生ID),score(考试成绩),这样可以轻松对成绩排序

三. redis雪崩&穿透&击穿

1、缓存穿透
1)定义

1. 缓存穿透是指查询一个一定不存在的数据,由于缓存不命中,接着查询数据库也无法查询出结果,
2. 虽然也不会写入到缓存中,但是这将会导致每个查询都会去请求数据库,造成缓存穿透;

2)解决方法 :布隆过滤

1. 对所有可能查询的参数以hash形式存储,在控制层先进行校验,不符合则丢弃,从而避免了对底层存储系统的查询压力;

2、缓存雪崩
1)定义

1. 缓存雪崩是指,由于缓存层承载着大量请求,有效的保护了存储层,但是如果缓存层由于某些原因整体不能提供服务
2. 于是所有的请求都会达到存储层,存储层的调用量会暴增,造成存储层也会挂掉的情况。

2)解决方法

  1. 保证缓存层服务高可用性:比如 Redis Sentinel 和 Redis Cluster 都实现了高可用
  2. 依赖隔离组件为后端限流并降级:比如对某个key只允许一个线程查询数据和写缓存,其他线程等待。

3、缓存击穿
1)定义:

1. 缓存击穿,就是说某个 key 非常热点,访问非常频繁,处于集中式高并发访问的情况
2. 当这个 key 在失效的瞬间,大量的请求就击穿了缓存,直接请求数据库,就像是在一道屏障上凿开了一个洞。

2)解决方法

  1. 解决方式也很简单,可以将热点数据设置为永远不过期;
  2. 或者基于 redis or zookeeper 实现互斥锁,等待第一个请求构建完缓存之后,再释放锁,进而其它请求才能通过该 key 访问数据。
  • 点赞
  • 收藏
  • 分享
  • 文章举报
longlong6682 发布了30 篇原创文章 · 获赞 4 · 访问量 1016 私信 关注
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: