前言
redis持久化保證了即使redis服務重啟也不會丟失資料,因為redis服務重啟後會將硬碟上持久化的資料恢復到記憶體中,但是當redis伺服器的硬碟損壞了可能會導致資料丟失,如果通過redis的主從複製機制就可以避免這種單點故障。
本文主要針對redis主從複製的原理進行了講解,分享出來供大家參考學習,下面話不多說了,來一起看看詳細的介紹吧
1.複製過程
2.資料間的同步
3.全量複製
4.部分複製
5.心跳
6.非同步複製
1.複製過程
2.資料間的同步
上面說的複製過程,其中有乙個步驟是「同步資料集」,這個就是現在講的「資料間的同步」。
redis 同步有 2 個命令:sync 和 psync,前者是 redis 2.8 之前的同步命令,後者是 redis 2.8 為了優化 sync 新設計的命令。我們會重點關注 2.8 的 psync 命令。
psync 命令需要 3 個元件支援:
主從節點各自複製偏移量:
主節點複製積壓緩衝區:
主節點執行 id:
如果在重啟時不改變執行 id 呢?
psync 命令的使用方式:
命令格式為psync
runid:從節點所複製主節點的執行 id
offset:當前從節點已複製的資料偏移量
psync 執行流程:
流程說明:
從節點傳送 psync 命令給主節點,runid 就是目標主節點的 id,如果沒有預設為 -1,offset 是從節點儲存的複製偏移量,如果是第一次複製則為 -1.
主節點會根據 runid 和 offset 決定返回結果:
到這裡,資料之間的同步就講的差不多了,篇幅還是比較長的。主要是針對 psync 命令相關之間的介紹。
3.全量複製
全量複製是 redis 最早支援的複製方式,也是主從第一次建立複製時必須經歷的的階段。觸發全量複製的命令是 sync 和 psync。之前說過,這兩個命令的分水嶺版本是 2.8,redis 2.8 之前使用 sync 只能執行全量不同,2.8 之後同時支援全量同步和部分同步。
流程如下:
傳送 psync 命令(sphklcoaubync ? -1)
主節點根據命令返回 fullresync
從節點記錄主節點 id 和 offset
以上加粗的部分是整個全量同步耗時的地方。
注意:如過 rdb 檔案大於 6gb,並且是千兆網絡卡,redis 的預設超時機制(60 秒),會導致全量複製失敗。可以通過調大 repl-timeout 引數來解決此問題。 redis 雖然支援無盤複製,即直接通過網路傳送給從節點,但功能不是很完善,生產環境慎用。
4.部分複製
當從節點正在複製主節點時,如果出現網路閃斷和其他異常,從節點會讓主節點補發丟失的命令資料,主節點只需要將複製緩衝區的資料傳送到從節點就能夠保證資料的一致性,相比較全量複製,成本小很多。
5.心跳
主從節點在建立複製後,他們之間維護著長連線並彼此傳送心跳命令。
心跳的關鍵機制如下:
注意:為了降低主從延遲,一般把 redis 主從節點部署在相同的機房/同城機房,避免網路延遲帶來的網路分割槽造成的心跳中斷等情況。
6.非同步複製
主節點不但負責資料讀寫,還負責把寫命令同步給從節點,寫命令的傳送過程是異hklcoaub步完成,也就是說主節點處理完寫命令後立即返回客戶度,並不等待從節點複製完成。
非同步複製的步驟很簡單,如下:
總結本文主要分析了 r程式設計客棧edis 的複製原理,包括複製過程,資料之間的同步,全量複製的流程,部分複製的流程,心跳設計,非同步複製流程。其中,可以看出,rdb 資料之間的同步非常耗時。所以,redis 在 2.8 版本退出了類似增量複製的 psync 命令,當 redis 主從直接發生了網路中斷,不會進行全量複製,而是將資料放到緩衝區(預設 1mb)裡,在通過主從之間各自維護複製 offset 來判斷快取區的資料是否溢位,如果沒有溢位,只需要傳送緩衝區資料即可,成本很小,反之,則要進行全量複製,因此,控制緩衝區大小非常的重要。
本文標題: redis主從複製原理的深入講解
本文位址:
Redis 主從複製
主從複製的開啟,完全是在從節點發起的,不需要我們在主節點做任何事情,從節點開啟主從複製,有3種方式 主從複製主要可分為 連線建立階段 即準備階段 資料同步階段 命令傳播階段 主要作用是在主從節點之間建立連線,為資料同步做好準備 從節點資料的初始化,具體執行的方式是 從節點向主節點傳送psync命令 ...
Redis 主從複製
就是將一台 redis 伺服器的資料,複製到其他的 redis 伺服器,前者為主節點 master leader 後者稱為從節點 sl e follower 資料的複製是單向的,只能從主節點到從節點,一般 master 以寫為主,sl e 以讀為主。redis 主從複製可以根據是否是全量分為全量同步...
redis主從複製
redis的高併發有一種實現方式就是主從架構,乙個master節點,多個sl e節點,可以很好的實現sl e節點的水平擴容 主從架構再加上讀寫分離,master節點負責寫操作,sl e節點負責讀操作,使得redis可以很好的做乙個高併發的處理。有人就會疑惑了 sl e節點上的資料怎麼來的了?所以我們...