redis数据同步
在本篇文章中,只描述数据同步的过程,不解释相关指令、参数配置、及场景解释如其他场景问题、如复制积压缓冲区满了怎么做?如何避免全量复制等自行百度(后期有时间也会进行说明)。
redis的数据同步是指在redis主从复制(或集群模式下)下进行数据同步的过程(异步)。redis的数据同步阶段主要分为三个阶段
- 连接阶段
- 数据同步阶段
全局复制
部分复制 - 命令传播阶段
下面根据这个三个阶段详细解读redis数据同步的流程。
第一个阶段连接阶段
在配置redis主从复制的时候,需要在配置文件中配置slaveof 属性,配置当前slave节点的Master主机的IP和端口。下面通过一张图描述连接阶段slave都干了什么
- slave发送slaveof ip port 指令请求连接master
- master接收到指令并且响应给slave自己的ip和端口
- slave接收到master的ip和port并保存
- slave根据保存的ip和port连接Master的Socket
- slave周期性的发送ping(定时任务)
- Master回复pong
- 如果存在身份校验的话则需要发送auth password
- Master验证校验
- slave发送指令 replconf listening-port
10.Master保存slave发送的端口号
以上这是Slave连接阶段做的事情,除去验证redis的部署一般都会在同一个区域网内,验证就没什么必要随意可以忽略掉
第二个阶段数据同步阶段
数据同步阶段主要是进行Master数据和Slave数据同步的过程,了解过数据同步过程的同学知道大致的同步过程是Slave发送请求同步的指令,Master接收到指令后调用bgsave生成rdb文件,并且将生成RDB文件过程中服务端接收到指令放在复制积压缓冲区,Master通过第一步建立的Socket连接将RDB文件计发送给slave,slave将rdb加入内存,进行数据恢复.此时这个过程我们称作全量复制。Slave在完成RDB数据恢复后,会发送信息到Master告诉Master我恢复完了把我恢复过程中你接受到复制积压缓冲区的数据发给我再次完成数据同步.这个过程称为部分复制.下面以图解的方式详细介绍复制过程。
- psync2 :这个指令是在4版本之后升级之后叫这个名字,主要作用是请求同步
- ?:在redis中每个服务端都有一个40为长度的唯一runid,这个问好就是在第一次连接的时候slave不知道Master的runid需要获取
- -1:指的是偏移量,这个在后面的复制积压缓冲区会详细解释
复制积压缓冲区
这里提到了复制积压缓冲区,一般很多人习惯称为复制缓冲区,复制积压缓冲区的本身是个队列,主要的作用是存储,slave在使用rdb数据恢复期间,master接受到的指令,供slave完成部分复制,slave的部分复制主要就是针对复制积压缓冲区的。它有以下几个特点
- 复制积压缓冲区是个先进先出的队列
- 复制积压缓冲区是有大小的,当元素数量大于队列的容量是,最先进入的元素就被弹出,新元素入队
- 每台服务器启动时,如果开启有aof或者被当成Master连接时就会创建
- master在每次执行指令的时候还会将指令放在积压缓冲区
图解积压缓冲区的底层原理
积压缓冲区底层实现是比较清楚的主要包含字节值(记录命令)和偏移量(区分不同slave的数据)两部分
下图为复制缓冲区底层存储的样式,如果你看过aof文件那就知道这个格式就是将一个完整的指令拆分成一个个字符
工作的原理很简单:
- 通过偏移量区分不同slave的数据传播差异
- master记录已经发送的offset
- slave记录已接收的offset
第三个阶段命令传播阶段
这个阶段我认为应该是循环获取复制积压缓冲区命令的阶段,从整体上看命令传播阶段就是循环进行数据同步的过程。这个过程中大部分是进行部分复制,但是也会在一些特定的情况下执行全量复制。具体的流程图中描述的很清楚