【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:贡献度分析…...
Ubuntu系统下交叉编译openssl
一、参考资料 OpenSSL&&libcurl库的交叉编译 - hesetone - 博客园 二、准备工作 1. 编译环境 宿主机:Ubuntu 20.04.6 LTSHost:ARM32位交叉编译器:arm-linux-gnueabihf-gcc-11.1.0 2. 设置交叉编译工具链 在交叉编译之前&#x…...

以下是对华为 HarmonyOS NETX 5属性动画(ArkTS)文档的结构化整理,通过层级标题、表格和代码块提升可读性:
一、属性动画概述NETX 作用:实现组件通用属性的渐变过渡效果,提升用户体验。支持属性:width、height、backgroundColor、opacity、scale、rotate、translate等。注意事项: 布局类属性(如宽高)变化时&#…...

基于ASP.NET+ SQL Server实现(Web)医院信息管理系统
医院信息管理系统 1. 课程设计内容 在 visual studio 2017 平台上,开发一个“医院信息管理系统”Web 程序。 2. 课程设计目的 综合运用 c#.net 知识,在 vs 2017 平台上,进行 ASP.NET 应用程序和简易网站的开发;初步熟悉开发一…...

MongoDB学习和应用(高效的非关系型数据库)
一丶 MongoDB简介 对于社交类软件的功能,我们需要对它的功能特点进行分析: 数据量会随着用户数增大而增大读多写少价值较低非好友看不到其动态信息地理位置的查询… 针对以上特点进行分析各大存储工具: mysql:关系型数据库&am…...

CMake基础:构建流程详解
目录 1.CMake构建过程的基本流程 2.CMake构建的具体步骤 2.1.创建构建目录 2.2.使用 CMake 生成构建文件 2.3.编译和构建 2.4.清理构建文件 2.5.重新配置和构建 3.跨平台构建示例 4.工具链与交叉编译 5.CMake构建后的项目结构解析 5.1.CMake构建后的目录结构 5.2.构…...

04-初识css
一、css样式引入 1.1.内部样式 <div style"width: 100px;"></div>1.2.外部样式 1.2.1.外部样式1 <style>.aa {width: 100px;} </style> <div class"aa"></div>1.2.2.外部样式2 <!-- rel内表面引入的是style样…...
爬虫基础学习day2
# 爬虫设计领域 工商:企查查、天眼查短视频:抖音、快手、西瓜 ---> 飞瓜电商:京东、淘宝、聚美优品、亚马逊 ---> 分析店铺经营决策标题、排名航空:抓取所有航空公司价格 ---> 去哪儿自媒体:采集自媒体数据进…...
Spring AI与Spring Modulith核心技术解析
Spring AI核心架构解析 Spring AI(https://spring.io/projects/spring-ai)作为Spring生态中的AI集成框架,其核心设计理念是通过模块化架构降低AI应用的开发复杂度。与Python生态中的LangChain/LlamaIndex等工具类似,但特别为多语…...
Linux C语言网络编程详细入门教程:如何一步步实现TCP服务端与客户端通信
文章目录 Linux C语言网络编程详细入门教程:如何一步步实现TCP服务端与客户端通信前言一、网络通信基础概念二、服务端与客户端的完整流程图解三、每一步的详细讲解和代码示例1. 创建Socket(服务端和客户端都要)2. 绑定本地地址和端口&#x…...

MySQL 知识小结(一)
一、my.cnf配置详解 我们知道安装MySQL有两种方式来安装咱们的MySQL数据库,分别是二进制安装编译数据库或者使用三方yum来进行安装,第三方yum的安装相对于二进制压缩包的安装更快捷,但是文件存放起来数据比较冗余,用二进制能够更好管理咱们M…...