一、複製的完整流程node
(1)slave node啓動,僅僅保存master node的信息,包括master node的host和ip,可是複製流程沒開始redis
master host和ip是從哪兒來的,redis.conf裏面的slaveof配置的緩存
(2)slave node內部有個定時任務,每秒檢查是否有新的master node要鏈接和複製,若是發現,就跟master node創建socket網絡鏈接
(3)slave node發送ping命令給master node
(4)口令認證,若是master設置了requirepass,那麼salve node必須發送masterauth的口令過去進行認證
(5)master node第一次執行全量複製,將全部數據發給slave node
(6)master node後續持續將寫命令,異步複製給slave node網絡
二、數據同步相關的核心機制異步
指的就是第一次slave鏈接msater的時候,執行的全量複製,那個過程裏面你的一些細節的機制socket
(1)master和slave都會維護一個offsetui
master會在自身不斷累加offset,slave也會在自身不斷累加offset
slave每秒都會上報本身的offset給master,同時master也會保存每一個slave的offsetdebug
這個倒不是說特定就用在全量複製的,主要是master和slave都要知道各自的數據的offset,才能知道互相之間的數據不一致的狀況server
(2)backlogblog
master node有一個backlog,默認是1MB大小
master node給slave node複製數據時,也會將數據在backlog中同步寫一份
backlog主要是用來作全量複製中斷候的增量複製的
(3)
master run id
info server,能夠看到master run id
若是根據host+ip定位master node,是不靠譜的,若是master node重啓或者數據出現了變化,那麼slave node應該根據不一樣的run id區分,run id不一樣就作全量複製
若是須要不更改run id重啓redis,可使用redis-cli debug reload命令
(4)psync
從節點使用psync從master node進行復制,psync runid offset
master node會根據自身的狀況返回響應信息,多是FULLRESYNC runid offset觸發全量複製,多是CONTINUE觸發增量複製
三、全量複製
(1)master執行bgsave,在本地生成一份rdb快照文件
(2)master node將rdb快照文件發送給salve node,若是rdb複製時間超過60秒(repl-timeout),那麼slave node就會認爲複製失敗,能夠適當調節大這個參數
(3)對於千兆網卡的機器,通常每秒傳輸100MB,6G文件,極可能超過60s
(4)master node在生成rdb時,會將全部新的寫命令緩存在內存中,在salve node保存了rdb以後,再將新的寫命令複製給salve node
(5)client-output-buffer-limit slave 256MB 64MB 60,若是在複製期間,內存緩衝區持續消耗超過64MB,或者一次性超過256MB,那麼中止複製,複製失敗
(6)slave node接收到rdb以後,清空本身的舊數據,而後從新加載rdb到本身的內存中,同時基於舊的數據版本對外提供服務
(7)若是slave node開啓了AOF,那麼會當即執行BGREWRITEAOF,重寫AOF
rdb生成、rdb經過網絡拷貝、slave舊數據的清理、slave aof rewrite,很耗費時間
若是複製的數據量在4G~6G之間,那麼極可能全量複製時間消耗到1分半到2分鐘
四、增量複製
(1)若是全量複製過程當中,master-slave網絡鏈接斷掉,那麼salve從新鏈接master時,會觸發增量複製
(2)master直接從本身的backlog中獲取部分丟失的數據,發送給slave node,默認backlog就是1MB
(3)msater就是根據slave發送的psync中的offset來從backlog中獲取數據的
五、heartbeat
主從節點互相都會發送heartbeat信息
master默認每隔10秒發送一次heartbeat,salve node每隔1秒發送一個heartbeat
六、異步複製
master每次接收到寫命令以後,如今內部寫入數據,而後異步發送給slave node