Redis中的复制功能(三)

复制

服务器运行ID

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

  • 1.每隔Redis服务器,不论主服务器还是从服务,都会有自己的运行ID
  • 2.运行ID在服务器启动时自动生成,由40个随机的十六进制字符组成,例如9a4739e8d2bb8bbc95096b04df58af419ec8033f

当从服务器对主服务器进行初次复制时,主服务器会将自己的运行ID传送给从服务器,而从服务器则会将这个运行ID保存起来。当从服务器断线并重新脸上一个主服务器时,从服务器将向当前连接的主服务器发送之前保存的运行ID:

  • 1.如果从服务器保存的运行ID和当前连接的主服务器的运行ID相同,那么说明从服务器断线之前复制的就是当前连接的这个主服务器,主服务器可以继续尝试执行部分重同步操作
  • 2.相反地,如果从服务器保存的运行ID和当前连接的主服务器的运行ID并不相同,那么说明从服务器断线之前的主服务器并不是当前连接的这个主服务器,主服务器将对从服务器执行完整重同步操作

例子

举个例子。假设从服务器原本正在复制一个运行ID为1的主服务器,那么在网络断开,从服务器重新连接上主服务器之后,从服务器将向主服务器发送这个运行ID,主服务器根据自己的运行ID是否为1来判断是否执行部分重同步还是执行完整重同步

PSYNC命令的实现

PSYNC命令的调用方法有两种:

  • 1.如果从服务器以前没有复制过任何主服务器,或者之前执行过SLAVEOF no one命令,那么从服务器在开始一次新的复制时将向主服务器发送PSYNC ? -1 命令,主动请求主服务器进行完整重同步(因为这时不可能执行部分重同步)
  • 2.相反地,如果从服务器已经复制过某个主服务器,那么从服务器在开始一次新的复制时将向主服务器发送PSYNC 命令:其中runid是上一次复制的主服务器的运行ID,而offset则是从服务器当前的复制偏移量,接收到这个命令的主服务器会通过这两个参数来判断应该对从服务器执行哪种同步操作。

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

  • 1.如果主服务器返回+FULLRESYNC 回复,那么表示主服务器将与从服务器执行完整重同步操作:其中runid是这个主服务器的运行ID,从服务器会将这个ID保存起来,在下一次发送PSYNC命令时使用:而offset则是主服务器当前的复制偏移量,从服务器会将这个值作为自己的初始化偏移量
  • 2.如果主服务器返回+CONITNUE回复,那么表示主服务器将与从服务器执行部分重同步操作,从服务器只要等着主服务器将自己缺少的那部分数据发送过来就可以了
  • 3.如果主服务器返回-ERR回复,那么表示主服务器的版本低于Redis2.8,它识别不了PSYNC命令,从服务器将向主服务器发送SYNC命令,并与主服务器执行完整同步操作

流程图总结了PSYNC命令执行完整重同步和部分重同步时可能遇上的情况
在这里插入图片描述

例子

举个例子。例如完整的复制——网络中断——重复制。(假设都在127.0.0.1)首先,假设有两个Redis服务器,它们的版本都是Redis2.8,其中主服务器的地址为6379,从服务求的地址为12345.

  • 1.如果客户端向从服务器发送民工SLAVEOF 127.0.0.1 6379,并且假设从服务器时第一次执行复制操作,那么从服务器将向主服务器发送PSYNC ? -1命令,请求主服务器执行完整重同步操作。
  • 2.主服务器在收到完整重同步操作请求之后,将在后台执行BGSAVE命令,并向从服务器返回+FULLRESYNC 1(主服务器runid) 10086回复,其中10086则是主服务器当前的复制偏移量。假设完整同步成功执行,并且主从服务器在一段时间之后仍然保持一致,但是在复制偏移量为20000的时候,主从服务器之间的网络连接断了,这是从服务器将重新连接主服务器,并再次对主服务器进行复制。
  • 3.因为之前曾经对主服务器进行过复制,所以从服务器将向主服务器发送命令PSYNC 1 20000,请求进行部分重同步。
  • 4.主服务器在接收到从服务器的PSYNC命令之后,首先对比从服务求传来的运行ID 和主服务器自身的运行ID,结果显示该ID和主服务器的运行ID相同,于是主服务器继续读取从服务器传来的偏移量20000,检查偏移量为20000之后的数据是否存在于复制积压缓冲区立案,结果发现数据仍然存在。
  • 5.确认运行ID相同并且数据存在之后,主服务器将向从服务器返回+CONTINUE回复,表示将与从服务器执行部分重同步操作,之后主服务器会将保存在复制积压缓冲区20000偏移量之后的所有数据发送给从服务器,主从服务器将再次回到一致状态

复制的实现

通过向从服务器发送SLAVEOF命令,可以实现让一个从服务器去复制一个主服务器:

SLAVEOF <master_ip> <master_port>

以从服务器接收到127.0.0.1:12345接收到命令:

SLAVEOF 127.0.0.1 6379

为例,分析详细实现步骤

步骤1:设置主服务器的地址和端口。

当客户端向从服务器发送以下命令时:

127.0.0.1:12345> SLAVEOF 127.0.0.1 6379
OK

从服务器首先要做的就是将客户端给定的主服务器IP地址127.0.0.1以及端口6379保存到服务器状态的masterhost属性和masterport属性里面:

struct redisServer {
// ...// 主服务器地址
char *masterhost;// 主服务器的端口
int masterport;// ...
}

如图所示,展示了SLAVEOF命令执行之后,从服务器的服务器状态。
SLAVEOF命令是一个异步命令,在完成masterhost属性和masterport属性的设置工作之后,从服务器将向发送SLAVEOF命令的客户端返回OK,表示复制指令已经被接收,而实际的复制工作将在OK返回之后才真正开始执行
在这里插入图片描述

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

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

相关文章

【C++】STL--vector

目录 vector的使用 vector的定义 vector iterator的使用 vector空间增长问题 vector增删查改 vector深度剖析及模拟实现 vector核心接口模拟实现 使用memcpy拷贝问题 迭代器失效问题 vector的使用 vector的定义 C中&#xff0c;vector是一个模版&#xff0c;第一个参…

全文更新:什么是Power Path?充电时是充电器供电还是电池供电?

原文来自微信公众号&#xff1a;工程师看海&#xff0c;与我联系&#xff1a;chunhou0820 看海原创视频教程&#xff1a;《运放秘籍》 昨天的文章误删了一部分&#xff0c;很多同学留言想看全文&#xff0c;现补充、更新如下&#xff1a; 前段时间&#xff0c;交流群里有位同学…

【图论】【分类讨论】LeetCode3017按距离统计房屋对数目

本文涉及的知识点 图论 分类讨论 本题同解 【差分数组】【图论】【分类讨论】【整除以2】3017按距离统计房屋对数目 LeetCode3017按距离统计房屋对数目 给你三个 正整数 n 、x 和 y 。 在城市中&#xff0c;存在编号从 1 到 n 的房屋&#xff0c;由 n 条街道相连。对所有 …

开源模型应用落地-qwen1.5-7b-chat-LoRA微调代码拆解

一、前言 本篇文章将解析 QWen1.5 系列模型的微调代码&#xff0c;帮助您理解其中的关键技术要点。通过阅读本文&#xff0c;您将能够更好地掌握这些关键技术&#xff0c;并应用于自己的项目中。 开源模型应用落地-qwen1.5-7b-chat-LoRA微调&#xff08;二&#xff09; 二、术语…

图论模板详解

目录 Floyd算法 例题&#xff1a;蓝桥公园 Dijkstra算法 例题&#xff1a;蓝桥王国 SPFA算法 例题&#xff1a;随机数据下的最短路问题 总结 最小生成树MST Prim算法 Kruskal算法 例题&#xff1a;聪明的猴子 Floyd算法 最简单的最短路径算法&#xff0c;使用邻接…

ubuntu20.04.6将虚拟机用户目录映射为磁盘Z

文章目录 linux虚拟机设置为NAT模式安装sshd服务映射目录到windows磁盘安装samba套件修改配置文件smb.conf重启smbd并设置用户名和密码 windows映射遇到的问题1、设置好之后映射不成功2、smbd下载失败3、smbd密码配置问题4、当有改动时候&#xff0c;最好重启一下smbd服务 linu…

Linux (Ubuntu)- mysql8 部署

目录 1.基本部署 2.修改密码 3.开启root可远程连接配置 1.基本部署 01》》先查看OS类型&#xff0c;如果是Ubuntu在往下边看 rootspray:/etc/mysql/mysql.conf.d# lsb_release -a LSB Version: core-11.1.0ubuntu2-noarch:security-11.1.0ubuntu2-noarch Distributor ID: …

Android面试题之Listview篇

秋招在即&#xff0c;计蒙准备在国庆假期结束前整理一套Android初级面试题籍&#xff0c;希望对大家有所帮助 提示&#xff1a;以下是本篇文章正文内容 ListView 1.当 ListView 数据集改变后&#xff0c;如何更新 ListView 使用该 ListView 的 adapter 的 notifyDataSetChange…

Python | Leetcode Python题解之第12题整数转罗马数字

题目&#xff1a; 题解&#xff1a; class Solution:THOUSANDS ["", "M", "MM", "MMM"]HUNDREDS ["", "C", "CC", "CCC", "CD", "D", "DC", "DCC&quo…

【C+ +初阶】前言篇章---C+ +的广袤

目录 1.C语言到C的过渡 2.C的发展历程 2.1C语言的诞生 2.2 c的历史版本 3.c 的地位 4. c的应用场景 4.1. 操作系统以及大型系统软件开发 所有操作系统几乎都是C/C写的 4.2. 服务器端开发 后台开发&#xff1a; 4.3. 游戏开发 4.4. 嵌入式 4.5. 数字图像处理 4.6. 人工智能 4.7.…

Debian安装宝塔教程

宝塔面板是一款非常受欢迎的服务器管理软件&#xff0c;它以其强大的功能、简洁的操作界面和丰富的应用生态而闻名。宝塔面板不仅能够帮助用户轻松管理服务器&#xff0c;还能够提供网站、数据库、FTP、备份等多种服务&#xff0c;是服务器管理的得力助手。 宝塔面板的特色 1.…

计算机msvcp110.dll丢失修复

MSVCP110.dll 是一个属于 Microsoft Visual C 运行时库的动态链接库&#xff08;DLL&#xff09;文件。具体而言&#xff0c;这个文件是 Microsoft Visual C 2012 Redistributable Package 的一部分&#xff0c;主要用于支持那些使用 Visual Studio 2012 版本的 C 编译器编译的…