Redis(二十二):复制(二),从青铜到王者的路线

前面我们提到过,现在Redis进行复制,从服务器是使用了Psync命令代替了Sync命令,下面介绍一下Psync命令的实现

Psync的调用方式有两种

  • 从服务器没有复制过主服务器,或者从服务器执行了slaveof no one命令,取消了从主关系,那么当从服务器执行slaveof命令时,会发送Psync ? -1命令,主动请求主服务器进行完整重同步(第一次同步肯定要执行完整重同步)

  • 从服务器已经复制过主服务器,但是中途断开连接了,进行重新连接时,也是发送Psync命令,命令格式为如下:Psync ,runid就是前面提到过的从服务器保留主服务器的运行ID,offset就是复制偏移量,这样主服务器就可以对进行比对,看是否需要执行完整重同步,再去看复制积压缓冲池里面是否还存有该复制偏移量往后的数据,如果有,就进行部分重同步。

根据情况的不同,接收到Psync命令的主服务器会向从服务器返回以下三种回复之一

  • 如果主服务器返回+FULLRESYNC 回复给从服务器,则代表主服务器将要进行完整重同步,runid是主服务器的运行ID,从服务器接受到这个运行ID之后就会保存起来,在下一次需要发送Psync命令时试用,而offset就是主服务器当前的复制偏移量,从服务器此时会将这个值作为自己的复制偏移量初值,然后进行维护起来(前面提到过,主从服务器都会维护自己的一个复制偏移量),此时从服务器需要等待主服务器发送RDB文件,载入后,再等待主服务器发送缓冲池在空白期执行的写命令,然后执行这些写命令,至此完成同步。

  • 如果主服务器返回的是+CONTINUE回复,那么表示主服务器将与从服务器执行部分重同步操作,从服务器只要等着主服务器将自己缺少的那部分数据发送过来就可以了(主服务器从复制积压缓冲池中取出)

  • 如果主服务器返回-ERR回复,表示版本不匹配,主服务器的版本太低(低于2.8),无法识别从服务器发送的Psync命令,但并不会停止同步,而是从服务器会向主服务器发送Sync命令,完成同步操作

过程如下图所示

在这里插入图片描述

复制/同步的实现


上面介绍了Psync命令的过程,但没有具体到其如何进行同步和复制的实现

整个复制同步过程总共有7个步骤

  1. 设置主服务器的地址和端口

  2. 建立套接字连接

  3. 发送Ping命令

  4. 身份验证

  5. 发送端口信息

  6. 同步

  7. 命令传播

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

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

slaveof 127.0.0.1 6379

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

Stcuct redisServer{

//…

前面的一些信息

//主服务器地址

char *masterhost;

//主服务器端口号

int masterport;

//…

};

SLAVEOF命令也是一个异步命令,会启用另一个进程去执行,在完成保存主服务器IP地址和端口号的工作后,从服务器将发送OK回复给客户端

在这里插入图片描述

这一步只是代表复制指令被接收,下面才会真正去执行复制工作

步骤二:建立套接字连接

得到了主服务器IP地址和端口号,下面的一步肯定是要进行主从服务器之间连接

从服务器会自己新建一个套接字,然后使用这个套接字连接到服务器,如果连接成功,收到连接成功回复的从服务器套接字会自动去绑定专门用于处理复制工作的文件事件处理器,这个处理器将会负责执行后续的复制工作,比如去接收RDB文件、接收后面主服务器通过传播发送的写命令

而主服务器在接受从服务器套接字连接之后,会为该套接字创建相应的一个客户端状态,将从服务器视作一个客户端去对待,那么此时从服务器就可以向主服务器发送命令请求,而主服务器可以接受从服务器发送的命令请求进行返回命令回复(不熟悉套接字连接可以回看前面系列的套接字连接)

在这里插入图片描述

步骤3:发送Ping命令

完成连接之后,从服务器就成为了主服务器的一个客户端,从服务器第一件事就是去发送Ping命令,一般客户端向服务器发送Ping命令,服务器会返回Pong的信息

在这里插入图片描述

发送ping命令主要有两个作用

  1. 虽然主从服务器建立了套接字连接,但主从服务器并没有使用套接字进行过任何通信,难以确定状态是否正常,使用ping命令可以知道连接状态是否正常

  2. 同时,Ping命令可以确定主服务器可以正常执行命令,因为复制工作接下来的几个步骤都必须在主服务器可以正常执行命令的情况下进行

从服务器在发送Ping命令之后将遇到下列三种情况之一

  • 第一种是网络状态不佳,主服务器接收到了Ping已经回复了pong,但从服务器不可以在规定时限内读取出命令回复的内容,这样就表示主从服务器之间的网络连接状态不佳,不可以继续执行复制工作的后续步骤,当出现这种情况时,从服务器会断开连接,然后重新创建连接主服务器的套接字。

  • 第二种是主服务出错,主服务器会向从服务器返回一个错误,表示主服务器暂时没办法处理从服务器的命令请求,不能够执行复制工作的后续步骤,当出现这种情况时,从服务器也是会断开连接,然后重新创建连接主服务器的套接字。

  • 第三种是正常情况,从服务器读取到了Pong回复,表示主从服务器之间连接状态正常并且主服务器可以正常相应从服务器的请求,然后会继续执行下面的复制工作

在这里插入图片描述

步骤4:身份验证

现在从服务器可以接收主服务器返回的PONG,证明连接一切正常,下一步就是要进行身份验证了

自我介绍一下,小编13年上海交大毕业,曾经在小公司待过,也去过华为、OPPO等大厂,18年进入阿里一直到现在。

深知大多数Java工程师,想要提升技能,往往是自己摸索成长或者是报班学习,但对于培训机构动则几千的学费,着实压力不小。自己不成体系的自学效果低效又漫长,而且极易碰到天花板技术停滞不前!

因此收集整理了一份《2024年Java开发全套学习资料》,初衷也很简单,就是希望能够帮助到想自学提升又不知道该从何学起的朋友,同时减轻大家的负担。
img
img
img
img
img
img

既有适合小白学习的零基础资料,也有适合3年以上经验的小伙伴深入学习提升的进阶课程,基本涵盖了95%以上Java开发知识点,真正体系化!

由于文件比较大,这里只是将部分目录大纲截图出来,每个节点里面都包含大厂面经、学习笔记、源码讲义、实战项目、讲解视频,并且后续会持续更新

如果你觉得这些内容对你有帮助,可以添加V获取:vip1024b (备注Java)
img

最后

一次偶然,从朋友那里得到一份“java高分面试指南”,里面涵盖了25个分类的面试题以及详细的解析:JavaOOP、Java集合/泛型、Java中的IO与NIO、Java反射、Java序列化、Java注解、多线程&并发、JVM、Mysql、Redis、Memcached、MongoDB、Spring、Spring Boot、Spring Cloud、RabbitMQ、Dubbo 、MyBatis 、ZooKeeper 、数据结构、算法、Elasticsearch 、Kafka 、微服务、Linux。

这不,马上就要到招聘季了,很多朋友又开始准备“金三银四”的春招啦,那我想这份“java高分面试指南”应该起到不小的作用,所以今天想给大家分享一下。

image

请注意:关于这份“java高分面试指南”,每一个方向专题(25个)的题目这里几乎都会列举,在不看答案的情况下,大家可以自行测试一下水平 且由于篇幅原因,这边无法展示所有完整的答案解析
inux。

这不,马上就要到招聘季了,很多朋友又开始准备“金三银四”的春招啦,那我想这份“java高分面试指南”应该起到不小的作用,所以今天想给大家分享一下。

[外链图片转存中…(img-9kGzPA2G-1712104527911)]

请注意:关于这份“java高分面试指南”,每一个方向专题(25个)的题目这里几乎都会列举,在不看答案的情况下,大家可以自行测试一下水平 且由于篇幅原因,这边无法展示所有完整的答案解析

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值