Redis主从复制的作用:

1,首先便是对数据的冗余备份功能,与mysql的主从基本一致

2,针对单机故障的问题,实现服务器的冗余

3,读写分离,master负责写,slave负责读,提供服务器的负载能力,可以进行横向的扩展

4,负载均衡,针对不同的业务场景,将并发操作进行合理的分摊

5,第五点是高可用,主从复制是哨兵模式和集群模式的前提和基础.

主从复制启动的命令:

1,从命令行中启动

我们先得有一个概念,就是在配置主从复制时,所有的操作都是在从节点来操作,也就是slave。

那么我们在从节点执行一个命令为 slaveof ip  port,执行完就代表我们连接上了

2,使用配置文件启动:

先将之前的断开使用命令: slaveof no  one 通过info命令查看断开是否成功,

在根据配置文件启动Redis服务,Redis-server redis6380.conf

启动Redis服务的时候,直接启动主从复制命令: redis-server –slaveof host port

主从复制的工作原理:

工作原理主要分为三个大流程,每个流程中间还有内部的机制:

1,建立链接过程: master和slave建立链接

2,数据同步过程: master和slave进行数据的同步

3命令传播过程: 进行增量数据的一个同步

redis主从关系的备份 redis主从模式原理_redis

第一阶段: 建立链接过程:

1,slave发送指令: slaveof ip port

2.master收到指令进行响应

3,slave设置master的地址和端口,保存master的信息

4,slave根据maser信息创建链接master的socket链接,

5,slave周期的发送ping,检测master状态

6,master进行周期响应

7,发送指令: 身份验证

8,验证授权

9,slave发送指令 replconf listening-port <port>

10 master保存slave的端口号

第二阶段:数据同步阶段过程:

1,slave发送请求同步指令

2,master执行bgsave

3,第一个slave连接时,也就是链接阶段,会创建一个命令缓冲区,

4,master创建出rdb文件,通过socket发送给slave

5,slave接受到rdb文件,清空之前的数据,然后根据这个rdb文件执行恢复过程,保证数据一致性.

需要注意的是;主从第一次同步的时候就是全量的一个同步,只有在全量复制完成之后,主节点就会发送复制积压缓冲区的数据,然后从节点就会执行bgrewriteaof进行恢复数据,从这里开始就是增量复制,具体的复制过程下面会说.

第三阶段:命令传播阶段:

当master数据库被修改后,主从服务器的数据不一致后,此时就会让主从数据同步到一致,这个过程称之为命令传播。master会将接收到的数据变更命令发送给slave,slave接收命令后执行命令,让主从数据达到一致。

命令传播过程的部分复制:

在命令阶段出现断网,或者网络抖动,就会导致链接断开,无法同步

这个时候,master依然在向replbackbuffer(复制缓冲积压区)写入数据

从节点继续尝试连接主机,

当从节点把自己的runid和偏移量发送给主节点的时候,并且执行pysnc命令请求同步

如果master判断出偏移量是在这个缓冲区之内的,那么就会返回一个continue命令,继续进行复制. 从节点接受到数据执行bgrewiriteaof ,恢复数据,

详细的一个主从复制过程(涉及到全量复制和增量复制):

redis主从关系的备份 redis主从模式原理_redis_02

1,从节点发送指令 1 psync runid offset 找到对应的runid索引数据,但是这里可以考虑一下,当从节点第一次链接的时候根本不知道主节点的runid和offset在哪里,所以第一次发送指标是 psync 1 意思是主节点的数据我全都要了.

2,主从节点开始执行bgsave生成rdb文件,记录当前的复制偏移量offset,

3,主节点这个时候会把自己的runid和offset通过  +FULLRESYNC runid offset 指令 通过socket发送rdb文件到从节点上,

4,从节点进行接收到+FULLRESYNC 对master节点的runid和offset进行一个保存,然后清空当前的所有数据,通过socket收到rdb文件,然后进行全量复制

5,在全量复制之后,slave获取到了master的runid和offset,后面的同步执行命令,psync runid  offset 发送给master节点,

6,master节点接受到之后,判断这个runid和offset是否匹配,同时offset是在缓冲区中,

7,主节点判断runid和offset有一个不满足的,就会返回到步骤2 继续进行全量的一个复制,

这里的runid不匹配只有可能是从节点进行了重启,offset不匹配就是缓冲区造成了溢出,如果runid或offset通过,那么从节点的offset和主节点的offset相同时则忽略,如果不相同,则会发送+CONTINUE offset(这是主节点的offset),通过socket发送缓冲区中的两个offset之间相差的缓冲数据到从节点上,然后进行同步.

8, 从节点收到+CONTINUE 保存master的offset 通过socket接收到信息后,执行bgrewriteaof,恢复数据

1-4是全量复制 5-8是部分复制

在主节点的第3步下面 主节点在主从复制的期间是一直在接收客户端的数据,主节点的offset是一直变化的。只有有变化就会给每个slave进行发送,这个发送的过程称之为心跳机制