Redis的主从复制过程-理解 【背景】Redis单节点存在单点故障为解决单点问题需要对Redis节点配置从节点。使用哨兵来监听主节点存活状态若主节点挂掉从节点能继续提供缓存功能。从节点怎样和主节点间完成数据传递就是Redis的主从复制。【主从配置及作用】临时配置redis-cli进入redis从节点后使用 --slaveof [masterIP] [masterPort]永久配置进入从节点的配置文件redis.conf增加slaveof [masterIP] [masterPort]作用1主从配置结合哨兵模式能解决单点故障问题提高redis可用性2从节点仅提高读的操作主节点提供写操作。对于读多写少的状况可给主节点配置多个从节点从而提供响应效率【复制过程】1从节点执行slaveof [masterIP] [masterPort]保存主节点信息2从节点中的定时任务发现主节点信息建立和主节点的socket连接3从节点发送Ping信号主节点返回Pong两边能互相通信4连接建立后主节点将所有数据发送给从节点数据同步5主节点把当前的数据同步给从节点后便完成了复制的建立流程。接下来主节点就会持续的把写命令发送给从节点保证主从数据一致性【数据同步】redis 2.8 之前使用sync [runId] [offset]同步命令redis2.8之后使用psync [runId] [offset]命令。两者不同在于sync命令仅支持全量复制过程psync支持全量和部分复制介绍同步之前先介绍几个概念runId每个redis节点启动都会生成唯一的runId每次redis重启后runId也会发生变化offset主节点和从节点都各自维护自己的主从复制偏移量offset当主节点有写入命令时offsetoffset命令的字节长度。从节点在收到主节点发送的命令后也会增加自己的offset并把自己的offset发送给主节点。这样主节点同时保存自己的offset从节点的offset通过对比offset来判断主从节点数据是否一致repl_backlog_size保存在主节点上的一个固定长度的先进先出队列默认大小为1MB1主节点发送数据给从节点过程中主节点还会进行一些写操作这时候的数据存储在复制缓冲区。从节点同步主节点数据完成后主节点将缓冲区的数据继续发送给从节点用于部分复制2主节点(master)响应写命令时不但会把命名发送给从节点还会写入复制积压缓冲区用于复制命令丢失的数据补救【全量复制流程】1从节点发送psync ? -1命令因为第一次发送不知道主节点的runId所以为 因为是第一次复制所以offset -12主节点发现从节点是第一次复制变返回FULLRESYNC {runId} {offset}runId是主节点的runIdoffset是主节点目前的offset3从节点接收主节点信息后保存到info中4主节点在发送FULLRESYNC后启动bgsave命令生成RDB文件5主节点发送RDB文件给从节点。到从节点加载数据完成这段期间主节点的写命令放入缓冲区。6从节点清理自己的数据库数据。7从节点加载RDB文件将数据保存的自己的数据库中8如果从节点开启了AOF从节点会异步重写aof文件【部分复制流程】1部分复制主要是Redis针对全量复制的过高开销做出的一种优化措施使用psync {runId}{offset}命令实现。当从节点(slave)正在复制主节点(master)时如果出现网络闪断或者命令丢失等异常情况时从节点会向主节点要求补发丢失的命令数据如果主节点的复制积压缓冲区内存将这部分数据则直接发送给从节点这样就可以保持主从节点复制的一致性。2主从连接中断期间主节点依然响应命令但因复制连接中断命令无法发送给从节点不过主节点内部存在的复制积压缓冲区依然可以保存最近一段时间的写命令数据默认最大缓存1MB。当从节点网络恢复后从节点会再次连上主节点。3当主从连接恢复后由于从节点之前保存了自身已复制的偏移量和主节点的运行ID。因此会把它们当做psync参数发送个主节点要求进行部分复制操作。4主节点接到psync命令后首先核对参数runId是否与自身一致如果一致说明之前复制的是当前主节点之后根据参数offset在自身复制积压缓冲区查找如果偏移量之后的数据存在缓冲区中则对从节点发送COUTINUE响应表示可以进行部分复制。5主节点根据偏移量把复制积压缓冲区里的数据发送给从节点保证主从复制进入正常状态。