06.深入學習redis replication的完整流程和原理
一、replication的完整流程
- slave配置master ip和port
# slaveof <masterip> <masterport>
slaveof 127.0.0.1 6379
- slave node內部有個定時任務,每秒檢查是否有新的master node要連接和複製,如果發現,就跟master node建立socket網絡連接
- slave node發送ping命令給master node。如果master設置了requirepass,那麼salve node必須發送masterauth的口令過去進行認證
- master node第一次執行全量複製,將所有數據發給slave node
- master node後續持續將寫命令,異步複製給slave node
二、全量複製
- master執行bgsave,在本地生成一份rdb快照文件
- master node將rdb快照文件發送給salve node,如果rdb複製時間超過60秒(repl-timeout),那麼slave node就會認為複製失敗,可以適當調節大這個參數
- master node在生成rdb時,會將所有新的寫命令緩存在內存中,在salve node保存了rdb之後,再將新的寫命令複製給salve node
- client-output-buffer-limit slave 256MB 64MB 60,如果在複製期間,內存緩衝區持續消耗超過64MB,或者一次性超過256MB,那麼停止複製,複製失敗
- slave node接收到rdb之後,清空自己的舊數據,然後重新加載rdb到自己的內存中,同時基於舊的數據版本對外提供服務
- 如果slave node開啟了AOF,那麼會立即執行BGREWRITEAOF,重寫AOF
注意:rdb生成、rdb通過網絡拷貝、slave舊數據的清理、slave aof rewrite,很耗費時間
三、增量複製
- 如果全量複製過程中,master-slave網絡連接斷掉,那麼salve重新連接master時,會觸發增量複製
- master直接從自己的backlog中獲取部分丟失的數據,發送給slave node,默認backlog就是1MB
- msater就是根據slave發送的psync中的offset來從backlog中獲取數據的
四、心跳
主從節點互相都會發送heartbeat信息
master默認每隔10秒發送一次heartbeat,salve node每隔1秒發送一個heartbeat
相關名詞解釋
- offset
master和slave都會在自身不斷累加offset
slave每秒都會上報自己的offset給master,同時master也會保存每個slave的offset
作用:1)用在全量複製,2)可以彼此了解數據不一致的情況
- backlog
master node有一個backlog,默認是1MB大小。master給slave複製數據時,也會將數據在backlog中同步寫一份。主要是用來做全量複製中斷候的增量複製的。
- master run_id
執行info server命令可以看到run_id。
如果master重啟,容易導致主從結點數據不一致的情況,重啟後run_id會重新生成,那麼slave應該根據變化的run_id知道master有變化,需要做全量複製。
如果需要不更改run_id重啟redis,可以使用redis-cli debug reload命令。
hi~我是Mirror,一個為了自由安逸的未來而不斷前進的的程序員。
如果你覺得文章對你有一點點幫助,一個小小贊,便是對我的認可,如果有不足之處,也歡迎各位指正。