[redis主从读写一致性]redis中主从复制的作用和好处

Redis高可用性主从复制原理的演化分析

很久以前写了一篇Redis主从复制原理的简要分析,基本上是笔记类文章。

主从复制,顾名思义,至少可以称为两个Redis服务器,一个主Redis服务器,一个Redis服务器或主从节点。然后从主Redis服务器复制数据。这是主从复制。此外,还可以连续地将数据从主节点复制到从属节点。

image-20221010182153070 [redis主从读写一致性]redis中主从复制的作用和好处 热门话题

如何设置主Redis服务器,如何设置从属Redis服务器?

例如,两台Redis服务器,IP分别为192.168.1.100和192.168.1.101。

第一种方法

例如,如果将192.168.1.100服务器设置为主服务器,则在服务器192.168.1.101的配置文件中设置如下:

然后重新启动服务器,使主服务器为192.168.1.100,从属服务器为192.168.1.101。

第二种方法

您还可以使用Redis-cli客户端连接到192.168.1.101,然后发出命令。

在Redis中重新启动后,主从关系将消失。

第三种方法

向Redis-server启动参数添加参数

一台主服务器也可以有多个从属服务器,也可以有从属服务器。

主从复制后有多个数据。这相当于有多个拷贝,是备份和灾难恢复。

为什么要有主从复制功能?

事实上,Redis问主从复制的作用和好处是什么。

负载平衡

数据量大的时候,为了减少服务器压力,使用读写分离模式来分散流量,主服务器负责写,服务器负责读。当然,主服务器也可以读取。

故障恢复

如果主服务器出现问题,从属服务器可以继续提供服务。而且,还可以从服务器升级到主服务器。这就是Redis的哨兵模式。

高可用性数据冗馀方法。

重复数据

如果一份数据多了,出了故障,可以快速恢复数据。

主从数据同步是指将从主服务器生成的RDB数据文件复制到从属服务器,然后解析RDB文件,在服务器上生成相应的数据。或者同步相关命令。

在Redis2.8之前,这是完整数据复制。也就是说,断开连接后,数据将完全重新复制。这种方法会再次同步原来同步的很多数据,这种方法的数据同步效率太低。

Redis2.8之后添加了部分重新同步模式。也就是说,添加了增量数据同步,仅同步需要同步的数据。这改进了以前的数据同步模式。

何时进行完全数据同步?第一次数据同步时,将执行完全数据同步。有时,当主从数据不一致时,也需要完全同步。

何时进行增量数据同步?例如,在断开连接后进行增量数据同步。

Redis2.8之前的主从同步包括两部分:完全同步命令传播。

完全同步:主从节点建立连接,主节点响应后,通过从节点向主节点发送SYNC命令,将从服务器状态更新为当前主服务器状态。主节点创建完整数据的RDB快照文件,并将其传输到从属节点,以便从节点加载RDB文件以恢复该数据。主节点在复制过程中继续向从节点发送堆叠在缓冲区内的新命令,以确保从节点上的数据与主节点数据相匹配。

传递命令:主节点和从节点保持连接,主节点继续向从节点发送命令流,以便主节点上的数据集发生更改。

流程图:

image-20221011143358480 [redis主从读写一致性]redis中主从复制的作用和好处 热门话题

介绍Redis6.0版本。

Redis2.8之后的完整复制与上述复制步骤类似,SYNC命令变为PSYNC命令,随后将添加部分重新同步。部分重新同步改进了以前的每次完全同步问题。

Offset:复制偏移。每个主节点都有此offset偏移,当主节点将生成的数据发送到从属节点时,发送的字节数据量自身offset量会增加。节点也有自己的offset,当节点写入数据时,offset也会增加。连接中断后,可以知道同步开始的地方。Offset必须与下面的复制积压缓冲区一起工作。

完整复制阶段

主从节点首先建立连接

建立连接后,节点使用命令向主节点启动同步请求。如果主从节点是第一个复制,则命令为,replid为?主库的replid未知,因为这是第一次复制。Offset是-1,表示第一个复制。

同步数据

同步缓冲命令数据

协商是按照前面定义的步骤发送相关命令,准备同步。有点协议的意思。步骤如下:

命令传播

然后,继续将主节点的作业命令发送到从属节点,并在节点上运行,以保持主从数据的一致性。

上面是一个主体的同步阶段,更详细的阶段需要分析源代码。

传输阶段与Redis2.8之前的完全同步没有太大区别。

部分数据同步

如果主从节点在执行同步命令时网络中断,则某些数据同步将在Redis2.8之前执行完全数据同步。由此可以清楚地看出,成本太高,不合理。(威廉莎士比亚Northern Exposure数据同步数据同步数据同步)断开连接的数据能否只同步一份而不是完全同步?

网络连接断开后,某些命令数据与从属节点不同步。你能保存这部分命令数据吗?重新连接后,在断开过程中,将此部分命令重新同步到从属节点,因此不需要完全同步。

image-20221012135557766 [redis主从读写一致性]redis中主从复制的作用和好处 热门话题

部分同步阈值?

从属节点replid与主节点的replid相同

如果满足上述两个阈值,将执行部分数据重新同步。

image-20221012135917371 [redis主从读写一致性]redis中主从复制的作用和好处 热门话题

先看两个问题

1.建议您保留此信息,因为节点重新启动后,原始主节点的节点编号和复制偏移将丢失,重新启动后需要完整复制

2.如果在主从切换后,主节点信息发生了变化,因此即使从节点需要完全数据同步,也可以验证新的主节点数据是否从主节点复制,这是一个不错的方法。

Redis4.0之后,PSYNC得到了改进,为了解决上述两个完整复制问题,提出了源增量复制解决方案。

第一:节点重启后,为什么需要与主节点进行完全数据同步?本质原因是主节点的编号和偏移信息从节点中丢失。Redis4.0将主节点的编号信息写入RDB,从而永久保留。

第二:主从切换后,为什么从节点必须与主节点完全同步?这是因为新的主节点无法识别原始主节点的编号信息。转换后如何识别?在Redis4.0之后进行主从切换之后,新的主节点将记录旧的主节点信息,因此新的主节点将知道原始数据已同步的旧主节点。都来自同一个地方,必须接受一些数据同步策略。

什么是无盘?

原始同步复制通过fork的子进程创建了RDB快照文件,RDB存储在磁盘上,然后传输RDB文件,从节点服务器恢复RDB文件数据。

如果没有磁盘,则不会创建RDB文件,也不会通过RDB传输数据。而是通过网络直接传输数据。

没有磁盘的东西能怎么办?

这也是Redis6.0之后第一个fork的子进程。此子进程dump数据通过管道写回主节点,主节点向从属节点发送数据。这些过程是无盘传输。

image-20221012161613157 [redis主从读写一致性]redis中主从复制的作用和好处 热门话题

image-20221012162452452 [redis主从读写一致性]redis中主从复制的作用和好处 热门话题

《Redis设计与实现》


发表评论

Copyright 2002-2022 by 思创留学网(琼ICP备2022001899号-3).All Rights Reserved.