当前位置: 首页 > 科技观察

面试官:Redis主从复制时网络断层怎么解决?

时间:2023-03-21 19:36:12 科技观察

本文转载自微信公众号《IT行业的打工仔》,作者:LeoWu。转载本文请联系IT行业农民工公众号。上周因为太忙,认真写了一篇关于水文的文章,夸夸自己过去的经历,反响超出了我的预期,也有读者在后台留言表示想看续集。哈哈,果然大家对水文的热情更高了。本期我们继续回到之前的Redis话题。今天主要讲讲主从复制相关的数据一致性,以及面对网络中断如何同步数据。BB不说了,直接上时钟!-思维导图-主从模式配置对于Redis主从模式大家可能比较熟悉,但是在日常工作中并不经常操作该配置。这里简单介绍一下master和slave的相关配置。1、主从模式Redis中设置主从的方式很简单,通常有两种方式:通过在配置文件redis.conf中设置slaveof(永久);直接在客户端执行slaveofipport(暂定);2、主从模式对于主从模式,配置与上面的操作类似,这里不再赘述。主从一致性原理了解了主从配置后,下面就进入正题了。在主从中,通常的操作是主库写数据,从库读数据。这样做的好处是,所有的请求压力都避免在了主库上,系统的扩展性也得到了很大的提升。但问题来了。从库中的数据必须和主库保持一致,所以主库中的数据写入后需要同步到从库。如何维护主从库的数据一致性,多从库时怎么办?1.全拷贝这是第一次同步时发生的传输关系。从名字就可以看出,主库第一次将所有数据毫无保留地传递给从库。让我们来看看他们是如何建立他们的第一段关系的(只知道你会想错了)。图中的同步过程非常清晰,分为三个部分:(1)主从节点建立联系。当从节点第一次与主节点建立联系时,从节点会向主节点发送psync命令,表示要进行数据同步。可以看到,psync命令会有两个参数:一个是runID,另一个是offset。runID:每个Redis实例生成的随机唯一ID,这里代表master节点的ID。offset:复制偏移量。图中,由于第一次拷贝时不知道主库的ID和偏移量,所以“?”和“-1”分别用来表示runID和offset。当主节点收到psync命令后,会使用FULLSYNC命令向从节点发送runID和offset两个参数。从节点保存它的信息。这是建立关系的地方。(2)master节点同步RDB文件RDB文件,这是一个老面孔,二进制文件,会用于持久化。在这里它起到了主从数据同步的作用,也就是说主从同步是依靠RDB文件来实现的。从节点收到RDB文件后,在本地完成数据加载,即认为主从同步完成。你在这里发现问题了吗?让我们回顾一下RDB文件是如何生成的。在持久化一文中,我们介绍了父进程fork子进程生成RDB文件。父进程不会阻塞接收和处理客户端命令。那么问题来了,当主节点向从节点发送RDB文件时,如何处理主节点同时收到的命令呢?(3)master节点同步缓冲命令这一步是为了解决RDB文件生成后父进程的问题。再次收到同步写命令的问题。为了保证主从节点的数据一致性,在主节点中使用了一个缓冲区来记录RDB文件生成后收到的写操作命令。RDB文件发送完成后,缓冲区中的命令会被发送到从节点执行。至此,主从节点之间的数据同步就完成了。2.级联操作回顾一下整个同步过程,从建立关系,生成RDB文件,传输到从节点,最后向从节点发送buffer命令。这是一个从节点与主节点同步的完整过程。那么我们再想一想:当有多个从节点时,即一主多从,第一次连接时必须进行全量复制。但是在生成RDB文件时,父进程fork子进程时可能会阻塞,同时在传输RDB文件时也会占用带宽,浪费资源。我们应该如何解决这种情况?不知道大家对文章开头的主从模式还有印象吗。通过从从节点重新建立从节点。同步数据时,从级联的从节点同步,从而减轻主节点的压力。网络有点没了。我们已经知道正常情况下主从节点的复制过程。但是,当网络中断,主从连接失败等异常情况下,主从同步是如何进行的呢?这里要提一下增量复制的一个名词,它和全量复制的区别在于它是根据主从节点的偏移量来同步数据的。这是什么意思?还记得我们在完整副本中提到的缓冲区吗?用于存放RDB文件生成后的写命令。这里我们称之为缓冲区A,主从节点断开连接后,除了将后续收到的写命令写入缓冲区A外,还会写入另一个缓冲区B。在缓冲区B中,主从节点将分别保持偏移偏移量。一开始,主节点的写位置和从节点的读位置在同一个起点。随着master节点的不断写入,offset会逐渐增加。同理,从节点被复制后,偏移量也在增加。当网络断开时,从节点将不再同步。这时,由于不断接收新的写操作,主节点的偏移量会大于从节点的偏移量。当连接恢复时,从节点向主节点发送带有偏移量的psync命令,主节点根据偏移量进行比较,只需要将未同步的写命令同步到从节点即可。总结主从一致性原理当从节点第一次连接时,主节点会生成一个RDB文件进行全量拷贝,并将新写入的命令存储在缓冲区中发送给从节点,保证数据的一致性;为了减少数据同步给主节点带来的压力,可以通过级联从节点进行同步。网络空无一人。网络断连重连后,主从节点通过各自维护的偏移量同步写命令。