【Redis-08】Redis主从复制的实现原理

 在Redis中,可以通过slaveof命令或者设置slaveof选项实现两台Redis服务器的主从复制,比如我们有两个Redis机器,地址分别是 127.0.0.1:6379 和 127.0.0.1:6380,现在我们在前者上面执行:

127.0.0.1:6379 > SLAVEOF 127.0.0.1:6380

 那么,127.0.0.1:6379就会成为从服务器,127.0.0.1:6380就是主服务器,主从服务器通过复制会保存相同的数据,这就是数据库状态一致。今天我们探讨的重点是,主从服务器之间是如何实现数据复制的,以及slaveof这个命令的实现原理。

1.全量复制功能的实现

 主从复制的实现是通过两个操作来实现的,分别是同步(sync)和命令传播(propagate),我们看着这两个操作代表什么含义:

  • 同步:将从服务器的状态更新至主服务器当前所处的数据库状态;这里会通过一个SYNC命令来完成,具体如下:
    1. 从服务器发送SYNC命令给主服务器;
    2. 主服务器接收到命令,执行bgsave命令,创建RDB文件;
    3. 主服务器记录bgsave命令执行期间处理的客户端新命令,并写入到某个缓冲区中;
    4. RDB文件创建完成,主服务器发送给从服务器,从服务器完成RDB文件的载入;
    5. 主服务器将命令缓冲区的内容发给从服务器,从服务器执行所有命令;
    6. 从服务器状态与主服务完成数据库状态一致。
      在这里插入图片描述
  • 命令广播:主服务器会将自己执行的写命令,发送给从服务器执行,使得两者再次保持状态一致。

2.增量复制功能的实现

 主从复制分为初始化复制和断线后复制,即从服务器初始启动时,执行saveof命令会执行一次同步,还有从服务器断线后再次链接,也会执行一次同步。

 在早起的Redis的版本中,无论是首次启动还是断线后重连,都是适用SYNC命令实现,即:全量复制,但是SYNC是一个特别耗费资源的操作,会占用大量CPU、内存、网络和磁盘I/O的资源,所以在后期的版本中,是使用增量复制PSYNC来实现复制操作的。

PSYNC这个命令是同时具有完整同步和部分重同步的功能,其中完整同步的功能和SYNC命令执行的步骤一样,而部分重同步的功能是在服务器断线重连后,如果条件允许,主服务器将断线期间的命令发送给从服务器执行,达到状态的同步的目的。所以这种部分重同步的操作相对于完整同步,是能减少很多资源消耗的。

2.1 部分重同步的实现细节

 部分重同步的功能是通过3个部分构成的,分别是主从服务器两者的复制偏移量,主服务器的复制积压缓冲区,服务器的运行ID。

2.1.1 复制偏移量

 复制的双方,分别会维护一个复制的偏移量:

  • 主服务器的复制积压缓冲区每次向从服务器传播N个字节时,就会将自己的复制偏移量 +N;
  • 从服务器在接收到N个字节数据时,会将自己的复制偏移量 +N。

 这样复制的双方就可以通过复制偏移量,达到同步的目的。如果主从服务器的状态一致,那么他们的复制偏移量总是相同的,否在是处于状态不一致的情况。

2.1.2 复制积压缓冲区

 复制积压缓冲区是由主服务器维护的一个固定长度先进先出的队列,默认大小是1MB。当服务器向从服务器传播命令时,它还会将此命令入队到复制积压缓冲区里面。同时,复制积压缓冲区会为入队的每一个字节记录相应的复制偏移量值,这里的偏移量和2.1.1维护的偏移量值是相匹配。同时由于固定队列先进先出的特性,使得复制积压缓冲区中,仅保存最近一段时间执行的同步命令。

 当服务器连接到主服务器时,从服务器向主服务器发送PSYNC命令是会带上自己的复制偏移量offset,主服务器根据此偏移量决定执行哪种操作:

  • 如果从服务器偏移量offset之后的数据还保存在主服务器的复制积压缓冲区里面,那么主服务器会执行部分重同步的操作。
  • 如果从服务器偏移量offset之后的数据已经不在主服务器的复制积压缓冲区里面了,那么主服务器会执行完整同步的操作。

 所谓的部分重同步操作,是指主服务器将从服务器偏移量offset之后的所有命令发给从服务器,避免全部命令重新发送的问题。

2.1.3 服务器运行ID

 每个Redis服务器(包括主从),都会有自己的运行ID,主从服务器首次进行同步时,主服务器会将自己的运行ID发送给从服务器,从服务器会保存此ID。
 当从服务器断线重连后,想要执行复制操作,会将前面保存的服务器ID发送给主服务器,此时由主服务器执行判断:

  • 如果从服务器保存的此ID和自己的ID相同,那说明断线前后的主服务器是同一个,此时就会根据偏移量判断是执行全部同步还是部分重同步。
  • 如果从服务器保存的此ID和自己的ID不同,那说明断线前后的主服务器已经变了,此时就会执行完整同步的操作。

3.心跳检测

 在主从复制的命令传播期间,从服务器会以每秒一次的频率,向主服务器发送命令:

REPLCONF ACK <replication_offset>

 其中,replication_offset是服务器当前的复制偏移量。那么发送此命令的作用是什么呢,主要是下面三个:

  1. 检测主从服务器之间的网络连接状态: 如果主服务器在超过1s内未收到从服务器发送的命令,就会认为两者之间的网络连接出现问题了。
  2. 辅助实现min-slaves选项: 在配置文件中,有这么两个参数,min-replicas-to-writemin-replicas-max-lag,如下,如果我们开启了此选项,表示如果从服务器数量少于3个,或者三个主从服务器之间的复制延迟都大于等于10s时,主服务器将拒绝执行写命令,这里主要是为了防止主服务器在不安全的情况下执行写命令。
# 从服务器的数量是3个
min-replicas-to-write 3 
# 主从服务器之间的延迟时间,单位是3
min-replicas-max-lag 10
  1. 检测广播命令是否丢失: 在命令广播期间,因为网路问题可能存在命令在半路丢失的情况,所以通过此命令的 replication_offset,即从服务器的复制偏移量,主服务器就可以获悉从服务器是否成功执行了上一次发送的命令。如果主从的复制偏移量相等,说明命令传播没有问题,如果不相等,说明命令有丢失或从服务器执行失败的情况,此时主服务器就会把从服务器偏移量之后的命令从新发送给从服务器执行,保证两个服务器状态的一致性。

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

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

相关文章

分布式技术之流量控制技术

文章目录 什么是流量控制&#xff1f;分布式系统流量控制策略漏桶策略令牌桶策略两种策略对比Sentinel 流量控制工作原理 什么是流量控制&#xff1f; 流量控制&#xff0c;如果学过计算机网络的话&#xff0c;第一反应肯定是网络传输中的流量控制。网络传输中的流量控制&…

【中南林业科技大学】计算机组成原理复习包括题目讲解(超详细)

来都来了点个赞收藏关注一下再走呗&#x1f339;&#x1f339;&#x1f339;&#x1f339; 第1章&#xff1a;绪论 1.冯诺依曼机特点&#xff0c;与现代计算机的区别 冯诺依曼计算机的基本思想是&#xff1a;程序和数据以二进制形式表示&#xff0c;存储程序控制。在计算机中&…

2023 AI开发者生态报告

随着人工智能技术的飞速发展&#xff0c;全球IT市场对AI的投入持续增长&#xff0c;预计到2027年将达到4236亿美元。中国作为AI领域的重要参与者&#xff0c;其投资规模预计将占全球的9%。在这样的背景下&#xff0c;2023年的《AI开发者生态报告》为我们揭示了人工智能时代的技…

数据结构,题目笔记

哈希表 线性探测再散列 【算法数据结构&#xff5c;哈希查找&#xff5c;哈希冲突&#xff5c;除留余数法&#xff5c;线形探测法&#xff5c;例题讲解】https://www.bilibili.com/video/BV1514y1P7BK?vd_source1a684a3a1b9d05485b3d6277aeeb705d 【二次探测再散列法】 【【…

信号与线性系统翻转课堂笔记20——系统函数与信号流图

信号与线性系统翻转课堂笔记20——系统函数与信号流图 The Flipped Classroom20 of Signals and Linear Systems 对应教材&#xff1a;《信号与线性系统分析&#xff08;第五版&#xff09;》高等教育出版社&#xff0c;吴大正著 一、要点 &#xff08;1&#xff09;了解信…

VS2019+OpenCV4.7.0+OpenCV_contrib4.7.0+CUDA安装+配置视频硬解码保姆级别教程

在算法开发过程中&#xff0c;涉及基于opencv的rtsp流硬解码&#xff0c;这里设计结合当前所有的资料&#xff0c;实现了现有opengl相关的所有跟视频硬解码相关的功能&#xff0c;下面对opencv4.7.0的编译流程进行说明&#xff1a; 一、准备工作 下载opencv &#xff1a;open…

【网络技术】【Kali Linux】Wireshark嗅探(一)ping和ICMP

一、实验目的 本次实验使用wireshark流量分析工具进行网络嗅探&#xff0c;旨在了解ping命令的原理及过程。 二、网络环境设置 本系列实验均使用虚拟机完成&#xff0c;主机操作系统为Windows 11&#xff0c;虚拟化平台选择Oracle VM VirtualBox&#xff0c;组网模式选择“N…

【实用工具】Tmux使用指南

Tmux 三个重要概念 session&#xff08;会话&#xff09;、window&#xff08;窗口&#xff09;、pane&#xff08;面板&#xff09; 一个会话可以有多个窗口&#xff0c;一个窗口可以划分为多个面板 注意在tmux中使用快捷命令的话&#xff0c;需要加上前缀ctrlb 关于session的…

Matplotlib_plt.subplots 遇见中文乱码解决方案

文章目录 一、现象&#xff1a;二、解决方案1.将 **SimHei.ttf** &#xff0c;下载到当前运行目录中2.绘图中涉及标题、横纵坐标等&#xff0c;加上 **FontProperties font** 即可 环境说明&#xff1a;macOS系统 一、现象&#xff1a; 原先代码是这样的 import numpy as n…

OpenCV实战 -- 维生素药片的检测记数

文章目录 检测记数原图经过操作开始进行消除粘连性--形态学变换总结实现方法1. 读取图片&#xff1a;2. 形态学处理&#xff1a;3. 二值化&#xff1a;4. 提取轮廓&#xff1a;5. 轮廓筛选和计数&#xff1a; 分水岭算法&#xff1a;逐行解释在基于距离变换的分水岭算法中&…

【数据结构】排序之交换排序(冒泡 | 快排)

交换目录 1. 前言2. 交换排序3. 冒泡排序3.1 分析3.2 代码实现 4. 快速排序4.1 hoare版本4.1.1 分析4.1.2 hoare版本代码 4.2 挖坑法4.2.1 分析4.2.2 挖坑法代码实现 4.3 前后指针版本4.3.1 分析4.3.2 前后指针版本代码实现 1. 前言 在之前的博客中介绍了插入排序&#xff0c;…

HTML5和JS实现新年礼花效果

HTML5和JS实现新年礼花效果 2023兔年再见&#xff0c;2024龙年来临了&#xff01; 祝愿读者朋友们在2024年里&#xff0c;身体健康&#xff0c;心灵愉悦&#xff0c;梦想成真。 下面是用HTML5和JS实现新年礼花效果&#xff1a; 源码如下&#xff1a; <!DOCTYPE html>…