(1) 當啓動一個 slave node 的時候,它會發送一個 PSYNC 命令給 master node。
(2) 若是這是 slave node 初次鏈接到 master node,那麼會觸發一次 full resynchronization 全量複製。
(3) 此時 master 會啓動一個後臺線程,開始生成一份 RDB 快照文件,同時還會將從客戶端 client 新收到的全部寫命令緩存在內存中。
(4) master 會將這個 RDB 發送給 slave,slave 會先寫入本地磁盤,而後再從本地磁盤加載到內存中,
(5) 接着 master 會將內存中緩存的寫命令發送到 slave,slave 也會同步這些數據。
(6) slave node 若是跟 master node 有網絡故障,斷開了鏈接,會自動重連,鏈接以後 master node 僅會複製給 slave 部分缺乏的數據。
node
若是主從複製過程當中,網絡鏈接中斷,那麼能夠接着上次複製的地方,繼續複製下去,而不是從頭開始複製一份程序員
master node 會在內存中維護一個 backlog,master 和 slave 都會保存一個 replica offset和一個 master run id,offset 就是保存在 backlog 中的。若是 master 和 slave 網絡鏈接斷掉了,slave 會讓 master 從上次的offset 開始繼續複製,若是沒有找到對應的 offset,那麼就會執行一次 resynchronization。redis
master在內存中直接建立rdb,而後發送給slave,不會在本身本地落地磁盤了緩存
適用狀況:由於磁盤傳輸性能比較低,網絡帶寬容許的狀況下能夠考慮使用diskless模式。
配置以下:安全
repl-diskless-sync no repl-diskless-sync-delay 5
開啓diskless模式,在主機開始同步以前須要等待全部slave的到來,並將傳輸任務緩存到傳輸隊列。默認主機等待時間是5秒,若是設置爲0時候,傳輸就不會等待全部從機的到來。網絡
slave不會過時key,只會等待master過時key。架構
若是master過時了一個key,或者經過LRU淘汰了一個key,那麼會模擬一條del命令發送給slave。less
若是採用了主從架構,那麼建議必須開啓master node的持久化!不建議用slave node做爲master node的數據熱備。異步
master節點,必需要使用持久化機制,master的各類備份方案,還要考慮本地文件丟失的狀況; 從備份中挑選一份rdb去恢復master; 這樣才能確保master啓動的時候,是有數據的
這裏能夠參考個人上一篇文章04.簡單瞭解一下Redis企業級數據備份方案性能
hi~我是Mirror,一個爲了自由安逸的將來而不斷前進的的程序員。 若是你以爲文章對你有一點點幫助,一個小小贊,即是對個人承認,若是有不足之處,也歡迎各位指正。