《Redis设计与实现》读书笔记-复制

news2024/11/25 8:20:12

目录

1.概述

2.复制命令

3.部分重同步过程

4.部分重同步实现

4.1复制偏移量

4.2复制积压缓冲区

4.3服务器运行ID

5.总结


1.概述

在redis 通过向从服务器发送命令:SLAVE OF,让从服务器复制主服务器,成为复制。

复制的目的 让从服务器与主服务器数据保持一致。

2.复制命令

为了解决旧版复制功能在处理断线重复制情况时的低效问题,Redis 从2.8版本开始,
使用 PSYNC命令代替 SYNC命令来执行复制时的同步操作
PSYNC 命令具有【完整重同步(full resynchronization)】 和 【部分重同步(partial resynchronization)】
两种模式:
口 其中完整重同步用于处理初次复制情况:完整重同步的执行步骤和SYNC命令的执
行步骤基本一样,它们都是通过让主服务器创建并发送 RDB 文件,以及向从服务器
发送保存在缓冲区里面的写命令来进行同步。
口 而部分重同步则用于处理断线后重复制情况:当从服务器在断线后重新连接主服务
器时,如果条件允许,主服务器可以将主从服务器连接断开期间执行的写命令发送
给从服务器,从服务器只要接收并执行这些写命令,就可以将数据库更新至主服务
器当前所处的状态。
PSYNC命令的部分重同步模式解决了旧版复制功能在处理断线后重复制时出现的低效
情况,表15-3展示了如何使用PSYNC命令高效地处理上一节展示的断线后复制情况。

3.部分重同步过程

4.部分重同步实现

部分重同步功能由以下三个部分构成:
口 主服务器的复制偏移量(replication offset)和从服务器的复制偏移量。
口 主服务器的复制积压缓冲区(replication backlog)。
口 服务器的运行 ID (run ID)。

4.1复制偏移量

执行复制的双方——主服务器和从服务器会分别维护一个复制偏移量:

口主服务器每次向从服务器传播N个字节的数据时,就将自己的复制偏移量的值加上N。
口 从服务器每次收到主服务器传播来的N个字节的数据时,就将自己的复制偏移量值加上N。

判断主从数据是否一致:主从偏移量相等则一致,否则不一致。

考虑以下这个例子:

假设如图15-7所示,主从服务器当前的复制偏移量都为10086,但是就在主服务器要向从服务器传播长度为33字节的数据之前,从服多器A 断线了,那么主服务器传播的数据将只有从服务器 B和从服务器C能收到,在这之后,主服务器、从服务器B 和从服务器C三个服务器的复制偏移量都将更新为10119,而断线的从服务器A的复制偏移量仍然停留在10086,这说明从服务器A与主服务器并不一致,如图15-9所示。

假设从服务器A 在断线之后就立即重新连接主服务器,并且成功,那么接下来,从服
务器将向主服务器发送 PSYNC 命令,报告从服务器A当前的复制偏移量为10086,那么
这时,主服务器应该对从服务器执行完整重同步还是部分重同步呢?如果执行部分重同步的
话,主服务器又如何补偿从服务器A 在断线期间丢失的那部分数据呢?以上问题的答案都
复制积压缓冲区出场了

4.2复制积压缓冲区

复制积压缓冲区是由主服务器维护的一个固定长度(fixed-size)先进先出(FIFO)队
列,默认大小为1MB,可调节。

主服务器在发送写命令给从服务器时,同时会写缓冲区

当从服务器重新连上主服务器时,从服务器会通过PSYNC命令将自己的复制偏移量
offset 发送给主服务器,主服务器会根据这个复制偏移量来决定对从服务器执行何种同步
操作:
口 如果 offset 偏移量之后的数据(也即是偏移量 offset+1开始的数据)仍然存在
于复制积压缓冲区里面,那么主服务器将对从服务器执行部分重同步操作。
口相反,如果 offset偏移量之后的数据已经不存在于复制积压缓冲区,那么主服务
器将对从服务器执行完整重同步操作。
回到之前图 15-9展示的断线后重连接例子:
口 当从服务器A 断线之后,它立即重新连接主服务器,并向主服务器发送 PSYNC命
令,报告自己的复制偏移量为10086。
口 主服务器收到从服务器发来的 PSYNC命令以及偏移量10086之后,主服务器将检
查偏移量10086之后的数据是否存在于复制积压缓冲区里面,结果发现这些数据仍
然存在,于是主服务器向从服务器发送 +CONTINUE 回复,表示数据同步将以部分
重同步模式来进行。

口 接着主服务器会将复制积压缓冲区10086偏移量之后的所有数据(偏移量为 10087
至10119)都发送给从服务器。
口 从服务器只要接收这33字节的缺失数据,就可以回到与主服务器一致的状态,如
图 15-11所示。

4.3服务器运行ID

除了复制偏移量和复制积压缓冲区之外,实现部分重同步还需要用到服务器运行ID
(run ID)

口每个 Redis 服务器,不论主服务器还是从服务,都会有自己的运行ID。
口运行ID 在服务器启动时自动生成,由40个随机的十六进制字符组成,例如53b9b
28df8042fdc9ab5e3fcbbbabffld5dce2b3。
当从服务器对主服务器进行初次复制时,主服务器会将自己的运行ID 传送给从服务器,
而从服务器则会将这个运行 ID 保存起来。
当从服务器断线并重新连上一个主服务器时,从服务器将向当前连接的主服务器发送之
前保存的运行 ID:
口 如果从服务器保存的运行ID 和当前连接的主服务器的运行ID 相同,那么说明从服
务器断线之前复制的就是当前连接的这个主服务器,主服务器可以继续尝试执行部
分重同步操作。
口 相反地,如果从服务器保存的运行 ID 和当前连接的主服务器的运行ID 并不相同,
那么说明从服务器断线之前复制的主服务器并不是当前连接的这个主服务器,主服
务器将对从服务器执行完整重同步操作。
举个例子,假设从服务器原本正在复制一个运行 ID 为 53b9b28df8042fdc9ab5e3f
cbbbabff1d5dce2b3的主服务器,那么在网络断开,从服务器重新连接上主服务器之后,
从服务器将向主服务器发送这个运行 TD,主服务器根据自己的运行 ID 是否53b9b28df80
42fdc9ab5e3fcbbbabff1d5dce2b3来判断是执行部分重同步还是执行完整重同步。

5.总结

  • 部分重同步通过复制偏移量、复制积压缓冲区、服务器运行 ID 三个部分来实现,重点解决断线重连全量复制的低效问题。
  •  在复制操作刚开始的时候,从服务器会成为主服务器的客户端,并通过向主服务器发送命令请求来执行复制步骤,而在复制操作的后期,主从服务器会互相成为对方的客户端。

今天的redis复制原理就分享到这吧,下期再见!欢迎大家一起交流和学习!

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

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

相关文章

等保测评 linux设置三权分立

1、首先浅谈一下目录结构 drwxr-xr-x意思如下:第一位表示文件类型。 d是目录文件,l是链接文件,-是普通文件,p是管道。后面的分三个三个来看,即 rwx 、r-x 、r-x。 第一个: root :r 是可读&#…

在Linux中认识pthread库

int *pnullptr; pnullptr; *pnullptr; 指针变量做右值也是变量拥有空间。去承装数据。 *p代表指针所指向的空间,及0号地址,及往虚拟地址的0号地址处写8个字节的数据,全部写为0. (此操作不允许) 进程和线程的关系如…

Python PDF文本处理技巧 - 查找和高亮文字

目录 使用工具 Python在PDF中查找和高亮文字并统计出现次数和页码 Python在PDF的特定页面区域中查找和高亮文字 Python使用正则表达式在PDF中查找和高亮文字 Python在PDF中查找文字并获取它的坐标位置 其他查找条件设置 在日常工作和学习中,我们常常需要处理各…

命令-响应框架在 ESP RainMaker 中的应用

【如果您之前有关注乐鑫的博客和新闻,那么应该对 ESP RainMaker 及其各项功能有所了解。如果不曾关注,建议先查看相关信息,知晓本文背景。】 在 ESP RainMaker 中,管理员用户可以查看一些基本的节点数据,包括类型、型…

【Liunx】线程与进程的经典面试题总结

在这个浮躁的时代 只有自律的人才能脱颖而出 -- 《觉醒年代》 线程与进程的面试题总结 1 简述什么是LWP2 简述LWP与pthread_create创建的线程之间的关系3 简述轻量级进程ID与进程ID之间的区别4 请简述什么是线程互斥,为什么需要互斥5 简述你了解的进程间通信方式…

【免费测试】人脸身份证比对接口如何用Java对接?(二)

一、什么是人脸身份证比对? 人脸身份证比对又称人证比对,实人比对,人像比对,输入姓名、身份证号码和头像照片,与公安库身份证头像进行权威比对,返回分值作为判断依据。 二、人脸身份证比对接口适用哪些场…

安科瑞智慧能源管理平台在电动汽车虚拟电厂优化调度起到什么作用?

摘要:大量电动汽车用户的无序充电可能造成电网负荷剧烈波动,危及电网的安全稳定。随着电动汽车入网技术的应用,将电动汽车充电站及其周边的分布式新能源发电聚合为虚拟电厂后进行优化调度,有助于改善电动汽车用户充放电的经济性及…

深入LVS内核世界:揭秘其高效背后的技术细节与实现机制

LVS简介 Linux virtual server,即Linux虚拟服务器,是一种基于Linux平台的高性能、高可用的服务器负载均衡技术。它主要工作在网络层、传输层(OSI参考模型的第三层、第四层),主要通过IP地址和端口号来转发网络流量。LV…

【Dash】Web 应用程序中的可复用组件

一、Reuable Comopnents By writing our makup in Python, we can create complex reusable components like tables without switching contexts or languages. from dash import Dash, html import pandas as pddf pd.read_csv(https://raw.githubusercontent.com/GarciaS…

程序包javax.annotation不存在

1、问题 程序包javax.annotation不存在2、原因 JDK1.8升级到17后,由于Java EE已经变更为Jakarta EE,包名以 javax 开头的需要改为 jakarta 3、解决 import javax.annotation.Resource; 替换成 import jakarta.annotation.Resource; 问题解决。 …

基于STM32开发的智能灌溉系统

目录 引言环境准备工作 硬件准备软件安装与配置系统设计 系统架构硬件连接代码实现 初始化代码控制代码应用场景 农业灌溉园艺灌溉常见问题及解决方案 常见问题解决方案结论 1. 引言 智能灌溉系统通过监测土壤湿度和环境条件,自动控制水泵和阀门,实现…

Linux系统驱动(十)设备树

文章目录 一、简介二、设备树语法(一)设备树的组成1. 节点的组成(1)节点的别名(2)节点可以被引用(3)同名节点的合并 2. 属性的组成(1)值的字符串表示形式&…

基于STM32开发的停车场管理系统

目录 引言环境准备工作 硬件准备软件安装与配置系统设计 系统架构硬件连接代码实现 初始化代码控制代码应用场景 商业停车场管理住宅区停车场管理常见问题及解决方案 常见问题解决方案结论 1. 引言 停车场管理系统通过监测车辆进出情况、空余车位数量以及收费情况&#xff0…

7.2 算法设计与分析-分治法和回溯法

分治法 相对简单,考的概率比较低 分治法:对于一个规模为的问题,若该问题可以容易地解决则直接解决;否则将其分解为k个规模较小的子问题,这些子问题互相独立且与原问题形式相同,递归地解决这些子问题&…

Proxmox Install 8

Proxmox 前言 Proxmox Virtual Environment(简称PVE)是一个开源的服务器虚拟化解决方案,它基于QEMU/KVM和LXC技术。Proxmox VE提供了一个易于使用的Web界面和命令行工具,允许用户轻松地创建和管理虚拟机(VMs)和容器。 Proxmox download Proxmox 官网下载Proxmox 百度网…

Midjourney入门-提示词基础撰写与公式

​ 前言 在前几篇教程里我们已经可以初步使用Midjourney进行出图了。 包括也了解了Midjourney的指令与参数。 但如果你想用Midjourney去生成各种各样高质量的图片, 并且生成的图片是你想要的画面内容,也就是更好控制生成图片的画面内容与风格&#xf…

电脑小白需要知道这些

电脑小白需要知道这些 解决问题 对于刚买到电脑,不懂电脑的新手需要学什么和知道什么,有什么是误区 需要知道 1.Wiodws 10\Windows11不在需要安装杀毒软件 甚至于电脑自带防火墙都可以关闭(有时候打开了防火墙反而导致一些奇奇怪怪的问题…

【书生大模型实战营】基础岛-浦语提示词工程实践

【书生大模型实战营】基础岛-浦语提示词工程实践 活动地址:地址 任务 背景问题:近期相关研究发现,LLM在对比浮点数字时表现不佳,经验证,internlm2-chat-1.8b (internlm2-chat-7b)也存在这一问题,例如认为…

生成式AI,在中国工业找到新“活法”

生成式AI,正在经历一场关于落地前景的论战。 在德国中北部城市希尔德斯海姆,世界工业巨头博世已经把生成式AI技术用在了生产线上。他们以AI仿真绘制的方式合成出超过15000张关于产品缺陷的图片,然后将其应用于电机定子生产线的质检。借助生成…

指针基础知识(笔记)

文章目录 1. 概念理解2. 空指针和野指针3. 计算4. 小结5. size_t6. 案例一: 指针查找并返回指定元素索引7. 指针访问多维数组(涉及 int (*ptr)[3]解析)8. 指针数组9. 函数的值传递与地址引用传递① 函数的值传递(pass by value)② 地址传递(pass by reference) 10. 案例二&…