【Redis知识点总结】(六)——主从同步、哨兵模式、集群

news2024/11/13 9:39:12

Redis知识点总结(六)——主从同步、哨兵模式、集群

  • 主从同步
  • 哨兵
  • 集群

主从同步

redis的主从同步,一般是一个主节点,加上多个从节点。只有主节点可以接收写命令,主节点接收到的写命令,会同步给从节点,从节点接收到主节点同步过来的写命令,会执行该命令,把数据写操作应用到内存。主节点和从节点都可以接收读命令,从节点可以分担主节点的读请求压力,这样就实现了读写分离。

在这里插入图片描述

以下是redis主从同步的原理:

在这里插入图片描述

要开启主从同步,我们要在主节点以外,多部署一个从节点。然后我们要登上从节点,执行replicaof {主节点ip} {主节点port} 的命令。

主从同步开启后,从节点会向主节点发送 psync {runid} {offset} 命令。runid是每个节点启动时都会被分配的一个唯一的id值,这里psync命令发送的runid是主节点的id,如果是重连发送的psync,runid是之前同步的主节点的id值,如果是第一次连接主节点,那么runid就是个问号“?”。offset是从节点当前复制到的偏移量,因为此时是第一次连接,从未进行过主从复制,那么发送的offset就是“-1”,于是第一次发送的psync命令就是“psync ? -1”。

当主节点接收到从节点发来的psync命令,分析发现从节点是第一次同步,会给从节点返回一个FULLREPLICA命令,表示接下来要进行全量同步。FULLREPLICA命令会带上主节点自己的runid,以及主节点目前的写入的偏移量offset。

然后主节点会执行bgsave命令,fork出一个子进程,子进程会dump出一个rdb快照,发给从节点。

从节点接收到rdb快照,会首先清空自己的数据,然后加载rdb快照。

在主节点执行完bgsave命令之后,主节点会继续接收客户端请求,期间的写命令会缓存在replication buffer缓冲区中,待从节点加载完rdb快照后,主节点会把replication buffer中的命令发送给从节点,从节点会执行这些命令,把它们应用到缓存中。

最后主节点与从节点之间会维持一个长连接,基于这个长连接进行命令传播。

如果从节点与主节点的连接断开了,从节点会尝试重连,流程如下:

在这里插入图片描述

在断开连接的这一段期间,主节点会继续接受请求,写命令会被写入一个名叫repl_backlog_buffer的环形缓冲区中,这个环形缓冲区在写满后,会回到开头进行覆盖写。

当从节点重新连上主节点后,从节点会发送 psync {runid} {offset} 命令。

主节点接收到从节点发来的psync命令后,会根据里面的offset判断repl_backlog_buffer中对应的写命令是否已被覆盖。如果没有被覆盖,那么会把repl_backlog_buffer中从节点的offset到主节点的offset之间的命令发送给从节点,这个就是增量同步;如果已经被覆盖了,那么就要进行全量同步了。

哨兵

当主节点挂掉之后,从节点是不会自动切换为主节点的,需要我们手动进行切换,但是这样就太麻烦了,于是就引入了哨兵集群。

哨兵集群由多个哨兵实例组成,每个哨兵实例其实就是一个redis节点,只是这个节点它不负责数据的读写,这个节点以哨兵的角色启动,负责对进行数据读写的redis节点进行监控,选主和通知这三个工作:

  • 监控:监控主节点和从节点是否正常运行。
  • 选主:当主节点下线之后,在从节点之中挑选一个提升为主节点。
  • 通知:发生主从切换之后,通知其他从节点与新主节点进行同步,通知客户端。

在这里插入图片描述

我们只需要给哨兵节点配置主节点的ip地址和端口号即可,哨兵节点启动之后,就会自动组成哨兵集群。哨兵节点自动组成集群,是通过主节点完成的,它们在主节点的“__sentinel__:hello”频道执行pub和sub命令,也就是进行发布订阅,pub命令把自己的ip地址和端口号发布到主节点的“__sentinel__:hello”频道上,sub命令订阅主节点的“__sentinel__:hello”频道,当其他哨兵节点把自己的ip地址和端口号发布到主节点的该频道,当前哨兵节点就可以订阅到其他节点的ip地址和端口号。

在这里插入图片描述

哨兵也要对从节点进行监控,但是我们启动哨兵的时候,并没有配置从节点的ip地址和端口号,哨兵也是通过主节点得知从节点的ip地址和端口号的。哨兵节点会向主节点发送一个INFO命令,主节点接收到哨兵节点发来的INFO命令,会把从节点信息列表返回给哨兵。哨兵获取到主节点返回的从节点信息列表,就可以向从节点发起连接。

在这里插入图片描述

哨兵持续监控着每一个节点,当有节点下线时,哨兵会把它标记为主观下线。如果下线的是从节点,那么就仅仅是标记为主观下线。如果是发现下线的是主节点,则流程稍微复杂一点:

  1. 首先标记主节点为主观下线
  2. 询问哨兵集群中的其他节点,看是否也把主节点标记为主观下线
  3. 如果达到quorum配置项指定个数的哨兵节点标记主节点为主观下线,则标记主节点为客观下线,并且要进行重新选主

在这里插入图片描述

重新选主的过程,也是比较复杂的。当一个哨兵节点把主节点标记为客观下线后,并不是马上进行重新选主,而是要在哨兵集群内进行投票,选出一个leader,它要向哨兵集群内每一个哨兵节点请求投自己一票,如果超过半数的哨兵节点都投了赞成票,该节点才成为选主的leader,由该哨兵节点来进行重新选主。如果该哨兵节点没有成功当上leader,那么就看一下哨兵集群中是否已经选出了leader,如果哨兵集群中已经选出了leader,那么它就啥也不用干了,否则就要等待一段时间,重新发起选举投票。

在这里插入图片描述

重新选主就是从众多从节点当中,挑选一个,把它提升为主节点。挑选的规则就是先过滤掉有问题的节点,然后对剩下的节点进行筛选打分,具体流程如下

  1. 先过滤掉已下线的从节点,以及经常断连的从节点
  2. 从剩下的从节点中,选出一个优先级最高的
  3. 如果有两个以上的从节点,有相同的优先级,则选出一个复制进度offset离主节点写入进度最近的
  4. 如果有两个以上的从节点offset相等,并且离主节点的写入进度最近,那么从它们之间选出ID最小的一个

选出主节点之后,该哨兵节点还要通知其他从节点与新的主节点进行同步,还要通知客户端与新的主节点连接。

在这里插入图片描述

集群

redis集群(Redis Cluster)是redis3.0版本提供的redis集群方案。redis集群采用了hash slot(哈希槽),集群中一共有16384个hash slot。当要往集群中set或get一个key时,会用CRC16算法根据key算出一个hash值,然后利用该hash值对16384取模,得知该key位于哪个hash槽,再请求该hash槽被分配到的redis节点进行读写。

在这里插入图片描述

我们可以使用 cluster create命令创建redis集群,并自动分配hash槽;也可以使用cluster meet命令手动建立实例间的连接,然后使用cluster addslots命令手动分配hash槽。

在这里插入图片描述

分配好hash槽后,redis集群中的节点之间,会互相交换信息,然后集群中的每个节点,都拥有了整个集群的hash槽分配情况。

在这里插入图片描述

然后当redis客户端连接上集群中的其中一个节点时,就能获取到集群中所有hash槽的分配情况,客户端会缓存集群信息在本地。

在这里插入图片描述

那么,当redis客户端要向集群set一个key或者get一个key时,就会按照规则进行计算:CRC16(key) % 16384,得到目标hash槽,然后查询本地缓存,看看该hash槽属于哪一个redis节点,然后再向该节点发起请求。

在这里插入图片描述

但是有时候由于发生了集群内hash槽的迁移,可能该hash槽已不归该redis节点管理,那么该redis节点上就没有对应的key了。此时redis节点会根据情况返回MOVED命令或ASK命令中的其中一个:

  • 如果hash槽里的所有key都完成了迁移,那么返回MOVED命令,并带上该hash槽最新的所属redis节点的ip地址和端口号。
  • 如果hash槽里还有部分key没有完成迁移,那么返回ASK命令,并带上该hash槽最新的所属redis节点的ip地址和端口号。

在这里插入图片描述

如果返回的时MOVED命令,redis客户端会直接向MOVED命令指定的redis节点发送请求,然后会更新本地缓存。

在这里插入图片描述

如果返回的是ASK命令,redis客户端会先向ASK命令指定的redis节点发送一个ASKING命令,表示允许该redis节点执行接下来该客户端发送的命令,然后客户端再发送真正的请求,但是不会更新本地缓存。

在这里插入图片描述

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

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

相关文章

Maven从零到放弃:文档学习

学习背景: Maven一直在使用,自己也构建过相应的项目。也对常用的配置和命令有一些了解,也处理过一些相关的问题。例如:项目缺少依赖;版本冲突或其他构建失败的问题。但是一直没有进行系统性的学习。 链接:…

Redis锁,乐观锁与悲观锁

锁 悲观锁 认为什么时候都会出问题,无论做什么都会加锁 乐观锁 很乐观,认为什么时候都不会出问题,所以不会上锁。 更新数据时去判断一下,在此期间,是否有人修改过这个数据 应用于:秒杀场景 **watch*…

小白如何兼职赚得第一桶金?六大网络赚钱方式助你轻松开启副业之旅

小白如何兼职赚得第一桶金?六大网络赚钱方式助你轻松开启副业之旅 无需担忧,以下为你精心挑选的六大线上兼职方式,将助你轻松开启副业赚钱之旅。 1,参与网络调查:市场调研公司及品牌商为洞察消费者需求,常…

第14篇:2线-4线译码器

Q:有编码器那对应的就会有译码器,本期我们来设计实现2线-4线二进制译码器 。 A:基本原理:译码器是编码器的逆过程,其功能是将具有特定含义的二进制码转换为对应的输出信号。2线-4线二进制译码器有2个输入共4种不同的组…

九州金榜|孩子产生厌学心理应该怎么办?

孩子厌学孩子在成长学习过程中的一个经历,也是家长在对孩子教育中遇到的一大挑战,孩子产生厌心理家长要怎么办呢?很多家长会对此很无奈,下面九州金榜家庭教育给几个方法,帮助家长疏导孩子厌学心理。 来百度APP畅享高清…

图像变换(python)

前言 这个Python没学过,写的是真的不方便,有很多问题还没解决,暂时不想写了,感兴趣的同学可以完善一下。设计的思路就是摆几个控件然后将对应的函数实现,这个Python的坐标放置以及控件的大小我没弄懂,算出…

shell实现查询进程号并批量kill(脚本)

问题或需求描述 在shell中,如果你想通过命令行查询出一系列匹配某个关键词的进程,并使用xargs命令批量结束这些进程,可以按照以下步骤操作: # 查询并提取进程号 pgrep -f "关键词" | xargs kill# 或者,如果…

Linux Load AVG linux 平均负载是什么? 简单解释说明

linux 命令基础汇总 命令&基础描述地址linux curl命令行直接发送 http 请求Linux curl 类似 postman 直接发送 get/post 请求linux ln创建链接(link)的命令创建链接(link)的命令linux linklinux 软链接介绍linux 软链接介绍l…

CI/CD实战-jenkins部署 3

安装 软件下载地址:Index of /jenkins/redhat/ | 清华大学开源软件镜像站 | Tsinghua Open Source Mirror 启动服务 安装推荐插件 不新建用户,使用admin账号登录 修改一下初始密码 新建项目测试 安装git命令 生成密钥 在gitlab中上传公钥 修改ssh 创建中…

22.保护性暂停扩展(一对一)

如果需要多个类之间使用GuardedObject对象,作为参数传递不是很方便,因此设计一个解耦的中间类,这样不仅能够解耦结果的等待者和结果生产者,还能够支持多个任务的管理。 Futures就好比居民楼一层的信箱,每个信箱有房间的…

清华大学突破性研究:GVGEN技术,7秒内从文字到3D高保真生成

引言:3D模型生成的挑战与机遇 随着计算机图形学的发展,3D模型的生成在各个行业中变得越来越重要,包括视频游戏设计、电影制作以及AR/VR技术等。在3D建模的不同方面中,从文本描述生成3D模型成为一个特别有趣的研究领域,…

哪些行业需要在线制作电子证书系统?

哪些行业需要在线制作电子证书系统? 1、教育机构:学校和培训机构需要为学生和培训者颁发证书,您的系统可以帮助他们快速生成和管理这些证书。 2、企业及政府部门:用于员工培训、资质认证等,提高内部管理效率。 3、专…

Learn OpenGL 29 延迟着色法

延迟着色法 我们现在一直使用的光照方式叫做正向渲染(Forward Rendering)或者正向着色法(Forward Shading),它是我们渲染物体的一种非常直接的方式,在场景中我们根据所有光源照亮一个物体,之后再渲染下一个物体,以此类推。它非常…

2024 ccfcsp认证打卡 2023 09 01 坐标变换(其一)

import java.util.Scanner;public class Main {public static void main(String[] args) {Scanner in new Scanner(System.in);int n in.nextInt(); // 操作次数int m in.nextInt(); // 初始坐标个数int temp_x 0; // 临时存储x的累加值int temp_y 0; // 临时存储y的累…

星云小窝项目1.0——项目启动(二)

星云小窝项目1.0——项目启动(二) 文章目录 前言1. 从Github从下载它2. 使用编辑器打开(以pycharm为例)2.1. 下载所需要的模块2.2. 配置mysql数据库2.3. 配置QQ邮箱发送验证码2.4. 修改代码3. 启动总结 前言 上一篇博客大致介绍了…

用户态和内核态:操作系统权限与运行模式解析

在现代计算机操作系统中,用户态(User Mode)和内核态(Kernel Mode)是两种重要的运行模式,用于区分用户程序与操作系统核心之间的权限和特权级别。深入理解这两种模式对于理解操作系统的工作原理至关重要。 …

发布文章积分自动增加

controller ApiOperation(value "添加文章")PostMapping("/addwengzhang")public String addwengzhang(RequestBody WengDto wengDto) {if (wengDto.getContent() null || wengDto.getTitle() null) {return "参数不可为空";}User user user…

CMakeLists生成动态库.so和静态库.a

一、下载NDK CMake - NDK : 26.2.11394342 或 23.1.7779620 - CMake : 3.22.1 二、新建android\app\CMakeLists.txt 文件CMakeLists.txt内容 cmake_minimum_required(VERSION 3.4.1) #mker为项目名称 project(mker)#设置生成的so动态库最后输出的路径 set(CMAKE_LIBRARY_OUTP…

【代驾+顺风车+货运】全开源双端APP代驾+顺风车+货运代驾小程序源码

内容目录 一、详细介绍二、效果展示1.部分代码2.效果图展示 一、详细介绍 系统是基于Thinkphpuniapp开发的,全开源未加密,这套源码可以拿回去自己做二开 后台用户端司机端 功能详情介绍: 车主实名认证,驾驶证认证,车…

阿里云OSS对象存储完全开发手册(一篇学会阿里云OSS所有知识点)

一、什么是OSS存储 阿里云对象存储OSS(Object Storage Service)是一款海量、安全、低成本、高可靠的云存储服务,可提供99.9999999999%(12个9)的数据持久性,99.995%的数据可用性。多种存储类型供选择&#…