Redis应用-哨兵模式以及缓存穿透雪崩解决方案

文章目录

  • Redis应用-哨兵模式以及缓存穿透雪崩
    • 哨兵模式
    • Redis缓存穿透和雪崩
      • 缓存穿透
        • 布隆过滤器
        • 缓存空对象
      • 缓存击穿
        • 设置热点数据永不过期
        • 加互斥锁
      • 缓存雪崩
        • Redis高可用
        • 限流降级
        • 数据预热

Redis应用-哨兵模式以及缓存穿透雪崩

哨兵模式

概述

主从切换技术的方法是:当主节点宕机后,需要手动把一台服务器切换到主服务器,这就需要人工干预,费时费力,还会造成一段时间服务不可用。这不是一种推荐的方式,更多的时候我们优先考虑哨兵模式。Redis从2.8的版本开始提供sentinel(哨兵)架构来解决这个问题。

哨兵模式是一种特使的模式,首先Redis提供了哨兵的命令,哨兵是一个独立的进程。其原理是哨兵通过发送命令,等待Redis服务器响应,从而监控运行的多个Redis实例。

在这里插入图片描述

这里的哨兵有两个作用

  1. 通过发送命令让Redis服务器返回监控其运行的状态,包括主节点和从节点。
  2. 当哨兵监测到master宕机,会自动将slave切换成master,然乎通过发布订阅模式通知其它从节点,修改配置文件->切换主机

然而一个哨兵进程对Redis服务器进行监控,可能会出现问题,为此,我们可以使用上图的多哨兵进行监控,各个哨兵直接还会互相监控,这样就形成了多哨兵模式。

假设主节点宕机,哨兵1先检测到这个结果,系统并不会马上进行fail over过程,仅仅是哨兵1主观认为主节点不可用,这个现象称为主观下线。当后面的哨兵也检测到主节点不可用并且达到一定数量时,那么哨兵直接就会进行一次投票,

投票的结果由一个哨兵发起,进行fail over故障转移操作。切换成功之后,就会通过发布订阅模式,让各个哨兵把自己监控的从节点实现切换主节点,这个过程称为客观下线

实践

# 配置哨兵配置文件
[root@VM-4-17-centos redisconfig]# vim sentinel.conf
sentinel monitor myredis 127.0.0.1 6379 1
# 启动哨兵
[root@VM-4-17-centos bin]# redis-sentinel redisconfig/sentinel.conf 

在这里插入图片描述

# 现在将79这个主机断掉
127.0.0.1:6379> shutdown
not connected> exit
# 哨兵收不到主节点的heartbeat 就会重新选举出主节点

在这里插入图片描述

# 查看81 的信息
127.0.0.1:6381> info replication
# Replication
role:slave	#从节点
master_host:127.0.0.1
master_port:6380
master_link_status:up
master_last_io_seconds_ago:1
master_sync_in_progress:0
slave_repl_offset:30626
slave_priority:100
slave_read_only:1
connected_slaves:0
master_replid:eed0a09fd55105549f3bde2dfa8273d3c6c7b1d8
master_replid2:fce6232ffa0779d9479f4b13d6ce60e1cb3bd46c
master_repl_offset:30626
second_repl_offset:28172
repl_backlog_active:1
repl_backlog_size:1048576
repl_backlog_first_byte_offset:1
repl_backlog_histlen:30626

# 查看80的信息
127.0.0.1:6380> info replication
# Replication
role:master	#主节点
connected_slaves:1
slave0:ip=127.0.0.1,port=6381,state=online,offset=30084,lag=0
master_replid:eed0a09fd55105549f3bde2dfa8273d3c6c7b1d8
master_replid2:fce6232ffa0779d9479f4b13d6ce60e1cb3bd46c
master_repl_offset:30084
second_repl_offset:28172
repl_backlog_active:1
repl_backlog_size:1048576
repl_backlog_first_byte_offset:179
repl_backlog_histlen:29906

# 重新连上79 ,79也只能作为从节点
127.0.0.1:6379> info replication
# Replication
role:slave
master_host:127.0.0.1
master_port:6380
master_link_status:up
master_last_io_seconds_ago:1
master_sync_in_progress:0
slave_repl_offset:67997
slave_priority:100
slave_read_only:1
connected_slaves:0
master_replid:eed0a09fd55105549f3bde2dfa8273d3c6c7b1d8
master_replid2:0000000000000000000000000000000000000000
master_repl_offset:67997
second_repl_offset:-1
repl_backlog_active:1
repl_backlog_size:1048576
repl_backlog_first_byte_offset:65543
repl_backlog_histlen:2455

在这里插入图片描述

哨兵模式

优点:

  1. 哨兵集群,基于主从复制模式,所有的主从配置优点它都有
  2. 主从可以切换,故障可以转移,系统的可用性会更好
  3. 哨兵模式就是主从模式的升级,手动到自动,更加健壮

缺点:

  1. Redis不好在线扩容,集群容量一旦达到上限,在线扩容就十分麻烦
  2. 实现哨兵模式也比较麻烦,配置有很多

哨兵模式的全部配置

# Example sentinel.conf
 
# 哨兵sentinel实例运行的端口 默认26379
port 26379
 
# 哨兵sentinel的工作目录
dir /tmp
 
# 哨兵sentinel监控的redis主节点的 ip port 
# master-name  可以自己命名的主节点名字 只能由字母A-z、数字0-9 、这三个字符".-_"组成。
# quorum 当这些quorum个数sentinel哨兵认为master主节点失联 那么这时 客观上认为主节点失联了
# sentinel monitor <master-name> <ip> <redis-port> <quorum>  下面这个2的意思就是当个哨兵检测到79服务宕机后才进行选举
sentinel monitor mymaster 127.0.0.1 6379 2
 
# 当在Redis实例中开启了requirepass foobared 授权密码 这样所有连接Redis实例的客户端都要提供密码
# 设置哨兵sentinel 连接主从的密码 注意必须为主从设置一样的验证密码
# sentinel auth-pass <master-name> <password>
sentinel auth-pass mymaster MySUPER--secret-0123passw0rd
 
 
# 指定多少毫秒之后 主节点没有应答哨兵sentinel 此时 哨兵主观上认为主节点下线 默认30秒
# sentinel down-after-milliseconds <master-name> <milliseconds>
sentinel down-after-milliseconds mymaster 30000
 
# 这个配置项指定了在发生failover主备切换时最多可以有多少个slave同时对新的master进行 同步,
这个数字越小,完成failover所需的时间就越长,
但是如果这个数字越大,就意味着越 多的slave因为replication而不可用。
可以通过将这个值设为 1 来保证每次只有一个slave 处于不能处理命令请求的状态。
# sentinel parallel-syncs <master-name> <numslaves>
sentinel parallel-syncs mymaster 1
 
 
 
# 故障转移的超时时间 failover-timeout 可以用在以下这些方面: 
#1. 同一个sentinel对同一个master两次failover之间的间隔时间。
#2. 当一个slave从一个错误的master那里同步数据开始计算时间。直到slave被纠正为向正确的master那里同步数据时。
#3.当想要取消一个正在进行的failover所需要的时间。  
#4.当进行failover时,配置所有slaves指向新的master所需的最大时间。不过,即使过了这个超时,slaves依然会被正确配置为指向master,但是就不按parallel-syncs所配置的规则来了
# 默认三分钟
# sentinel failover-timeout <master-name> <milliseconds>
sentinel failover-timeout mymaster 180000
 
# SCRIPTS EXECUTION
 
#配置当某一事件发生时所需要执行的脚本,可以通过脚本来通知管理员,例如当系统运行不正常时发邮件通知相关人员。
#对于脚本的运行结果有以下规则:
#若脚本执行后返回1,那么该脚本稍后将会被再次执行,重复次数目前默认为10
#若脚本执行后返回2,或者比2更高的一个返回值,脚本将不会重复执行。
#如果脚本在执行过程中由于收到系统中断信号被终止了,则同返回值为1时的行为相同。
#一个脚本的最大执行时间为60s,如果超过这个时间,脚本将会被一个SIGKILL信号终止,之后重新执行。
 
#通知型脚本:当sentinel有任何警告级别的事件发生时(比如说redis实例的主观失效和客观失效等等),将会去调用这个脚本,
这时这个脚本应该通过邮件,SMS等方式去通知系统管理员关于系统不正常运行的信息。调用该脚本时,将传给脚本两个参数,
一个是事件的类型,
一个是事件的描述。
如果sentinel.conf配置文件中配置了这个脚本路径,那么必须保证这个脚本存在于这个路径,并且是可执行的,否则sentinel无法正常启动成功。
#通知脚本
# sentinel notification-script <master-name> <script-path>
  sentinel notification-script mymaster /var/redis/notify.sh
 
# 客户端重新配置主节点参数脚本
# 当一个master由于failover而发生改变时,这个脚本将会被调用,通知相关的客户端关于master地址已经发生改变的信息。
# 以下参数将会在调用脚本时传给脚本:
# <master-name> <role> <state> <from-ip> <from-port> <to-ip> <to-port>
# 目前<state>总是“failover”,
# <role>是“leader”或者“observer”中的一个。 
# 参数 from-ip, from-port, to-ip, to-port是用来和旧的master和新的master(即旧的slave)通信的
# 这个脚本应该是通用的,能被多次调用,不是针对性的。
# sentinel client-reconfig-script <master-name> <script-path>
sentinel client-reconfig-script mymaster /var/redis/reconfig.sh

Redis缓存穿透和雪崩

Redis缓存的使用极大的提升了程序的性能和效率,特别是数据查询方面,同时也带来了一些问题[数据一致性的问题],从严格的意义上来讲,只能达到最终的数据一致性,而不能保证在任何时刻的数据一致性。另外,还有一些典型的问题,也是面试的高频问题,就是缓存穿透和缓存雪崩,目前也有比较流行的解决方案。

缓存穿透

概述

简单来说就是用户想要查询一个数据,发现Redis内存数据库中没有,于是向持久层数据库发起查询发现也没有,查询失败。当用户量很多的时候,缓存没有命中,都集中到持久层数据库去查询,这样会给持久层数据库造成很大的压力,这个时候就会出现缓存穿透。

在这里插入图片描述

解决方案

布隆过滤器

布隆过滤器是一种数据结构,对所有可能查询的参数以hash的形式存储,在控制层先进行校验,不符合则丢弃,避免对存储系统过大的查询压力。

在这里插入图片描述

缓存空对象

当存储层不命中后,即使返回的空对象也会缓存起来,同事设置一个过期时间,之后再访问这个数据将会从缓存中获取

在这里插入图片描述

但是这种办法会有两个问题:

  1. 如果空值能够被缓存起来,就意味着缓存需要更多的空间存储更多的键,因为这当中可能会出现很多空值的键
  2. 即使空值设置了过期时间,还是会存在缓存层和存储层的数据会有一段时间窗口的不一致,这对于需要保持一致性的业务有一定的影响。

缓存击穿

概述

这里需要注意和缓存击穿的区别,缓存击穿是指一个key非常热点,在不停的扛着大并发,大并发集中对这一个点进行访问,当这个key在失效的瞬间,持续的大并发就会穿破缓存,直接请求数据库,就像在一个屏障上凿开一个洞。

当某个key在过期的瞬间,有大量的请求并发访问,这类数据一般是热点数据,由于缓存过期会同时访问数据库来查询最新数据并回写缓存,会导致数据库的压力过大。

解决方案

设置热点数据永不过期

从缓存层面上来看,没有设置过期时间,所有不会出现热点过期后产生的问题

加互斥锁

使用分布式锁,保证对于每个key只有一个线程去查询后端服务,其它线程没有获得分布式锁的权限,因此只需要等待即可,这种方式将高并发的压力转移到了分布式锁因此对分布式锁的考研很大。

在这里插入图片描述

缓存雪崩

概述

缓存雪崩是指在某一个时间段,缓存集中过期失效或者Redis宕机。

产生雪崩的原因之一,比如在写文本的时候,马上要到双十一零点,很快就会迎来一波抢购,这波商品时间比较集中的放入了缓存,假设缓存一个小时,那么到了凌晨一点中的时候,这批商品的缓存就会都过期,而对这批商品的访问查询,都落到了数据库上,对于数据库而言,就会产生周期性的压力波峰,于是所有的请求都会达到存储层,存储层的使用量暴增,在成存储层宕机的情况。

在这里插入图片描述

解决方案

Redis高可用

这个含义是既然redis有可能挂掉,那就多设几台redis,这样一台挂掉之后其它的还可以继续工作,其实就是搭建集群(异地多活)

限流降级

这个的意思就是在缓存失效后,通过加锁或者队列来控制读数据库写缓存的线程数量,比如对某个key只允许一个线程查询数据和写缓存,其它线程等待。

数据预热

这个的意思就是在正是部署之前,先把可能需要访问的数据先访问一遍,这样部分可能大量访问的数据就会加载到缓存中;在即将发生大并发访问前手动触发加载缓存不同的key,设置不同的过期时间,让缓存失效的时间点尽量均匀。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/362053.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

RHCE DNS域名解析服务器

目录 1. 正向解析 1.1 安装必要软件 1.2 配置静态ip 1.3 DNS配置 1.4 测试 2. 反向解析 2.1 关闭安全软件&#xff0c;安装必要软件 2.2 配置静态ip 2.3 DNS配置 2.4 测试 1. 正向解析 1.1 安装必要软件 1.2 配置静态ip 服务器配置 nmcli c modify ens32 ipv4.method man…

基于simulink的模糊PID控制器建模与仿真,并对比PID控制器

目录 1.课题概述 2.系统仿真结果 3.核心程序与模型 4.系统原理简介 4.1PID控制器原理 4.2 模糊PID控制器原理 5.完整工程文件 1.课题概述 在simulink&#xff0c;分别建模实现一个模糊PID控制器和一个PID控制器&#xff0c;然后将PID控制器的控制输出和模糊PID的控制输出…

[工具探索]Safari 和 Google Chrome 浏览器内核差异

最近有些Vue3的项目&#xff0c;使用了safari进行测试环境搞开发&#xff0c;发现页面存在不同程序的页面乱码情况&#xff0c;反而google浏览器没问题&#xff0c;下面我们就对比下他们之间的差异点&#xff1a; 日常开发google chrome占多数&#xff1b;现在主流浏览器 Goog…

双目模组 - IMSEE SDK的配置实践:含Opencv的详细编译配置

IMSEE 的环境要求: CMake(3.0以上)(需要支持vs2019) Visual Studio 2019 opencv3.3.1 IMSEE-SDK 官网参考: Windows 源码安装 — IMSEE SDK 1.4.2 文档 (imsee-sdk-docs.readthedocs.io) 【案】按照IMSEE的建议进行安装: 1 Windows 安装: 1.1 环境准备: 1.1.1 CMake:in…

当阿里云偶遇个人用户——谈幻兽帕鲁自建服

1. 快乐地闲谈 我擅长分析的云计算领域是“以工程师为操作用户的企业级IT服务”&#xff0c;但这篇文章讨论的对象甚至不是开发者用户&#xff0c;而是我从未设想过的“非IT用户”。 看到朋友转发《阿里云60秒部署幻兽帕鲁》的文章&#xff0c;我还想就是这能分析什么哪&#x…

结构体与共用体——C语言——day15

在C语言中&#xff0c;C语言允许用户自己指定这样一种数据结构&#xff0c;它称为结构体(structure) 。它相当于其他高级语言中的“记录”。 假设程序中要用到图所表示的数据结构&#xff0c;但是C语言没有提供这种现成的数据类型&#xff0c;因此用户必须要在程序中建立所需的…

C#——三角形面积公式

已知三角形的三个边&#xff0c;求面积&#xff0c;可以使用海伦公式。 因此&#xff0c;可以执行得到三角形面积公式的计算方法代码如下&#xff1a; /** / <summary>* / 三角形面积公式* / </summary>* / <param name"a">边长a</param>*…

[word] word艺术字体如何设置? #知识分享#职场发展#媒体

word艺术字体如何设置&#xff1f; 在工作中有些技巧&#xff0c;可以快速提高工作效率&#xff0c;解决大部分工作&#xff0c;今天给大家分享word艺术字体如何设置的技巧&#xff0c;希望可以帮助到你。 1、设置艺术字 选中文字&#xff0c;然后点击菜单栏的【插入】按钮一一…

版本管理工具git: 谨慎使用git中的撤回操作

文章目录 一、背景二、解决方案1、步骤一2、步骤二 三、参考 一、背景 昨天代码分支提交错了&#xff0c;idea中使用了如下操作&#xff0c;结果代码不见了 二、解决方案 1、步骤一 使用git reflog命令&#xff0c;查看提交记录&#xff0c;找到之前commit操作的哈希值 …

启动盘重装ubuntu22系统

win+R msinfo32查看 插入制作好的u盘电脑开机 进入BIOS界面的方法有多种,以下是一些常见的方法: 进入BIOS界面的最常见按键有: Del键:大多数台式机通过在启动时按下Del键来进入BIOS。Esc键:在AMI BIOS和某些品牌电脑中,进入BIOS系统需要按“Esc”键,一般在开机画面…

确认项目范围基准 常见的5大问题

确认项目范围基准的过程中&#xff0c;经常会遇到一些问题&#xff0c;如经常出现项目范围不明确、范围变更频繁等问题&#xff0c;往往会导致项目延期、超预算、质量下降等问题&#xff0c;严重的话可能会导致项目失败。 因此&#xff0c;我们在进行项目范围基准确认时&#x…

Centos慢慢长大(一)

1、写在前面 这将是一个系列性的文章。可能更多的是记录我在学习的过程中的一些感悟吧。我想强调的是在这一系列文章里我会从最小化的安装开始&#xff0c;然后逐渐的增加需要安装的软件。就象一个婴儿的诞生&#xff0c;慢慢的学走路、学说话、学使用筷子。。。。。。 这将是一…

不同生态系统蒸散发研究进展_刘超_2023

不同生态系统蒸散发研究进展_刘超_2023 摘要关键词 1 研究方法1.1 实测法1.1.1 蒸渗仪1.1.2 气孔计法1.1.3 化学示踪法1.1.4 大孔径闪烁仪1.1.5 涡动相关法 1.2 模型法1.2.1 水量平衡法1.2.2 波文比-能量平衡法1.2.3 遥感技术1.2.4 综合法和辐射法 2 研究展望2.1 研究进展2.2 存…

zookeeper(2) 服务器动态上下线监听和分布式锁案例

案例一&#xff1a;服务器动态上下线监听 某分布式系统中&#xff0c;主节点可以有多台&#xff0c;可以动态上下线&#xff0c;任意一台客户端都能实时感知 到主节点服务器的上下线。 1.服务端代码 package com.atguigu.case1;import org.apache.zookeeper.*;import java.io…

YOLOv8改进 | 损失函数篇 | 更加聚焦的边界框损失Focaler-IoU、InnerFocalerIoU(二次创新)

一、本文介绍 本文给大家带来的改进机制是更加聚焦的边界框损失Focaler-IoU已经我进行二次创新的InnerFocalerIoU同时本文的内容支持现阶段的百分之九十以上的IoU,比如Focaler-IoU、Focaler-ShapeIoU、Inner-Focaler-ShapeIoU包含非常全的损失函数,边界框的损失函数只看这一…

【每日一题】6.LeetCode——轮转数组

&#x1f4da;博客主页&#xff1a;爱敲代码的小杨. ✨专栏&#xff1a;《Java SE语法》|《数据结构与算法》 ❤️感谢大家点赞&#x1f44d;&#x1f3fb;收藏⭐评论✍&#x1f3fb;&#xff0c;您的三连就是我持续更新的动力❤️ &#x1f64f;小杨水平有限&#xff0c;欢…

Spring Boot第一天

SpringBoot概述 Spring Boot是Spring提供的一个子项目&#xff0c;用于快速构建Spring应用程序 传统方式构建Spring应用程序 导入依赖繁琐 项目配置繁琐 为了简化如此繁琐的配置流程&#xff0c;SpringBoot这一子项目提供了如下特性 SpringBoot特性 起步依赖 本质上就是一个…

集显如何安装pytorch (CPU)

目录 前言1. 注意事项2. CPU版 前言 此为记录贴&#xff0c;原先都是独显&#xff0c;安装GPU&#xff0c;第一次查看发现是集显&#xff0c;没有配备的GPU 1. 注意事项 验证自身是否为独显&#xff1a;cmd下执行 DxDiag 如果Graphics则为集显&#xff0c;代表只能操作CPU模…

腾讯云幻兽帕鲁Palworld服务器价格表,2024年2月最新

腾讯云幻兽帕鲁服务器价格32元起&#xff0c;4核16G12M配置32元1个月、96元3个月、156元6个月、312元一年&#xff0c;支持4-8个玩家&#xff1b;8核32G22M幻兽帕鲁服务器115元1个月、345元3个月&#xff0c;支持10到20人在线开黑。腾讯云百科txybk.com分享更多4核8G12M、16核6…

DevOps落地笔记-03|用户故事:对用户需求达成共识的关键

上一讲主要跟你介绍了如何使用影响地图这个工具来进行产品定义、里程碑规划和用户需求分析。影响地图让我们始终以达到目标为核心&#xff0c;并让功能和需求不偏离该目标&#xff0c;从而让交付更有重点。可视化、结构化的思维导图为技术和业务人员创建了共享的整体视图&#…