Redis主从复制

Redis主从复制通过全量和增量同步确保数据一致,缓解读写压力。全量复制涉及主节点生成RDB文件并发送给从节点;增量复制则通过复制偏移量、复制积压缓冲区和runID实现不间断同步。主从复制优点包括异步复制、扩展性和数据冗余,但若主节点宕机需手动切换,可借助哨兵模式解决。
摘要由CSDN通过智能技术生成

主从复制

是什么

在往往高并发的情况下,往往只是查询数据,而不是修改数据,用于主从机来缓解读写压力

所以采用主从复制机制,redis的主从结构可以采用一主多从或者级联结构,Redis主从复制可以根据是否是全量分为全量同步和增量同步。

以下为级联结构

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-fxOtsQCD-1624430965734)(C:\Users\lenovo\AppData\Roaming\Typora\typora-user-images\image-20210622150211999.png)]

在一个主机下连接三个从机,而从机下再关联两个从机,主机负责写,而从机负责读,而主服务器将写的内容的快照同步到从机上,从而主从数据一致

这里分为两种

全量复制和增量复制

全量复制:发生再从机slave的初始化阶段,这时候需要将主机Msater上的所有数据都复制一遍,Redis通过psync命令进行全量复制。

  • 从机连接主机,然后发送SYNC同步命令
  • 主服务器接收到sync命令后,开始执行BGSAVE命令生成RDB文件并使用缓冲区记录此后执行的所有写命令
  • 主服务器BGSAVE执行完后,向所有从机发送快照RDB文件,并在发送期间继续记录被执行的写文件
  • 从机收到快照文件后丢弃所有的旧数据,载入收到的快照
  • 主机快照发送完毕后开始向从机发送缓冲区中的写命令
  • 从机完成对快照的载入,开始接收命令请求,并执行来自主机缓冲区的写命令。
  • 如果从机开启了AOF,那么会触发bgrewriteaof的执行,从而保证AOF文件更新到主节点的最新状态

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-HAOqH2gR-1624430945016)(C:\Users\lenovo\AppData\Roaming\Typora\typora-user-images\image-20210622164235736.png)]

增量复制

Redis增量复制时指Slave(从机)初始化后正常工作时主服务器发生的写操作同步到从机的过程,即主机每执行一个写命令就会向从机发送相同的写命令,从机接收并执行写命令。但也可以用于网络中断时的数据同步

增量复制需要了解三个概念

1、复制偏移量

主机和从机分别维护一个复制偏移量,代表主机向从机传递的节点数,主机每次向从机传送N个字节数据时,主机的偏移量增加N,从机每次收到主机的N个字节数据时,从机的偏移量增加N

2、复制积压缓冲区

复制挤压缓冲区是由主机进行维护的、固定长度、先进先出队列、默认大小1MB,当主机开始有从机建立时,作用是备份主节点最近发送给从机的数据。这里无论主机有多少个从机,都只有一个缓冲区。

在命令传输阶段,主机除了将写命令发送给从系欸点,还会发送一份给缓冲区,作为备份使用。缓冲区中保存这写命令,以及其中每个字节对应的复制偏移量。由于复制挤压缓冲区定长而且先进先出,所以它保存的时最节点最近执行的写命令,时间较早的写命令会被挤出缓冲区。

3、服务器运行ID(runid)

每个Redis节点,在启动时都会自动生成一个随机ID(每次启动都会不一样),由40个随机的16进制字符组成,runid时唯一识别的redis节点,通过info Server命令,可以查看节点的runid。

它的作用:主从第一次复制时,主机会将自己的runID发送给从机,从机会将这个runID保存起来,当断线重连时,从机会将这个runID发送给主机,主机根据runID判断能否进行部份复制。

  • 如果从节点保存的runid与主节点现在的runid相同,说明主从节点之前同步过,主节点会继续尝试使用部分复制(到底能不能部分复制还要看offset和复制积压缓冲区的情况);
  • 如果从节点保存的runid与主节点现在的runid不同,说明从节点在断线前同步的Redis节点并不是当前的主节点,只能进行全量复制。

psync流程图

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-nGxayM0A-1624430945019)(C:\Users\lenovo\AppData\Roaming\Typora\typora-user-images\image-20210622212257283.png)]

解释:

  1. 首先需要判断是否是从机第一次进行复制,判断依据:从机是否执行过slaveo或者最近执行了skaveof no one,则从机发送命令为psync?-1,向从节点请求全量复制
  2. 如果执行过slaveof,则发送命令psync,runid是上次复制的主节点的runid,offset为上次复制截止时从机保存的复制偏移量。
    1. 这里还会判断主机的runid和从机发送的runid是否相等,相等且从机offset之后的数据在复制积压缓冲区都存在,则回复+CONTINUE,表示可以进行增量复制。
    2. runid不同时,或者offset后的数据不在复制积压缓冲区中了(在队列中被挤出了),则回复+FULLRESYNC 表示需要进行全量复制。

优点

  1. 采取异步复制,什么叫异步复制?即 非阻塞复制,redis2.8开始,从机会周期的应答从复制流中处理的数据量
  2. 一个主机可以有多个从机
  3. 每个redis可以接收来自其他redis服务器的连接
  4. 主从复制提高了redis服务的可扩展性,避免单个redis服务器的读写访问压力过大的问题,同时也可以处理数据备份和冗余提供一种解决方案
  5. 主从复制对于主机是非阻塞的,即从机在进行主从复制同步过程中,主机仍可以接收处理外界的访问请求
  6. 主从复制对于从机也是非阻塞的,即从机在进行主从复制的过程中也可进行外界的查询请求,但是这时候查询到的数据是以前老的数据,因为可能还没有加载主机新的快照信息,可以在配置文件中设置repl-disable-tcp-nodelay 默认是no,如果改为yes,那么主机就会将数据包进行合并从而减少带宽,但是发送频率会降低,从而节点数据延迟增加,一致性变差,只有在应用对redis数据不一致性容忍性高,且主节点之间网络不好的时候,才会设置为yes
  7. 可以分配一个从服务器及进行保存的工作,从而为主服务器消除了把数据写到磁盘的过程损耗

缺点

如果主服务器宕机,那么所有从服务器都会失效,所以需要手动设置主机,费时费力。所以就推出了哨兵模式,当主节点宕机时,哨兵会投票选出新的主机。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值