淺談Redis主從復(fù)制以及主從復(fù)制原理
面臨問題
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ī)器。
解決辦法
要實(shí)現(xiàn)分布式數(shù)據(jù)庫的更大的存儲容量和承受高并發(fā)訪問量,我們會將原來集中式數(shù)據(jù)庫的數(shù)據(jù)分別存儲到其他多個網(wǎng)絡(luò)節(jié)點(diǎn)上。Redis 為了解決這個單一節(jié)點(diǎn)的問題,也會把數(shù)據(jù)復(fù)制多個副本部署到其他節(jié)點(diǎn)上進(jìn)行復(fù)制,實(shí)現(xiàn) Redis 的高可用,實(shí)現(xiàn)對數(shù)據(jù)的冗余備份,從而保證數(shù)據(jù)和服務(wù)的高可用。
主從復(fù)制
主從復(fù)制,是指將一臺 Redis 服務(wù)器的數(shù)據(jù),復(fù)制到其他的 Redis 服務(wù)器。前者稱為主節(jié)點(diǎn)(master),后者稱為從節(jié)點(diǎn)(slave),數(shù)據(jù)的復(fù)制是單向的,只能由主節(jié)點(diǎn)到從節(jié)點(diǎn)。默認(rèn)情況下,每臺 Redis 服務(wù)器都是主節(jié)點(diǎn);且一個主節(jié)點(diǎn)可以有多個從節(jié)點(diǎn)(或沒有從節(jié)點(diǎn)),但一個從節(jié)點(diǎn)只能有一個主節(jié)點(diǎn)。

主從復(fù)制的作用
1. 數(shù)據(jù)冗余:主從復(fù)制實(shí)現(xiàn)了數(shù)據(jù)的熱備份,是持久化之外的一種數(shù)據(jù)冗余方式。
2. 故障恢復(fù):當(dāng)主節(jié)點(diǎn)出現(xiàn)問題時,可以由從節(jié)點(diǎn)提供服務(wù),實(shí)現(xiàn)快速的故障恢復(fù);實(shí)際上是一種服務(wù)的冗余。
3. 負(fù)載均衡:在主從復(fù)制的基礎(chǔ)上,配合讀寫分離,可以由主節(jié)點(diǎn)提供寫服務(wù),由從節(jié)點(diǎn)提供讀服務(wù)(即寫 Redis 數(shù)據(jù)時應(yīng)用連接主節(jié)點(diǎn),讀 Redis 數(shù)據(jù)時應(yīng)用連接從節(jié)點(diǎn)),分擔(dān)服務(wù)器負(fù)載;尤其是在寫少讀多的場景下,通過多個從節(jié)點(diǎn)分擔(dān)讀負(fù)載,可以大大提高 Redis 服務(wù)器的并發(fā)量。
4. 讀寫分離:可以用于實(shí)現(xiàn)讀寫分離,主庫寫、從庫讀,讀寫分離不僅可以提高服務(wù)器的負(fù)載能力,同時可根據(jù)需求的變化,改變從庫的數(shù)量;
5. 高可用基石:除了上述作用以外,主從復(fù)制還是哨兵和集群能夠?qū)嵤┑幕A(chǔ),因此說主從復(fù)制是 Redis 高可用的基礎(chǔ)。
主從復(fù)制啟用
從節(jié)點(diǎn)開啟主從復(fù)制,有 3 種方式:
1. 配 置 文 件 : 在 從 服 務(wù) 器 的 配 置 文 件 中 加 入 : slaveof <masterip>
<masterport>
2. 啟動命令: redis-server 啟 動 命 令 后 加 入 --slaveof <masterip>
<masterport>
3. 客戶端命令: Redis 服務(wù)器啟動后,直接通過客戶端執(zhí)行命令:slaveof
<masterip>
<masterport>,則該 Redis 實(shí)例成為從節(jié)點(diǎn)。
通過 info replication 命令可以看到復(fù)制的一些信息主從復(fù)制原理主從復(fù)制過程大體可以分為 3 個階段:連接建立階段(即準(zhǔn)備階段)、數(shù)據(jù)同步階段、命令傳播階段。在從節(jié)點(diǎn)執(zhí)行 slaveof 命令后,復(fù)制過程便開始運(yùn)作,下面圖示大概可以看到,從圖中可以看出復(fù)制過程大致分為 6 個過程

主從配置之后的日志記錄也可以看出這個流程
1)保存主節(jié)點(diǎn)(master)信息。執(zhí)行 slaveof 后 Redis 會打印如下日志:

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

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

如果從節(jié)點(diǎn)無法建立連接,定時任務(wù)會無限重試直到連接成功或者執(zhí)行 slaveof no one 取消復(fù)制關(guān)于連接失敗,可以在從節(jié)點(diǎn)執(zhí)行 info replication 查看master_link_down_since_seconds 指標(biāo),它會記錄與主節(jié)點(diǎn)連接失敗的系統(tǒng)時間。從節(jié)點(diǎn)連接主節(jié)點(diǎn)失敗時也會每秒打印如下日志,方便發(fā)現(xiàn)問題:
# Error condition on socketforSYNC: {socket_error_reason}
3)發(fā)送 ping 命令。
連接建立成功后從節(jié)點(diǎn)發(fā)送 ping 請求進(jìn)行首次通信,ping 請求主要目的如下:
- 檢測主從之間網(wǎng)絡(luò)套接字是否可用。
- 檢測主節(jié)點(diǎn)當(dāng)前是否可接受處理命令。
如果發(fā)送 ping 命令后,從節(jié)點(diǎn)沒有收到主節(jié)點(diǎn)的 pong 回復(fù)或者超時,比如網(wǎng)絡(luò)超時或者主節(jié)點(diǎn)正在阻塞無法響應(yīng)命令,從節(jié)點(diǎn)會斷開復(fù)制連接,下次定時任務(wù)會發(fā)起重連


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

4)權(quán)限驗證。如果主節(jié)點(diǎn)設(shè)置了 requirepass 參數(shù),則需要密碼驗證,從節(jié)點(diǎn)必須配置 masterauth 參數(shù)保證與主節(jié)點(diǎn)相同的密碼才能通過驗證;如果驗證失敗復(fù)制將終止,從節(jié)點(diǎn)重新發(fā)起復(fù)制流程。
5)同步數(shù)據(jù)集。主從復(fù)制連接正常通信后,對于首次建立復(fù)制的場景,主節(jié)點(diǎn)會把持有的數(shù)據(jù)全部發(fā)送給從節(jié)點(diǎn),這部分操作是耗時最長的步驟。
6)命令持續(xù)復(fù)制。當(dāng)主節(jié)點(diǎn)把當(dāng)前的數(shù)據(jù)同步給從節(jié)點(diǎn)后,便完成了復(fù)制的建立流程。接下來主節(jié)點(diǎn)會持續(xù)地把寫命令發(fā)送給從節(jié)點(diǎn),保證主從數(shù)據(jù)一致性。
以上就是淺談Redis主從復(fù)制以及主從復(fù)制原理的詳細(xì)內(nèi)容,更多關(guān)于Redis主從復(fù)制以及主從復(fù)制原理的資料請關(guān)注腳本之家其它相關(guān)文章!
相關(guān)文章
Redis 實(shí)現(xiàn)消息隊列實(shí)際案例
文章探討Redis作為消息隊列的三大核心方案(List、Pub/Sub、Stream)及適用場景,分析了輕量部署、高性能、多語言支持等優(yōu)勢,指出Stream在可靠性、消息確認(rèn)、死信隊列等企業(yè)級需求上表現(xiàn)最佳,適合電商等高吞吐場景,并提供了實(shí)際應(yīng)用案例與優(yōu)化建議,感興趣的朋友一起看看吧2025-09-09
Windows安裝Redis的幾種方式與測試流程總結(jié)
本文系統(tǒng)梳理了在 Windows 系統(tǒng)上安裝和使用 Redis 的多種方式,涵蓋通過端口號識別運(yùn)行中的 Redis 實(shí)例、進(jìn)程定位方法,并提供了 Java 環(huán)境下的連接與測試示例,同時還介紹了常見的圖形化管理工具,便于可視化管理與調(diào)試,需要的朋友可以參考下2025-05-05
Windows系統(tǒng)安裝Redis的詳細(xì)圖文教程
但有時候想在windows下折騰下Redis,那么就可以參考下面的方法了,雖然腳本之家小編以前整理了一些,發(fā)現(xiàn)這篇做的比較詳細(xì),下載也給出來了2018-08-08
淺談redis的過期時間設(shè)置和過期刪除機(jī)制
本文主要介紹了redis的過期時間設(shè)置和過期刪除機(jī)制,文中通過示例代碼介紹的非常詳細(xì),具有一定的參考價值,感興趣的小伙伴們可以參考一下2022-03-03
關(guān)于redis可視化工具讀取數(shù)據(jù)亂碼問題
大家來聊一聊在日常操作redis時用的是什么工具,redis提供的一些命令你都了解了嗎,今天通過本文給大家介紹redis可視化工具讀取數(shù)據(jù)亂碼問題,感興趣的朋友跟隨小編一起看看吧2021-07-07
redis快速部署為docker容器的方法實(shí)現(xiàn)
部署 Redis 作為 Docker 容器是一種快速、靈活且可重復(fù)使用的方式,特別適合開發(fā)、測試和部署環(huán)境,本文主要介紹了redis快速部署為docker容器的方法實(shí)現(xiàn),具有一定的參考價值,感興趣的可以了解一下2024-05-05

