- 成為從服務(wù)器的命令:
SLAVEOF
復(fù)制功能分為 同步
+ 命令傳播
同步
:將從服務(wù)器的狀態(tài)更新到主服務(wù)器的狀態(tài)(只在建立連接的時候)
命令傳播
:同步完成之后辆布,主服務(wù)器接收到命令,導(dǎo)致的主從雙方不一致的情況茶鉴,通過命令的傳播來維持主從的一致性
同步功能的實現(xiàn)
-
SYNC命令
(舊版本的復(fù)制功能)=完整的重同步 -
PSYNC命令
(新版本的復(fù)制功能)=完整重同步+部分重同步
舊版的SYNC操作
- 從服務(wù)器發(fā)送SYNC命令
- 主服務(wù)器收到SYNC命令后锋玲,執(zhí)行BGSAVE命令,生成RDB文件(這個RDB文件僅記錄到執(zhí)行BGSAVE命令時的數(shù)據(jù)庫狀態(tài))蛤铜,
并且創(chuàng)建一個緩存區(qū)將從現(xiàn)在開始的寫命令寫進來
- 從服務(wù)器加載RDB文件嫩絮,恢復(fù)到主服務(wù)器開始BGSAVE時的狀態(tài)
- 主服務(wù)器將緩沖區(qū)的命令發(fā)送給從服務(wù)器,保證生成RDB文件時的寫命令也能被完整執(zhí)行
舊版SYNC的缺點
:只有單純的完整重同步導(dǎo)致斷開連接后重連上來的從服務(wù)器也必須要讓主服務(wù)器重新生成RDB文件围肥。
1.生成RDB文件影響性能
2. 傳輸RDB文件增加網(wǎng)絡(luò)負(fù)擔(dān)
所以在新版本的PSYNC命令
中增加了部分重同步
的操作
新版的PSYNC
從服務(wù)器斷開連接后重新連接的主服務(wù)器如果還是原來的那臺剿干,并且中間兩者相差的命令查的不多,可以僅對中間相差的命令做部分的重同步
- 主從服務(wù)器各自維護一個偏移量offset
- 主服務(wù)器每次向從服務(wù)器復(fù)制N個字節(jié)的數(shù)據(jù)時穆刻,就將自己的offset增加N
- 從服務(wù)器接收到N個字節(jié)的數(shù)據(jù)時置尔,就將自己的offset增加N
- 通過這兩個offset就可以知道主從服務(wù)器之間相差的偏差了
PSYNC的復(fù)制積壓緩存區(qū)
:主服務(wù)器維護一個先進先出(FIFO)的固定長度的隊列(默認(rèn)1MB),主服務(wù)器在復(fù)制給從服務(wù)器的時候,也會往這個隊列里面存放數(shù)據(jù)氢伟。其中每一個字節(jié)都有對應(yīng)的偏移量offset(和主從服務(wù)器維護的offset一個概念)
- 當(dāng)PSYNC命令時榜轿,發(fā)現(xiàn)主從服務(wù)器有偏差,并且從服務(wù)器當(dāng)前的offset還在這個
復(fù)制積壓緩存區(qū)
的話朵锣,就可以使用部分重同步
了
PSYNC命令 PYSNC <runid> <offset>
runid:本從服務(wù)器上次同步的主服務(wù)id,用來比較是不是斷開前連接的是本主服務(wù)器谬盐,如果不是,直接完整重同步
offset:從服務(wù)器當(dāng)前的offset,用來判斷是否使用部分重同步
復(fù)制的實現(xiàn)步驟
- 設(shè)置需要同步的主服務(wù)器
SLAVEOFip
port
- 建立socket
- 發(fā)送PING命令確認(rèn)連接是否正常
- 身份驗證
- 發(fā)送端口命令 --告訴主服務(wù)器自己的監(jiān)聽端口(不知道啥作用)
- 同步 PSYNC
- 命令傳播
- 心跳檢測
- 檢查網(wǎng)絡(luò)連接狀態(tài)
- 檢測命令丟失(傳遞offset)
- 輔助實現(xiàn) min-slaves (還不知道怎么實現(xiàn))