Redis缓存雪崩(主从复制、哨兵模式(脑裂)、分片集群)

news2024/12/23 12:33:55

缓存雪崩:

在同一时段大量的缓存key同时失效或者Redis服务宕机,导致大量请求到达数据库,带来巨大压力。

方法一:

给不同key的TTL添加随机值,以此避免同一时间大量key失效。(用于解决同一时间大量key过期,后面的方法用于解决redis宕机)

方法二:

使用Redis集群提高服务可用性(哨兵模式、分片集群)

主从复制(解决高并发读):

在讲哨兵模式之前,我们需要先了解一下主从复制

单节点处理并发的能力有限,我们需要提供搭建集群来提高应对并发的能力。

主节点命名为master、子节点命名为(slave/replica)。由于redis基本上都是在执行读操作,所以我们只需要安排主节点负责写操作、子节点负责读操作就可以有效的提高应对并发的能力。不过这里就有一个问题,主节点执行了写操作后,怎么和子节点进行数据同步呢?

全量同步:

流程:

(以下是第一次同步的流程)

  1. 子节点执行replicaof命令建立连接。

    这里大家可能会有疑问,子节点什么时侯要建立连接呢?

    其实这个命令是在搭建集群的时候执行的,在搭建集群时我们会执行如下命令。

    # 服务器 B 执行这条命令以设置服务器A为自己的主节点
    replicaof <服务器 A 的 IP 地址> <服务器 A 的 Redis 端口号>

    执行完命令后,我们就建立好主从节点之间的连接了。

  1. 子节点请求数据同步(这里有两个很重要的参数:replid、offest)

  2. 主节点判断是否是第一次同步。就是通过replid来判断,一个数据集不论增删改查它的replid不变,所以如果子节点的replid和主节点不同,代表一定是第一次同步)

  3. 是第一次则返回数据版本信息(replid、offest)

  4. 子节点保存版本信息(这里子节点的replid就和主节点相同了)

  5. 主节点执行bgsave,生成RDB

  6. 主节点发送RDB

  7. 子节点清空数据并加载RDB(根据RDB生成数据)

  8. 主节点记录RDB期间所有的命令(有一步的原因:在子节点清空并生成数据的过程中,主节点可能会接收到写操作,但是发送的RDB里面数据是接收到写操作之前的数据,所以需要一个repl_baklog来记录生成RDB后接收的操作)

  9. 主节点发送repl_baklog中的命令(再次进行同步,确保数据相同)

  10. 子节点执行接受到的命令

(以下是非第一次同步的流程)

  1. 主节点发送repl_baklog中的命令(这里就用到刚刚说的重要的变量offest,在第一次同步时,步骤4发送了第一次offest,此后步骤10只需要根据offest,就可以判断需要发送哪些数据,比如说第一次步骤4发送的offest为5,而在子节点生成数据期间,repl_baklog记录的数据为7条,此时主节点的offest就变成了 5+7=12,那么主节点就会发送 12-5=7 条最新的命令给子节点以完成同步)

  2. 子节点执行接受到的命令

增量同步:

实际上和全量同步的非第一次同步流程很像,但是增量同步主要应对slave重启

流程:

  1. 子节点重启

  2. 子节点请求数据同步(这里同样会发送两个参数:replid、offest)

  3. 主节点判断是否是第一次(replid是否一致,不过这里我们建立过链接,只是因为slave重启了要重新同步数据)

  4. 不是第一次,主节点发送continue

  5. 主节点根据slave传入的offest(步骤2)来判断要发送那些repl_baklog中的命令

  6. 主节点发送repl_baklog中的命令

  7. 子节点执行命令

哨兵模式(解决高可用):

主从复制存在一个问题,如果主节点挂了,那么整个集群就不可用了(只有主节点执行写操作),为了应对这种情况,redis提供了哨兵机制。

监控:

用于判断节点是否可用

自动故障恢复:

当master节点被判断下线,哨兵就会进行选举

选举逻辑:

  1. 根据断开时间排除部分节点

  2. 判断slave-priority中的优先级,最小的被选举为主节点

  3. 如果slave-priority相同,就根据offest判断,offest越大代表数据越全面

  4. 最后是根据slave节点的运行id,每个slave节点在运行时都有一个id,越小优先级越高

脑裂问题:

哨兵模式会出现的一个问题,如果说由于某些原因(可能是网络原因),哨兵(sentinel)和master断开了连接(图一),但是master和Clinet的连接并没有中断,由于哨兵模式特有的自动故障修复功能,哨兵会在slave中重新选举出新的master节点(要注意,原本的master节点并没有下线,所有的数据操作仍然是在Client和原本的master之间进行),过了一段时间后,哨兵(sentinel)连接上了原本的主节点,但是由于哨兵认可的是新选举的master节点,所以原本的master节点会被降级为slave节点(图二),然后被降级的salve节点就会清空自己的数据重新申请新master节点的数据,这样会导致脑裂过程中Client和原本的master之间交换的数据全部丢失。

                                                                        图一

                                                                        图二

解决方法:

  1. 设置master节点 min-replicas-to-write 1(表示master节点最少要有一个slave节点,不然不进行数据操作)

  2. 设置master节点 min-replicas-max-lag 5(表示master节点与slave节点最久5s要通信一次,不然不进行数据操作)

分片集群:

主从复制解决了高并发读的问题,但是因为只有一个master在写,所以无法解决高并发写的问题,如果我们有多个master,是不是就可以解决高并发写的问题了?

  • 多个master解决高并发写的问题

  • 每个master有多个slave解决高并发读的问题(每个slave都可以读)

  • master通过ping检测彼此状态(sentinel相同功能,如果发现客观下线就在slave中新选举一个master,解决高可用问题)

  • 客户端请求可以访问集群任意节点,最终都会被转发到正确节点(要理解这个就要看下面的内容)

简单来说,不管是传进来什么样的数据,都会通过哈希函数计算出哈希值然后存放在对应区间的插槽中(这里要注意,如果key前面有大括号,就将大括号中的数据用于计算,如果没有大括号,就将key本身用于计算)

方法三:

给缓存业务添加降级限流策略(比如说nginx限流,sentinel降级)

方法四:

给业务添加多级缓存(充分利用请求处理的每个环节,分别添加缓存)

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

linux笔记10--编辑器之神VIM

文章目录 1. 简单介绍① 为什么叫vim② linux常见的编辑器③ 注意事项④ 其它 2. 操作模式的划分① 两种 -- 国际上普通模式(命令操作模式)插入模式 ② 三种 -- 国内普通模式如何进入与退出界面 插入模式如何进入与退出界面 命令模式如何进入与退出界面常见的命令模式 ③ 区别④…

RFID技术在人工晶体清洗台上的应用案例分析

RFID技术在人工晶体清洗台上的应用案例分析 应用背景 在医疗领域中人工晶体清洗台发挥着极为重要的作用&#xff0c;随着市场需求的持续增长、技术的不断创新、定制化趋势的加强以及环保要求的提高&#xff0c;人工晶体清洗台不免暴露出一下应用痛点需要解决。 痛点&#xff…

SAP ABAP 常用的便利小手段:大写+自动对齐

目录 一&#xff0c;字体变大写 二&#xff0c;自动对齐行 一&#xff0c;字体变大写 找到上面的ユーティリティ⇒設定、 在【ユーザ固有の設定】里选择&#xff0c;【打文字】&#xff0c;同时勾除【名称を変更しない】 二&#xff0c;自动对齐行 在页面右下角找到黄色的【…

Java如何快速实现发送模版消息?

Java如何快速实现发送模版消息&#xff1f; 这次分析模版消息&#xff1a; 公众号&#xff08;小程序同理&#xff09;登录微信公众平台&#xff0c;创建模版&#xff0c;拿到模版id, 拿到appid,appSecret&#xff0c;根据开发文档找到对应功能的api进行开发即可&#xff0c;记…

EcmaScript6全新语法特性-----EcmaScript6(1)

age : 20,language : "Eng"}// 对象也可以用结构表达式来获取对应的值const { name,age,language} person;// 这样可以将我们获取的值name变成abc这个变量// const { name:abc,age,language} person;// 字符串拓展let str "Hello,vue";// 判断是否以xxx…

ES6 逐点突破系列 -- 函数的扩展

} f() // 1 var x 1; function foo(x, y function() { x 2; }) { var x 3; y(); console.log(x); } foo() // 3 x // 1 上面代码中&#xff0c;函数foo的参数形成一个单独作用域。这个作用域里面&#xff0c;首先声明了变量x&#xff0c;然后声明了变量y&#xf…

Axios发送ajax请求

}, // 请求体参数 data: { username: ‘admin’, password: ‘admin’ } }).then(response>{ // 响应状态码 console.log(response.status); // 响应状态字符串 console.log(response.statusText); // 响应头信息 console.log(response.headers); // 响应体 c…

docker 部署的 wordpress 接入阿里云短信服务 详细实操介绍

一、阿里云短信服务配置&#xff1a; 1、登录 阿里云短信服务 完成指引短信相关配置 2、创建RAM用户 并完成授权 出于安全及规范考虑 需通过RAM 用户来完成OponApl 接口调用&#xff0c;创建成功需完成短信接口&#xff08;AliyunDysmsFullAccess、AliyunDysmsReadOnlyAccess…

量检具管理有一套

量检具是用于测量和检验产品尺寸、形状和质量的工具。有一位年轻的工程师小张&#xff0c;他负责管理工厂的量检具&#xff0c;确保它们能够准确地测量产品尺寸和质量。有一天&#xff0c;小张发现量检具出现了一些问题。他注意到一些量具的读数不准确&#xff0c;导致生产出来…

加载资源文件失败

背景 自己以前装了一个海康的深度学习算法平台&#xff0c;试用期是一个月&#xff0c;过了一个月之后&#xff0c;因为没有有效注册码或者加密狗的支持了导致无法使用&#xff0c;于是打算卸载掉&#xff0c;在卸载一个软件的时候&#xff0c;无论是使用控制面板还是软件自带的…

SpringIOC核心源码

一、Spring IOC容器源码解析 1、Spring IOC容器的核心类 &#xff08;1&#xff09;BeanFactory与ApplicationContext &#xff08;2&#xff09;默认容器DefaultListableBeanFactory a. DefaultListableBeanFactory实现的接口 b.DefaultListableBeanFactory继承的类&#…

TCP/IP 在 Linux 内核中的实现

之前出了一个python的socket编程的文章&#xff0c;里面讲的是怎么进行socket编程。最近想到TCP/IP协议的原理&#xff0c;然后查阅资料后说是在操作系统级别实现的&#xff0c;python的socket模块只是一个接口。 本文就来谈一下Linux源码里实现TCP/IP协议簇的源代码在哪里&am…

记一次服务器崩溃事件

今天在安装Jenkins的时候&#xff0c;进行到插件安装这一步&#xff0c;本来一切顺利&#xff0c;结果最后安装完成之后一直进不去网页&#xff0c;显示连接超时&#xff0c;网上搜索了一圈也没发现什么相似的情况&#xff0c;当我疑惑的时候回到Linux控制台&#xff0c;发现命…

三品PDM电子行业解决方案介绍 电子企业PDM应用效果

随着全球化和技术创新的不断推进&#xff0c;电子行业正经历着前所未有的发展机遇。然而&#xff0c;随之而来的挑战也日益凸显&#xff0c;尤其是在产品数据管理PDM方面。本文将探讨电子行业在PDM方面的需求&#xff0c;并提出相应的解决方案&#xff0c;以帮助企业提升效率和…

css布局中的BFC问题

什么是边距重叠&#xff1f; 什么情况下会发生边距重叠&#xff1f; 如何解决边距重叠&#xff1f; 边距重叠&#xff1a; 两个box如果都设置了边距&#xff0c;那么在垂直方向上&#xff0c;两个box的边距会发生重叠&#xff0c;以绝对值大的那个为最终结果显示在页面上。…

解锁数据潜力:数据提取技术的无限可能

在当今信息爆炸的时代&#xff0c;数据已经渗透到我们生活的方方面面&#xff0c;成为推动社会进步和经济发展的重要力量。然而&#xff0c;仅仅拥有数据并不足以带来实质性的改变&#xff0c;关键在于如何有效地提取、分析和利用这些数据&#xff0c;以解锁其深藏的潜力。数据…

计算机中丢失vcruntime140_1.dll如何修复?分享7种常用解决方法

vcruntime140_1.dll缺失原因分析 软件卸载或更新不当在软件卸载或更新过程中&#xff0c;如果未能正确处理依赖关系&#xff0c;可能会导致vcruntime140_1.dll文件被错误地删除或损坏。 据统计&#xff0c;约有30%的DLL文件丢失问题是由于不当的卸载或更新操作引起的。 用户…

气体分离膜种类逐渐增多 市场规模不断扩大

气体分离膜种类逐渐增多 市场规模不断扩大 气体分离膜是由高分子材料组成的一种选择性膜。气体分离膜对不同种类的气体分子具有不同的透过率的选择性&#xff0c;可从混合气体中选择性分离某种特殊气体&#xff0c;从而起到分离、提纯等作用。与传统气体分离方法相比&#xff0…

EfficientNet大解析:如何重新定义模型效能?

EfficientNet大解析&#xff1a;如何重新定义模型效能&#xff1f; 1、abstract2、Compound Model Scaling3、EfficientNet Architecture4、results5、conclusion 论文地址: EfficientNet: Rethinking Model Scaling for Convolutional Neural Networks 1、abstract 提出了一…

常见加密方式:MD5、DES/AES、RSA、Base64

16/32位的数据&#xff0c;最有可能就是使用md5加密的 使用对称加密的时候&#xff0c;双方使用相同的私钥 私钥&#xff1a;单独请求/隐藏在前端的隐藏标签当中 二、RSA非对称密钥加密 公钥加密&#xff0c;私钥解密 私钥是通过公钥计算生成的 加密解密算法都在js源文件当…