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 上,很大程度上增加了每秒处理查询请求的数量。
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
操作时的状态一致。
流程图如下:
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.缓存穿透 缓存穿透是指客户端请求的数据在缓存中和数据库中都不存在,这样缓存永远不会生效,这些请求都会打到数据库。 常见的解决方案有两种: 缓存空对…...
阿里云电商平台用户行为分析与人群画像系统设计与实现
通过在阿里云(https://baike.baidu.com/item/%E9%98%BF%E9%87%8C%E4%BA%91/297128)上构建包含数据源层、数据存储层、数据处理层、数据分析层和数据应用层的系统架构,并设计合理的数据模型、ETL流程、数据质量与性能监控机制以及安全与合规性…...
Go语言的 的输入/输出流(I/O Streams)核心知识
Go语言的输入/输出流(I/O Streams)核心知识 前言 Go语言是一种现代编程语言,因其高效性、简洁性及强大的并发支持而受到开发者的喜爱。在开发应用程序时,输入/输出(I/O)操作是一个不可或缺的部分。无论是…...

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

数据结构C语言描述8(图文结合)--哈希、哈希冲突、开放地址法、链地址法等实现
前言 这个专栏将会用纯C实现常用的数据结构和简单的算法;有C基础即可跟着学习,代码均可运行;准备考研的也可跟着写,个人感觉,如果时间充裕,手写一遍比看书、刷题管用很多,这也是本人采用纯C语言…...

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

云打印之拼多多打印组件交互协议
拼多多打印组件交互协议相关介绍如下: 1、打印组件下载地址 http://meta.pinduoduo.com/api/one/app/v1/lateststable?appIdcom.xunmeng.pddprint&platformwindows&subTypemain 2、socket连接端口 如果是http的话,端口是5000 socket new …...
TCP 演进之路:软硬件跷跷板与新征程
今天依旧是与 TCP 相关的一个短评。 先看软硬件间的胶着。晶体管诞生以来,硬件一直在突飞猛进发展,后来这个事被摩尔定律正则化,人们开始可以预测未来,但即便如此,软件依然跟不上来,不过几年,老…...
React最小状态管理Jotai
Jotai 状态管理 1. 简介 Jotai 是一个基于原子 atom 概念的 React 状态管理库,它提供了简单且灵活的方式来管理应用状态, 而且非常轻量, 大厂用的非常多。 JotaiRedux适合单个页面,多次用到的属性适合全局公共属性超级轻量(与use…...

计算机网络 —— 网络编程(TCP)
计算机网络 —— 网络编程(TCP) TCP和UDP的区别TCP (Transmission Control Protocol)UDP (User Datagram Protocol) 前期准备listen (服务端)函数原型返回值使用示例注意事项 accpect (服务端)函数原型返回…...
字玩FontPlayer开发笔记4 性能优化 首屏加载时间优化
字玩FontPlayer开发笔记4 性能优化 首屏加载时间优化 字玩FontPlayer是笔者开源的一款字体设计工具,使用Vue3 ElementUI开发,源代码: github: https://github.com/HiToysMaker/fontplayer gitee: https://gitee.com/toysmaker/fontplayer …...
RabbitMQ案例
1. 导入依赖 <!--AMQP依赖,包含RabbitMQ--><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-amqp</artifactId></dependency> 发送消息 注入RabbitTemplate Autowired RabbitT…...
智能工厂的设计软件 应用场景的一个例子:为AI聊天工具添加一个知识系统 之13 方案再探之4:特定于领域的模板 之 div模型(完整版)
前景提要 整个“方案再探”篇 围绕着如何将项目附件文档中Part 1 部分中给出的零散问题讨论整理、重组为一个结构化的设计文档。为此提出了讨论题目: 特定于领域的模板--一个三套接的hoc结构 它是本项目actors 的剧本原型。其地位: 祖传代码脚本模板…...

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

数据结构复习 (顺序查找,对半查找,斐波那契查找,插值查找,分块查找)
查找(检索): 定义:从给定的数据中找到对应的K 1,顺序查找: O(n)的从前向后的遍历 2,对半查找,要求有序 从中间开始查找,每次检查中间的是否正确,不正确就…...

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

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

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

记录:导出功能:接收文件流数据进行导出(vue3)
请求接口:一定要加responseType: blob 后端返回数据: api.js export function export() {return request({url: dev/api/export,method: get,responseType: blob,//一定要加}) } vue: import {export} from /api// 导出 const exportTab…...

前端导出带有合并单元格的列表
// 导出async function exportExcel(fileName "共识调整.xlsx") {// 所有数据const exportData await getAllMainData();// 表头内容let fitstTitleList [];const secondTitleList [];allColumns.value.forEach(column > {if (!column.children) {fitstTitleL…...

UR 协作机器人「三剑客」:精密轻量担当(UR7e)、全能协作主力(UR12e)、重型任务专家(UR15)
UR协作机器人正以其卓越性能在现代制造业自动化中扮演重要角色。UR7e、UR12e和UR15通过创新技术和精准设计满足了不同行业的多样化需求。其中,UR15以其速度、精度及人工智能准备能力成为自动化领域的重要突破。UR7e和UR12e则在负载规格和市场定位上不断优化…...
今日学习:Spring线程池|并发修改异常|链路丢失|登录续期|VIP过期策略|数值类缓存
文章目录 优雅版线程池ThreadPoolTaskExecutor和ThreadPoolTaskExecutor的装饰器并发修改异常并发修改异常简介实现机制设计原因及意义 使用线程池造成的链路丢失问题线程池导致的链路丢失问题发生原因 常见解决方法更好的解决方法设计精妙之处 登录续期登录续期常见实现方式特…...
力扣-35.搜索插入位置
题目描述 给定一个排序数组和一个目标值,在数组中找到目标值,并返回其索引。如果目标值不存在于数组中,返回它将会被按顺序插入的位置。 请必须使用时间复杂度为 O(log n) 的算法。 class Solution {public int searchInsert(int[] nums, …...
Java线上CPU飙高问题排查全指南
一、引言 在Java应用的线上运行环境中,CPU飙高是一个常见且棘手的性能问题。当系统出现CPU飙高时,通常会导致应用响应缓慢,甚至服务不可用,严重影响用户体验和业务运行。因此,掌握一套科学有效的CPU飙高问题排查方法&…...
Pinocchio 库详解及其在足式机器人上的应用
Pinocchio 库详解及其在足式机器人上的应用 Pinocchio (Pinocchio is not only a nose) 是一个开源的 C 库,专门用于快速计算机器人模型的正向运动学、逆向运动学、雅可比矩阵、动力学和动力学导数。它主要关注效率和准确性,并提供了一个通用的框架&…...

LINUX 69 FTP 客服管理系统 man 5 /etc/vsftpd/vsftpd.conf
FTP 客服管理系统 实现kefu123登录,不允许匿名访问,kefu只能访问/data/kefu目录,不能查看其他目录 创建账号密码 useradd kefu echo 123|passwd -stdin kefu [rootcode caozx26420]# echo 123|passwd --stdin kefu 更改用户 kefu 的密码…...
深入浅出WebGL:在浏览器中解锁3D世界的魔法钥匙
WebGL:在浏览器中解锁3D世界的魔法钥匙 引言:网页的边界正在消失 在数字化浪潮的推动下,网页早已不再是静态信息的展示窗口。如今,我们可以在浏览器中体验逼真的3D游戏、交互式数据可视化、虚拟实验室,甚至沉浸式的V…...
板凳-------Mysql cookbook学习 (十--2)
5.12 模式匹配中的大小写问题 mysql> use cookbook Database changed mysql> select a like A, a regexp A; ------------------------------ | a like A | a regexp A | ------------------------------ | 1 | 1 | --------------------------…...

Python 解释器安装全攻略(适用于 Linux / Windows / macOS)
目录 一、Windows安装Python解释器1.1 下载并安装Python解释1.2 测试安装是否成功1.3 设置pip的国内镜像------永久配置 二、macOS安装Python解释器三、Linux下安装Python解释器3.1 Rocky8.10/Rocky9.5安装Python解释器3.2 Ubuntu2204/Ubuntu2404安装Python解释器3.3 设置pip的…...