上一篇文章,我已經簡單介紹了怎麼使用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 清晰地看到整個流程。
閱讀更多 架構即人生 的文章