Redis 主從復(fù)制原理

作者:LoyaltyLu

鏈接:https://segmentfault.com/a/1190000018268350

Redis是一個開源的使用ANSI C語言編寫、支持網(wǎng)絡(luò)、可基于內(nèi)存亦可持久化的日志型、Key-Value數(shù)據(jù)庫,并提供多種語言的API。從2010年3月15日起,Redis的開發(fā)工作由VMware主持。從2013年5月開始,Redis的開發(fā)由Pivotal贊助。

概述

在現(xiàn)有企業(yè)中80%公司大部分使用的是redis單機(jī)服務(wù),在實際的場景當(dāng)中單一節(jié)點的redis容易面臨風(fēng)險。

面臨問題

1、機(jī)器故障。我們部署到一臺 Redis 服務(wù)器,當(dāng)發(fā)生機(jī)器故障時,需要遷移到另外一臺服務(wù)器并且要保證數(shù)據(jù)是同步的。而數(shù)據(jù)是最重要的,如果你不在乎,基本上也就不會使用 Redis 了。

2、容量瓶頸。當(dāng)我們有需求需要擴(kuò)容 Redis 內(nèi)存時,從 16G 的內(nèi)存升到 64G,單機(jī)肯定是滿足不了。當(dāng)然,你可以重新買個 128G 的新機(jī)器。

解決辦法

要實現(xiàn)分布式數(shù)據(jù)庫的更大的存儲容量和承受高并發(fā)訪問量,我們會將原來集中式數(shù)據(jù)庫的數(shù)據(jù)分別存儲到其他多個網(wǎng)絡(luò)節(jié)點上。

Redis 為了解決這個單一節(jié)點的問題,也會把數(shù)據(jù)復(fù)制多個副本部署到其他節(jié)點上進(jìn)行復(fù)制,實現(xiàn) Redis的高可用,實現(xiàn)對數(shù)據(jù)的冗余備份,從而保證數(shù)據(jù)和服務(wù)的高可用。

主從復(fù)制

什么是主從復(fù)制
image

主從復(fù)制,是指將一臺Redis服務(wù)器的數(shù)據(jù),復(fù)制到其他的Redis服務(wù)器。前者稱為主節(jié)點(master),后者稱為從節(jié)點(slave),數(shù)據(jù)的復(fù)制是單向的,只能由主節(jié)點到從節(jié)點。

默認(rèn)情況下,每臺Redis服務(wù)器都是主節(jié)點;且一個主節(jié)點可以有多個從節(jié)點(或沒有從節(jié)點),但一個從節(jié)點只能有一個主節(jié)點。

主從復(fù)制的作用

1、數(shù)據(jù)冗余:主從復(fù)制實現(xiàn)了數(shù)據(jù)的熱備份,是持久化之外的一種數(shù)據(jù)冗余方式。

2、故障恢復(fù):當(dāng)主節(jié)點出現(xiàn)問題時,可以由從節(jié)點提供服務(wù),實現(xiàn)快速的故障恢復(fù);實際上是一種服務(wù)的冗余。

3、負(fù)載均衡:在主從復(fù)制的基礎(chǔ)上,配合讀寫分離,可以由主節(jié)點提供寫服務(wù),由從節(jié)點提供讀服務(wù)(即寫Redis數(shù)據(jù)時應(yīng)用連接主節(jié)點,讀Redis數(shù)據(jù)時應(yīng)用連接從節(jié)點),分擔(dān)服務(wù)器負(fù)載;尤其是在寫少讀多的場景下,通過多個從節(jié)點分擔(dān)讀負(fù)載,可以大大提高Redis服務(wù)器的并發(fā)量。

4、讀寫分離:可以用于實現(xiàn)讀寫分離,主庫寫、從庫讀,讀寫分離不僅可以提高服務(wù)器的負(fù)載能力,同時可根據(jù)需求的變化,改變從庫的數(shù)量。

5、高可用基石:除了上述作用以外,主從復(fù)制還是哨兵和集群能夠?qū)嵤┑幕A(chǔ),因此說主從復(fù)制是Redis高可用的基礎(chǔ)。

主從復(fù)制啟用

從節(jié)點開啟主從復(fù)制,有3種方式:

1、配置文件:在從服務(wù)器的配置文件中加入 slaveof<masterip><masterport>。

2、啟動命令:redis-server啟動命令后加入 --slaveof<masterip><masterport>。

3、客戶端命令:Redis服務(wù)器啟動后,直接通過客戶端執(zhí)行命令 slaveof<masterip><masterport>,則該Redis實例成為從節(jié)點。

通過 info replication 命令可以看到復(fù)制的一些信息。

主從復(fù)制原理

主從復(fù)制過程大體可以分為3個階段:連接建立階段(即準(zhǔn)備階段)、數(shù)據(jù)同步階段、命令傳播階段。

在從節(jié)點執(zhí)行 slaveof 命令后,復(fù)制過程便開始運作,下面圖示可以看出復(fù)制過程大致分為6個過程。

image

主從配置之后的日志記錄也可以看出這個流程。

1、保存主節(jié)點(master)信息

執(zhí)行 slaveof 后 Redis 會打印如下日志:

image

2、從節(jié)點與主節(jié)點建立網(wǎng)絡(luò)連接

從節(jié)點(slave)內(nèi)部通過每秒運行的定時任務(wù)維護(hù)復(fù)制相關(guān)邏輯,當(dāng)定時任務(wù)發(fā)現(xiàn)存在新的主節(jié)點后,會嘗試與該節(jié)點建立網(wǎng)絡(luò)連接。

image

從節(jié)點與主節(jié)點建立網(wǎng)絡(luò)連接。

從節(jié)點會建立一個 socket 套接字,從節(jié)點建立了一個端口為51234的套接字,專門用于接受主節(jié)點發(fā)送的復(fù)制命令。從節(jié)點連接成功后打印如下日志:

image

如果從節(jié)點無法建立連接,定時任務(wù)會無限重試直到連接成功或者執(zhí)行 slaveofnoone 取消復(fù)制。

關(guān)于連接失敗,可以在從節(jié)點執(zhí)行 info replication 查看 master_link_down_since_seconds 指標(biāo),它會記錄與主節(jié)點連接失敗的系統(tǒng)時間。從節(jié)點連接主節(jié)點失敗時也會每秒打印如下日志,方便發(fā)現(xiàn)問題:

3、發(fā)送 ping 命令

連接建立成功后從節(jié)點發(fā)送 ping 請求進(jìn)行首次通信, ping 請求主要目的如下:

  • 檢測主從之間網(wǎng)絡(luò)套接字是否可用。

  • 檢測主節(jié)點當(dāng)前是否可接受處理命令。

如果發(fā)送 ping 命令后,從節(jié)點沒有收到主節(jié)點的 pong 回復(fù)或者超時,比如網(wǎng)絡(luò)超時或者主節(jié)點正在阻塞無法響應(yīng)命令,從節(jié)點會斷開復(fù)制連接,下次定時任務(wù)會發(fā)起重連。

image
image

從節(jié)點發(fā)送的 ping 命令成功返回,Redis 打印如下日志,并繼續(xù)后續(xù)復(fù)制流程:

image

4、權(quán)限驗證

如果主節(jié)點設(shè)置了 requirepass 參數(shù),則需要密碼驗證,從節(jié)點必須配置 masterauth 參數(shù)保證與主節(jié)點相同的密碼才能通過驗證。如果驗證失敗復(fù)制將終止,從節(jié)點重新發(fā)起復(fù)制流程。

5、同步數(shù)據(jù)集

主從復(fù)制連接正常通信后,對于首次建立復(fù)制的場景,主節(jié)點會把持有的數(shù)據(jù)全部發(fā)送給從節(jié)點,這部分操作是耗時最長的步驟。

6、命令持續(xù)復(fù)制

當(dāng)主節(jié)點把當(dāng)前的數(shù)據(jù)同步給從節(jié)點后,便完成了復(fù)制的建立流程。接下來主節(jié)點會持續(xù)地把寫命令發(fā)送給從節(jié)點,保證主從數(shù)據(jù)一致性。

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

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

  • 本篇就一下方面展開分析 如何使用主從復(fù)制? 主從復(fù)制的原理(重點是全量復(fù)制和部分復(fù)制、以及心跳機(jī)制) 實際應(yīng)用中需...
    lucode閱讀 1,069評論 0 5
  • 主從復(fù)制的作用主要包括: 1、數(shù)據(jù)冗余:主從復(fù)制實現(xiàn)了數(shù)據(jù)的熱備份,是持久化之外的一種數(shù)據(jù)冗余方式。 2、故障恢復(fù)...
    firstsecret閱讀 651評論 0 1
  • 1. 垂直水平居中 (父元素寬度、高度已知) position + margin 實現(xiàn)的效果: 解析:已知父元素寬...
    無相_庸才閱讀 768評論 0 0
  • 最近幾年有本書特別火,相信你一定有所耳聞。本書就是彼得.蒂爾的《從0到1:開啟商業(yè)與未來的秘密》。然而,這本書之所...
    城匯玩a閱讀 198評論 0 1
  • 時光荏苒、日月如梭,詠春拳在經(jīng)過了幾百年歷史的洗禮后,具有了豐富的文化內(nèi)涵,同時也創(chuàng)造出了屬于自己的輝煌。在冷兵器...
    李義軒_5112閱讀 326評論 0 0

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