Redis全量同步和增量同步原理
全量同步
主從第一次同步是全量同步:也就是說,當你主從節(jié)點連接建立后,需要執(zhí)行一次全量同步。那么Redis如何實現(xiàn)全量同步呢?
其實本質(zhì)就是Master 給 slave 發(fā)送其保存的RDB文件。slave讀取RDB文件恢復(fù)數(shù)據(jù)
詳細介紹:
【第一步】slave與master建立連接后,master判斷該slave 是否是第一次建立連接。那么該如何判斷呢?
其實Master和slave都有一個Replication Id,簡稱replid,若id一致說明是已經(jīng)建立過連接了,不需要進行全量同步,則需要進行增量同步。
【第二步】master 執(zhí)行bgsave,生成RDB文件,同時在生成RDB的同時,也會產(chǎn)生一個baklog文件記錄RDB期間的命令,然后將RDB文件發(fā)送給從節(jié)點,從節(jié)點加載RDB文件中的數(shù)據(jù)。至此全量同步已經(jīng)完成。
【第三步】也就是后續(xù)master和slave在進行同步時候就是增量同步。則需要利用之前生成的baklog文件。
【總結(jié)全量同步】
- slave節(jié)點先進行增量同步;
- master節(jié)點判斷replid,發(fā)現(xiàn)不一致,拒絕增量同步;
- master將完整內(nèi)存數(shù)據(jù)生成RDB,發(fā)送RDB到slave;
- slave清空本地數(shù)據(jù), 加載master的RDB;
- master將RDB期間的命令記錄在repl_baklog,并持續(xù)將lgo知道命令發(fā)送給slave;
- slave執(zhí)行接收到的命令,保持與master之間的同步。
增量同步
主從第一次同步是全量同步,但如果slave重啟后同步,此時slave重啟后,slave節(jié)點和master節(jié)點的數(shù)據(jù)之間有落后,因此需要進行增量同步。
【過程】
master節(jié)點和slave節(jié)點中維護了一個環(huán)形數(shù)組(前文提到的repl_baklog)和一個指針為offset。
slave來申請增量同步,帶著replid和offset,然后master根據(jù)獲取offset之后的數(shù)據(jù),將其發(fā)送給slave,slave進行同步。
- 此時會出現(xiàn)一個問題,當slave下限太久時,master中存儲的數(shù)據(jù)已經(jīng)超過了這個repl_baklog的上線,因此就需要重新進行全量同步。
通過對Redis主從集群的同步介紹,可以從以下幾個方面來優(yōu)化Redis的主從集群
- 在master中配置repl-diskless-sync yes 啟用無磁盤負責(zé),來避免全量同步時的磁盤IO。(應(yīng)用場景:你的磁盤傳輸比較慢,但是你的網(wǎng)絡(luò)帶寬很大,網(wǎng)絡(luò)狀況極好。)
- Redis單節(jié)點上內(nèi)存占用不要太大。減少RDB文件的大小。
- 適當?shù)奶岣遰epl_baklog的大小,盡量slave恢復(fù)后做全量同步。
- 限制一個master上的slave節(jié)點數(shù)量,可以采用主從鏈的形式。
總結(jié)
到此這篇關(guān)于Redis全量同步和增量同步原理的文章就介紹到這了,更多相關(guān)Redis全量和增量同步內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
一次關(guān)于Redis內(nèi)存詭異增長的排查過程實戰(zhàn)記錄
這篇文章主要給大家分享了一次關(guān)于Redis內(nèi)存詭異增長的排查過程實戰(zhàn)記錄,文中通過示例代碼介紹的非常詳細,對大家學(xué)習(xí)或者使用Redis具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧2018-07-07Spring Boot整合Redis實現(xiàn)訂單超時處理問題
這篇文章主要介紹了Spring Boot整合Redis實現(xiàn)訂單超時處理,通過這個基本的示例,你可以了解如何使用Spring Boot和Redis來處理訂單超時問題,并根據(jù)需要進行擴展和定制,需要的朋友可以參考下2023-11-11Redis高并發(fā)防止秒殺超賣實戰(zhàn)源碼解決方案
本文主要介紹了Redis高并發(fā)防止秒殺超賣實戰(zhàn)源碼解決方案,文中通過示例代碼介紹的非常詳細,具有一定的參考價值,感興趣的小伙伴們可以參考一下2021-10-10詳解Redis中key的命名規(guī)范和值的命名規(guī)范
這篇文章主要介紹了詳解Redis中key的命名規(guī)范和值的命名規(guī)范,文中通過示例代碼介紹的非常詳細,對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧2020-12-12緩存替換策略及應(yīng)用(以Redis、InnoDB為例)
本文以Redis、InnoDB為例給大家講解緩存替換策略及應(yīng)用,本文給大家提到五種置換策略,通過實例代碼給大家介紹的非常詳細,需要的朋友參考下吧2021-07-07