Redis全量同步和增量同步原理
全量同步
主從第一次同步是全量同步:也就是說,當你主從節點連接建立後,需要執行一次全量同步。那麼Redis如何實現全量同步呢?
其實本質就是Master 給 slave 發送其保存的RDB文件。slave讀取RDB文件恢復數據
詳細介紹:
【第一步】slave與master建立連接後,master判斷該slave 是否是第一次建立連接。那麼該如何判斷呢?
其實Master和slave都有一個Replication Id,簡稱replid,若id一致說明是已經建立過連接瞭,不需要進行全量同步,則需要進行增量同步。
【第二步】master 執行bgsave,生成RDB文件,同時在生成RDB的同時,也會產生一個baklog文件記錄RDB期間的命令,然後將RDB文件發送給從節點,從節點加載RDB文件中的數據。至此全量同步已經完成。
【第三步】也就是後續master和slave在進行同步時候就是增量同步。則需要利用之前生成的baklog文件。
【總結全量同步】
- slave節點先進行增量同步;
- master節點判斷replid,發現不一致,拒絕增量同步;
- master將完整內存數據生成RDB,發送RDB到slave;
- slave清空本地數據, 加載master的RDB;
- master將RDB期間的命令記錄在repl_baklog,並持續將lgo知道命令發送給slave;
- slave執行接收到的命令,保持與master之間的同步。
增量同步
主從第一次同步是全量同步,但如果slave重啟後同步,此時slave重啟後,slave節點和master節點的數據之間有落後,因此需要進行增量同步。
【過程】
master節點和slave節點中維護瞭一個環形數組(前文提到的repl_baklog)和一個指針為offset。
slave來申請增量同步,帶著replid和offset,然後master根據獲取offset之後的數據,將其發送給slave,slave進行同步。
- 此時會出現一個問題,當slave下限太久時,master中存儲的數據已經超過瞭這個repl_baklog的上線,因此就需要重新進行全量同步。
通過對Redis主從集群的同步介紹,可以從以下幾個方面來優化Redis的主從集群
- 在master中配置repl-diskless-sync yes 啟用無磁盤負責,來避免全量同步時的磁盤IO。(應用場景:你的磁盤傳輸比較慢,但是你的網絡帶寬很大,網絡狀況極好。)
- Redis單節點上內存占用不要太大。減少RDB文件的大小。
- 適當的提高repl_baklog的大小,盡量slave恢復後做全量同步。
- 限制一個master上的slave節點數量,可以采用主從鏈的形式。
總結
到此這篇關於Redis全量同步和增量同步原理的文章就介紹到這瞭,更多相關Redis全量和增量同步內容請搜索WalkonNet以前的文章或繼續瀏覽下面的相關文章希望大傢以後多多支持WalkonNet!
推薦閱讀:
- 使用docker搭建redis主從的方法步驟
- Redis實現主從復制方式(Master&Slave)
- docker compose部署主從復制的實現
- 詳解Redis集群搭建的三種方式
- Docker配置redis哨兵模式的方法(多服務器上)