redis主從同步原理

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教程

? 版權聲明
THE END
喜歡就支持一下吧
點贊13 分享