首頁 >資料庫 >Redis >redis主從同步原理

redis主從同步原理

hzc
hzc原創
2020-06-22 13:22:526006瀏覽

redis主從同步原理

#1.前言

在redis中為了確保redis的高可用,一般會搭建一個集群模式就是主從模式。

主從模式可以保證redis的高可用,那麼redis是怎麼保證主從伺服器的資料一致性的,接下來我們淺談下redis主(master)從(slave)同步的原理。

2.初次全量同步

當一個redis伺服器初次向主伺服器發送salveof指令時,redis會從伺服器進行一次全量同步,同步的步驟如下圖所示:

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斷開重連之後會重新同步,重新同步分完全同步與部分同步

首先來看看部分同步大致的方向

redis主從同步原理

  • #當slave斷開重連後,會傳送psync  指令給master。
  • master收到psync後會返回 continue回复,表示slave可以執行部分同步了。
  • master發送斷線後的寫指令給slave
  • #slave執行寫入指令。

實際上當slave傳送psync指令給master之後,master還需要依照下列三點判斷是否要進行部分同步。

先來介紹一下是哪三個面向:

  • 伺服器運行ID

每個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.主從同步最終流程

redis主從同步原理

#6.結語

最近公司需要,我搭建了一套redis主從集群並且用哨兵進行監聽實現主從切換。因此我根據《redis設計與實現》梳理了redis主從原理,給自己加深印象。

# 推薦教學:《redis教學

以上是redis主從同步原理的詳細內容。更多資訊請關注PHP中文網其他相關文章!

陳述:
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn