主從復(fù)制
在redis中,用戶可以通過(guò)執(zhí)行slaveof命令或者設(shè)置slaveof選項(xiàng),讓一個(gè)服務(wù)器去復(fù)制(repllcate)另一個(gè)服務(wù)器,我們稱呼被復(fù)制的服務(wù)器為主服務(wù)器(master),而對(duì)主服務(wù)進(jìn)行復(fù)制的服務(wù)器則被稱為從服務(wù)器(slave)。配置原則:配從不配主
解除主從關(guān)系命令:slaveof no one
舊版復(fù)制
Redis的復(fù)制功能分為同步(sync)和命令傳播(command propagate)兩個(gè)操作:
同步操作用于將從服務(wù)器的數(shù)據(jù)庫(kù)狀態(tài)更新至主服務(wù)器當(dāng)前所處的數(shù)據(jù)狀態(tài);
命令傳播操作則用于在主服務(wù)器的數(shù)據(jù)庫(kù)狀態(tài)被修改,導(dǎo)致主從服務(wù)器的數(shù)據(jù)庫(kù)狀態(tài)出現(xiàn)不一致時(shí),讓主從服務(wù)器的數(shù)據(jù)庫(kù)重新回到一致?tīng)顟B(tài)。
同步:
當(dāng)客戶端向服務(wù)器發(fā)送slaveof命令,要求從服務(wù)器復(fù)制主服務(wù)器時(shí),從服務(wù)器首先需要執(zhí)行同步操作,將從服務(wù)器的數(shù)據(jù)庫(kù)狀態(tài)更新至主服務(wù)器當(dāng)前所處的數(shù)據(jù)庫(kù)狀態(tài)
命令傳播
在執(zhí)行完同步操作后,主從服務(wù)器之間數(shù)據(jù)庫(kù)狀態(tài)已經(jīng)相同,但這個(gè)狀態(tài)并非一成不變,如果主服務(wù)器執(zhí)行了寫操作,那么主服務(wù)器的數(shù)據(jù)庫(kù)狀態(tài)就會(huì)修改,所以為了讓主從服務(wù)器再次回到一致?tīng)顟B(tài),主服務(wù)器需要對(duì)從服務(wù)器執(zhí)行命令傳播操作;主服務(wù)器會(huì)將自己執(zhí)行的寫命令,也即是造成主從服務(wù)器不一致的那條寫命令,發(fā)送給從服務(wù)器執(zhí)行,當(dāng)從服務(wù)器執(zhí)行了相同的寫命令后,主從服務(wù)器將再次回到一致?tīng)顟B(tài)。
舊版復(fù)制的缺陷
在redis中,從服務(wù)器對(duì)主服務(wù)器的復(fù)制可以分為以下兩種情況:
1.初次復(fù)制:從服務(wù)器以前沒(méi)有復(fù)制過(guò)任何主服務(wù)器,或者從服務(wù)器當(dāng)前要復(fù)制的主服務(wù)器和上一次復(fù)制的祝福完全不同;
2.斷線后重復(fù)制:處于命令傳播階段的主從服務(wù)器因?yàn)榫W(wǎng)絡(luò)原因而中斷了復(fù)制,但從服務(wù)器通過(guò)自動(dòng)重連接重新連接上了主服務(wù)器,并繼續(xù)復(fù)制主服務(wù)器。
SYNC命令是一個(gè)非常耗費(fèi)資源的操作,因?yàn)槊看螆?zhí)行SYNC命令,主從服務(wù)器需要執(zhí)行以下操作:
1)主服務(wù)器需要執(zhí)行BGSAVE命令來(lái)生成RDB文件,這個(gè)生成操作會(huì)耗費(fèi)主服務(wù)器大量的cpu、內(nèi)存和磁盤IO資源;
2)主服務(wù)器需要將自己生成的RDB文件發(fā)送給從服務(wù)器,這個(gè)發(fā)送操作會(huì)耗費(fèi)主從服務(wù)大量的網(wǎng)絡(luò)資源(帶寬和流量),并對(duì)主服務(wù)器響應(yīng)命令請(qǐng)求的時(shí)間產(chǎn)生影響
3)接收到RDB文件的從服務(wù)器需要載入主服務(wù)器發(fā)來(lái)的RDB文件,并且在載入期間,從服務(wù)器會(huì)因?yàn)樽枞鴽](méi)辦法處理命令請(qǐng)求。
新版復(fù)制
Redis從2.8版本開始。使用PSYNC命令替代SYNC命令來(lái)執(zhí)行復(fù)制時(shí)的同步操作 。
PSYNC命令具有完整重同步(full resynchronization)和部分同步(partial resynchronization)兩種模式:
完整重同步用于處理初次復(fù)制情況:完整重同步的執(zhí)行步驟和SYNC命令的執(zhí)行步驟基本一樣,它們都是通過(guò)讓主服務(wù)器創(chuàng)建并發(fā)送RDB文件,以及向從服務(wù)器發(fā)送保存在緩沖區(qū)里面的寫命令來(lái)進(jìn)行同步;
部分重同步則用于處理斷線后重復(fù)制情況:當(dāng)從服務(wù)器在斷線后重新連接主服務(wù)器時(shí),如果條件允許,主服務(wù)器可以將主從服務(wù)器連接斷開期間執(zhí)行的寫命令發(fā)送給從服務(wù)器,從服務(wù)器只要接收并執(zhí)行這些命令,就可以將數(shù)據(jù)庫(kù)更新至主服務(wù)器當(dāng)前所處的狀態(tài)
部分重同步的實(shí)現(xiàn),由以下三個(gè)部分構(gòu)成:
1.主服務(wù)器的復(fù)制偏移量(replication offset)和從服務(wù)器的復(fù)制偏移量;
2.主服務(wù)器的復(fù)制積壓緩沖區(qū)(replicaiton backlog)
3.服務(wù)器端運(yùn)行ID(run ID)