Redis-主从复制

Posted by ShiYu on 2018-10-31

CAP原理

  • C - Consistent,一致性
  • A - Availablity,可用性
  • P - Partition tolerance,分区容忍性

分布式系统中,各个节点分布在不同机器上,相互之间是通过网络连接的,当网络断开时,导致节点之间无法通信,这种网络断开场景的专业名词交【网络分区】

CAP指的的当网络分区发生时,一致性和可用性只能保证一个。

最终一致

Redis的主从同步是异步进行的,不满足一致性要求,但是主节点修改了数据后,所有数据立刻返回,即使网络断开,主节点依然正常对外提供服务,满足可用性。虽然不满足一致性,但是Redis提供了相关机制保证数据最终一致性,从节点会努力追赶主节点,最终从节点和主节点状态会保持一致。

同步策略

增量同步

Redis同步指令流,主节点将对自己状态产生修改影响的指令记录在本地内存buffer中,然后异步将buffer中指令同步到从节点,从节点一边执行同步的指令流来达到和主节点一样的状态,一边向主节点反馈自己同步到哪里了(偏移量)。

内存buffer容量是有限的,主节点不可能将所有指令都记录在buffer中,所以Redis记录指令流的buffer是一个定长的环形数组,如果数组满了,会从头开始覆盖前面的内容。

如果网络不好,主从节点短时间内无法通信,但是主节点buffer已经满了并覆盖了部分指令,就会导致无法通过指令流进行同步,这个时候就需要用到快照同步。

快照同步

快照同步是指将主节点进行一次bgsave操作,将当前内存数据快照到磁盘中,然后将快照传递到从节点,从节点接收到文件后,进行全量加载,加载前需要将当前内存数据清空,加载完毕后通知主节点继续进行增量同步。加载快照数据需要一定时间,如果加载快照数据这段时间内,主节点buffer又满了,就会不停地进行快照同步,所以buffer大小一定要设置好。我们可以将buffer里存储的指令流理解成持久化方法中的AOF,将快照理解成持久化方法中的RDB(二进制文件)。

无盘复制

生成快照的操作对IO要求很好,从2.8.18起,Redis支持无盘复制,即主节点直接通过套接字将快照内容序列化发送到从节点,减少本地磁盘IO操作

增加从节点

当增加一个新的节点到集群,它必须先进行快照同步,然后进行增量同步。