[redis] 主從複製原理

全複製流程

  • 當 從服務器第一次複製主服務器,從服務器(slave)使用 SLAVEOF host port 命令,向主服務器(master)發送複製請求, master 收到後返回 OK;

    slave 保存 master  信息,結構 server.h/redisServer 結構中 masterhost, masterport
    
  • 異步執行復制工作,內部流程如下,(runid:master 運行 ID) (offect:複製偏移量):

    • slave 使用 socket 連接 master 節點,連接建立成功後,發送 PING 命令,
      如沒有得到 PONG 命令響應(代表 master 目前不能正常處理),繼續重連。
    • 如果 slave 設置了masterauth,則需要進行權限驗證;
    • 通過權限驗證後,slave 執行 REPLCONF listening-port ,向 master 提供 slave 監聽端口號,
      端口號會被 master 保存至 server.h/client slave_listening_port 中,可以使用 INFO REPLICATION 查看(port值);
    • slave 向 master 發送 PSYNC <? > <-1>,代表全量複製;PSYNC <runid> <offect>。
    • master 接收到請求後,調用 replication.c/slaveTryPartialResynchronization() 並生成 runid 和 offect;
    • master 返回 +FULLRESYNC <runid> <offect> 其中 offect 爲 master 當前的複製偏移量。
    • slave 保存 runid 及 offect 當做 slave 的當前複製偏移量,此時 master 調用 BGSVAE 生成 RDB 文件。
    • RDB 生成好之後, master 發送 RDB 文件到 slave;
    • slave 接收到 RDB 後進行處理(加載到內存中),處理完成後 slave 會進行 PSYNC runid offect 請求,此時爲<部分重同步>

部分複製流程

  • 因網絡或其他問題導致 slave 與 master 的 offect 不一致

    • slave 會發送 PSYNC <runid> <offect>
    • master 接收到 PSYNC 請求後,對照 offect
    • 如果 slave 的 offect 之後的數據(offect + 1) 仍然存在於 master 的複製積壓緩衝區中,則執行部分複製;否則進行全複製流程
    • 如果 slave 請求的 runid 與 master 的 runid 不一致也執行全複製流程
  • 可以通過 info replication 命令查看偏移量;master_repl_offset(主服務器偏移量) 、slave_repl_offset(從服務器偏移量)

心跳檢測

  • slave 以默認 1 秒的頻率,向 master 發送命令:REPLCONF ACK <replication_offect> 其中(replication_offect 爲 slave offect),命令作用如下
    • 檢測主從服務器網絡狀態
    • 輔助實現 min-slaves 實現
      • 可以設置 master 達到一定的條件拒絕執行寫命令(min-slaves-to-write、min-slaves-max-lag)
    • 檢測命令丟失
      • 如果檢測到命令丟失,master 將會向 slave 補發缺失數據
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章