![cover](https://img-blog.csdnimg.cn/a9a46e8f72464c75947658754d17da33.png?x-oss-process=image/watermark,type_ZHJvaWRzYW5zZmFsbGJhY2s,shadow_50,text_Q1NETiBARG91YmxlLVY=,size_20,color_FFFFFF,t_70,g_se,x_16)
Redis哨兵模式
一、哨兵模式概述(自动选主机的方式)主从切换技术:当主机宕机后,需要手动把一台从(slave)服务器切换为主服务器,这就需要人工干预,费时费力,还回造成一段时间内服务不可用,所以推荐哨兵架构(Sentinel)来解决这个问题。哨兵模式是一种特殊的模式,首先Redis提供了哨兵的命令,哨兵是一个独立的进程,作为进程,它独立运行。其原理是哨兵通过发送命令,等待Redis服务器响应,从而监控运行的多个R
·
一、哨兵模式概述
(自动选主机的方式)
主从切换技术:当主机宕机后,需要手动把一台从(slave)服务器切换为主服务器,这就需要人工干预,费时费力,还回造成一段时间内服务不可用,所以推荐哨兵架构(Sentinel)来解决这个问题。
哨兵模式是一种特殊的模式,首先Redis提供了哨兵的命令,哨兵是一个独立的进程,作为进程,它独立运行。其原理是哨兵通过发送命令,等待Redis服务器响应,从而监控运行的多个Redis实例。
![](https://i-blog.csdnimg.cn/blog_migrate/f29f3790c228353234753e04a81637cf.png)
这里哨兵模式有两个作用:
-
通过发送命令,让Redis服务器返回监控其运行状态,包括主服务器和从服务器
-
当哨兵监测到Redis主机宕机,会自动将slave切换成master,然后通过发布订阅模式通知其他服务器,修改配置文件,让他们换主机
当一个哨兵进程对Redis服务器进行监控,可能会出现问题,为此可以使用哨兵进行监控,
各个哨兵之间还会进行监控,这就形成了多哨兵模式。
![](https://i-blog.csdnimg.cn/blog_migrate/caa87ec664ec2c65f93b661b29398ad2.png)
以上过程:假设主服务器宕机,哨兵1先检测到结果,但是系统并不会马上进行failover过程,仅仅是哨兵1主观认为主服务器不可以用,这个现象称为主观下线,当后面的哨兵也检测到主服务器不可用,并且数量达到一定时,那么哨兵之间就会进行一次投票,投票的结果由一个哨兵发起,进行failover故障转移操作。
操作转移成功后。就会发布订阅模式,让各个哨兵把自己监控的从服务器实现切换主机,这一过程称为
客观下线
测试:
1.配置哨兵配置文件
sentinel monitor myredis 127.0.0.1 6379 1
解释 :
sentinel
monitor
(被监控的名称) host port 1
最后面的1是监测到主机宕机后,会投出1票
2.启动哨兵
![](https://i-blog.csdnimg.cn/blog_migrate/94d5009fe80b61163b6090bfa4206693.png)
主机宕机,6379 sdown ,从机中随机选择一个服务器-----6381
哨兵日志:
![](https://i-blog.csdnimg.cn/blog_migrate/33dca1c162eb33500a3d6163dfcd1c9e.png)
+failover-state-send-slaveof-noone ------
此时6379即使修复,也只能变成从机
优点:
1.哨兵集群。基于主从复制模式,所有的主从配置优点,它都有
2.主从可以切换,故障可以转移,系统可用性就更好
3.哨兵模式是主从模式的升级,手动到自动,更完善
缺点:
1.Redis不好在线扩容,集群容量一旦达到上限,扩容麻烦
2.实现配置麻烦
哨兵模式的全部配置:
![](https://i-blog.csdnimg.cn/blog_migrate/fe7f537127c52ba16a5dc9e0d7286aaa.png)
![](https://i-blog.csdnimg.cn/blog_migrate/b269b739549942e6d41c7df8f5524b0a.png)
![](https://i-blog.csdnimg.cn/blog_migrate/035396072d3aa4a245113db8f9afe7d2.png)
![](https://i-blog.csdnimg.cn/blog_migrate/8cff5b951078bf6e8789c11ef01bd180.png)
![](https://i-blog.csdnimg.cn/blog_migrate/fa8a15fc20bb611e2e9c8c0a34746676.png)
二、Redis缓存穿透、击穿和雪崩
缓存穿透(查不到数据):用户想要查询一个数据,发现Redis内存数据库里没有,也就是缓存没有命中,于是向
持久层的数据库查询,发现也没有,于是本次查询失败,当用户很多的时候,缓存都没有命中,于是都去请求了持久层数据库,这会给持久层数据库造成很大的压力,出现缓存穿透。
![](https://i-blog.csdnimg.cn/blog_migrate/ab1223bd22439efbbea6bc58b38fb895.png)
解决方案:布隆过滤器
布隆过滤器是一种数据结构,对所有可能查询的参数以hash形式存储,在控制层先进行校验,不符合则丢弃,从而避免了对底层存储系统的压力
![](https://i-blog.csdnimg.cn/blog_migrate/d5ce516fd96734157af4026079b1a52f.png)
但是:
1、如果空值能被缓存起来,这就意味着缓存需要更多的空间存储更多的键
2、即使对空值设置了过期时间,还是会存在缓存层和存储层的数据会有一段时间的窗口不一致
缓存击穿(访问量过大):是指某一个key
非常热点,在不停的扛着大的并发,大并发集中对这个点进行访问,当这个key在失效的瞬间,持续的大并发就穿破缓存,直接请求数据库。
当某个key过期的瞬间,就会有大量的请求并发访问,这类数据一般是热点数据,由于缓存过期,会同时访问数据库来查询最新数据,并且回写缓存,会导致数据库瞬间压力过大。
解决:
![](https://i-blog.csdnimg.cn/blog_migrate/15bce17def1437efd19f06159005cc27.png)
1、设置热点数据永不过期
2、加互斥锁
使用分布式锁,保证每一个key同时只有一个线程去查询后端服务,其他线程没有获得分布式锁的权限,只需等待(对分布锁要求高)
缓存雪崩:指在某一个时间段,缓存集中过期失效,Redis宕机
比如 :双十一零点,抢购,这波商品应该放在缓存区,假设缓存一小时,到了凌晨一点,商品缓存过期,而对于这批商品的访问,都跑到数据库中,对于数据库,产生压力峰。所有请求都会到达存储层,存储层的调用量增加,存储层狗带(缓存服务节点的宕机,对数据库服务器造成的压力不可预知)
![](https://i-blog.csdnimg.cn/blog_migrate/33c10cbc750bfbf40ecfe8e2a35ffc95.png)
解决:
1、redis高可用(多增加redis)
2、限流降级(通过加锁来控制数据库写缓存的线程数量)
3、数据预热(在正式部署之前,把可能的数据先访问一遍)
4、设置随机失效keys
更多推荐
所有评论(0)