资料整理自《Redis深度历险:核心原理和应用实践》一书 资料整理自:Redis 的主从同步,及两种高可用方式

Redis主从同步可以分为全量同步增量同步。

一、全量同步

全量同步发生场景:

1.新增从节点,从节点进行数据初始化 2.在进行增量同步时,主节点会将写指令同步到buffer缓冲区,buffer缓冲区大小是有限的,所以buffer中内存满了,就会从头覆盖之前的写指令,导致主节点那些没有同步到从节点的写指令已经被后续的指令覆盖掉,从节点将无法直接通过buffer缓冲区中的写指令来进行同步,这个时候就需要进行快照同步,也就是全量同步。

全量同步过程详解:

  1. 从服务器连接主服务器,发送SYNC命令;
  2. 主服务器接收到SYNC命名后,开始执行BGSAVE命令生成RDB文件并使用缓冲区记录此后执行的所有写命令;
  3. 主服务器BGSAVE执行完后,向所有从服务器发送快照文件,并在发送期间继续记录被执行的写命令;
  4. 从服务器收到快照文件后丢弃所有旧数据,载入收到的快照;
  5. 主服务器快照发送完毕后开始向从服务器发送缓冲区中的写命令;
  6. 从服务器完成对快照的载入,开始接收命令请求,并执行来自主服务器缓冲区的写命令;

alt

注意: 在整个快照同步(全量同步)进行的过程中,主节点的buffer缓冲区还在不停的往前移动,如果快照同步的时间过长或者复制 buffer 太小,都会导致同步期间的增量指令在复制 buffer 中被覆盖,这样就会导致快照同步完成后无法进行增量复制,然后会再次发起快照同步,如此极有可能会陷入快照同步的死循环。

所以务必配置一个合适的复制 buffer 大小参数,避免快照复制的死循环。

二、增量同步

Redis增量同步是指从节点完成了初始化后,开始正常工作时,将主节点服务器发生的写操作同步到从服务器的过程。

增量同步同步的是写指令,主节点会将写指令记录在本地的内存buffer缓冲区中,然后异步将buffer中的写指令同步到从节点,从节点一边执行同步的指令流来达到和主节点一样的状态,一遍向主节点反馈自己同步到哪里了 (偏移量)。

三、无盘复制

主节点在进行快照同步时,会进行很重的文件 IO 操作,特别是对于非 SSD磁盘存储时,快照会对系统的负载产生较大影响。特别是当系统正在进行AOF的fsync操作时如果发生快照,fsync将会被推迟执行,这就会严重影响主节点的服务效率。 所以从 Redis2.8.18版开始支持无盘复制。所谓无盘复制是指主服务器直接通过套接字将快照内容发送到从节点,生成快照是一个遍历的过程,主节点会一边遍历内存,一遍将序列化的内容发送到从节点,从节点还是跟之前一样,先将接收到的内容存储到磁盘文件中,再进行一次性加载。