上一篇文章,我已经简单介绍了怎么使用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
......
可以先看一下概况,接下来我们会细讲。
主要内容包含:
- 主从节点怎么建立复制;
- 主从节点间数据怎么同步;
主从节点怎么建立复制
使用命令 info replication 可以看出:
role: 当前节点角色,master or slave
connected_slaves: 该节点的从节点,当前为0,即没有从节点
master_repl_offset: 数据索引
1.执行slaveof命令
从节点执行 slaveof masterhost masterport 命令后,复制便开始了。
2.主从建立socket连接
在截图中,我们可以看到从节点通过三次握手和主节点建立了连接。
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查看:
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
主从节点建立复制后,通过之间的长连接发送心跳:
- 主节点默认每隔10秒发送ping命令,判断从节点的存活性和连接状态。
- 从节点每隔1秒发送 REPLCONF ACK {offset} 命令,给主节点上报自身的当前复制偏移量。
REPLCONF命令主要作用有以下几种:
- 实时监测主从节点网络状态;
- 上报自身复制/同步偏移量,检查复制数据是否丢失,如果从节点数据丢失,则再从主节点的做增量同步;
- 辅助实现min-slave选项;
以上就是主从节点数据复制/同步的原来,可以通过 Wireshark 清晰地看到整个流程。
閱讀更多 架構即人生 的文章