一文帶你深入理解Redis的主從架構(gòu)
Redis主從架構(gòu)概述
Redis主從架構(gòu)是一種分布式數(shù)據(jù)庫(kù)架構(gòu),它包括一個(gè)主節(jié)點(diǎn)(Master)和一個(gè)或多個(gè)從節(jié)點(diǎn)(Slave)。主節(jié)點(diǎn)處理所有寫(xiě)操作,從節(jié)點(diǎn)負(fù)責(zé)復(fù)制主節(jié)點(diǎn)的數(shù)據(jù)并處理讀請(qǐng)求。以下是主從架構(gòu)的核心組件:
主節(jié)點(diǎn)(Master):
- 主節(jié)點(diǎn)是Redis集群的核心,負(fù)責(zé)處理所有寫(xiě)操作。
- 客戶端連接到主節(jié)點(diǎn),并向其發(fā)送寫(xiě)請(qǐng)求。
- 主節(jié)點(diǎn)將寫(xiě)操作同步到所有連接的從節(jié)點(diǎn),以保持?jǐn)?shù)據(jù)一致性。
從節(jié)點(diǎn)(Slave):
- 從節(jié)點(diǎn)是主節(jié)點(diǎn)的復(fù)制品,其數(shù)據(jù)與主節(jié)點(diǎn)保持同步。
- 從節(jié)點(diǎn)可以處理讀操作,但不允許進(jìn)行寫(xiě)操作(只讀)。
- 如果主節(jié)點(diǎn)不可用,可以將從節(jié)點(diǎn)提升為新的主節(jié)點(diǎn)。
主從同步步驟
具體步驟如下:
1、從節(jié)點(diǎn)根據(jù)自身狀態(tài),發(fā)送 psync
命令給 master:
- 如果從實(shí)例從未執(zhí)行過(guò)
replicaof
,則從節(jié)點(diǎn)發(fā)送 psync ? -1,代表全量,從 -1 處開(kāi)始復(fù)制。 - 如果從節(jié)點(diǎn)之前執(zhí)行過(guò)
replicaof
,則取當(dāng)前實(shí)例中記錄下 runID和 offset,執(zhí)行命令psync <runID> <offset>
, runID 是主節(jié)點(diǎn) runID,offset 是復(fù)制偏移量。
2、主節(jié)點(diǎn)根據(jù)接收到的psync
命令及當(dāng)前服務(wù)器狀態(tài),決定執(zhí)行全量復(fù)制還是部分復(fù)制:
對(duì)比主、從節(jié)點(diǎn)的 runID 一致,且從節(jié)點(diǎn)發(fā)送
slave_repl_offset
之后的數(shù)據(jù)在repl_backlog_buffer
緩沖區(qū)中均存在(隊(duì)列是環(huán)形的,有可能被擦除重寫(xiě)了),則回復(fù) CONTINUE,代表以追加模式進(jìn)行部分復(fù)制。runID 與從節(jié)點(diǎn)發(fā)送的 runID 不同,或者從節(jié)點(diǎn)發(fā)送的
slave_repl_offset
之后的數(shù)據(jù)已不在主節(jié)點(diǎn)的repl_backlog_buffer
緩沖區(qū)中 (因?yàn)殛?duì)列是環(huán)形的,所以等待時(shí)間太長(zhǎng)或者有斷連的情況,有可能被擦除重寫(xiě)了),則回復(fù)從節(jié)點(diǎn)FULLRESYNC <runid> <offset>
,表示要進(jìn)行全量復(fù)制,同時(shí)記下主節(jié)點(diǎn)的 runID 和offset。日志如下:
repl_backlog_buffer
:它是為了從庫(kù)斷開(kāi)之后,如何找到主從差異數(shù)據(jù)而設(shè)計(jì)的環(huán)形緩沖區(qū),從而避免全量復(fù)制帶來(lái)的性能開(kāi)銷(xiāo)。如果從庫(kù)斷開(kāi)時(shí)間太久,repl_backlog_buffer環(huán)形緩沖區(qū)被主庫(kù)的寫(xiě)命令覆蓋了,那么從庫(kù)連上主庫(kù)后只能乖乖地進(jìn)行一次全量復(fù)制,所以repl_backlog_buffer配置盡量大一些,可以降低主從斷開(kāi)后全量復(fù)制的概率。而在repl_backlog_buffer
中找主從差異的數(shù)據(jù)后,如何發(fā)給從庫(kù)呢?這就用到了replication buffer
。
replication buffer
:Redis和客戶端通信也好,和從庫(kù)通信也好,Redis都需要給分配一個(gè) 內(nèi)存buffer進(jìn)行數(shù)據(jù)交互,客戶端是一個(gè)client,從庫(kù)也是一個(gè)client,我們每個(gè)client連上Redis后,Redis都會(huì)分配一個(gè)client buffer,所有數(shù)據(jù)交互都是通過(guò)這個(gè)buffer進(jìn)行的:Redis先把數(shù)據(jù)寫(xiě)到這個(gè)buffer中,然后再把buffer中的數(shù)據(jù)發(fā)到client socket中再通過(guò)網(wǎng)絡(luò)發(fā)送出去,這樣就完成了數(shù)據(jù)交互。所以主從在增量同步時(shí),從庫(kù)作為一個(gè)client,也會(huì)分配一個(gè)buffer,只不過(guò)這個(gè)buffer專(zhuān)門(mén)用來(lái)傳播用戶的寫(xiě)命令到從庫(kù),保證主從數(shù)據(jù)一致,我們通常把它叫做replication buffer
。
repl_backlog_size
環(huán)形緩沖區(qū)寫(xiě)滿之后,從庫(kù)是會(huì)丟失掉那部分被覆蓋掉的數(shù)據(jù),還是直接進(jìn)行全量復(fù)制
- 一個(gè)從庫(kù)如果和主庫(kù)斷連時(shí)間過(guò)長(zhǎng),造成它在主庫(kù)
repl_backlog_buffer
的slave_repl_offset
位置上的數(shù)據(jù)已經(jīng)被覆蓋掉了,此時(shí)從庫(kù)和主庫(kù)間將進(jìn)行全量復(fù)制。 - 每個(gè)從庫(kù)會(huì)記錄自己的
slave_repl_offset
,每個(gè)從庫(kù)的復(fù)制進(jìn)度也不一定相同。在和主庫(kù)重連進(jìn)行恢復(fù)時(shí),從庫(kù)會(huì)通過(guò)psync命令把自己記錄的slave_repl_offset
發(fā)給主庫(kù),主庫(kù)會(huì)根據(jù)從庫(kù)各自的復(fù)制進(jìn)度,來(lái)決定這個(gè)從庫(kù)可以進(jìn)行增量復(fù)制,還是全量復(fù)制。
主從架構(gòu)的優(yōu)勢(shì)
Redis主從架構(gòu)具有多個(gè)關(guān)鍵優(yōu)勢(shì):
高可用性:通過(guò)故障轉(zhuǎn)移機(jī)制,Redis主從架構(gòu)提供了高可用性。如果主節(jié)點(diǎn)出現(xiàn)故障,可以快速切換到一個(gè)從節(jié)點(diǎn),幾乎沒(méi)有停機(jī)時(shí)間。
讀寫(xiě)分離:Redis主從架構(gòu)允許從節(jié)點(diǎn)處理讀操作,從而減輕了主節(jié)點(diǎn)的讀負(fù)載,提高了整體性能。
數(shù)據(jù)冗余:從節(jié)點(diǎn)是主節(jié)點(diǎn)的復(fù)制,提供了數(shù)據(jù)冗余。即使主節(jié)點(diǎn)出現(xiàn)問(wèn)題,數(shù)據(jù)仍然可用。
靈活性:可以根據(jù)需要擴(kuò)展從節(jié)點(diǎn),以處理更多的讀請(qǐng)求,從而提高系統(tǒng)的擴(kuò)展性。
如何搭建Redis主從架構(gòu)
本地搭建可以參考:Docker Compose搭建Redis主從復(fù)制環(huán)境的實(shí)現(xiàn)步驟_docker_腳本之家 (jb51.net)
要搭建Redis主從架構(gòu),需要執(zhí)行以下步驟:
安裝和配置Redis:在主節(jié)點(diǎn)和從節(jié)點(diǎn)上安裝Redis,并配置它們的
redis.conf
文件,確保允許數(shù)據(jù)復(fù)制。啟動(dòng)主節(jié)點(diǎn):首先啟動(dòng)主節(jié)點(diǎn),確保其正常運(yùn)行。
啟動(dòng)從節(jié)點(diǎn):?jiǎn)?dòng)從節(jié)點(diǎn),并在配置文件中指定主節(jié)點(diǎn)的IP地址和端口。這個(gè)跟MySQL很類(lèi)似。
replicaof <masterip> <masterport>
數(shù)據(jù)同步:從節(jié)點(diǎn)會(huì)自動(dòng)連接到主節(jié)點(diǎn)并請(qǐng)求數(shù)據(jù)復(fù)制。可以使用
INFO replication
命令檢查復(fù)制狀態(tài)。測(cè)試和監(jiān)控:驗(yàn)證主從架構(gòu)是否正常工作,監(jiān)控主節(jié)點(diǎn)和從節(jié)點(diǎn)的性能和狀態(tài)。
結(jié)論
Redis主從架構(gòu)是一種強(qiáng)大的架構(gòu)模式,可用于提高Redis數(shù)據(jù)庫(kù)的可用性、性能和可擴(kuò)展性。它通過(guò)將寫(xiě)操作集中在主節(jié)點(diǎn)上,同時(shí)允許多個(gè)從節(jié)點(diǎn)處理讀操作,為應(yīng)對(duì)高負(fù)載和故障提供了解決方案。通過(guò)了解Redis主從架構(gòu)的工作原理和配置方法,可以更好地利用Redis來(lái)構(gòu)建強(qiáng)大的應(yīng)用程序和服務(wù)。
以上就是一文帶你深入理解Redis的主從架構(gòu)的詳細(xì)內(nèi)容,更多關(guān)于Redis主從架構(gòu)的資料請(qǐng)關(guān)注腳本之家其它相關(guān)文章!
相關(guān)文章
Spring?redis使用報(bào)錯(cuò)Read?timed?out排查及解決過(guò)程
項(xiàng)目使用spring集成redis,偶爾會(huì)出現(xiàn)read timed out的情況,剛開(kāi)始以為是網(wǎng)絡(luò)不穩(wěn)定引起的,后面發(fā)現(xiàn)影響業(yè)務(wù)測(cè)試的準(zhǔn)確性,這篇文章主要給大家介紹了關(guān)于Spring redis使用報(bào)錯(cuò)Read timed out排查及解決過(guò)程的相關(guān)資料,需要的朋友可以參考下2024-02-02redis事務(wù)_動(dòng)力節(jié)點(diǎn)Java學(xué)院整理
這篇文章主要介紹了redis事務(wù),小編覺(jué)得挺不錯(cuò)的,現(xiàn)在分享給大家,也給大家做個(gè)參考。一起跟隨小編過(guò)來(lái)看看吧2017-08-08Redis筆記點(diǎn)贊排行榜的實(shí)現(xiàn)示例
探店筆記類(lèi)似點(diǎn)評(píng)網(wǎng)站的評(píng)價(jià),本文主要介紹了Redis筆記點(diǎn)贊排行榜的實(shí)現(xiàn)示例,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧2023-01-01Govern Service 基于 Redis 的服務(wù)治理平臺(tái)安裝過(guò)程詳解
Govern Service 是一個(gè)輕量級(jí)、低成本的服務(wù)注冊(cè)、服務(wù)發(fā)現(xiàn)、 配置服務(wù) SDK,通過(guò)使用現(xiàn)有基礎(chǔ)設(shè)施中的 Redis 不用給運(yùn)維部署帶來(lái)額外的成本與負(fù)擔(dān),接下來(lái)通過(guò)本文給大家分享Govern Service 基于 Redis 的服務(wù)治理平臺(tái)的相關(guān)知識(shí),感興趣的朋友一起看看吧2021-05-05Redis特殊數(shù)據(jù)類(lèi)型HyperLogLog基數(shù)統(tǒng)計(jì)算法講解
這篇文章主要為大家介紹了Redis特殊數(shù)據(jù)類(lèi)型HyperLogLog基數(shù)統(tǒng)計(jì)算法講解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪2022-05-05Redis 的查詢很快的原因解析及Redis 如何保證查詢的高效
由于redis是內(nèi)存數(shù)據(jù)庫(kù),歸功于它的數(shù)據(jù)結(jié)構(gòu)所以查詢效率非常高,今天通過(guò)本文給大家介紹下Redis 的查詢很快的原因解析及Redis 如何保證查詢的高效,感興趣的朋友一起看看吧2022-03-03詳解redis數(shù)據(jù)結(jié)構(gòu)之sds
sds是Simple Dynamic String的縮寫(xiě),譯為簡(jiǎn)單動(dòng)態(tài)字符串,redis使用該結(jié)構(gòu)保存字符串,不同于c中的字符串,redis使用該結(jié)構(gòu)來(lái)更方便的進(jìn)行字符串的處理,需要的朋友可以參考下2017-05-05Redis 緩存實(shí)現(xiàn)存儲(chǔ)和讀取歷史搜索關(guān)鍵字的操作方法
這篇文章主要介紹了Redis 緩存實(shí)現(xiàn)存儲(chǔ)和讀取歷史搜索關(guān)鍵字,本文通過(guò)實(shí)例代碼給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下2020-12-12redis鍵值出現(xiàn)\xac\xed\x00\x05t\x00&的問(wèn)題及解決
這篇文章主要介紹了redis鍵值出現(xiàn)\xac\xed\x00\x05t\x00&的問(wèn)題及解決方案,具有很好的參考價(jià)值,希望對(duì)大家有所幫助,如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2023-07-07