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

news2024/12/24 9:02:44

缓存雪崩:

在同一时段大量的缓存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/1847413.html

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

相关文章

环境配置04:Pytorch下载安装

说明&#xff1a; 显存大于4G的建议使用GPU版本的pytorch&#xff0c;低于4G建议使用CPU版本pytorch&#xff0c;直接使用命令安装对应版本即可 GPU版本的pytorch的使用需要显卡支持&#xff0c;需要先安装CUDA&#xff0c;即需要完成以下安装 1.查看已安装CUDA版本 GPU对应…

Zabbix 监控 Kubernetes 集群

Zabbix 监控 Kubernetes 集群 Zabbix作为一个成熟且功能强大的监控系统&#xff0c;被许多企业广泛采用。它能够对各种IT基础设施进行全面的监控&#xff0c;包括服务器、网络设备、应用程序等。而将Zabbix与Kubernetes结合&#xff0c;可以实现对Kubernetes集群的全面监控&am…

qt 简单实验 画一个等边三角形

1.概要 2.代码 2.1 widget.h #ifndef WIDGET_H #define WIDGET_H#include <QWidget> #include <QPainter>QT_BEGIN_NAMESPACE namespace Ui { class Widget; } QT_END_NAMESPACEclass Widget : public QWidget {Q_OBJECTpublic:Widget(QWidget *parent nullptr)…

3.3 Ubuntu24使用kubeadm部署高可用K8S集群

Ubuntu24使用kubeadm部署高可用K8S集群 使用kubeadm部署一个k8s集群&#xff0c;3个master1个worker节点。 1. 环境信息 操作系统&#xff1a;ubuntu24.04内存: 2GBCPU: 2网络: 能够互访&#xff0c;能够访问互联网 hostnameip备注k8s-master1192.168.0.51master1k8s-maste…

可视化数据科学平台在信贷领域应用系列七:自动机器学习(下篇)

在当今金融科技迅速发展的时代&#xff0c;自动机器学习&#xff08;AutoML&#xff09;逐步成为了信贷风控领域的重要工具。随着大数据和人工智能技术的进步以及信贷风险环境的快速变化&#xff0c;传统人工建模模式的时效性已经难以应对复杂多变的挑战。自动机器学习框架将数…

【linux】操作系统使用wget下载网络文件,内核tcpv4部分运行日志

打印日志代码及运行日志(多余日志被删除了些)&#xff1a; 登录 - Gitee.comhttps://gitee.com/r77683962/linux-6.9.0/commit/55a53caa06c1472398fac30113c9731cb9e3b482 测试步骤和手段&#xff1a; 1、清空 kern.log&#xff1b; 2、使用wget 下载linux-6.9.tar.gz&…

芯片方案SIC88336血氧仪方案

血氧仪利用红外线光源照射患者手指末梢&#xff0c;在经过血液的时候&#xff0c;光线会被血液中的氧合血红蛋白和脱氧血红蛋白吸收。传感器感知到吸收的光强度变化&#xff0c;并将其转化为电信号发送给主机。主机通过处理这些信号&#xff0c;计算出血氧饱和度值&#xff0c;…

数字贸易变革:新模式、新机遇、新发展

树莓集团通过积极探索数字贸易的新模式和新机遇&#xff0c;不断推动数字贸易的发展和创新。未来&#xff0c;树莓集团将继续秉承开放、合作、共赢的理念&#xff0c;与全球优秀的企业和合作伙伴共同探索新的发展路径&#xff0c;为实现数字贸易的升级贡献一份力量。 一、数字贸…

使用ASP.NET Core封装接口请求参数格式

有些人获取接口请求参数是直接使用数据库实体类来获取的&#xff0c;这种方式虽然写起来很方便&#xff0c;但是会导致swagger接口文档出现很多没用的参数&#xff0c;让人看着不舒服。 比如&#xff0c;新增用户只需要传用户名、密码、邮箱就可以了&#xff0c;但是实体类也包…

C语言之顺序结构以及程序调试的debug宏

一&#xff1a;C语言中的顺序结构 1:最浅显的顺序结构理解&#xff1a;三种结构之一 &#xff08;1&#xff09;代码执行的时候没有遇到判断跳转或者循环&#xff0c;默认是顺序执行的。执行完上一句则开始执行下一句。 &#xff08;2&#xff09;顺序结构说明cpu的工作状态&a…

GD32学习

参考视频13.立创开发板GD32教程&#xff1a;串口配置_哔哩哔哩_bilibili 固件库跟用户手册基本上差不多&#xff0c;只不过用用户手册编写程序的话会更加的底层&#xff0c;固件库的话就是把一些函数封装起来&#xff0c;用的时候拿过来即可&#xff0c;目前我还没有找到固件库…

AI日报|我国人工智能核心产业规模已达5784亿元!阿里通义Qwen2成斯坦福大模型榜单最强开源模型!

⭐️搜索“可信AI进展“关注公众号&#xff0c;动手做AI Agent书籍&#xff0c;限量免费赠送&#xff01;快来参与吧&#xff5e; 文章链接&#xff1a; 福利来啦&#xff01;动手做AI Agent书籍&#xff0c;限量免费赠送&#xff01; 今日热点&#xff1a; 我国人工智能企业…

6.21 移动语义与智能指针

//先构造&#xff0c;再拷贝构造//利用"hello"这个字符串创建了一个临时对象//并复制给了s3//这一步实际上new了两次String s3 "hello"; 背景需求&#xff1a; 这个隐式创建的字符串出了该行就直接销毁掉&#xff0c;效率比较低 可以让_pstr指向这个空间…

AI赋能前端:你的Chrome 控制台需要AI(爱)

像会永生那样去学习,像明天就要死亡那样去生活。——圣雄甘地 大家好,我是柒八九。一个专注于前端开发技术/Rust及AI应用知识分享的Coder 此篇文章所涉及到的技术有 AI(Gemini)ChromeDevTool🪜魔法接码平台因为,行文字数所限,有些概念可能会一带而过亦或者提供对应的学习…

刘亦菲新剧玫瑰的故事

刘亦菲新剧《玫瑰的故事》&#xff1a;开放结局&#xff0c;无限遐想 当刘亦菲再次踏入荧屏&#xff0c;与导演汪俊携手打造的《玫瑰的故事》便引发了无数观众的期待与关注。这部剧不仅汇聚了众多实力派演员&#xff0c;更以其独特的剧情和精致的制作成为了近期热门的话题。《…

生成模型的两大代表:VAE和GAN

生成模型 给定数据集&#xff0c;希望生成模型产生与训练集同分布的新样本。对于训练数据服从\(p_{data}(x)\)&#xff1b;对于产生样本服从\(p_{model}(x)\)。希望学到一个模型\(p_{model}(x)\)与\(p_{data}(x)\)尽可能接近。 这也是无监督学习中的一个核心问题——密度估计…

服装连锁实体店如何做好会员营销管理

在现代商业环境中&#xff0c;会员营销管理已经成为服装连锁实体店提升客户忠诚度和增加销售额的重要手段。随着消费者对个性化服务需求的不断增加&#xff0c;如何通过有效的会员营销管理来满足客户需求、提高客户满意度和增强品牌粘性&#xff0c;已经成为服装连锁实体店亟需…

FFmpeg源码:AV_RB32宏定义分析

一、AV_RB32宏定义的作用 AV_RB32是FFmpeg源码中经常出现的一个宏&#xff0c;其定义如下&#xff1a; #ifndef AV_RB32 # define AV_RB32(p) AV_RB(32, p) #endif 该宏定义有多层。把它简化为函数&#xff0c;其函数声明可以等价于&#xff1a; uint32_t AV_RB32(uint…

网络爬虫设置代理服务器

目录 1&#xff0e;获取代理 IP 2&#xff0e;设置代理 IP 3. 检测代理 IP 的有效性 4. 处理异常 如果希望在网络爬虫程序中使用代理服务器&#xff0c;就需要为网络爬虫程序设置代理服务器。 设置代理服务器一般分为获取代理 IP 、设置代理 IP 两步。接下来&#xff0c;分…

oracle报错ora-01691,如何扩大表空间大小

1.目的 解决oracle数据库表结构空间不足&#xff0c;导致客户端或服务端程序无法连接数据库&#xff1b;知悉 oralce提示ora-01691的查询分析语句及快速解决办法 2.解决办法 查询表结构容量空间以及扩大容量后进行查询验证 select b.file_id,b.tablespace_name,b.file_name,b…