1. 程式人生 > >Redis主從同步原理-PSYNC【轉】

Redis主從同步原理-PSYNC【轉】

offset 以及 number fontsize gravity 有一個 post slave js xml

Reids復制數據主要有2種場景:
1. 從服務器從來第一次和當前主服務器連接,即初次復制
2. 從服務器斷線後重新和之前連接的主服務器恢復連接,即斷線後重復制
??對於初次復制來說使用SYNC命令進行全量復制是合適高效的,但是對於斷線後重復制來說效率就不太能接受了。舉例來說:
技術分享圖片
??如圖所示,Master在斷開連接期間只傳播了3個寫入命令,但是重新連接之後卻要全量復制,顯然這是低效並且不太必要的。

PSYNC概念

??為了應對這種情況,Redis在2.8版本提供了PSYNC命令來帶代替SYNC命令,為Redis主從復制提供了部分復制的能力。PSYNC命令格式是:

PSYNC <runid> <offset>
runid:主服務器ID
offset:從服務器最後接收命令的偏移量
  • 1
  • 2
  • 3

??PSYNC執行過程中比較重要的概念有3個:runid、offset(復制偏移量)以及復制積壓緩沖區。

runid

??每個Redis服務器都會有一個表明自己身份的ID。在PSYNC中發送的這個ID是指之前連接的Master的ID,如果沒保存這個ID,PSYNC的命令會使用”PSYNC ? -1” 這種形式發送給Master,表示需要全量復制。

offset(復制偏移量)

??在主從復制的Master和Slave雙方都會各自維持一個offset。Master成功發送N個字節的命令後會將Master的offset加上N,Slave在接收到N個字節命令後同樣會將Slave的offset增加N。Master和Slave如果狀態是一致的那麽它的的offset也應該是一致的。

復制積壓緩沖區

??復制積壓緩沖區是由Master維護的一個固定長度的FIFO隊列,它的作用是緩存已經傳播出去的命令。當Master進行命令傳播時,不僅將命令發送給所有Slave,還會將命令寫入到復制積壓緩沖區裏面。

PSYNC執行過程

??理解了上面三個基本概念,PSYNC的執行過程就好理解了。
技術分享圖片
??1 客戶端向服務器發送SLAVEOF命令,讓當前服務器成為Slave;
??2 當前服務器根據自己是否保存Master runid來判斷是否是第一次復制,如果是第一次同步則跳轉到3,否則跳轉到4;
??3 向Master發送PSYNC ? -1 命令來進行完整同步;
??4 向Master發送PSYNC runid offset;
??5 Master接收到PSYNC 命令後首先判斷runid是否和本機的id一致,如果一致則會再次判斷offset偏移量和本機的偏移量相差有沒有超過復制積壓緩沖區大小,如果沒有那麽就給Slave發送CONTINUE,此時Slave只需要等待Master傳回失去連接期間丟失的命令;
??6 如果runid和本機id不一致或者雙方offset差距超過了復制積壓緩沖區大小,那麽就會返回FULLRESYNC runid offset,Slave將runid保存起來,並進行完整同步。

Redis主從同步原理-PSYNC【轉】