基于Redis搭建高可用集群,redis集群,哨兵,雪崩,穿透,击穿
一. 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的数据结构(字典)
- redis中的集合相当于一个特殊的字典,字典的所有value都位null
- 当集合中的最后一个元素被移除后,数据结构会被自动删除,内存被回收
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)解决方法
- 保证缓存层服务高可用性:比如 Redis Sentinel 和 Redis Cluster 都实现了高可用
- 依赖隔离组件为后端限流并降级:比如对某个key只允许一个线程查询数据和写缓存,其他线程等待。
3、缓存击穿
1)定义:
1. 缓存击穿,就是说某个 key 非常热点,访问非常频繁,处于集中式高并发访问的情况
2. 当这个 key 在失效的瞬间,大量的请求就击穿了缓存,直接请求数据库,就像是在一道屏障上凿开了一个洞。
2)解决方法
- 解决方式也很简单,可以将热点数据设置为永远不过期;
- 或者基于 redis or zookeeper 实现互斥锁,等待第一个请求构建完缓存之后,再释放锁,进而其它请求才能通过该 key 访问数据。
- 点赞
- 收藏
- 分享
- 文章举报
- 基于Sentinel(哨兵)搭建实现Redis高可用集群
- 基于哨兵(Sentinel)模式搭建Redis集群搭建
- 基于Centos7系统搭建Redis集群之哨兵机制(新手教程)
- 基于Docker的Redis高可用集群搭建(redis-sentinel)
- 搭建基于 centos 的 Redis 哨兵模式 (4.0.6)
- 什么是 redis 的雪崩、穿透和击穿?Redis 崩溃之后会怎么样?系统该如何应对这种情况?如何处理 Redis 的穿透?
- Redis主从复制集群及哨兵模式搭建
- redis主从集群搭建及容灾部署(哨兵sentinel)
- centos下redis集群哨兵服务搭建(三)
- Redis高可用集群-哨兵模式(Redis-Sentinel)搭建配置教程【Windows环境】
- redis主从集群搭建及容灾部署(哨兵sentinel)
- redis主从集群搭建及容灾部署(哨兵sentinel)
- Redis主从集群搭建及容灾部署(哨兵sentinel)
- redis高可用之sentinel哨兵集群详解与搭建
- CentOs7 搭建基于最新版 Redis 集群环境
- Redis的三种集群方式+穿透与雪崩的预防和解决
- Redis 主从集群搭建及哨兵模式配置
- CentOs7 搭建基于最新版 Redis 集群环境之图文详解
- Linux_基于Docker搭建Redis集群
- 搭建redis-sentinel(哨兵机制)集群