06.深入學習redis replication的完整流程和原理

一、replication的完整流程


  1. slave配置master ip和port
# slaveof <masterip> <masterport>
slaveof 127.0.0.1 6379
  1. slave node內部有個定時任務,每秒檢查是否有新的master node要連接和複製,如果發現,就跟master node建立socket網絡連接
  2. slave node發送ping命令給master node。如果master設置了requirepass,那麼salve node必須發送masterauth的口令過去進行認證
  3. master node第一次執行全量複製,將所有數據發給slave node
  4. master node後續持續將寫命令,異步複製給slave node


二、全量複製


  1. master執行bgsave,在本地生成一份rdb快照文件
  2. master node將rdb快照文件發送給salve node,如果rdb複製時間超過60秒(repl-timeout),那麼slave node就會認為複製失敗,可以適當調節大這個參數
  3. master node在生成rdb時,會將所有新的寫命令緩存在內存中,在salve node保存了rdb之後,再將新的寫命令複製給salve node
  4. client-output-buffer-limit slave 256MB 64MB 60,如果在複製期間,內存緩衝區持續消耗超過64MB,或者一次性超過256MB,那麼停止複製,複製失敗
  5. slave node接收到rdb之後,清空自己的舊數據,然後重新加載rdb到自己的內存中,同時基於舊的數據版本對外提供服務
  6. 如果slave node開啟了AOF,那麼會立即執行BGREWRITEAOF,重寫AOF

注意:rdb生成、rdb通過網絡拷貝、slave舊數據的清理、slave aof rewrite,很耗費時間


三、增量複製


  1. 如果全量複製過程中,master-slave網絡連接斷掉,那麼salve重新連接master時,會觸發增量複製
  2. master直接從自己的backlog中獲取部分丟失的數據,發送給slave node,默認backlog就是1MB
  3. 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,一個為了自由安逸的未來而不斷前進的的程序員。
如果你覺得文章對你有一點點幫助,一個小小贊,便是對我的認可,如果有不足之處,也歡迎各位指正。

Tags: