【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命令,会把从节点信息列表返回给哨兵。哨兵获取到主节点返回的从节点信息列表,就可以向从节点发起连接。

哨兵持续监控着每一个节点,当有节点下线时,哨兵会把它标记为主观下线。如果下线的是从节点,那么就仅仅是标记为主观下线。如果是发现下线的是主节点,则流程稍微复杂一点:
- 首先标记主节点为主观下线
- 询问哨兵集群中的其他节点,看是否也把主节点标记为主观下线
- 如果达到quorum配置项指定个数的哨兵节点标记主节点为主观下线,则标记主节点为客观下线,并且要进行重新选主

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

重新选主就是从众多从节点当中,挑选一个,把它提升为主节点。挑选的规则就是先过滤掉有问题的节点,然后对剩下的节点进行筛选打分,具体流程如下
- 先过滤掉已下线的从节点,以及经常断连的从节点
- 从剩下的从节点中,选出一个优先级最高的
- 如果有两个以上的从节点,有相同的优先级,则选出一个复制进度offset离主节点写入进度最近的
- 如果有两个以上的从节点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节点执行接下来该客户端发送的命令,然后客户端再发送真正的请求,但是不会更新本地缓存。

相关文章:
【Redis知识点总结】(六)——主从同步、哨兵模式、集群
Redis知识点总结(六)——主从同步、哨兵模式、集群 主从同步哨兵集群 主从同步 redis的主从同步,一般是一个主节点,加上多个从节点。只有主节点可以接收写命令,主节点接收到的写命令,会同步给从节点&#…...
Java面试题:设计一个线程安全的单例模式,并解释其内存占用和垃圾回收机制;使用生产者消费者模式实现一个并发安全的队列;设计一个支持高并发的分布式锁
Java深度面试题:设计模式、内存管理与并发编程的综合考察 随着Java技术的不断发展,对Java开发者的技术要求也在不断提高。设计模式、内存管理、多线程工具类以及并发工具包和框架等都是Java开发者必须掌握的核心知识点。本文将通过三道综合性的面试题&a…...
【硬件设计】以立创EDA举例——持续更新
【硬件设计】以立创EDA举例——持续更新 文章目录 前言立创EDA官网教程一、原理图二、PCB1.布局2.设计规则3.电流与线宽 4.PCB走线5.Polar Si90006.过孔7.铺铜总结 前言 提示:以下是本篇文章正文内容,下面案例可供参考 立创EDA官网教程 立创EDA使用教程…...
Chain of Note-CoN增强检索增强型语言模型的鲁棒性
Enhancing Robustness in Retrieval-Augmented Language Models 检索增强型语言模型(RALMs)在大型语言模型的能力上取得了重大进步,特别是在利用外部知识源减少事实性幻觉方面。然而,检索到的信息的可靠性并不总是有保证的。检索…...
Uniapp 的 uni.request传参后端
以下是使用Uniapp的交互数据的两种方式 后端使用Parameter接收数据 后端使用RequestBody接收Json格式数据 后端: CrossOrigin RestController RequestMapping("/user") public class UserController {GetMapping("/login")public String lo…...
数据可视化-ECharts Html项目实战(5)
在之前的文章中,我们学习了如何设置滚动图例,工具箱设置和插入图片。想了解的朋友可以查看这篇文章。同时,希望我的文章能帮助到你,如果觉得我的文章写的不错,请留下你宝贵的点赞,谢谢 数据可视化-ECharts…...
C++学习之旅(二)运行四个小项目 (Ubuntu使用Vscode)
如果是c语言学的比较好的同学 可以直接跟着代码敲一遍,代码附有详细语法介绍,不可错过 一,猜数字游戏 #include <iostream> #include <cstdlib> #include <ctime>int main() {srand(static_cast<unsigned int>(tim…...
数据分析与挖掘
数据起源: 规模庞大,结构复杂,难以通过现有商业工具和技术在可容忍的时间内获取、管理和处理的数据集。具有5V特性:数量(Volume):数据量大、多样性(Variety):…...
Maxwell监听mysql的binlog日志变化写入kafka消费者
一. 环境: maxwell:v1.29.2 (从1.30开始maxwell停止了对java8的使用,改为为11) maxwell1.29.2这个版本对mysql8.0以后的缺少utf8mb3字符的解码问题,需要对原码中加上一个部分内容 :具体也给大家做了总结 : 关于v1.…...
Kafka系列之:Kafka Connect REST API
Kafka系列之:Kafka Connect REST API 由于 Kafka Connect 旨在作为服务运行,因此它还提供了用于管理连接器的 REST API。此 REST API 可在独立模式和分布式模式下使用。可以使用侦听器配置选项来配置 REST API 服务器。该字段应包含以下格式的侦听器列表: protocol://host:p…...
DC-4靶机
一.环境搭建 1.下载地址 靶场下载地址:https://download.vulnhub.com/dc/DC-4.zip 下载不下来用迅雷下载 2.虚拟机配置 切换为nat模式 开启靶机,遇到所有的错误直接点重试或者是,开启后呈现为下图即可 二.开始渗透 1.信息收集 老规矩,…...
ideaSSM 高校公寓交流员管理系统bootstrap开发mysql数据库web结构java编程计算机网页源码maven项目
一、源码特点 idea 开发 SSM 高校公寓交流管理系统是一套完善的信息管理系统,结合SSM框架和bootstrap完成本系统,对理解JSP java编程开发语言有帮助系统采用SSM框架(MVC模式开发),系统具有完整的源代码和数据库&…...
Android studio添加阿里云仓库
在工程的settings.gradle中添加 repositories { google() jcenter() mavenCentral() maven { url https://jitpack.io } //阿里云镜像 maven { url https://maven.aliyun.com/repository/google } maven { url https:…...
每天一个数据分析题(二百二十)
在集成学习的GBDT算法中,每次训练新的决策树的目的是( )? A. 预测原始数据的标签 B. 预测上一个模型的残差 C. 降低模型的偏差 D. 降低模型的方差 题目来源于CDA模拟题库 点击此处获取答案...
Centos上安装Harbor并使用
harbor的安装与使用 Harbor介绍安装前的准备工作为Harbor自签发证书安装Harbor安装docker开启包转发功能和修改内核参数安装harbor扩展 Harbor 图像化界面使用说明测试使用harbor私有镜像仓库从harbor仓库下载镜像 Harbor介绍 容器应用的开发和运行离不开可靠的 镜像管理&…...
工作需求,Vue实现登录
加油,新时代打工人! vue 2.x Element UI <template><div class"body" :style"{background-image: url(${require(/assets/images/login.png)})}"><el-form :rules"rules" ref"loginForm" :mode…...
【生产力】Mac 窗口布局工具 Magnet
Magnet 是一款为Mac操作系统设计的实用工具,旨在帮助用户更加方便地管理和组织他们的窗口布局。通过使用Magnet,用户可以轻松地将应用程序窗口拖放到屏幕的各个部分,从而实现窗口的自动排列和大小调整。这款工具特别适合需要同时处理多个应用…...
Linux的相关指令总结
Linux的基本命令 Linux指令是Linux操作系统的核心组成部分,它们为用户和管理员提供了与系统进行交互和管理的强大工具。这些指令涵盖了从基本的文件操作到复杂的系统配置和管理的各个方面。 ls指令 功能:用于列出指定目录中的文件和子目录名称。语法&am…...
HTTPS 加密原理
HTTPS 加密原理 HTTPS 加密原理常见的加密方法单向加密对称加密非对称加密 为什么需要加密?加密流程演变对称加密非对称加密非对称加密对称加密 存在问题解决方式数字证书生成方式 整体流程 HTTPS 加密原理 常见的加密方法 单向加密 也称为不可逆加密,…...
【数据挖掘】实验4:数据探索
实验4:数据探索 一:实验目的与要求 1:熟悉和掌握数据探索,学习数据质量分类、数据特征分析和R语言的主要数据探索函数。 二:实验内容 1:数据质量分析 2:统计量分析 3:贡献度分析…...
AI-调查研究-01-正念冥想有用吗?对健康的影响及科学指南
点一下关注吧!!!非常感谢!!持续更新!!! 🚀 AI篇持续更新中!(长期更新) 目前2025年06月05日更新到: AI炼丹日志-28 - Aud…...
AI Agent与Agentic AI:原理、应用、挑战与未来展望
文章目录 一、引言二、AI Agent与Agentic AI的兴起2.1 技术契机与生态成熟2.2 Agent的定义与特征2.3 Agent的发展历程 三、AI Agent的核心技术栈解密3.1 感知模块代码示例:使用Python和OpenCV进行图像识别 3.2 认知与决策模块代码示例:使用OpenAI GPT-3进…...
【论文笔记】若干矿井粉尘检测算法概述
总的来说,传统机器学习、传统机器学习与深度学习的结合、LSTM等算法所需要的数据集来源于矿井传感器测量的粉尘浓度,通过建立回归模型来预测未来矿井的粉尘浓度。传统机器学习算法性能易受数据中极端值的影响。YOLO等计算机视觉算法所需要的数据集来源于…...
C++.OpenGL (10/64)基础光照(Basic Lighting)
基础光照(Basic Lighting) 冯氏光照模型(Phong Lighting Model) #mermaid-svg-GLdskXwWINxNGHso {font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;fill:#333;}#mermaid-svg-GLdskXwWINxNGHso .error-icon{fill:#552222;}#mermaid-svg-GLd…...
使用Spring AI和MCP协议构建图片搜索服务
目录 使用Spring AI和MCP协议构建图片搜索服务 引言 技术栈概览 项目架构设计 架构图 服务端开发 1. 创建Spring Boot项目 2. 实现图片搜索工具 3. 配置传输模式 Stdio模式(本地调用) SSE模式(远程调用) 4. 注册工具提…...
20个超级好用的 CSS 动画库
分享 20 个最佳 CSS 动画库。 它们中的大多数将生成纯 CSS 代码,而不需要任何外部库。 1.Animate.css 一个开箱即用型的跨浏览器动画库,可供你在项目中使用。 2.Magic Animations CSS3 一组简单的动画,可以包含在你的网页或应用项目中。 3.An…...
Webpack性能优化:构建速度与体积优化策略
一、构建速度优化 1、升级Webpack和Node.js 优化效果:Webpack 4比Webpack 3构建时间降低60%-98%。原因: V8引擎优化(for of替代forEach、Map/Set替代Object)。默认使用更快的md4哈希算法。AST直接从Loa…...
【Linux系统】Linux环境变量:系统配置的隐形指挥官
。# Linux系列 文章目录 前言一、环境变量的概念二、常见的环境变量三、环境变量特点及其相关指令3.1 环境变量的全局性3.2、环境变量的生命周期 四、环境变量的组织方式五、C语言对环境变量的操作5.1 设置环境变量:setenv5.2 删除环境变量:unsetenv5.3 遍历所有环境…...
【从零开始学习JVM | 第四篇】类加载器和双亲委派机制(高频面试题)
前言: 双亲委派机制对于面试这块来说非常重要,在实际开发中也是经常遇见需要打破双亲委派的需求,今天我们一起来探索一下什么是双亲委派机制,在此之前我们先介绍一下类的加载器。 目录 编辑 前言: 类加载器 1. …...
《Docker》架构
文章目录 架构模式单机架构应用数据分离架构应用服务器集群架构读写分离/主从分离架构冷热分离架构垂直分库架构微服务架构容器编排架构什么是容器,docker,镜像,k8s 架构模式 单机架构 单机架构其实就是应用服务器和单机服务器都部署在同一…...
