当前位置: 首页 > news >正文

Redis——主从复制模式

文章目录

  • 1. 引入
  • 2. 主从复制模式
    • 2.1 概念
    • 2.2 配置
    • 2.3 原理
      • 2.3.1 建立连接阶段
      • 2.3.2 命令传播阶段
      • 2.3.3 心跳检测机制
      • 2.3.4 部分重同步机制
        • (1) 主节点通过 复制积压缓冲区 记录写命令
        • (2) 主节点通过 复制偏移量 判断从节点是否满足执行部分重同步的条件
        • (3) 执行部分重同步操作
    • 2.4 优点
    • 2.5 缺点
  • 3. 总结


1. 引入

随着使用互联网的人数的增多,服务器每秒能处理的请求数量也需要不断增加。为此,传统的单体系统架构变成了分布式的系统架构,单体的中间件变成了中间件的集群。像 MySQL 主从复制的集群模式经常在网络上见到,Redis 也有自己的集群模式,主要分为三种:

  • 主从复制模式。
  • 哨兵模式。
  • 分片集群。

本文主要讲解第一种模式,第二种和第三种模式将会分成两篇文章在之后讲解。

2. 主从复制模式

2.1 概念

在 Redis 集群中,将 Redis 节点分成两种节点——一个主节点多个从节点,规则如下:

  • 主节点处理写操作
  • 从节点处理读操作
  • 主节点处理完写操作后,将写操作 异步 发送给所有从节点,从节点接收并执行写操作,以保证主从数据一致

Redis 主从复制模式的集群形成的结构图如下所示:

Redis 集群
同步数据
同步数据
同步数据
同步数据
从节点1
主节点
从节点2
从节点 ...
从节点 n
写操作
读操作

通过这种集群模式,得以将读操作和写操作分离,并且把读操作分散到多台 Redis 上,很大程度上增加了每秒处理查询请求的数量。

2.2 配置

对于 Redis 的主从复制模式,无需对主节点配置任何多余信息,主要配置从节点的 redis.conf 文件:

  • slaveof <master-ip> <master-port>:在 <master-ip> 处填写主节点的 ip 地址,<master-port> 填写主节点 Redis 对外开放的端口号。这个配置让 从节点 知道要从哪个 主节点 进行复制。
  • masterauth <master-requirepass>:如果主节点设置了密码,在 <master-requirepass> 处填写对应的密码,用于从服务器连接主服务器时的身份验证。

如下配置可以作为 Redis 从节点中 配置主节点信息 的参考:

slaveof 192.168.100.1 6379
masterauth e0cfd72aa80e

如下配置是 Redis 主节点 配置密码信息 的参考:

requirepass e0cfd72aa80e

2.3 原理

2.3.1 建立连接阶段

  • 从节点发起同步请求:从节点启动后,会向 redis.conf 配置中指定的主节点发送 SYNC 命令,请求数据同步,开启主从复制流程。
  • 主节点响应并准备数据:主节点执行 BGSAVE 命令,在后台生成当前数据集对应的 RDB 文件 (在 Redis——持久化 中讲解过 RDB)。
    • BGSAVE 执行期间,主节点可以继续正常处理客户端发来的写请求,不过这些写请求对应的写命令会被暂存到 复制缓冲区 (replication buffer) 中。
    • BGSAVE 命令执行完成,生成 RDB 文件后,主节点把这个 RDB 文件发送给从节点。
  • 从节点接收并载入数据:从节点接收到主节点发来的 RDB 文件后,使用 RDB 文件,将自身的数据状态恢复到和主节点执行 BGSAVE 命令时基本一致的状态。
  • 从节点同步产生 RDB 文件期间的数据:将 RDB 文件发送给从节点后,主节点会接着把 复制缓冲区 中暂存的写命令按顺序发送给从节点,从节点再依次执行这些写命令,从而保证从节点的数据状态能和主节点完成 BGSAVE 操作时的状态一致。

流程图如下:

客户端 主节点 从节点 发起同步请求 执行 BGSAVE 指令,在后台生成 RDB 文件 许多写操作 在执行 BGSAVE 指令期间, 将写操作的写指令暂存到复制缓冲区中 当生成 RDB 文件后, 将 RDB 文件发给从节点 将数据同步到主节点执行 BGSAVE 前的状态 将复制缓冲区的写指令按顺序发给从节点 将数据同步到主节点执行 BGSAVE 后的状态 客户端 主节点 从节点

2.3.2 命令传播阶段

  • 主节点发送写命令:在完成从节点的数据同步后,只要主节点后续接收到客户端的写请求并执行完毕,它就会:
    • 首先,将写命令记录到 复制积压缓冲区 (之后会详细讲解) 中。
    • 然后,将其以异步的方式发送给所有已经连接的从节点。
  • 从节点执行写命令:从节点接收到主节点发来的写命令后,会按照接收到的顺序依次执行这些写命令。通过不断执行主节点传来的写命令,就能时刻保证主从数据一致。

流程图如下:

客户端 主节点 从节点 写操作 执行写命令 将写命令记录到复制积压缓冲区中, 并增加自己的复制偏移量 将写命令异步发给从节点 执行主节点发送的写命令, 并增加自己的复制偏移量 客户端 主节点 从节点

2.3.3 心跳检测机制

在主从复制的整个过程中,主从节点之间还存在 心跳检测机制 来确保连接的正常和数据的及时同步:

  • 从节点会定期向主节点发送 REPLCONF ACK <replication_offset> 命令 (其中 <replication_offset> 表示从节点复制的偏移量,之后会详细讲解),如同 心跳 一样。发送这条信息有两个作用:
    • 让主节点知道自己处于正常连接状态。
    • 让主节点知道自己复制的位置,从而判断自己是否需要 部分重同步 (之后会详细讲解)。
  • 主节点根据从节点发来的心跳信息,可以判断从节点的连接情况。如果发现某个从节点长时间没有发送心跳,就可以标记从节点状态为下线,之后就不用再向它发送写指令了。

2.3.4 部分重同步机制

(1) 主节点通过 复制积压缓冲区 记录写命令

主节点在执行完写命令后,会将写命令缓存到 复制积压缓冲区 (replication backlog buffer) 中,这个缓冲区是 先进先出 的,和 队列 一样,目的就是 当从节点由于某些原因 (如网络暂停中断) 与主节点断开连接,又重新连接后,从节点能够通过这些写命令来实现部分重同步,避免进行完整的同步流程

(2) 主节点通过 复制偏移量 判断从节点是否满足执行部分重同步的条件

在心跳检测时,如果主节点发现从节点的 replication_offset (复制偏移量) 与自身的 replication_offset 相差很多,这时主节点会首先 判断从节点所缺失的那部分写命令是否还保留在复制积压缓冲区中,如果在,则可以进行部分重同步;否则从节点需要发起完整的同步流程。

(3) 执行部分重同步操作

如果确定可以进行部分重同步,主节点会根据从节点当前的 replication_offset ,从复制积压缓冲区中提取出从该偏移量之后的写命令,然后将这些写命令发送给从节点

从节点接收到主节点发来的这些写命令后,会按照顺序依次执行,执行完后自身的 replication_offset 就会更新,从而跟上主节点的数据同步进度,完成部分重同步过程,使得主从节点的数据再次保持一致,而无需重新进行完整的初始同步 (也就是无需再执行 SYNC 命令去获取 RDB 文件等一系列操作)。

2.4 优点

  • 提升读性能:适用于 读多写少 的业务场景。在这种模式下,可以将大量的读请求分配到多个从节点上处理,分担主节点的读负载,使得系统整体能够同时处理更多的请求,提升响应速度和吞吐量。
  • 数据冗余与高可用性:通过将数据从主节点复制到多个从节点,实现了数据的冗余备份。若主节点出现故障 (如硬件故障、软件崩溃、网络问题等),可以迅速将某个从节点提升为主节点,继续对外提供服务,减少因主节点故障导致的数据丢失和服务中断风险,在一定程度上保证 Redis 集群的高可用性。
  • 方便数据备份与恢复:从节点本身就是主节点数据的副本,相当于自动完成了数据备份工作。在需要恢复数据时,只要从节点的数据状态是可用且完整的,就可以较为方便地利用从节点的数据来进行恢复操作,无需额外复杂的备份流程和工具。

2.5 缺点

  • 数据同步延迟:在主节点执行写操作后,数据同步到从节点不是立刻完成的,存在一定的时间延迟。尤其是在高并发写场景下,延迟可能会更加明显,这就可能导致从节点的数据在短期内并非是最新的,出现主从数据不一致的情况,影响业务逻辑的准确性。
  • 故障切换复杂:当主节点发生故障时,虽然理论上可以将从节点提升为主节点来继续服务,但在实际操作中,这个故障切换过程并非完全自动和简单。需要人工介入或者借助额外的监控和管理工具来准确判断主节点故障情况,合理选择要升级的从节点,并完成相关配置的调整 (如通知其他从节点新的主节点信息等),否则容易出现各种问题,导致服务中断或者数据不一致等情况。

3. 总结

通过 Redis 的主从复制模式,读操作得以和写操作分离:

  • 写操作全部在在主节点上执行,主节点通过传播这些写命令,使得主从数据保持同步。
  • 读操作分散到各个从节点上。

除此之外,主从复制模式还通过 心跳检测机制 和 部分重同步机制 保证主从数据的一致性。

通过主从复制模式,增强了 Redis 集群读写操作的吞吐量,并在一定程度上保证了 Redis 集群的高可用性。但是,主从节点之间的数据同步存在延迟,可能导致短暂的数据不一致情况;在主节点故障时,还得运维人员手动选出一个新的主节点并重新配置其它从节点,故障切换比较复杂。

相关文章:

Redis——主从复制模式

文章目录 1. 引入2. 主从复制模式2.1 概念2.2 配置2.3 原理2.3.1 建立连接阶段2.3.2 命令传播阶段2.3.3 心跳检测机制2.3.4 部分重同步机制(1) 主节点通过 复制积压缓冲区 记录写命令(2) 主节点通过 复制偏移量 判断从节点是否满足执行部分重同步的条件(3) 执行部分重同步操作 …...

简历_熟悉缓存高并发场景处理方法,如缓存穿透、缓存击穿、缓存雪崩

系列博客目录 文章目录 系列博客目录1.缓存穿透总结 2.缓存雪崩3.缓存击穿代码总结 1.缓存穿透 缓存穿透是指客户端请求的数据在缓存中和数据库中都不存在&#xff0c;这样缓存永远不会生效&#xff0c;这些请求都会打到数据库。 常见的解决方案有两种&#xff1a; 缓存空对…...

阿里云电商平台用户行为分析与人群画像系统设计与实现

通过在阿里云&#xff08;https://baike.baidu.com/item/%E9%98%BF%E9%87%8C%E4%BA%91/297128&#xff09;上构建包含数据源层、数据存储层、数据处理层、数据分析层和数据应用层的系统架构&#xff0c;并设计合理的数据模型、ETL流程、数据质量与性能监控机制以及安全与合规性…...

Go语言的 的输入/输出流(I/O Streams)核心知识

Go语言的输入/输出流&#xff08;I/O Streams&#xff09;核心知识 前言 Go语言是一种现代编程语言&#xff0c;因其高效性、简洁性及强大的并发支持而受到开发者的喜爱。在开发应用程序时&#xff0c;输入/输出&#xff08;I/O&#xff09;操作是一个不可或缺的部分。无论是…...

57.在 Vue 3 中使用 OpenLayers 点击选择 Feature 设置特定颜色

在 Web 开发中&#xff0c;地图应用是非常常见的需求&#xff0c;而 OpenLayers 是一个非常强大的地图库&#xff0c;它提供了丰富的地图操作功能。今天&#xff0c;我们将一起学习如何在 Vue 3 中结合 OpenLayers 使用点击事件来选择地图上的 Feature&#xff0c;并设置特定的…...

数据结构C语言描述8(图文结合)--哈希、哈希冲突、开放地址法、链地址法等实现

前言 这个专栏将会用纯C实现常用的数据结构和简单的算法&#xff1b;有C基础即可跟着学习&#xff0c;代码均可运行&#xff1b;准备考研的也可跟着写&#xff0c;个人感觉&#xff0c;如果时间充裕&#xff0c;手写一遍比看书、刷题管用很多&#xff0c;这也是本人采用纯C语言…...

自动化立体库安全使用管理制度完整版

导语 大家好&#xff0c;我是社长&#xff0c;老K。专注分享智能制造和智能仓储物流等内容。欢迎大家到本文底部评论区留言。 新书《智能物流系统构成与技术实践》人俱乐部 完整版文件和更多学习资料&#xff0c;请球友到知识星球【智能仓储物流技术研习社】自行下载。 以下是《…...

云打印之拼多多打印组件交互协议

拼多多打印组件交互协议相关介绍如下&#xff1a; 1、打印组件下载地址 http://meta.pinduoduo.com/api/one/app/v1/lateststable?appIdcom.xunmeng.pddprint&platformwindows&subTypemain 2、socket连接端口 如果是http的话&#xff0c;端口是5000 socket new …...

TCP 演进之路:软硬件跷跷板与新征程

今天依旧是与 TCP 相关的一个短评。 先看软硬件间的胶着。晶体管诞生以来&#xff0c;硬件一直在突飞猛进发展&#xff0c;后来这个事被摩尔定律正则化&#xff0c;人们开始可以预测未来&#xff0c;但即便如此&#xff0c;软件依然跟不上来&#xff0c;不过几年&#xff0c;老…...

React最小状态管理Jotai

Jotai 状态管理 1. 简介 Jotai 是一个基于原子 atom 概念的 React 状态管理库&#xff0c;它提供了简单且灵活的方式来管理应用状态, 而且非常轻量&#xff0c; 大厂用的非常多。 JotaiRedux适合单个页面&#xff0c;多次用到的属性适合全局公共属性超级轻量&#xff08;与use…...

计算机网络 —— 网络编程(TCP)

计算机网络 —— 网络编程&#xff08;TCP&#xff09; TCP和UDP的区别TCP (Transmission Control Protocol)UDP (User Datagram Protocol) 前期准备listen &#xff08;服务端&#xff09;函数原型返回值使用示例注意事项 accpect &#xff08;服务端&#xff09;函数原型返回…...

字玩FontPlayer开发笔记4 性能优化 首屏加载时间优化

字玩FontPlayer开发笔记4 性能优化 首屏加载时间优化 字玩FontPlayer是笔者开源的一款字体设计工具&#xff0c;使用Vue3 ElementUI开发&#xff0c;源代码&#xff1a; github: https://github.com/HiToysMaker/fontplayer gitee: https://gitee.com/toysmaker/fontplayer …...

RabbitMQ案例

1. 导入依赖 <!--AMQP依赖&#xff0c;包含RabbitMQ--><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-amqp</artifactId></dependency> 发送消息 注入RabbitTemplate Autowired RabbitT…...

智能工厂的设计软件 应用场景的一个例子:为AI聊天工具添加一个知识系统 之13 方案再探之4:特定于领域的模板 之 div模型(完整版)

前景提要 整个“方案再探”篇 围绕着如何将项目附件文档中Part 1 部分中给出的零散问题讨论整理、重组为一个结构化的设计文档。为此提出了讨论题目&#xff1a; 特定于领域的模板--一个三套接的hoc结构 它是本项目actors 的剧本原型。其地位&#xff1a; 祖传代码脚本模板…...

WebRtc02:WebRtc架构、目录结构、运行机制

整体架构 WebRtc主要分为三层&#xff1a; CAPI层&#xff1a;外层调用Session管理核心层&#xff1a;包括视频引擎、音频引擎、网络传输 可由使用者重写视频引擎&#xff1a;编解码器、视频缓存、视频增强音频引擎&#xff1a;编解码器、音频缓存、回音消除、降噪传输&#x…...

数据结构复习 (顺序查找,对半查找,斐波那契查找,插值查找,分块查找)

查找&#xff08;检索&#xff09;&#xff1a; 定义&#xff1a;从给定的数据中找到对应的K 1&#xff0c;顺序查找&#xff1a; O(n)的从前向后的遍历 2&#xff0c;对半查找&#xff0c;要求有序 从中间开始查找&#xff0c;每次检查中间的是否正确&#xff0c;不正确就…...

el-input输入框需要支持多输入,最后传输给后台的字段值以逗号分割

需求&#xff1a;一个输入框字段需要支持多次输入&#xff0c;最后传输给后台的字段值以逗号分割 解决方案&#xff1a;结合了el-tag组件的动态编辑标签 那块的代码 //子组件 <template><div class"input-multiple-box" idinputMultipleBox><div>…...

C# 枚举格式字符串

总目录 前言 当前文章为 C# 中的格式设置(格式化字符串) 大全 中的一个小章节。 一、概述 1. 基本信息 可以使用 Enum.ToString 方法&#xff0c;新建表示枚举成员的数字值、十六进制值或字符串值的字符串对象。枚举格式说明符不区分大小写。 二、自定义数字格式说明符详解…...

【51单片机-零基础chapter1】

安装软件(配套的有,不多赘述) 1.管理员身份运行keil和破解软件kegen 将CID代码复制粘贴到 一定要管理员方式,不然会error 插入板子 我的电脑,管理 1.如果是拯救者,查看端口,如果没有则显示隐藏 2.苹果不知道,好像不可以 3.其他电脑在"其他设备找" (注:本人在校已…...

记录:导出功能:接收文件流数据进行导出(vue3)

请求接口&#xff1a;一定要加responseType: blob 后端返回数据&#xff1a; api.js export function export() {return request({url: dev/api/export,method: get,responseType: blob,//一定要加}) } vue&#xff1a; import {export} from /api// 导出 const exportTab…...

利用最小二乘法找圆心和半径

#include <iostream> #include <vector> #include <cmath> #include <Eigen/Dense> // 需安装Eigen库用于矩阵运算 // 定义点结构 struct Point { double x, y; Point(double x_, double y_) : x(x_), y(y_) {} }; // 最小二乘法求圆心和半径 …...

CTF show Web 红包题第六弹

提示 1.不是SQL注入 2.需要找关键源码 思路 进入页面发现是一个登录框&#xff0c;很难让人不联想到SQL注入&#xff0c;但提示都说了不是SQL注入&#xff0c;所以就不往这方面想了 ​ 先查看一下网页源码&#xff0c;发现一段JavaScript代码&#xff0c;有一个关键类ctfs…...

《从零掌握MIPI CSI-2: 协议精解与FPGA摄像头开发实战》-- CSI-2 协议详细解析 (一)

CSI-2 协议详细解析 (一&#xff09; 1. CSI-2层定义&#xff08;CSI-2 Layer Definitions&#xff09; 分层结构 &#xff1a;CSI-2协议分为6层&#xff1a; 物理层&#xff08;PHY Layer&#xff09; &#xff1a; 定义电气特性、时钟机制和传输介质&#xff08;导线&#…...

苍穹外卖--缓存菜品

1.问题说明 用户端小程序展示的菜品数据都是通过查询数据库获得&#xff0c;如果用户端访问量比较大&#xff0c;数据库访问压力随之增大 2.实现思路 通过Redis来缓存菜品数据&#xff0c;减少数据库查询操作。 缓存逻辑分析&#xff1a; ①每个分类下的菜品保持一份缓存数据…...

【AI学习】三、AI算法中的向量

在人工智能&#xff08;AI&#xff09;算法中&#xff0c;向量&#xff08;Vector&#xff09;是一种将现实世界中的数据&#xff08;如图像、文本、音频等&#xff09;转化为计算机可处理的数值型特征表示的工具。它是连接人类认知&#xff08;如语义、视觉特征&#xff09;与…...

Docker 本地安装 mysql 数据库

Docker: Accelerated Container Application Development 下载对应操作系统版本的 docker &#xff1b;并安装。 基础操作不再赘述。 打开 macOS 终端&#xff0c;开始 docker 安装mysql之旅 第一步 docker search mysql 》〉docker search mysql NAME DE…...

Razor编程中@Html的方法使用大全

文章目录 1. 基础HTML辅助方法1.1 Html.ActionLink()1.2 Html.RouteLink()1.3 Html.Display() / Html.DisplayFor()1.4 Html.Editor() / Html.EditorFor()1.5 Html.Label() / Html.LabelFor()1.6 Html.TextBox() / Html.TextBoxFor() 2. 表单相关辅助方法2.1 Html.BeginForm() …...

脑机新手指南(七):OpenBCI_GUI:从环境搭建到数据可视化(上)

一、OpenBCI_GUI 项目概述 &#xff08;一&#xff09;项目背景与目标 OpenBCI 是一个开源的脑电信号采集硬件平台&#xff0c;其配套的 OpenBCI_GUI 则是专为该硬件设计的图形化界面工具。对于研究人员、开发者和学生而言&#xff0c;首次接触 OpenBCI 设备时&#xff0c;往…...

手机平板能效生态设计指令EU 2023/1670标准解读

手机平板能效生态设计指令EU 2023/1670标准解读 以下是针对欧盟《手机和平板电脑生态设计法规》(EU) 2023/1670 的核心解读&#xff0c;综合法规核心要求、最新修正及企业合规要点&#xff1a; 一、法规背景与目标 生效与强制时间 发布于2023年8月31日&#xff08;OJ公报&…...

uniapp 小程序 学习(一)

利用Hbuilder 创建项目 运行到内置浏览器看效果 下载微信小程序 安装到Hbuilder 下载地址 &#xff1a;开发者工具默认安装 设置服务端口号 在Hbuilder中设置微信小程序 配置 找到运行设置&#xff0c;将微信开发者工具放入到Hbuilder中&#xff0c; 打开后出现 如下 bug 解…...