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還需要根據以下三點判斷是否進行部分同步。
先來介紹一下是哪三個方面:
- 服務器運行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.主從同步最終流程
6.結語
最近公司需要,我搭建了一套redis主從集群并且用哨兵進行監聽實現主從切換。因此我根據《redis設計與實現》梳理了redis主從原理,給自己加深印象。
推薦教程: 《redis教程》