今天主要講的是主從複製資料一致性相關以及面對網路中斷如何進行資料同步的問題。
- 思維導圖 -
主從模式配置
1、主從模式
redis 中設定主從的方式很簡單,通常有兩種:
2、主-從-從模式
對於主-從-從的模式來說,配置也與上邊的操作類似,在這裡就不多贅述了。
主從一致性原理
了解了主從配置後,下面就要進入正題了。
在主從中,通常的操作是主庫用來寫入資料,從庫用來讀取資料。這樣的好處是避免了所有的請求壓力都打在了主庫上,同時系統的伸縮性也得到了很大的提公升。
但是問題就來了,讀從庫時的資料要與主庫保持一致,那就需要主庫的資料在寫入後同步到從庫中。如何保持主庫與從庫的資料一致性,當有多個從庫時,又如何做到呢?
1、全量複製
這是第一次同步時所發生的傳遞關係。看名字就知道,主庫第一次就毫無保留的把所有資料都傳遞給了從庫。
我們先來看下它們是如何發生第一次關係的(就知道你會想歪)。
圖中的同步流程已經很清晰了,總共分為三部分:
(1)主從節點建立聯絡
當從節點與主節點第一次建立聯絡時,從節點會向主節點傳送 psync 命令,表示要進行資料同步。
正如你看到的 psync 命令後會帶有兩個引數:乙個是 runid,乙個是偏移量 offset。
在圖中第一次複製時因為不知道主庫id和偏移量,因此用「?」和「-1」分別來表示runid 和 offset。
當主節點接收到 psync 命令後,會使用 fullsync命令向從節點傳送 runid 及offset 兩個引數。從節點將其資訊儲存下來。
到這裡關係算是建立了下來。
(2)主節點同步rdb檔案
rdb檔案,這是乙個老面孔了,持久化時會用到的二進位制檔案。在這裡起著主從資料同步的作用,也就是說主從同步是依賴 rdb 檔案來實現的。
從節點接收到 rdb 檔案後,在本地完成資料載入,算是完成了主從同步。
到這裡你有沒有發現什麼問題?
我們回想下 rdb 檔案是如何生成的。在持久化那篇文章裡,我們介紹過,父程序 fork 了乙個子程序來進行生成 rdb 檔案。父程序並不阻塞接收處理客戶端的命令。
那麼問題就產生了,當主節點把 rdb 檔案傳送給從節點時,主節點同時接收的命令又該如何來處理?
(3)主節點同步緩衝區命令
這一步就是來解決 rdb 檔案生成後,父程序又接收到寫命令同步的問題的。
為了保證主從節點資料的一致性,主節點中會使用緩衝區來記錄 rdb 檔案生成後接收到的寫操作命令。在 rdb 檔案傳送完成後會把緩衝區的命令傳送給從節點來執行。
到這裡,主從節點的資料同步算是完成了。
2、級聯操作
我們再來回顧下整個同步流程,從建立關係,生成 rdb 檔案,傳輸給從節點到最後緩衝區命令傳送給從節點。這是乙個從節點與主節點同步的完整流程。
那麼我們再來思考:當有多個從節點,也就是一主多從時,第一次連線時都要進行全量複製。但是在生成 rdb 檔案時,父程序 fork 子程序時可能會出現阻塞,同時在傳輸 rdb 檔案時也會占用頻寬,浪費資源。
這種情況我們該如何來解決呢?
不知道你對文章開頭的 主-從-從模式是否還有印象。通過對從節點再建立從節點。同步資料時從級聯的從節點上進行同步,從而就減輕了主節點的壓力。
網路開小差了
上面的流程我們已經知道了正常情況下主從節點的複製過程了,但是當網路中斷導致主從連線失敗等異常情況下,主從同步又是如何來進行的?
在這裡要提到乙個增量複製的名詞,與全量複製不同的是,它是根據主從節點的偏移量來進行資料同步的。
什麼意思呢?
還記得在全量複製裡我們所提到過的緩衝區嗎?就是用來儲存生成 rdb 檔案後的寫命令的,這裡我們稱為緩衝區a。主從節點斷開連線後,除了會將後續接收到的寫命令寫入緩衝區a的同時,還會寫入到另乙個緩衝區b裡。
在緩衝區b裡,主從節點分別會維護乙個偏移量 offset。剛開始時,主節點的寫位置與從節點的讀位置在同一起點,隨著主節點的不斷寫入,偏移量也會逐漸增大。同樣地,從節點複製完後偏移量也在不斷增加。
當網路斷開連線時,從節點不再進行同步,此時主節點由於不斷接收新的寫操作的偏移量會大於從節點的偏移量。當連線恢復時,從節點向主節點傳送帶有偏移量的psync 命令,主節點根據偏移量來進行比較,只需將未同步寫命令同步給從節點即可。
總結
主從一致性原理
網路開小差了
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節點上的資料怎麼來的了?所以我們...