redis夯实之路-主从复制详解

news2025/3/3 5:45:33

Redis中可以通过执行slaveof命令或者设置slaveof选项,让一个服务器区复制另一个服务器,被复制的为主服务器,复制的为从服务器。

复制

Redis中可以通过执行slaveof命令或者设置slaveof选项,让一个服务器区复制另一个服务器,被复制的为主服务器,复制的为从服务器

复制功能分为同步和命令传播两个操作

同步操作是将从服务器状态更新为主服务器的数据库状态;

命令传播是主服务器状态被修改时,使主从服务器数据库回归一致状态。

同步

sync


1. 从服务器向主服务器发送SYNC命令。
2.收到SYNC命令的主服务器执行BGSAVE命令,在后台生成一个RDB文件,同时在一个缓冲区记录从之后执行的所有写命令。
3.当主服务器的BGSAVE命令执行完毕时,主服务器会将RDB文件发送给从服务器,从服务器接收并载入这个RDB文件,将自己的数据库状态更新至主服务器执行BGSAVE命令时的数据库状态。
4.主服务器将记录在缓冲区里面的所有写命令发送给从服务器,从服务器执行这些写命令,使主从服务器状态一致。

简单来说,从服务器向主服务器发送sync命令后,主服务器使用rdb文件记录bgsave执行之前的数据库状态,使用缓冲区保存写命令来记录bgsave执行之后的数据库状态,通过这两种方式来保证主从数据库状态一致。

psync

主服务器将自己执行的写命令发送给从服务器,让两者状态保持一致

旧版的redis断线后重复制需要同步,这是低效的。

从2.8版本开始,断线后重复制使用psync来代替sync。Psync有完全重同步和部分重同步两种模式

完全重同步:初次复制时,让主服务器创建并发送rdb文件,向从服务器发送缓冲区中的写命令

部分重同步:主服务器向从服务器发送断开连接期间的执行的写命令

部分重同步由主服务器和从服务器复制偏移量,主服务器的复制积压缓冲区,服务器的运行id构成

主服务器向从服务器发送n字节数据,复制偏移量加n;从服务器收到n字节数据,复制偏移量加n

主服务器的复制积压缓冲区是固定长度,先进先出的队列,默认为1mb

服务器的运行id启动时自动生成,初次复制,从服务器会保存主服务器id,断线重连后根据id判断是直接执行完整重同步(从服务器保存id与当前主服务器id不同)还是尝试执行部分重同步(id相同)

Psync命令实现

PSYNC命令的调用方法有两种:
1.如果从服务器以前没有复制过任何主服务器,或者之前执行过SLAVEOF no one命令,那么从服务器在开始一次新的复制时将向主服务器发送PSYNC ? -1命令,主动请求主服务器进行完整重同步(因为这时不可能执行部分重同步)。


2.相反地,如果从服务器已经复制过某个主服务器,那么从服务器在开始一次新的复制时将向主服务器发送PSYNc <runid> <offset>命令(runid是上一次复制的主服务器的运行ID,而offset则是从服务器当前的复制偏移量),接收到这个命令的主服务器会通过这两个参数来判断应该对从服务器执行哪种同步操作。

根据情况,接收到PSYNC命令的主服务器会向从服务器返回以下三种回复的其中一种:

1.如果主服务器返回+FULLRESYNC <runid> <offset>回复,那么表示主服务器将与从服务器执行完整重同步操作:其中runid是这个主服务器的运行ID,从服务器会将这个ID保存起来,在下一次发送 PSYNC命令时使用;而offset则是主服务器当前的复制偏移量,从服务器会将这个值作为自己的初始化偏移量。

2.如果主服务器返回+CONTINUE回复,那么表示主服务器将与从服务器执行部分重同步操作,从服务器只要等着主服务器将自己缺少的那部分数据发送过来就可以了。

3.如果主服务器返回-ERR回复,那么表示主服务器的版本低于Redis 2.8,它识别不了PSYNC命令,从服务器将向主服务器发送SYNC命令,并与主服务器执行完整同步操作。

命令传播

主服务器会将自己执行的写命令发送给从服务器。

心跳检测

主服务通过命令传播来更新从服务器状态,从服务器通过向主服务器发送命令来进行心跳检测,命令丢失检测。

在命令传播阶段,从服务器默认会以每秒一次的频率,向主服务器发送命令:

REPLCONF ACK <replication_offset>
其中replication_offset是从服务器当前的复制偏移量。

发送REPLCONF ACK命令对于主从服务器有三个作用:
1.检测主从服务器的网络连接状态。
2.辅助实现min-slaves选项。
3.检测命令丢失。

复制的实现

设置主服务器的地址和端口,建立套接字连接,发送ping命令(作用:检查套接字是否正常,检查主服务器是能正常处理命令请求),身份验证,发送端口信息,同步(同步执行前从服务器是主服务器的客户端,同步执行后双方都是对方的客户端),命令传播

总结

总结:主从复制分为同步(全量同步)和命令传播(增量同步)两步操作。reids2.8版本后psync代替了sync,相比于sync是全量同步模式,psync具备了数据全量重同步和部分重同步模式。首先会尝试进行增量同步,不成功则进行全量同步。

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

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

相关文章

科大讯飞星火大模型接入API js 部分 接口 安装注意事项

下载以下链接例子运行程序 https://xfyun-doc.xfyun.cn/static%2F16968175055332330%2Fspark_js_demo.zip 官网给的说明 准备 1.在demo中填写APPID、APISecret、APIKey&#xff0c;可到控制台-我的应用-大模型页面获取 2.安装nodejs 本地运行 1.打开cmd&#xff0c;进入dem…

2024三掌柜赠书活动第三期:Rust系统编程

目录 前言 Rust语言概念 关于《Rust系统编程》 Rust系统编程的核心点 Rust系统编程的关键技术和工具 编辑推荐 内容简介 作者简介 图书目录 书中前言/序言 《Rust系统编程》全书速览 结束语 前言 在技术圈&#xff0c;最近的编程语言新秀当属Rust莫属&#xff0c;R…

Center审计策略表安装和策略添加(事务)——(Linux/Windows版本)

本博客主要讲述Center的审计策略表安装和策略添加 使用事务添加 1、开启事务 my->StartTransaction(); 2、编写sql语句 //清除原来数据&#xff0c;防止数据污染my->Query("DROP TABLE IF EXISTS t_strategy");string sql "CREATE TABLE t_strategy (…

虚幻引擎nDisplay教程:如何同步nDisplay节点与Switchboard + Helix Core

对于使用大型LED屏幕进行拍摄的虚拟制作团队来说&#xff0c;虚幻&#xff08;Unreal&#xff09;的nDisplay是一个重要的工具。但是&#xff0c;在nDisplay中将正确版本的文件发送到每个节点会非常耗时。立即阅读本文&#xff0c;您将了解到如何使用Perforce Helix Core版本控…

Jenkins集成Sonar Qube

下载插件 重启Jenkins 容器 sonarqube 使用令牌 Jenkins 配置 重新构建

Flask类视图的基本用法及高级技巧详解

概要 当我们谈论Web开发时&#xff0c;Flask是Python世界中最受欢迎的微框架之一。简洁灵活的设计让它在开发小型到中型的Web应用程序时尤其受欢迎。在Flask中处理URL路由时&#xff0c;我们常常会使用基于函数的视图。尽管这很简单直接&#xff0c;但是随着应用的增长&#x…

Linux驱动学习—I2C总线

1、应用层实现I2C通信 1.1 I2C简介 I2C是很常见的一种总线协议&#xff0c;I2C是NXP公司设计的&#xff0c;I2C使用两条线在主控制器和从机之间进行数据通信。一条是SCL&#xff08;串行时钟线&#xff09;&#xff0c;另外一条是SDA(串行数据线)&#xff0c;因为I2C这两条数…

如何使用创建时间给文件重命名,简单的批量操作教程

在处理大量文件时&#xff0c;有时要按照规则对文件重命名&#xff0c;根据文件的创建时间来重命名。那如何批量操作呢&#xff1f;现在一起来看云炫文件管理器如何用文件的创建时间来批量重命名。 按创建时间重命名文件的前后对比图。 用创建时间批量给文件重命名的步骤&…

定时器问题(vue的问题)

我在a页面写一个定时&#xff0c;让他每秒钟打印一个1&#xff0c;然后跳转到b页面&#xff0c;此时可以看到&#xff0c;定时器依然在执行。这样是非常消耗性能的。如下图所示&#xff1a; 解决方法1 首先我在data函数里面进行定义定时器名称&#xff1a; data() {return {t…

六、新建窗体时,几种窗体的区别

新建窗体时&#xff0c;会有几种类型的选项&#xff0c;很多同学不明白其中的意思&#xff0c;我们在本章节中详细介绍一下几种窗体的区别。 窗体的类型分以下几种 Dialog with Buttons Bottom 带按钮的对话框&#xff0c;按钮在底部 Dialog with Buttons Right 带按钮的对话框…

【Java SE语法篇】8.面向对象三大特征——封装、继承和多态

&#x1f4da;博客主页&#xff1a;爱敲代码的小杨. ✨专栏&#xff1a;《Java SE语法》 ❤️感谢大家点赞&#x1f44d;&#x1f3fb;收藏⭐评论✍&#x1f3fb;&#xff0c;您的三连就是我持续更新的动力❤️ 文章目录 1. 封装1.1 封装的概念1.2 为什么封装1.3 封装的实现…

Vue基知识四

本文对前边几章所学习的内容&#xff0c;以案例的形式做一个总结 一 TodoList案例 即待办事项案例&#xff0c;效果如下 1.1 组件化编码流程&#xff08;通用&#xff09; 这是编码时的通用流程&#xff0c;以后也可以按照这个流程来写代码&#xff08;熟悉后这个流程的顺…

Flutter开发进阶之动画

Flutter开发进阶之动画 在Flutter中&#xff0c;动画是至关重要的一个部分&#xff0c;它能够为应用程序提供更加丰富和生动的用户体验&#xff0c;Flutter中的动画系统是UI框架的核心功能之一&#xff0c;也是开发者学习Flutter框架的重要部分&#xff0c;由于动画原理在所有…

Python基本语法与变量的相关介绍

python基本语法与变量 python语句的缩进 Python代码块使用缩进对齐表示代码逻辑&#xff0c;Python每段代码块缩进的空白数量可以任意&#xff0c;但要确保同段代码块语句必须包含相同的缩进空白数量。建议在代码块的每个缩进层次使用单个制表符或两个空格或四个空格 , 切记不…

GPU云服务器使用教程、运行YOLOV5项目并连接到本地VSCode(Pycharm)

编程如画&#xff0c;我是panda&#xff01; 之前已经教过大家如何在自己的电脑中配置Pytorch深度学习环境&#xff0c;但是有些小伙伴没有英伟达的GPU&#xff0c;所以用CPU的话训练模型会比较慢&#xff0c;所以这次出一期使用GPU云服务器的教程。 码字不易&#xff0c;如果对…

金南瓜SECS/GEM发送event、VID

金南瓜SECS/GEM发送事件&#xff08;CEID&#xff09;很简单&#xff0c;只需一步就完成。 最重要是简单易懂&#xff0c;任何人一看就上手。无需懂得内部逻辑&#xff0c;以及一大堆的导入问题。 代码如下 C#的代码&#xff1a; // 扫码成功 private void buttonReadBarco…

一个简易的PHP论坛系统

一个简易的PHP论坛系统 php课程设计&#xff0c;毕业设计 预览 技术 bootstrap 4.x jquery css php mysql 5.7 目录结构 登录 管理员 admin/123456 测试用户 user1/123456 更多文章和源码获取查看

51-13 多模态论文串讲—BEiT v3 论文精读

BEIT-3的核心思想是将图像建模为一种语言&#xff0c;这样我们就可以对图像、文本以及图像-文本对进行统一的mask modeling。Multi-way transformer模型可以有效地完成不同的视觉和视觉语言任务&#xff0c;使其成为通用建模的一个有效选择。 同时&#xff0c;本文也对多模态大…

深入 Move 生态,探秘铭文热潮背后的思考

Move 语言是 Meta&#xff08;Facebook&#xff09;在 2018 年开发的新一代智能合约编程语言。回顾过去的一年&#xff0c;Aptos 与 Sui 主网上线&#xff0c;为整个 Web3 开启了下一个十亿用户服务的新征程。Rooch、Initia、MoveMent 等多条使用 Move 语言的区块链网络涌现&am…

边缘计算的舞台,挑战与机遇相伴

目录 前言 边缘计算保卫战&#xff1a;数据宝藏的隐藏与探索 稳如磐石&#xff1a;保障你的边缘计算宝藏安稳运行&#xff01; 打破时间的桎梏&#xff1a;为边缘计算注入超快速度与实时表演 边缘计算&#xff1a;应对多样性和异构性的酷炫策略大揭秘 边缘计算&#xff1a;释…