Redis复制原理解析

Redis复制原理解析

Wireshark抓取数据

上一篇文章,我已经简单介绍了怎么使用Wireshark分析Redis通信,没看过的可以看一下。

从上图中,我们可以看到抓取的内容如下:

PING

+PONG

REPLCONF listening-port 6381

+OK

REPLCONF capa eof

+OK

PSYNC ? -1

+FULLRESYNC eccb7179d6d601d0a087bddb2c69257d6ef4c32c 3194

$273

REDIS0007. redis-ver.3.2.100.

[email protected].]..used-mem........

mset:key_1.value_1..pipeline_set.pipeline_set_value.

mset:key_2.value_2

pipeline_hset,,...........pipeline_field..pipeline_value2...set_key2

set_value2.

mset:key_3.value_3..set_key set_value.K!....|O

*3

$8

REPLCONF

$3

ACK

$4

3194

*3

$8

REPLCONF

$3

ACK

$4

3194

......

可以先看一下概况,接下来我们会细讲。

主要内容包含:

  1. 主从节点怎么建立复制;
  2. 主从节点间数据怎么同步;

主从节点怎么建立复制

Redis复制原理解析

使用命令 info replication 可以看出:

role: 当前节点角色,master or slave

connected_slaves: 该节点的从节点,当前为0,即没有从节点

master_repl_offset: 数据索引

1.执行slaveof命令

Redis复制原理解析

从节点执行 slaveof masterhost masterport 命令后,复制便开始了。

2.主从建立socket连接

Redis复制原理解析

在截图中,我们可以看到从节点通过三次握手和主节点建立了连接。

3.发送ping命令

PING

+PONG

建立连接后从节点发送 ping 请求进行首次通信,主要目的如下:

  • 检查套接字的读写状态是否正常。
  • 检查主节点是否能正常处理命令请求。

如果从节点读取到“PONG”的回复,则表示主从节点之间的网路连接状态正常,并且主节点可以正常处理从节点发送的命令请求。

4.身份校验

REPLCONF listening-port 6381

+OK


从节点在收到主节点返回的“PONG”回复之后,接下来会做的就是身份验证。如果从节点设置了masterauth选项,则进行身份验证。反之则不进行。

在需要进行身份验证的情况下,从节点将向主节点发送一条AUTH命令,命令的参数即可从节点masterauth选项的值。

5.发送端口信息

在身份验证之后,从节点将执行REPLCONF listening-port <port-number>,向主节点发送从节点的监听端口号。/<port-number>

主节点会将其记录在对应的客户端状态的slave_listening_port属性中,这点可通过info Replication查看:

Redis复制原理解析

6.同步数据

主从数据同步方式包含两种:全量和增量。

全量同步,一般在首次建立复制的时候会全量复制,会把主节点全部数据一次性发送给从节点,数据量大的时候会对主从节点和网络造成很大的开销。

增量同步,这是Redis在2.8以上版本新增的属性,可以避免全量同步。

PSYNC ? -1

+FULLRESYNC eccb7179d6d601d0a087bddb2c69257d6ef4c32c 3194

$273

REDIS0007. redis-ver.3.2.100.

[email protected].]..used-mem........

mset:key_1.value_1..pipeline_set.pipeline_set_value.

mset:key_2.value_2

从节点使用psync命令完成同步功能,格式为 PSYNC {runId} {offset}

  • runId: 从节点所同步主节点的运行id;
  • offset: 当前从节点已同步的数据偏移量;

主节点收到后,会返回以下几种情况:

+FULLRESYNC 表示将进行全量同步

+CONTINUE 表示将进行增量同步

+ERR 表示主节点版本过低,无法识别PSYNC命令

如果是第一次进行全量复制,

则从节点发送 PSYNC ? -1,

主节点响应:+FULLRESYNC eccb7179d6d601d0a087bddb2c69257d6ef4c32c 1275

7.命令传播

当完成了同步之后,主从节点就会进入命令传播阶段。这时主节点只要一直将自己执行的写命令发送到从节点,而从节点只要一直接收并执行主节点发来的写命令,就可以保证主从节点保持一致了。

slave0:ip=127.0.0.1,port=6381,state=online,offset=5294,lag=1

master_repl_offset:5294

从统计信息中可以看出主节点和从节点当前的复制偏移量,master_repl_offset - slave0.offset 就是当前从节点的复制延迟量。

7.心跳

*3

$8

REPLCONF

$3

ACK

$4

3194

主从节点建立复制后,通过之间的长连接发送心跳:

  1. 主节点默认每隔10秒发送ping命令,判断从节点的存活性和连接状态。
  2. 从节点每隔1秒发送 REPLCONF ACK {offset} 命令,给主节点上报自身的当前复制偏移量。

REPLCONF命令主要作用有以下几种:

  • 实时监测主从节点网络状态;
  • 上报自身复制/同步偏移量,检查复制数据是否丢失,如果从节点数据丢失,则再从主节点的做增量同步;
  • 辅助实现min-slave选项;

以上就是主从节点数据复制/同步的原来,可以通过 Wireshark 清晰地看到整个流程。


分享到:


相關文章: