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 清晰地看到整個流程。


分享到:


相關文章: