#1.前言
在redis中為了確保redis的高可用,一般會搭建一個集群模式就是主從模式。
主從模式可以保證redis的高可用,那麼redis是怎麼保證主從伺服器的資料一致性的,接下來我們淺談下redis主(master)從(slave)同步的原理。
2.初次全量同步
當一個redis伺服器初次向主伺服器發送salveof指令時,redis會從伺服器進行一次全量同步,同步的步驟如下圖所示:
- #slave伺服器向master發送psync指令(此時發送的是psync ? -1 ),告訴master我需要同步資料了。
- master接收到psync指令後會進行BGSAVE指令產生RDB檔快照。
- 生成完後,會將RDB檔案傳送給slave。
- slave接收到檔案會載入RDB快照,並且將資料庫狀態變更為master在執行BGSAVE時的狀態一致。
- master會傳送所有儲存在緩衝區裡的指令,告訴slave可以進行同步了
- slave執行這些寫入指令。
3.指令傳播
#slave已經同步過master了,那麼如果後續master進行了寫入操作,比如說一個簡單的set name redis,那麼master執行過目前指令後,會將目前指令傳送給slave執行一遍,達成資料一致性。
4.重新複製
當slave斷開重連之後會重新同步,重新同步分完全同步與部分同步
首先來看看部分同步大致的方向
- #當slave斷開重連後,會傳送psync 指令給master。
- master收到psync後會返回 continue回复,表示slave可以執行部分同步了。
- master發送斷線後的寫指令給slave
- #slave執行寫入指令。
實際上當slave傳送psync指令給master之後,master還需要依照下列三點判斷是否要進行部分同步。
先來介紹一下是哪三個面向:
每個redis伺服器開啟後會產生運行ID。
當進行初次同步時,master會將自己的ID告訴slave,slave會記錄下來,當slave斷線重連後,發現ID是這個master的就會嘗試進行部分重同步。當ID與現在連接的master不一樣時會進行完整重同步。
複製偏移包含master複製偏移量和slave複製偏移量,當初次同步過後兩個資料庫的複製偏移量相同,之後master執行一次寫入指令,那麼master的偏移量1,master會寫指令給slave,slave執行一次,slave偏移量1,這樣版本就能一致。
#複製積壓緩衝區是由master維護的固定長度的先進先出的佇列。
當slave傳送psync,會將自己的偏移量也傳送給master,當slave的偏移量之後的資料在緩衝區還存在,就會傳回continue通知slave進行部分重同步。
當slave的偏移量之後的資料不在緩衝區了,就會進行完整重同步。
結合以上三點,我們又可以總結下:
#
- 當slave斷開重連後,會傳送psync 指令給master。
- master首先會對伺服器執行id進行判斷,如果與自己相同就進行判斷偏移量
- master會判斷自己的偏移量與slave的偏移量是否一致。
- 如果不一致,master會去緩衝區中判斷slave的偏移量之後的資料是否存在。
- 如果存在就會返回 continue回复,表示slave可以執行部分同步了。
- master發送斷線後的寫指令給slave
- #slave執行寫入指令。
5.主從同步最終流程
#6.結語
最近公司需要,我搭建了一套redis主從集群並且用哨兵進行監聽實現主從切換。因此我根據《redis設計與實現》梳理了redis主從原理,給自己加深印象。
# 推薦教學:《redis教學》
以上是redis主從同步原理的詳細內容。更多資訊請關注PHP中文網其他相關文章!