0%

redis的主从复制

1. redis主从同步概述

redis的主从同步与mysql不一样,redis都是通过同步命令的方式进行的。

具体的同步方式分为两种,全量同步、部分重同步

2、全量同步

主从初次同步都是通过该方式进行的。

  1. 从库连接带主库后,发送SYNC命令。
  2. 主库接收到命令后会生成rdb文件,并将文件传输给从库。
  3. 从库将自己的数据库的状态恢复为主库执行bigsave的状态。
  4. 主库将命令缓存区的写命令发送到从库,从库接收并执行之。

ps:redis的RDB文件生成

3、部分重同步(>=2.8)

该同步针对的是主从网络断开后的数据恢复,在2.8之前版本的redis,重连后的数据恢复是需要进行全量同步的,效率比较低下。

  1. 主库和从库在发送和接收数据的时候,会记录下来字节编号,也就是说都会维护一个复制偏移量。
  2. 在主库中,会维护一个队列(FIFO),每次发送数据都会先进入队列,同时将老数据从队列另一端弹出。
  3. 如果主从断开连接,此时,主从的复制偏移量会不一致,这就表示两边的状态是不一致的。
  4. 主从重新连接后,从库会通关PSYNC命令,将自己的复制偏移量发送带主库。
  5. 主库会检查从库的复制偏移量是否在队列中,如果在队列中,则继续将数据发送到从库中。如果不在队列中,则进行全量同步。
  6. redis会生成一个40个字符长度的唯一id,主库会传给从库主库的id,重连的时候从库又返回给主库,主库通过这个id判断网络断开前是不是就是这个从库。从而判断是否需要部分重同步。
  7. 从库会想主库发送心跳,带上自己的复制偏移量,这个可以检测主从网络状态,可以检查命令丢失。

ps:由于是异步发送的命令,故可能会有主从延迟的问题。