4. 【Redis主從架構】Redis replication完整流程和深入講解
1. Replication完整複製流程
-
slave node啓動,僅僅保存 master node 的信息,包括 master node 的host和ip,但是複製流程還沒有開始,master host和ip從哪裏來,redis.conf裏面的slaveof配置的。
-
salve node 內部有個定時任務,每秒檢查是否有master node要連接和複製,如果發現, slave node 就跟 master node 建立socket網絡連接。
-
slave node 發送ping命令給master node。
-
口令認證,如果master 設置了 requiress,那麼 salve node必須發送masterauth的口令過去進行認證。
-
slave node第一次連接到master,會執行全量複製,將所有數據發送給slave node
-
master node後續持續寫命令,異步複製到slave node。
2. 數據同步相關的核心機制
第一次slave 連接 master 的時候,執行的全量複製,這個過程中一些細節的機制
master 會在自身不斷累積offset,slave也會在自身不斷累加offset
slave 每秒都會上報自己的offset給master,同時master也會保存每個slave的offset,主要作用是:master和slave都要知道各自數據的offset,才能知道互相之間數據不一致的情況。
master node有一個backlog,默認大小是1M。
master node給salve複製數據的時候,會同步將數據寫到backlog中。
backlog主要是用來做全量複製中斷時的增量複製
- master runid的作用
- info server命令可以看到 master 的run id
如果根據host+ip命令定位master node,是不靠譜的,如果master node重啓或者數據出現了變化,那麼 slave node應該根據不同的run id的不同做全量複製。
如果需要不更改run id重啓redis,可以使用redis-cli debug reload命令。
- psync
slave 節點 使用 psync 命令從 master node進行復制,psync runid offset
master node 會根據自身的情況返回響應信息,可能是 fullresync runid offset 觸發全量複製,可能是continue觸發增量複製。
3. 全量複製詳細介紹
- master 執行 bgsave 命令,在本地生成一份rdb快照文件。
- master node 將rdb快照文件發送到 salve node,如果rdb複製事件超過60s(repl-timeout),那麼 slave node 就會認爲複製失敗,可以適當的調大這個參數。
- 對於千兆網卡的機器,一般一秒傳輸100MB文件,6G文件很可能超過60s秒,導致複製失敗
- master node 生成rdb時,會將所有新增的命令存儲到內存中,在slave node 保存了rdb之後,再講新的寫命令複製給 slave node。
- client-output-buffer-limit slave 256MB 64MB 60,如果在複製期間,新增的數據超過內存緩存區大小64MB,或者一次性到達256MB,那麼停止複製,複製失敗
- 如果slave node 開啓了AOF,那麼會立即執行BGRWRITEAOF,重新AOF。
rdb生成,rdb通過網絡拷貝,slave舊數據的清理、slave aof rewrite,很好時間。
4. 增量複製
- 如果複製過程中,master-slave網絡連接中斷,那麼salve重新連接到master,是進行增量複製,而不是全量複製。
- master 直接從自己的backlog中獲取部分丟失的數據,發送給slave node,默認backlog的大小是1MB
- master 會根據salve發送的psync中的offset來從backlog中獲取數據。
5. heartbeat
主從節點互相都會發送heartbeat信息
master 默認每隔10秒發送一次heartbeat,slave node每秒發送一個heartbeat。
6. 異步複製
master 介紹到寫命令之後,現在內部寫入數據,然後異步發送給slave node。
參考 石衫老師 《億級流量教程》課程筆記