精华推荐 |【Redis技术探索】「底层架构原理」深入透析主从架构的底层原理分析实现机制

news2025/4/4 13:56:44

📕技术箴言

当心中有更高的山峰去攀登,就不会在意脚下的泥沼。

📕前提概要

Redis高可用的方案包括:持久化主从复制(及读写分离)哨兵集群(Cluster)

📕📕 持久化:

侧重解决的是Redis数据的单机备份问题(从内存到硬盘的备份),数据可用性以及可靠性。

📕📕 主从复制

侧重解决数据的多机热备,以及从实例角度进行解决提高了高可用(故障切换),主从复制还可以实现负载均衡(高性能)

📕📕 哨兵

侧重于服务实例角度,自动进行监控和切换,进行解决实例之间提高了高可用(故障切换)

📕📕 集群

侧重于服务实例和数据角度,进行数据容灾以及高可用的能力,此外可以扩展单节点redis的数据存储上限

📕 内容提要

本片文章主要将详细介绍Redis主从复制的内容包括如何使用主从复制、主从复制的原理(重点是全量复制和部分复制、以及心跳机制)、实际应用中需要注意的问题(如数据不一致问题、复制超时问题、复制缓冲区溢出问题)、主从复制相关的配置(重点是repl-timeout、client-output-buffer-limit slave)等。

📕主从复制的概述

总体过程

  1. 主节点负责写数据,从节点负责读数据。

  2. 主从复制,是指将一台Redis服务器的数据,复制到其他的Redis服务器。

  3. 前者称为主节点(master),后者称为从节点(slave);

  4. 数据的复制是单向的,只能由主节点到从节点。

默认情况下,每台Redis服务器都是主节点;且一个主节点可以有多个从节点(或没有从节点),但一个从节点只能有一个主节点。

📕主从复制的作用

  • 数据冗余主从复制实现了数据的热备份,是持久化之外的一种数据冗余方式,数据可以保证可用性和一致性

  • 故障恢复当主节点出现问题时,可以由从节点提供服务,实现快速的故障恢复;实际上是一种服务的冗余

  • 负载均衡:在主从复制的基础上,配合读写分离,可以由主节点提供写服务,由从节点提供读服务(即写Redis数据时应用连接主节点,读Redis数据时应用连接从节点),分担服务器负载;尤其是在写少读多的场景下,通过多个从节点分担读负载,可以大大提高Redis服务器的并发量。

  • 高可用基石:除了上述作用以外,主从复制还是哨兵和集群能够实施的基础,因此说主从复制是Redis高可用的基础。

📕主从复制的拓扑

📕📕一主一从

  • 主节点故障转移从节点,当主节点的“写”命令并发高且需要持久化,可以只在从节点开启AOF(主节点不需要),这样即保证了数据的安全性,也避免AOF持久化对主节点的影响

📕📕一主多从

  • 针对“读”较多的场景,“读”由多个从节点来分担,但节点越多,主节点同步到多节点的次数也越多,影响带宽,也加重主节点的负担

📕📕 树状主从:

  • 一主多从的缺点(主节点推送次数多压力大)可用些方案解决,主节点只推送一次数据到从节点B,再由从节点B推送到C,减轻主节点推送的压力。

📕 主从复制的原理

了解redis复制原理对日后运维有很大帮助,包括如何规划节点,如何处理节点故障,redis复制过程可分为三个阶段:

  • 复制初始化阶段
  • 数据同步阶段
  • 命令传播阶段

📕📕 复制初始化阶段

主从复制主要实现的一个流程如上图:

1. 当执行完slaveof/replica masterip port命令时候,从库根据指明的master节点ip和port向主库发起socket连接,主库收到socket连接之后将连接信息保存,此时连接建立,从服务器保存主服务器的配置信息,保存之后待从服务器内部的定时器执行时,就会触发复制的流程


注意:replicaof 是新版本的命令,旧版本是 slaveof 命令,如果你使用的是 Redis 5.0.0 之前的版本,那么请使用 SLAVEOF 命令代替本章中的 REPLICAOF 命令,并使用 slaveof 配置选项代替本章中的 replicaof 配置选项


2. 从服务器首先会与主服务器建立一个socket套字节连接,用作主从通信使用。后面主服务器发送数据给从服务器也是通过该套字节进行。

3. socket套字节连接成功之后,接着发送鉴权ping命令,正常的情况下,主服务器会发送对应pong的响应。ping命令的作用是为了,保证socket套字节是否可以用,同时也是为了验证主服务器是否接受操作命令,否则可能出现超时或者主库此时在处理其他任务阻塞那么此时从库将断开socket连接,然后进行重试

4. 如果主库连接设置了密码,则从库需要设置masterauth参数此时从库会发送auth命令,命令格式为“auth + 密码”进行密码验证,其中密码为masterauth参数配置的密码,需要注意的是如果主库设置了密码验证,从库未配置masterauth参数则报错,socket连接断开。当身份验证完成以后,从节点发送自己的监听端口,主库保存其端口信息,此时进入下一个阶段:数据同步阶段

5. 可以开始复制数据了。主服务器此时会进行全量复制,将主服务的数据全部发给从服务器,从服务器保存主服务器发送的数据。

6.接下来就是持续复制操作。主服务器会进行异步复制,一边将写的数据写入自身,同时会将新的写命令发送给从服务器。

📕📕 数据同步阶段

  1. 主库和从库都确认对方信息以后,便可开始数据同步,此时从库向主库发送psync命令(需要注意的是redis4.0版本对2.8版本的psync做了优化,后续会进行说明),

  2. 主库收到该命令后判断是进行增量复制还是全量复制然后根据策略进行数据的同步,当主库有新的写操作时候此时进入复制第三阶段:命令传播阶段

📕📕 命令传播阶段

  • 当数据同步完成以后,在此后的时间里主从维护着心跳检查来确认对方是否在线,每隔一段时间(默认10秒,通过repl-ping-replica-period/repl-ping-slave-period参数指定)主节点向从节点发送PING命令判断从节点是否在线。

  • 从节点每秒1次向主节点发送REPLCONF ACK命令,命令格式为:REPLCONF ACK {offset},其中offset指从节点保存的复制偏移量。

    • 作用一是汇报自己复制偏移量,主节点会对比复制偏移量向从节点发送未同步的命令
    • 作用二在于判断主节点是否在线,从库接送命令并执行,最终实现与主库数据相同

📕📕 主从乐观复制机制

Redis采用量乐观复制策略,容忍在一定时间内主从数据内容是不同的,但是两者的数据最终会同步

📕📕 主从复制实现策略

Redis主从复制主要分为三种弄策略方式,不同的策略方式都是针对不同的场景下进行使用。三种场景方式分别如下:

📕📕📕 全量复制

全量复制用在主从复制刚建立时或者从切主服务器时,从服务器没有主服务器的数据,主服务器会将自身的数据通过rdb文件方式发送给从服务器,从服务器会清空自身数据,接着将主服务器发送的数据加载到自身中。

1. 从服务器->主服务器: 1.psync ? -1
2. 主服务器->从服务器: 2.fullsync runid offset
3. 从服务器: 保存 runid offset
4. 主服务器: 执行bgsave生成rdb
5. 主服务器->从服务器: 发送rdb
6. 从服务器: 清空自身老数据
7. 从服务器: 加载主服务器数据

📕📕📕 部分复制

部分复制用在一些异常情况下,例如主从延迟、从服务宕机之后重新启动接收主服务器发送的部分数据

部分复制的实现主要依赖于复制缓存区、主服务的runid、主从服务器各自复制偏移量(offset)

📕📕📕📕 复制缓存区**

repl_backlog_size保存在主节点上的一个固定长度的先进先出队列,默认大小是1MB

  • 主服务在接收写命令时,会将命令写入缓存区,以便从服务器在异常情况下,减少数据的丢失

  • 当从服务器正常连接之后,主服务器会将缓存区内的数据发送给从服务器。这里的缓存区是一个长队列

  • 主节点发送数据给从节点过程中,主节点还会进行一些写操作,这时候的数据存储在复制缓冲区中。从节点同步主节点数据完成后,主节点将缓冲区的数据继续发送给从节点,用于部分复制

  • 主节点响应写命令时,不但会把写命令发送给从节点,还会写入复制积压缓冲区,用于复制命令丢失的数据补救。

📕📕📕📕 主服务器runid

  • 主服务器会在每次服务启动之后,会生成一个唯一的ID,作为自身标识。从服务器会将该标识保存起来,发送部分复制命令时,会使用该runid

psync runid offset

📕📕📕📕 主从复制各自偏移量:

主从服务在建立复制之后,都会有自身的偏移量offset。

  • 主节点在每次进行了写命令之后,也会增加自身的偏移量(offset=offset+命令的字节长度)。这里的偏移量是通过命令的字节长度累加计算

  • 从节点会每秒钟发送自身复制的偏移量给主节点,主节点在发送写命令之后,从节点也会增加自身的复制偏移量(也会增加自己的offset)

主节点同时保存自己的offset和从节点的offset,通过对比offset来判断主从节点数据是否一致

📕📕📕 异步复制

异步复制是针对主从建立复制关系之后,主从服务器持续保持复制关系。

📕📕 场景问题

📕📕📕 数据安全

  • 从服务器只读

replica-read-only yes

  • 从服务器连接密码

masterauth

📕📕📕 数据延迟。

默认的情况下主节点存在新数据不会立即发送给从服务器,如果开启,则会理解延迟发送给从服务器。默认的时间间隔与Linux内核定义有关

  • 复制延迟

repl-disable-tcp-nodelay yes

📕📕📕 主从节点连接状态。

主从节点一旦建立连接之后,会定时模拟成对方的客户端,检测对方的服务状态。主节点可以通过设置repl-ping-replica-period/repl-ping-slave-period配置参数进行设置。默认的频率是10s。

从节点咋执行**replconf ack {offsetid}**时,也会将自身的复制偏移量发送给主服务器,主服务根据偏移量进行判断数据延迟。存在数据延迟就会从复制积压缓冲区的数据汇中,将对应的数据补发给从节点

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

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

相关文章

音视频面试涨知识(四)

视频格式播放体验流量占用情况DASH统计直播推流端到播放端延时。支持和视频帧绑定的内容交互。比如,直播答题在播放端的弹窗等。小HLS对视频进行切片,按切片播放,缓存小起播快;拖动时间轴到任意时间播放时,可以快速定位…

dubbo2和dubbo3 入门简介

稳定版本:2.5.3 目前已恢复更新Apache Dubbo 是一款微服务框架,为大规模微服务实践提供高性能 RPC通信、流量治理、可观测性等解决方案, 涵盖 Java、Golang 等多种语言 SDK 实现。3.0 版本的正式发布,标志着 Apache Dubbo 正式进入云原生时代。3.0 在通信协议、服务发现、部…

微服务框架 SpringCloud微服务架构 多级缓存 48 多级缓存 48.1 初识OpenResty

微服务框架 【SpringCloudRabbitMQDockerRedis搜索分布式,系统详解springcloud微服务技术栈课程|黑马程序员Java微服务】 多级缓存 文章目录微服务框架多级缓存48 多级缓存48.1 初识OpenResty48.1.1 初识OpenResty48.1.2 安装OpenResty48 多级缓存 48.1 初识Open…

python 使用tk报错

文章目录Preface解决方法问题1:问题2: **tk.Tk()** 这里的 Tk 的 k 是小写错误信息 ~~并没有什么实际作用/提示~~Preface 最近刚开始学习用python 的时候遇到一个对于我这样的新手来说比较棘手的问题. 我查询了好久, 大多数给出的答案就是代码写错了 而且是不给错误行数的那种…

微服务框架 SpringCloud微服务架构 多级缓存 48 多级缓存 48.3 请求参数处理

微服务框架 【SpringCloudRabbitMQDockerRedis搜索分布式,系统详解springcloud微服务技术栈课程|黑马程序员Java微服务】 多级缓存 文章目录微服务框架多级缓存48 多级缓存48.3 请求参数处理48.3.1 OpenResty获取请求参数48.3.2 直接上案例48 多级缓存 48.3 请求…

Service 与 Pod 有什么联系?

目录前言一、创建 Deployment二、创建 Service三、集群外部访问前言 首先我们要清楚,Pod 中的容器很可能因为各种原因故障而死掉,如果真的发生故障,那 Deployment 等 Controller 会通过动态创建和销毁 Pod 来保证应用整体的健壮性。而每个 P…

java的垃圾回收浅谈

目录 并发标记问题 三色算法问题 浮动垃圾问题 漏标问题 cms的解决方式 g1的解决方式 跨代(区)引用 CMS垃圾回收日志 G1垃圾回收日志 垃圾回收过程其实都包含两步:标记回收。 标记算法: 引用计数:每个对象都有一个计数器&#xff…

【大数据技术Hadoop+Spark】Hive基础SQL语法DDL、DML、DQL讲解及演示(附SQL语句)

Hive基础SQL语法 1:DDL操作 DDL是数据定义语言,与关系数据库操作相似, 创建数据库 CREATE DATABASE|SCHEMA [IF NOT EXISTS] database_name显示数据库 SHOW databases;查看数据库详情 DESC DATABASE|SCHEMA database_name切…

2022年都快完了,还学Access的人是不是傻?

2022年都快完了,还学Access的人是不是傻?这是某问答平台,讨论火热的话题。 该问题下,部分程序员拍手称好,对Access语言充满不屑,认为Access过时该被淘汰,笔者作为开发者,并不赞同。事…

【Linux】虚拟地址空间

文章目录❓什么是虚拟地址空间?😊我们先来看这样的一个程序:⚠️感性的认识虚拟地址空间😊Linux具体是怎么实现进程地址空间的❓为什么会存在虚拟地址空间?❓什么是虚拟地址空间? 虚拟地址空间是操作系统为了实现进程管理所设定的一种虚拟…

[附源码]Node.js计算机毕业设计高校学生选课系统Express

项目运行 环境配置: Node.js最新版 Vscode Mysql5.7 HBuilderXNavicat11Vue。 项目技术: Express框架 Node.js Vue 等等组成,B/S模式 Vscode管理前后端分离等等。 环境需要 1.运行环境:最好是Nodejs最新版,我…

Android 跨应用发送自定义广播

话不多说,直接看效果图和代码! 一、效果图 1、未发送广播之前,两个APP的主界面图; 2、发送之后,文本框内容改变。 二、代码 1、创建第一个APP (1)MainActivity中代码如下: p…

分享篇:第十届“泰迪杯”数据挖掘挑战赛-农田害虫图像识别(特等奖)一

1.1 赛题背景 昆虫的种类浩如烟海,农田常见的昆虫是人工生态系统的重要组成部分。分辨益 虫和害虫,保留益虫,消灭害虫,对于减轻害虫对农田的生产危害有重要意义。常见 农田害虫共有 138 种,天敌昆虫则为 40 种。病虫害…

D-UNet:一种用于慢性脑卒中病变分割的维数融合U型网络

摘要 二维卷积神经网络忽略了医学图像的三维信息,而三维卷积神经网络对计算资源的需求过大。而本文提出一种新的结构,称为维度融合网络(D-UNet)这个网络在编码阶段创新的结合了二维和三维卷积。所提出的网络结构实现了比2D网络更…

C语言快速过渡C++

下面只讲干货,方便C语言初学者快速上手cpp来刷算法题,如果是希望系统学习cpp的不建议继续阅读,仅限于快速使用 文章目录using namespace stdcin cout 头文件变量声明bool变量const定义常量string类字符串的定义与拼接字符串的输入字符串的处理…

Qt扫盲-QStackedWidget理论总结

QStackedWidget理论总结1. 简述2. 布局用法3. 页面切换4. 常用功能1. 简述 QStackedWidget和QTabWidget的功能类似,都是为解决大量的控件在一个页面上可能显示不出来,同时呢,这些控件也可以按一定方式分类,我们就可以把这些控件分…

JAVA文件基本操作与概念

文件的概念 狭义的文件: 存储在硬盘上的数据,以文件为单位,进行组织;文件夹也叫做"目录",也是一种特殊的文件(文件里存储的也是文件) 这章笔记的内容都是指狭义的文件 广义的文件: 操作系统…

Docker安装emqx详解(配置SSL证书、开启WSS、鉴权)

EMQX 是一款大规模可弹性伸缩的云原生分布式物联网 MQTT 消息服务器。 1 端口介绍 1883:MQTT 协议端口8084:MQTT/SSL 端口8083:MQTT/WebSocket 端口8080:HTTP API 端口18083:Dashboard 管理控制台端口 2 拉取镜像 …

视频文件转M3U8

前言 前段时间遇到一个播放视频的项目,为了防止登录的用户下载项目的视频,所以需要对视频加密,即使用户下载也不能播放;因为前端采用videojs,最后确认方案是将mp4转m3u8文件格式,来实现视频文件加密播放。下…

公共用房管理系统有哪些管理功能?

数图互通房产管理 数图互通公共用房管理系统的管理功能范围包括: 1、对全部公房进行图形化、电子化、规范、动态化管理。 2、房屋数据定义:可对校区、片区、建筑物、楼层、房间数据进行增删改查,对房间属性数据进行批量修改。 3、档案及多类型附件管理:可对房产的…