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

Redis主从同步是怎么实现的?

Redis主从同步是怎么实现的?

主从节点建立连接后,从节点会进行判断:

1.如果这是从节点之前没有同步过数据

属于初次复制,会进行全量重同步,那么从节点会向主节点发送PSYNC?-1 命令,请求主节点进行全量重同步

2.如果从节点不是初次复制(例如出现掉线后重连) 这个时候从节点会将之前进行同步的Replication ID(一个随机字符串,标识主节点上的特定数据集)和offset(从服务器当前的复制偏移量)通过PSYNC id offset命令发送给主节点,主节点会进行判断,

  • 如果Replication ID跟当前的Replication ID不一致(可能主节点进行了变化),或者是当前buffer缓冲区中不存在对应的offset,那么会跟上面的初次复制一样,进行全量重同步
  • 如果Replication ID跟当前的Replication ID一致并且当前buffer缓冲区中存在对应的offset,那么会进行部分重同步。(部分重同步是Redis 2.8之后的版本支持的,主要基于性能考虑,为了断线期间的小部分数据修改进行全量重同步效率比较低)
全量重同步

主节点会执行BGSAVE命令,fork出一个子进程,在后台生成一个RDB持久化文件,完成后,发送给从服务器,从节点接受并载入RDB文件,使得从节点的数据库状态更新至主节点执行BGSAVE命令时的状态。并且在生成RDB文件期间,主节点也会使用一个缓冲区来记录这个期间执行的所有写命令,将这些命令发送给从节点,从节点执行命令将自己数据库状态更新至与主节点完全一致。

部分重同步

因为此时从节点只是落后主节点一小段时间的数据修改,并且偏移量在复制缓冲区buffer中可以找到,所以主节点把从节点落后的这部分数据修改命令发送给从节点,完成同步。

命令传播

在执行全量重同步或者部分重同步以后,主从节点的数据库状态达到一致后,会进入到命令传播阶段。主节点执行修改命令后,会将修改命令添加到内存中的buffer缓冲区(是一个定长的环形数组,满了时就会覆盖前面的数据),然后异步地将buffer缓冲区的命令发送给从节点。

http://www.lryc.cn/news/521829.html

相关文章:

  • Flutter中Get.snackbar避免重复显示的实现
  • [Qt]常用控件介绍-多元素控件-QListWidget、QTableWidget、QQTreeWidget
  • 深入Android架构(从线程到AIDL)_32 JNI架构原理_Java与C的对接05
  • 【gRPC】clientPool 客户端连接池简单实现与go案例
  • Android 15应用适配指南:所有应用的行为变更
  • 24-25-1-单片机开卷部分习题和评分标准
  • STM32第6章、WWDG
  • 汽车免拆诊断案例 | 2007 款法拉利 599 GTB 车发动机故障灯异常点亮
  • C语言-数据结构-队列
  • STL之VectorMapList针对erase方法踩坑笔记
  • 梯度下降法为什么要提前停止
  • 【vue3项目使用 animate动画效果】
  • 1.1.1 C语言常用的一些函数(持续更新)
  • 李宏毅机器学习课程笔记03 | 类神经网络优化技巧
  • 简洁明快git入门及github实践教程
  • Python使用socket实现简易的http服务
  • 【Hive】海量数据存储利器之Hive库原理初探
  • linux系统监视(centos 7)
  • Blazor中Syncfusion图像编辑器组件使用方法
  • 电动汽车V2G技术Matlab/Simulink仿真模型
  • C++中的unordered_set和unordered_map的模拟实现
  • Spring Boot 2 学习指南与资料分享
  • (一)QSQLite3库简介
  • 《计算机网络》课后探研题书面报告_网际校验和算法
  • hot100_240. 搜索二维矩阵 II
  • 78_Redis网络模型
  • python范围
  • vulnhub靶场【Raven系列】之2 ,对于mysql udf提权的复习
  • 基于vite+vue3+mapbox-gl从零搭建一个项目
  • 向harbor中上传镜像(向harbor上传image)