redis主從複製原理、斷點續傳、無磁盤化複製、過期key處理

一、redis replication概括
1、主從架構的核心原理
當啓動一個slave node的時候,它會發送一個PSYNC命令給master node
如果這是slave node重新連接master node,那麼master node僅僅會複製給slave部分缺少的數據; 如果是slave node第一次連接master node,那麼會觸發一次full resynchronization(全量複製)
開始full resynchronization的時候,master會啓動一個後臺線程,開始生成一份RDB快照文件,同時還會將從客戶端收到的所有寫命令緩存在內存中。RDB文件生成完畢之後,master會將這個RDB發送給slave,slave會先寫入本地磁盤,然後再從本地磁盤加載到內存中。然後master會將內存中緩存的寫命令發送給slave,slave也會同步這些數據。
slave node如果跟master node有網絡故障,斷開了連接,會自動重連。master如果發現有多個slave node都來重新連接,僅僅會啓動一個rdb save操作,用一份數據服務所有slave node。

 

2、主從複製的斷點續傳

從redis 2.8開始,就支持主從複製的斷點續傳,如果主從複製過程中,網絡連接斷掉了,那麼可以接着上次複製的地方,繼續複製下去,而不是從頭開始複製一份
master node會在內存中創建一個backlog,master和slave都會保存一個replica offset還有一個master id,offset就是保存在backlog中的。如果master和slave網絡連接斷掉了,slave會讓master從上次的replica offset開始繼續複製
但是如果沒有找到對應的offset,那麼就會執行一次resynchronization

 

3、無磁盤化複製

master在內存中直接創建rdb,然後發送給slave,不會在自己本地落地磁盤了
repl-diskless-sync
repl-diskless-sync-delay,等待一定時長再開始複製,因爲要等更多slave重新連接過來

 

4、過期key處理

slave不會過期key,只會等待master過期key。如果master過期了一個key,或者通過LRU淘汰了一個key,那麼會模擬一條del命令發送給slave。

二、redis replication 詳細流程及專業詞彙解釋
1、複製的完整流程
(1)slave node啓動,僅僅保存master node的信息,包括master node的host和ip,但是複製流程沒開始
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
2、數據同步相關的核心機制
指的就是第一次slave連接msater的時候,執行的全量複製,那個過程裏面你的一些細節的機制
(1)master和slave都會維護一個offset
master會在自身不斷累加offset,slave也會在自身不斷累加offset
slave每秒都會上報自己的offset給master,同時master也會保存每個slave的offset
這個倒不是說特定就用在全量複製的,主要是master和slave都要知道各自的數據的offset,才能知道互相之間的數據不一致的情況
(2)backlog
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觸發增量複製
3、全量複製
(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分鐘
4、增量複製
(1)如果全量複製過程中,master-slave網絡連接斷掉,那麼salve重新連接master時,會觸發增量複製
(2)master直接從自己的backlog中獲取部分丟失的數據,發送給slave node,默認backlog就是1MB
(3)msater就是根據slave發送的psync中的offset來從backlog中獲取數據的
5、heartbeat
主從節點互相都會發送heartbeat信息
master默認每隔10秒發送一次heartbeat,salve node每隔1秒發送一個heartbeat
6、異步複製
master每次接收到寫命令之後,現在內部寫入數據,然後異步發送給slave node

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章