四、详解Redis集群

一、RDB和AOF持久化

redis的数据一般保存在内存,那么当突然宕机,岂不是数据就丢失了,因此redis实现了将数据持久化的方式:RDB和AOF两种持久化方式。

1.1 RDB持久化(bgsave)

redis支持快照的方式进行数据持久化,将redis的内存数据直接保存在磁盘上,生成RDB文件。

主要流程:主进程fork出来子进程,然后主进程继续接收用户请求,子进程开始进行数据拷贝。这里有个问题需要考虑:当子进程进行数据拷贝的时候,主进程还在接收请求,那么主进程就会在内存上进行修改,此时主子进程内存将会分离。

那么redis什么时候进行数据持久化呢,在redis中会有一些配置来设置这个频率。例如:

save 900 1
save 300 60
save 60 10000

但是RDB得缺点也很明显,如果频率太快,那么RDB执行频率高,导致性能下降。如果频率太慢,那么在中间这段时间,可能造成数据丢失。

1.2 AOF持久化

由于RDB的持久化存在数据丢失问题,因此redis在RDB的基础上,又开始支持aof模式。这中模式简单来讲就是将redis的写命令写入到一个文件中(append of file)。

 例如,当用户set一个key的时候,除了将内存中的key进行修改,还会将set命令写入到aof文件中,这样一来,即使redis宕机,那么我们也能从aof文件中将数据恢复。

那么有一个问题,redis本来是内存数据库,数据操作非常快,当加入aof的时候,却进行了io磁盘操作,这岂不是很慢?

redis中是通过aof缓冲区来解决的,当redis执行写命令的时候,将命令放入到内存缓冲区中,当到达一秒的时候(every second)将缓冲区得到数据刷入到磁盘。

1.3 AOF重写(瘦身)

由于aof文件是记录的写命令,因此随着时间的推移,aof文件将会非常大,如果aof文件过大,那么在redis重启的时候,数据恢复将会非常慢。

因此我们需要解决这个问题。

两种方案:

1、重新遍历内存,将数据重新写入一个新的aof中。

2、执行一次RDB,然后将执行过程中的写命令aof。即RDB+AOF形式。

当aof文件过大,就会执行aof重写。此时将会开辟一个新的子进程进行重写,主进程依然继续处理用户请求。子进程遍历内存,将数据以命令的形式写入新的aof中。

注意此过程主进程还依然执行,那么新的写命令怎么办呢,这里引入了【aof重写缓冲区】,新的命令将会放入这个缓冲区中,当子进程重写结束后,将aof重写缓冲区的数据在放入aof文件中。

二、Redis主从架构

之前我们讲的原理都是在redis单个机器上,单点的机器从可用性和稳定性上来说都太弱了,因此需要进行主从架构,提升系统性能,高可用。

1、在集群中启动3个实例

2、在其中两个机器下执行 slaveof或者replicateof  主ip  主port 来进行连接

通过日志可以看到,当某个机器链接主服务器的时候,主服务器打印如下日志:

其中重要的几个信息:

1、replication id

2、BGSAVE

通过这两个信息,可以看出,在主从同步的一开始,需要副本id信息和rdb文件。

同时用info命令来查看主服务器的状态:

可以看到,除了上述两个信息之外,还有两个信息:
1、offset 偏移量

2、lag 积压

2.1 主从同步原理 

2.1.1 第一次同步(全量同步)

当从节点第一次链接主节点, 主节点将会把全量数据都发送从节点。

1、首先先把master的版本发送从节点。

2、执行bgsave,将master数据快照,然后发送从节点。从节点加载RDB文件

3、master将新的操作命令放入baklog文件中,并发送到从节点中,从节点执行baklog

4、后续链接过程中,master不断将baklog里面的命令发送给slave。

那么master是如何知道slave是第一次链接呢。

这里就用到了重要的参数replication id,如果slave的replicationid和maser的不一样,则说明是第一次。

那么master是如何不断的发送baklog呢,

这里就用到了offset 偏移量,当slave的offset小于master的offset,则说明slave落后于master,需要及时同步。

2.1.2 非第一次同步(增量同步)

当slave进行重启的时候,重新链接master的时候,会发起增量同步,这个时候slave将replicationid和offset传给master。master将offset之后的数据发送给slave。

需要注意:baklog文件是一个环形,如果slave远远落后于master,那么slave将无法进行增量同步。 此时只能进行全量同步。

在这里顺便提一下:在全量同步的过程中需要rdb,所以性能可能比较慢,是否有手段来提升性能呢?

1、无磁盘复制。即在生成RDB文件的时候,不去写磁盘,而是直接写入网络io流中。【适用于磁盘满,网速快的环境】

2、控制单个redis的内存大小,这样RDB文件也不会很大

3、可以尝试利用主--从--从架构,减轻master压力

2.2 哨兵机制

redis的哨兵主要是为了检测redis主从架构的可用性。另外哨兵会协调主从之间的选举。redis的每个哨兵会不断地,间隔一秒,向主从发送ping。

主观下线:如果某个哨兵发现某个机器掉线,则认为主观下线。

客观下线:如果其他哨兵也发现机器掉线,超过了配置的阈值,则认为客观下线。

如果一旦机器被认定为客观下线,如果是主服务器挂了,则需要开始选举,那么如何选举呢。 最重要的一点是当前slave机器的offset,offset约新,则优先级越高。

这里和zk不一样,zk是自己协调,而redis是由哨兵协调,哨兵根据各个slave的offset的偏移情况,而哨兵针对主服务器的协调才和zk一样:


1. **收集候选从服务器列表**:当 Sentinel 实例们确认主服务器已经下线时,它们会开始寻找合适的从服务器作为新的主服务器。Sentinel 实例会根据从服务器的优先级、复制偏移量等因素进行评估,筛选出一个候选从服务器列表。  

2. **发起投票请求**:每个 Sentinel 实例都会向其他 Sentinel 实例发送一个包含候选从服务器列表的投票请求。投票请求中包含了每个候选从服务器的信息,如 ID、优先级、复制偏移量等。  

3. **接收并处理投票请求**:收到投票请求的 Sentinel 实例会对请求中的候选从服务器列表进行评估,然后返回自己的投票结果。每个 Sentinel 实例都可以根据自己的策略和规则来决定投给哪个候选从服务器。  

4. **统计投票结果**:发起投票请求的 Sentinel 实例会等待一段时间,收集其他 Sentinel 实例的投票结果。当超过半数的 Sentinel 实例返回投票结果时,就可以确定哪个从服务器得到了最多的票数。  

5. **选择得票最多的从服务器作为新的主服务器**:得到最多票数的从服务器将成为新的主服务器。Sentinel 实例会选择一个 Sentinel 实例作为代表,负责执行故障转移操作,将选定的从服务器转变为新的主服务器。

 6. **更新从服务器配置**:代表 Sentinel 实例会向其他从服务器发送命令,修改它们的配置,使它们指向新的主服务器。  

7. **监控新的主服务器**:故障转移完成后,Sentinel 实例会继续监视新的主服务器以及其他从服务器,确保整个集群的健康状态。

三、Redis集群架构

redis的主从模式存在一些缺点:

1、这种基于主从的模式需要主和从之间进行rdb复制,而RDB复制是一个耗性能的操作,因此一般来讲redis的内存不宜设置过大。但是如果不设置过大,那就意味着存储能力弱,如果有大量数据进行存储,那怎么办?

2、主从模式主要是为了抗住高并发的读。但是写操作还是打到主节点。如果有高并发的写操作,那该怎么办呢?

因此redis提供了集群模式。

集群模式下,由多个master构成,并且每个master都分配一定的slot。

参考:

互联网大厂技术-Redis-集群模型、架构原理、难点应用场景、高频面试问题详解_redis主观下线 客观下线-CSDN博客

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

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

相关文章

【激光SLAM】激光的前端配准算法

文章目录 ICP匹配方法(Point to Point)PL-ICP匹配方法(Point to Line)基于优化的匹配方法(Optimization-based Method)优化方法的求解地图双线性插值拉格朗日插值法——一维线性插值 相关方法(C…

微信小程序按需注入和用时注入

官网链接 按需注入 {"lazyCodeLoading": "requiredComponents" }注意事项 启用按需注入后,小程序仅注入当前访问页面所需的自定义组件和页面代码。未访问的页面、当前页面未声明的自定义组件不会被加载和初始化,对应代码文件将不…

【HarmonyOS】鸿蒙开发之Text组件——第3.2章

text组件属性介绍 textAlign有三种属性start(默认),end,center Column(){//默认文字大小16Text("迪加奥特曼").width(200)Text().margin({top:10,bottom:10})Text("泰罗奥特曼").width(200).fontSize(26).fontColor(Color.Red).textAlign(TextAlign.End)…

H12-821_130

130.如图所示,R1与R2组成一个VRRP备份组1,通过在R1执行vrrp vrid 1 virtual-ip_______命令,可以使其成为IP地址拥有者,让R1为Master, R2为Backup 。 答案:192.168.1.254 注释: IP地址拥有者优先级是255&am…

uniapp富文本文字长按选中(用于复制,兼容H5、APP、小程序三端)

方案&#xff1a;使用u-parse的selectable属性 <u-parse :selectable"true" :html"content"></u-parse> 注意&#xff1a;u-parse直接使用是不兼容小程序的&#xff0c;需要对u-parse进行改造&#xff1a; 1. 查看u-parse源码发现小程序走到以…

程序员金三银四跳槽指南:时间线经典面试16问

祝大家成功上岸&#xff0c;升职加薪&#xff0c;冲鸭 &#x1f389; 金三银四 今天复工&#xff0c;就要开始准备啦&#x1f4bc;✨ 把握好打工人跳槽的金三银四&#xff0c;获得满意的新工作 &#x1f389; 时间线 年后跳槽时间线&#xff0c;过完年刚好开始准备&#xf…

无人机技术,无人机动力系统知识,电机、电调、桨叶技术详解

无人机动力系统中的电机、电调和桨叶技术都是非常重要的部分&#xff0c;以下是对这些技术的详解&#xff1a; 无人机电机 在无人机动力系统中&#xff0c;电机是将电能转化为机械能的关键部件。其主要作用是产生旋转力矩&#xff0c;驱动螺旋桨的旋转&#xff0c;从而实现无…

LeetCode--2298. 周末任务计数

文章目录 1 题目描述2 测试用例3 解题思路 1 题目描述 表: Tasks ------------------- | Column Name | Type | ------------------- | task_id | int | | assignee_id | int | | submit_date | date | -------------------task_id 是该表的主键&#xff08;具有唯一值…

const 知识点解析

当我们在c语言中碰到这么一种情况&#xff1a;我们现在有一个变量&#xff0c; 这个变量呢&#xff0c;我们指向访问它&#xff0c; 但不会修改它。但是又担心在后续的代码中不小心将它修改&#xff0c; 这种情况该怎么做呢&#xff1f;这种情况下可以使用const. 被const修饰的…

数学实验第三版(主编:李继成 赵小艳)课后练习答案(十四)(1)

实验十四&#xff1a;水塔水流量估计模型 练习一 1.海水温度随着深度的变化而变化,海面温度较高,随着深度的增加,海水温度越来越低.通过验观测得一组海水温度t与深度h的数据如下: h/m 0 1.5 2.5 4.6 8.2 12.5 16.5 26.5 t/℃ 23.5 22.9 20.1 19.1 15.4 11.5 …

服务器4c16g中的c指什么?或者4h什么意思?

服务器4c16g中的c指什么&#xff1f;c是指CPU处理器&#xff0c;4c代表4核CPU&#xff0c;4c也可以表示为4h&#xff0c;cpu是处理器中的基本计算单位&#xff0c;服务器的CPU核心数量越多&#xff0c;处理器的计算能力就越强&#xff0c;由于是云服务器&#xff0c;CPU指的是v…

数据在内存中的存储以及百度笔试题

目录 一.整型家族 什么是大小端存储&#xff08;百度笔试题&#xff09; 大端字节序存储 小端字节序存储 为什么要讨论大小端字节序存储 写一个程序判断是大端还是小端存储&#xff08;百度笔试题&#xff09; 思路&#xff1a;用1去判断&#xff0c;如果返回1则是小端&a…

腾讯云4核8G12M服务器支持多少人在线?

4核8G服务器支持多少人同时在线访问&#xff1f;阿腾云的4核8G服务器可以支持20个访客同时访问&#xff0c;关于4核8G服务器承载量并发数qps计算测评&#xff0c;云服务器上运行程序效率不同支持人数在线人数不同&#xff0c;公网带宽也是影响4核8G服务器并发数的一大因素&…

帮管家 CRM init 信息泄露漏洞复现 [附POC]

文章目录 帮管家 CRM init 信息泄露漏洞复现 [附POC]0x01 前言0x02 漏洞描述0x03 影响版本0x04 漏洞环境0x05 漏洞复现1.访问漏洞环境2.构造POC3.复现帮管家 CRM init 信息泄露漏洞复现 [附POC] 0x01 前言 免责声明:请勿利用文章内的相关技术从事非法测试,由于传播、利用此…

Open CASCADE学习|曲线向曲面投影

在三维空间中&#xff0c;将曲线向曲面投影通常涉及复杂的几何计算。这个过程可以通过多种方法实现&#xff0c;但最常见的是使用数学和几何库&#xff0c;如OpenCASCADE&#xff0c;来处理这些计算。 在OpenCASCADE中&#xff0c;投影曲线到曲面通常涉及以下步骤&#xff1a;…

面试题-02

1.什么是Java程序的主类&#xff1f;应用程序和小程序的主类有何不同&#xff1f; 一个程序中可以有多个类&#xff0c;但只能有一个类是主类。在Java应用程序中&#xff0c;这个主类是指包含main()方法的类。而在Java小程序中&#xff0c;这个主类是一个继承自系统类JApplet或…

RocketMq——NameServer源码分析

摘要 RocketMQ架构体系里有四个角色&#xff1a;NameServer、Broker、Producer、Consumer。其中&#xff0c;Broker统称为服务端&#xff0c;Producer属于消息生产者和Consumer属于消息消费者&#xff0c;他们统称为客户端。客户端要如何与服务端通信&#xff1f;拿消息发送举…

【LeetCode每日一题】单调栈 901股票价格跨度

901. 股票价格跨度思路 设计一个算法收集某些股票的每日报价&#xff0c;并返回该股票当日价格的 跨度 。 当日股票价格的 跨度 被定义为股票价格小于或等于今天价格的最大连续日数&#xff08;从今天开始往回数&#xff0c;包括今天&#xff09;。 例如&#xff0c;如果未来…

elementui 中 el-date-picker 控制选择当前年之前或者之后的年份

文章目录 需求分析 需求 对 el-date-picker控件做出判断控制 分析 给 el-date-picker 组件添加 picker-options 属性&#xff0c;并绑定对应数据 pickerOptions html <el-form-item label"雨量年份&#xff1a;" prop"date"><el-date-picker …

鸿蒙应用/元服务开发-窗口概述

一、窗口模块的定义 窗口模块用于在同一块物理屏幕上&#xff0c;提供多个应用界面显示、交互的机制。 对应用开发者而言&#xff0c;窗口模块提供了界面显示和交互能力。 对终端用户而言&#xff0c;窗口模块提供了控制应用界面的方式。 对整个操作系统而言&#xff0c;窗…