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

Reids複製數據主要有2種場景: 
1. 從服務器歷來第一次和當前主服務器鏈接,即初次複製 
2. 從服務器斷線後從新和以前鏈接的主服務器恢復鏈接,即斷線後重複製 
  對於初次複製來講使用SYNC命令進行全量複製是合適高效的,可是對於斷線後重複製來講效率就不太能接受了。舉例來講: 
Redis斷線重連 
  如圖所示,Master在斷開鏈接期間只傳播了3個寫入命令,可是從新鏈接以後卻要全量複製,顯然這是低效而且不太必要的。
緩存

PSYNC概念

  爲了應對這種狀況,Redis在2.8版本提供了PSYNC命令來帶代替SYNC命令,爲Redis主從複製提供了部分複製的能力。PSYNC命令格式是:服務器

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

  PSYNC執行過程當中比較重要的概念有3個:runid、offset(複製偏移量)以及複製積壓緩衝區。spa

runid

  每一個Redis服務器都會有一個代表本身身份的ID。在PSYNC中發送的這個ID是指以前鏈接的Master的ID,若是沒保存這個ID,PSYNC的命令會使用」PSYNC ? -1」 這種形式發送給Master,表示須要全量複製。code

offset(複製偏移量)

  在主從複製的Master和Slave雙方都會各自維持一個offset。Master成功發送N個字節的命令後會將Master的offset加上N,Slave在接收到N個字節命令後一樣會將Slave的offset增長N。Master和Slave若是狀態是一致的那麼它的的offset也應該是一致的。xml

複製積壓緩衝區

  複製積壓緩衝區是由Master維護的一個固定長度的FIFO隊列,它的做用是緩存已經傳播出去的命令。當Master進行命令傳播時,不只將命令發送給全部Slave,還會將命令寫入到複製積壓緩衝區裏面。隊列

PSYNC執行過程

  理解了上面三個基本概念,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保存起來,並進行完整同步。
同步

相關文章
相關標籤/搜索