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

缓存雪崩:

在同一时段大量的缓存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.mzph.cn/news/857137.shtml

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

相关文章

qt 如何获取磁盘信息、QStorageInfo

以往获取qt磁盘信息&#xff0c;笔者是通过一下API转换的 BOOL GetDiskFreeSpaceExW([in, optional] LPCWSTR lpDirectoryName,[out, optional] PULARGE_INTEGER lpFreeBytesAvailableToCaller,[out, optional] PULARGE_INTEGER lpTotalNumberOfBytes,[out, optional…

excel基本操作

excel 若要取消在数据表中进行的所有筛选 步骤操作&#xff1a; 单击“数据”选项卡。在“排序和筛选”组中&#xff0c;找到“清除”按钮。点击“清除”按钮。 图例&#xff1a; 将文本文件的数据导入到Excel工作表中进行数据处理 步骤&#xff1a; 在Excel中&#xff0c…

java之文件上传代码审计

1 文件上传漏洞审计 1.1 漏洞原理介绍 大部分文件上传漏洞的产生是因为Web应用程序未对文件的格式和进行严格过滤&#xff0c;导致用户可上传jsp、php等webshell代码文件&#xff0c;从而被利用。例如在 BBS发布图片 , 在个人网站发布ZIP压缩包, 在办公平台发布DOC文件等 , 只…

高阶图神经网络 (HOGNN) 的概念、分类和比较

图神经网络&#xff08;GNNs&#xff09;是一类强大的深度学习&#xff08;DL&#xff09;模型&#xff0c;用于对相互连接的图数据集进行分类和回归。它们已被用于研究人类互动、分析蛋白质结构、设计化合物、发现药物、识别入侵机器、模拟单词之间的关系、寻找有效的交通路线…

【代码详解】点云融合dypcd方法

MVS深度图估计之后&#xff0c;需要融合成点云提交给benchmark来评测&#xff0c;而融合方式和实现版本多种多样&#xff0c;参数也丰俭由人&#xff0c;所以一直是trick高发区。今天来详解一下其中的dypcd融合。 该方法最初应该是由D2HC-RMVSNet提出&#xff0c;这篇文章是EC…

Vue70-路由的几个注意点

一、路由组件和一般组件 1-1、一般组件 1-2、路由组件 不用写组件标签。靠路由规则匹配出来&#xff0c;由路由器渲染出来的组件。 1-3、注意点1 一般组件和路由组件&#xff0c;一般放在不同的文件夹&#xff0c;便于管理。 一般组件放在components文件夹下。 1-4、注意点…

C语言从头学24——函数原型

前面学习函数时已经知道必须先存在一个函数然后才能使用&#xff0c;且这个函数的位置还要在 main()函数之前&#xff0c;否则的话编译时会报错。但我们写程序时&#xff0c;main() 函数是程序入口&#xff0c;程序的主要部分都在 main() 函数中&#xff0c;且其它函数也都要通…

[Linux内核驱动]自旋锁

自旋锁&#xff08;spinlock&#xff09; 更多内容可以查看我的github 概念 Spinlock是linux内核中常用的一种互斥锁机制&#xff0c;和mutex不同&#xff0c;当无法持锁进入临界区的时候&#xff0c;当前执行线索不会阻塞&#xff0c;而是不断的自旋等待该锁释放。 正因为如此…

河南大学24计算机考研数据,有三个学院招收计算机相关专业,都是考的408!

河南大学&#xff08;Henan University&#xff09;&#xff0c;简称“河大”&#xff0c;是河南省人民政府与中华人民共和国教育部共建高校&#xff0c;国家“双一流”建设高校&#xff0c;入选国家“111计划”、中西部高校基础能力建设工程、卓越医生教育培养计划、卓越法律人…

RFID优缺点和应用场景

一、RFID技术特点 优点 快速扫描&#xff1a;RFID识别器可以同时读写多个RFID标签&#xff0c;读取速度非常快。有源RFID系统的草图功能可以用于交互式服务&#xff0c;如过程跟踪和维护跟踪。 小型化和形状多样化&#xff1a;RFID标签向小型化和多样化方向发展&#xff0c;以…

怎么用二维码在线下载视频?视频用二维码下载的制作方法

怎么把视频转换成二维码之后还可以下载视频呢&#xff1f;现在使用二维码的方式来分享视频内容在很多行业和场景中都有应用&#xff0c;这种方式能够更加简单快捷的完成视频的传播分享&#xff0c;那么怎么让扫码者可以自由选择下载视频呢&#xff1f;下面来给大家分享扫码下载…

SQL server LAG方法改造 适配 SQL server 2008

LAG函数 方法 需要改造为 适配 SQL server 2008 ---改造前&#xff1a; select area_id, area_name, year, lag(cast(year as int ),1,1970) over (partition by area_id order by year) previous_year, …

深入探索C++中的AVL树

引言 在数据结构和算法的世界里&#xff0c;平衡二叉搜索树&#xff08;Balanced Binary Search Tree, BST&#xff09;是一种非常重要的数据结构。AVL树&#xff08;Adelson-Velsky和Landis发明的树&#xff09;就是平衡二叉搜索树的一种&#xff0c;它通过自平衡来维护其性质…

zookeeper + kafka消息队列

zookeeper kafka 消息队列 一、消息队列简介 1、什么是消息队列 消息队列&#xff08;Message Queue&#xff09;是一种用于跨进程或分布式系统中传递消息的通信机制。消息队列在异步通信、系统解耦、负载均衡和容错方面具有重要作用。 &#xff08;1&#xff09;特性 异步…

c++ 里构造函数的形参与数据成员的同名问题

如题&#xff0c;这时&#xff0c;或许在 java 里&#xff0c;会报语法错误。但在 c vs2019 开了 c20语法规范。这不再是错误。这样的好处是解决了咱们的起变量名的麻烦&#xff1a;重名现在已不是错误&#xff0c;编译器可以解决了。测试如下&#xff1a; 我们看看 c 编译器是…

如何正确理解和评估品牌价值?

在当今这个品牌林立的商业世界里&#xff0c;我们常常听到企业家们满怀憧憬地谈论品牌梦想。 但究竟是什么驱使这些企业去打造一个品牌&#xff0c;到底是市场的激烈竞争&#xff0c;还是内心的情感寄托&#xff1f;亦或是社会发展的必然趋势&#xff0c;引领我们追求超越产品…

C++ using 关键

先上代码 example 1&#xff1a; template <typename T> class Blocker : {public:using MessageType T;using MessageShrPtr std::shared_ptr<T>;using MessageQueue std::deque<MessageShrPtr>;using Callback std::function<void(const MessageS…

1969python房屋租赁管理系统mysql数据库Flask结构BootStrap布局计算机软件工程网页

一、源码特点 python Flask房屋租赁管理系统是一套完善的web设计系统mysql数据库 &#xff0c;对理解python编程开发语言有帮助&#xff0c;系统具有完整的源代码和数据库&#xff0c;系统主要采用B/S模式开发。 python flask 房屋租赁管理系统 开发环境pycharm mysql …

SpringBoot 项目,三种方式实现打印 sql 日志

方式一&#xff1a;指定mybatis日志级别 # application.yml mybatis:configuration:log-impl: org.apache.ibatis.logging.stdout.StdOutImpl# 等价于application.properties mybatis.configuration.log-implorg.apache.ibatis.logging.stdout.StdOutImpl方式二、Mybatis-Plus…

酱香型白酒派系介绍

酱香型白酒作为中国传统白酒的重要流派&#xff0c;以其独特的酱香和复杂的酿造工艺而著称。在酱香型白酒中&#xff0c;形成了多个派系&#xff0c;各具特色。 以下是关于北派、茅派、川派和黔派等各个派系的详细介绍。 一、北派 地理位置&#xff1a;主要产于秦岭和淮河以…