什么是主從復(fù)制
1、 主從復(fù)制,是指將一臺(tái)Redis服務(wù)器的數(shù)據(jù),復(fù)制到其他的Redis服務(wù)器。
2、 前者稱為主節(jié)點(diǎn)(master),后者稱為從節(jié)點(diǎn)(slave);數(shù)據(jù)的復(fù)制是單向的,只能由主節(jié)點(diǎn)到從節(jié)點(diǎn)
默認(rèn)情況下,每臺(tái)Redis服務(wù)器都是主節(jié)點(diǎn);且一個(gè)主節(jié)點(diǎn)可以有多個(gè)從節(jié)點(diǎn)(或沒有),但一個(gè)從節(jié)點(diǎn)只有一個(gè)主
主從復(fù)制的作業(yè)主要包括
- 數(shù)據(jù)冗余:主從復(fù)制實(shí)現(xiàn)了數(shù)據(jù)的熱備份,是持久化之外的一種數(shù)據(jù)冗余方式
- 故障恢復(fù): 當(dāng)主節(jié)點(diǎn)出現(xiàn)問題時(shí),可以由從節(jié)點(diǎn)提供服務(wù),實(shí)現(xiàn)快速的故障恢復(fù);實(shí)際上是一種服務(wù)的冗余。
- 負(fù)載均衡:在主從復(fù)制的基礎(chǔ)上,配合讀寫分離,可以由主節(jié)點(diǎn)提供寫服務(wù),由從節(jié)點(diǎn)提供讀服務(wù)(即寫Redis數(shù)據(jù)時(shí)應(yīng)用連接主節(jié)點(diǎn),讀Redis數(shù)據(jù)時(shí)應(yīng)用連接從節(jié)點(diǎn)),分擔(dān)服務(wù)器負(fù)載;尤其是在寫少讀多的場(chǎng)景下,通過多個(gè)從節(jié)點(diǎn)分擔(dān)讀負(fù)載,可以大大提高Redis服務(wù)器的并發(fā)量
- 高可用基石:除了上述作用外,主從復(fù)制還是哨兵和集群能夠?qū)嵤┑幕A(chǔ),因此說主從復(fù)制是Redis高可用的基礎(chǔ)。
主從庫采用的是讀寫分離的方式

原理
分為全量復(fù)制和增量復(fù)制
全量復(fù)制:發(fā)生在第一次復(fù)制時(shí)
增量復(fù)制:只會(huì)把主從庫網(wǎng)絡(luò)斷連期間主庫收到的命令,同步給從庫全量復(fù)制的三個(gè)階段
第一階段是 主從庫建立連接、協(xié)商同步的過程
主要是為全量復(fù)制做準(zhǔn)備。從庫和主庫建立起連接,并告訴主庫即將進(jìn)行同步,主庫確認(rèn)回復(fù)后,主從庫間就可以開始同步了
具體來說,從庫給主庫發(fā)送psync命令,表示要進(jìn)行數(shù)據(jù)同步,主庫根據(jù)這個(gè)命令的參數(shù)來啟動(dòng)復(fù)制。psync命令包含了主庫的runID和復(fù)制進(jìn)度offset兩個(gè)參數(shù)。runID是每個(gè)Redis實(shí)例啟動(dòng)時(shí)都會(huì)自動(dòng)生成的一個(gè)隨機(jī)ID,用來唯一標(biāo)記這個(gè)實(shí)例。當(dāng)從庫和主庫第一次復(fù)制時(shí),因?yàn)椴恢乐鲙斓膔unID,所以將runID設(shè)為“?”。offset,此時(shí)設(shè)為-1,表示第一次復(fù)制。主庫收到psync命令后,會(huì)用fullresync響應(yīng)命令帶上兩個(gè)參數(shù),主庫的runID和主庫的復(fù)制進(jìn)度offset,返回給從庫。從庫收到響應(yīng)后,會(huì)記錄下這兩個(gè)參數(shù)。 注意:fullresync響應(yīng)表示第一次復(fù)制采用的全量復(fù)制,也就是說,主庫會(huì)把當(dāng)前所有的數(shù)據(jù)都復(fù)制給從庫
第二階段 主庫將所有數(shù)據(jù)同步給從庫
從庫收到數(shù)據(jù)后,在本地完成數(shù)據(jù)加載。這個(gè)過程依賴于內(nèi)存快照生成的RDB文件。
具體來說,主庫執(zhí)行bgsave命令,生成RDB文件,接著將文件發(fā)給從庫。從庫接收到RDB文件后,會(huì)先清空當(dāng)前數(shù)據(jù)庫,然后加載RDB文件。 這是因?yàn)閺膸煸谕ㄟ^replcaof命令開始和主庫同步前,可能保存了其他數(shù)據(jù)。為了避免之前數(shù)據(jù)的影響,從庫需要先把當(dāng)前數(shù)據(jù)庫清空。在主庫將數(shù)據(jù)同步給從庫的過程中,主庫不會(huì)被阻塞,仍然可以正常接收請(qǐng)求。否則,Redis的服務(wù)就被中斷了。但是,這些請(qǐng)求中的寫操作并沒有記錄到剛剛生成的RDB文件中。為了保證主從庫的數(shù)據(jù)一致性,主庫會(huì)在內(nèi)存中專門的relication buffer,記錄RDB文件生成后收到的所有寫操作
第三階段 主庫會(huì)把第二階段執(zhí)行過程中新收到的寫命令,再發(fā)送給從庫
具體的操作是,當(dāng)主庫完成RDB文件發(fā)送后,就會(huì)把此時(shí)replication buffer中的修改操作發(fā)送給從庫,從庫再重新執(zhí)行這些操作。
至此,主從庫就實(shí)現(xiàn)同步了