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 集群的高可用性。但是,主从节点之间的数据同步存在延迟,可能导致短暂的数据不一致情况;在主节点故障时,还得运维人员手动选出一个新的主节点并重新配置其它从节点,故障切换比较复杂。

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

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

相关文章

Mysql数据实时同步到Es上

同步方案 ① 同步双写 同步双写实一种数据同步策略&#xff0c;它指的是在主数据库(如mysql) 上进行数据修改操作&#xff0c;同时将这些修改同步写入到ES 中&#xff0c;这种策略旨在确保两个数据库之间的数据一致性&#xff0c;并且优化系统的读写性能。 目标 同步双写是…

供需平台信息发布付费查看小程序系统开发方案

供需平台信息发布付费查看小程序系统主要是为了满足个人及企业用户的供需信息发布与匹配需求。 一、目标用户群体 个人用户&#xff1a;寻找兼职工作、二手物品交换、本地服务&#xff08;如家政、维修&#xff09;等。 小微企业&#xff1a;推广产品和服务&#xff0c;寻找合…

深入理解计算机系统—虚拟内存(3)

9.9 动态内存分配 虽然可以使用低级的 mmap 和 munmap 函数来创建和删除虚拟内存的区域&#xff0c;但是 C程序员还是会觉得当运行时需要额外虚拟内存时&#xff0c;用 动态内存分配器 更方便&#xff0c;也有更好的可移植性。 动态内存分配器维护着一个进程的虚拟内存区域&…

html本地字符串处理工具|去重、分割、求交集、求并集

源代码&#xff08;保存到本地文件命名为 xxx.html&#xff0c;用浏览器打开该文件即可使用&#xff09; <!DOCTYPE html> <html lang"zh-CN"><head><meta charset"UTF-8"><title>数据处理</title><style>inpu…

毕业项目推荐:基于yolov8/yolov5的行人检测识别系统(python+卷积神经网络)

文章目录 概要一、整体资源介绍技术要点功能展示&#xff1a;功能1 支持单张图片识别功能2 支持遍历文件夹识别功能3 支持识别视频文件功能4 支持摄像头识别功能5 支持结果文件导出&#xff08;xls格式&#xff09;功能6 支持切换检测到的目标查看 二、数据集三、算法介绍1. YO…

企业二要素如何用C#实现

一、什么是企业二要素&#xff1f; 企业二要素&#xff0c;通过输入统一社会信用代码、企业名称或统一社会信用代码、法人名称&#xff0c;验证两者是否匹配一致。 二、企业二要素适用哪些场景&#xff1f; 例如&#xff1a;信用与金融领域 1.信用评级&#xff1a;信用评级…

微信小程序中 “页面” 和 “非页面” 的区别

微信小程序中 “页面” 和 “非页面” 的区别&#xff0c;并用表格进行对比。 核心概念&#xff1a; 页面 (Page)&#xff1a; 页面是微信小程序中用户可以直接交互的视图层&#xff0c;也是小程序的基本组成部分。每个页面都有自己的 WXML 结构、WXSS 样式和 JavaScript 逻辑…

互联网直播点播平台EasyDSS无人机视频推拉流技术实现工地远程监控巡检直播

在建筑行业&#xff0c;施工现场的安全管理和实时监控一直是项目管理中的重点。随着技术的进步&#xff0c;无人机工地直播技术成为了一种新兴的解决方案&#xff0c;它不仅能够提高施工透明度&#xff0c;还能够加强现场安全管理。EasyDSS作为一种先进的流媒体技术平台&#x…

【文献精读笔记】Explainability for Large Language Models: A Survey (大语言模型的可解释性综述)(四)

****非斜体正文为原文献内容&#xff08;也包含笔者的补充&#xff09;&#xff0c;灰色块中是对文章细节的进一步详细解释&#xff01; 四、提示范式&#xff08;Explanation for Prompting Paradigm&#xff09; 随着语言模型规模的扩大&#xff0c;基于提示&#xff08;prom…

基于区块链的共享算力系统概念方案

以下白皮书为一个去中心化的 GPU 共享算力系统的概念性方案参考&#xff0c;旨在帮助社区和开发者初步了解该系统的设计思路与运作机制。该方案受到 IPFS、区块链&#xff08;如比特币、以太坊&#xff09;等去中心化项目的启发&#xff0c;结合了激励机制和点对点资源共享理念…

RedisInsight:企业级 Redis 管理与分析工具

1 介绍 RedisInsight 是一款专为企业级用户设计的 Redis 管理与分析工具,旨在简化 Redis 数据库的管理和优化操作。通过直观的图形化界面和强大的功能集,RedisInsight 提供了全面的监控、诊断、性能优化以及数据管理能力,帮助企业和开发团队更高效地管理和运维 Redis 实例。…

【循环神经网络】RNN介绍

在人工神经网络中&#xff0c;”浅层网络”是指具有一个输入层、一个输出层和最多一个没有循环连接的隐藏层的网络。随着层数的增加&#xff0c;网络的复杂性也在增加。更多的层或循环连接通常会增加网络的深度&#xff0c;并使其能够提供不同级别的数据表示和特征提取&#xf…

vue v-for 数据增加页面不刷新

<div style"float:left;border:1px solid red;height:100px;width:600px;"><el-form-item label"多语言配置" style"width:700px;" prop"validTanleHead"><el-input style"width: 180px" placeholder"请…

DeepSeek v3为何爆火?如何用其集成Milvus搭建RAG?

最近&#xff0c;DeepSeek v3&#xff08;一个MoE模型&#xff0c;拥有671B参数&#xff0c;其中37B参数被激活&#xff09;模型全球爆火。 作为一款能与Claude 3.5 Sonnet&#xff0c;GPT-4o等模型匹敌的开源模型DeepSeek v3不仅将其算法开源&#xff0c;还放出一份扎实的技术…

【C语言】_野指针

目录 1. 野指针常见成因 1.1 指针未初始化 1.2 指针越界访问 1.3 指针指向的空间释放了 2. 规避野指针 2.1 指针初始化 2.2 小心指针越界 2.3 指针变量使用前检查有效性&#xff0c;不再使用时及时置NULL 2.4 避免返回局部变量的地址 野指针&#xff1a;野指针就是指针…

IEEE PDF eXpress遇到Font TimesNewRomanPSMT is not embedded的解决方案

IEEE PDF eXpress遇到Font TimesNewRomanPSMT is not embedded的解决方案 问题描述 在IEEE PDF eXpress上上传论文后&#xff0c;出现Font XXX is not embedded的问题。 该问题是指你所插入的图片等&#xff0c;没有将对应的字体嵌入进去。 解决方案 以下以Origin Lab图片…

什么情况会导致JVM退出?

大家好&#xff0c;我是锋哥。今天分享关于【什么情况会导致JVM退出?】面试题。希望对大家有帮助&#xff1b; 什么情况会导致JVM退出? 1000道 互联网大厂Java工程师 精选面试题-Java资源分享网 JVM&#xff08;Java Virtual Machine&#xff09;在不同情况下可能会退出&am…

Linux内核编程(二十一)USB应用及驱动开发

一、基础知识 1. USB接口是什么&#xff1f; USB接口&#xff08;Universal Serial Bus&#xff09;是一种通用串行总线&#xff0c;广泛使用的接口标准&#xff0c;主要用于连接计算机与外围设备&#xff08;如键盘、鼠标、打印机、存储设备等&#xff09;之间的数据传输和电…

CSS——1.优缺点

<!DOCTYPE html> <html><head><meta charset"UTF-8"><title></title><link rel"stylesheet" type"text/css" href"1-02.css"/></head><body><!--css&#xff1a;层叠样式表…

攻防世界 - Web - Level 3 | simple_js

关注这个靶场的其它相关笔记&#xff1a;攻防世界&#xff08;XCTF&#xff09; —— 靶场笔记合集-CSDN博客 0x01&#xff1a;考点速览 本题考察的是 JS 的代码审计&#xff0c;以下是你需要了解的知识点&#xff1a; String.fromCharCode() -> 将接收的 Unicode 编码转换…