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

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.mfbz.cn/a/483411.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

Github 2024-03-24php开源项目日报 Top10

根据Github Trendings的统计,今日(2024-03-24统计)共有10个项目上榜。根据开发语言中项目的数量,汇总情况如下: 开发语言项目数量PHP项目10JavaScript项目1Nextcloud服务器:安全的数据之家 创建周期:2796 天开发语言:PHP, JavaScript协议类型:GNU Affero General Public…

【数据结构】考研真题攻克与重点知识点剖析 - 第 1 篇:绪论

前言 本文基础知识部分来自于b站:分享笔记的好人儿的思维导图与王道考研课程,感谢大佬的开源精神,习题来自老师划的重点以及考研真题。此前我尝试了完全使用Python或是结合大语言模型对考研真题进行数据清洗与可视化分析,本人技术…

IDDR、ODDR、IDEALY2和ODELAY2详解

文章目录 前言一、IDDR原语二、ODDR原语三、IDELAYCTRL原语四、IDELAY原语4.1、参数配置 :4.2、端口说明 :4.3、延时控制时序图 五、ODELAY原语 前言 本文参考XILINX手册UG471 一、IDDR原语 参考xilinx手册UG471 IDDR #(.DDR_CLK_EDGE ("SAME_…

【C++11】:统一的列表初始化|声明|STL变化

​ 🎬慕斯主页:修仙—别有洞天 ♈️今日夜电波:マイノリティ脈絡—ずっと真夜中でいいのに。 0:24━━━━━━️💟──────── 4:02 🔄 …

已知屏幕分辨率和屏幕尺寸,JavaScript如何计算屏幕PPI像素密度

返回主目录:OpenLayers扩展组件系列汇总目录:常用OpenLayers地图扩展组件ol-ext、ol-cesium、ol-layerswitcher、ol-geocoder和ol-wind等扩展库 前言 本章作为补充章,用于讲解使用ol-ext组件的前置知识。 要想知道 PPI 是什么,我们需要先理解“像素”这个概念,那么什么是…

【C++算法】洛谷P1102:A-B数对,思路,lower_bound,upper_bound,二分答案,代码详解

文章目录 1)解题思路2)三种情况3)代码 题目链接:P1102 A-B 数对 - 洛谷 | 计算机科学教育新生态 (luogu.com.cn) 1)解题思路 这道题要求我们在序列中找到 A − B C A-BC A−BC 的数对的个数,下标不同的数…

注解总结,Java中的注解,springboot中的注解

注解总结 1、Junit 开始执行的方法:初始化资源,执行完之后的方法:释放资源 测试方法,必须是:公有、非静态、无参无返回值的 在一个类中,可以定义多个测试方法,每个测试方法可以单独运行&#…

XUbuntu22.04之安装Plantuml(二百二十三)

简介: CSDN博客专家,专注Android/Linux系统,分享多mic语音方案、音视频、编解码等技术,与大家一起成长! 优质专栏:Audio工程师进阶系列【原创干货持续更新中……】🚀 优质专栏:多媒…

llvm后端

SelectionDAGBuilder是LLVM(Low Level Virtual Machine)编译器中的一个重要组件,它负责将LLVM中间表示(Intermediate Representation,IR)转换为SelectionDAG(选择有向无环图)的形式。…

Nacos部署(四)Docker部署Nacos2.3.x集群环境

😊 作者: 一恍过去 💖 主页: https://blog.csdn.net/zhuocailing3390 🎊 社区: Java技术栈交流 🎉 主题: Nacos部署(四)Docker部署Nacos2.3.x集群环境 ⏱…

adams卸载与安装

adams 卸载后重新安装lnstaller could not read the log directory of the existing installerto backup and restore.Installer will now exit. ADAMS软件卸载安装【adams吧】_百度贴吧 (baidu.com)

阿里云OSS存储的视频如何加水印

OSS是不能进行视频添加水印的,可以图片添加水印。 您可以在视频点播中进行配置: https://help.aliyun.com/zh/vod/user-guide/video-watermarks?spma2c4g.11186623.0.i2 原来的业务代码都是使用python 对oss的 视频进行上传 的,上传的视频路径已经保存到…

提高效率与寿命:坚持正确的码垛机器人操作流程

在工业生产中,码垛机器人以其提升效率、减少损耗、降低成本等优势,成为众多行业不可或缺的重要设备。然而,与所有精密机械一样,码垛机器人的使用寿命很大程度上取决于正确的操作流程。科学规范的操作不仅保障生产顺利进行&#xf…

关于 Microsoft Visual Studio

关于 Microsoft Visual Studio References References [1] Yongqiang Cheng, https://yongqiang.blog.csdn.net/

EPO企业生产运营数智化平台助力制造企业迈向智能制造

随着“中国制造2025”和工业4.0的不断推进,越来越多的制造企业准备迈入智能制造和智慧制造领域,实现数智化管理。企业通过搭建EPO企业生产运营平台,结合自身业务现状和数字化需求,从各个业务场景、部门人员、产品组成等方面进行分…

XSS一-WEB攻防-XSS跨站反射型存储型DOM型标签闭合输入输出JS代码解析

演示案例: XSS跨站-输入输出-原理&分类&闭合XSS跨站-分类测试-反射&存储&DOM #XSS跨站-输入输出-原理&分类&闭合 漏洞原理:接受输入数据,输出显示数据后解析执行 基础类型:反射(非持续),存储(…

内网渗透(二)必须了解Windows域环境

★★免责声明★★ 文章中涉及的程序(方法)可能带有攻击性,仅供安全研究与学习之用,读者将信息做其他用途,由Ta承担全部法律及连带责任,文章作者不承担任何法律及连带责任。 1、Windows域环境简介 Windows域是计算机网络的一种形式…

鸿蒙一次开发,多端部署(十二)资源使用

在页面开发过程中,经常需要用到颜色、字体、间距、图片等资源,在不同的设备或配置中,这些资源的值可能不同。有两种方式处理: 应用资源:借助资源文件能力,开发者在应用中自定义资源,自行管理这些…

知识管理入门:轻松选择合适的知识管理软件

你是不是经常觉得自己的大脑像个杂乱的仓库,各种信息、知识和想法在里面乱窜,找不到头绪?别担心,知识管理软件来帮你解决这个问题啦!今天,我们就来聊聊知识管理软件这个神奇的工具,新手也能轻松…

MongoDB知识

1、部署MongoDB (1)new好一个mongo文件之后执行 (出现mongodb.key)记得放行端口 openssl rand -base64 666 > mongodb.key (2)放到一个docker-compose.yml之后docker-compose up -d执行 version: 3.…
最新文章