搞懂Redis (七) - 主從復(fù)制

什么是主從復(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ǔ)。

主從庫采用的是讀寫分離的方式


讀寫分離的主從庫方案
  1. 原理
    分為全量復(fù)制和增量復(fù)制
    全量復(fù)制:發(fā)生在第一次復(fù)制時(shí)
    增量復(fù)制:只會(huì)把主從庫網(wǎng)絡(luò)斷連期間主庫收到的命令,同步給從庫

  2. 全量復(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)同步了

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

  • 一、Redis主從復(fù)制 主從復(fù)制:主節(jié)點(diǎn)負(fù)責(zé)寫數(shù)據(jù),從節(jié)點(diǎn)負(fù)責(zé)讀數(shù)據(jù),主節(jié)點(diǎn)定期把數(shù)據(jù)同步到從節(jié)點(diǎn)保證數(shù)據(jù)的一致性...
    愛情小傻蛋閱讀 1,096評(píng)論 0 0
  • 一、主從復(fù)制說明 1.1、面臨問題 在實(shí)際的場(chǎng)景當(dāng)中單一節(jié)點(diǎn)的redis容易面臨風(fēng)險(xiǎn)。比如: 機(jī)器故障:我們部署一...
    心似南風(fēng)閱讀 1,083評(píng)論 0 1
  • 1. 基礎(chǔ)概念 主從模式(master-slave):備份數(shù)據(jù)、負(fù)載均衡,一個(gè)主節(jié)點(diǎn)可以有多個(gè)從節(jié)點(diǎn),一個(gè)從節(jié)點(diǎn)只...
    坤坤坤坤楊閱讀 483評(píng)論 0 0
  • 本篇主要分三部分討論Redis主從復(fù)制的實(shí)現(xiàn)原理:主從復(fù)制過程、狀態(tài)機(jī)、源碼解析。Redis從節(jié)點(diǎn)使用了狀態(tài)機(jī)機(jī)制...
    JBryan閱讀 984評(píng)論 0 0
  • 主從復(fù)制概述 有了 RDB 和 AOF 再也不怕宕機(jī)丟失數(shù)據(jù)了,但是 Redis 實(shí)例宕機(jī)了怎么實(shí)現(xiàn)高可用呢?既然...
    匠丶閱讀 243評(píng)論 0 0

友情鏈接更多精彩內(nèi)容