第九章:Redis replication 主從復(fù)制

什么是主從復(fù)制

  1. 一個(gè)master可以有多個(gè)slave
  2. 一個(gè)slave只能有一個(gè)master
  3. 數(shù)據(jù)流是單向的,master到slave

全量復(fù)制和部分復(fù)制

run id 查看復(fù)制偏移量(用來(lái)比對(duì)兩邊數(shù)據(jù)同步問(wèn)題,相差不能太大)
  1. 插一個(gè)命令redis-cli -p 6379 info server | grep run查看redis運(yùn)行id
    image.png
  2. 查看復(fù)制偏移量


    image.png
全量復(fù)制

在Redis復(fù)制的基礎(chǔ)上,使用和配置主從復(fù)制非常簡(jiǎn)單,它允許從屬Redis服務(wù)器成為主服務(wù)器的精確副本。每次鏈路斷開(kāi)時(shí),從設(shè)備將自動(dòng)重新連接到主設(shè)備,無(wú)論主設(shè)備發(fā)生什么情況,都將試圖成為主設(shè)備的精確副本。

這個(gè)系統(tǒng)使用三個(gè)主要機(jī)制:

  1. 當(dāng)主和從實(shí)例連接良好時(shí),主設(shè)備通過(guò)發(fā)送命令流來(lái)保持從設(shè)備更新,以便復(fù)制對(duì)主數(shù)據(jù)集中發(fā)生的數(shù)據(jù)集的影響:客戶機(jī)寫入,密鑰過(guò)期或被驅(qū)逐等等。
  2. 當(dāng)主站和從站之間的鏈路斷開(kāi)時(shí),對(duì)于網(wǎng)絡(luò)問(wèn)題或者由于在主站或從站中感測(cè)到超時(shí),從站重新連接并嘗試進(jìn)行部分重新同步:這意味著它將嘗試只獲取部分在斷開(kāi)連接時(shí)錯(cuò)過(guò)的命令流。
  3. 當(dāng)部分重新同步不可能時(shí),從機(jī)將要求完全重新同步。這將涉及一個(gè)更復(fù)雜的過(guò)程,在這個(gè)過(guò)程中,主機(jī)需要?jiǎng)?chuàng)建所有數(shù)據(jù)的快照,將數(shù)據(jù)發(fā)送給從機(jī),然后在數(shù)據(jù)集更改時(shí)繼續(xù)發(fā)送命令流。

Redis默認(rèn)使用異步復(fù)制,這是高延遲和高性能,是絕大多數(shù)Redis用例的自然復(fù)制模式。 但是,Redis從站會(huì)異步確認(rèn)主站定期收到的數(shù)據(jù)量。

某些數(shù)據(jù)的同步復(fù)制可以由客戶端使用WAIT命令來(lái)請(qǐng)求。 但WAIT只能確保在其他Redis實(shí)例中具有指定數(shù)量的已確認(rèn)副本:在故障轉(zhuǎn)移期間出于不同原因的故障轉(zhuǎn)移期間,確認(rèn)寫入仍可能丟失,或取決于Redis持久性的確切配置。 您可以檢查Sentinel或Redis群集文檔以獲取有關(guān)高可用性和故障轉(zhuǎn)移的更多信息。 本文的其余部分主要描述了Redis基本復(fù)制的基本特征。

以下是關(guān)于Redis復(fù)制的一些非常重要的事實(shí):

  • Redis使用異步復(fù)制,異步從到主機(jī)確認(rèn)處理的數(shù)據(jù)量。

  • 主人可以有多個(gè)奴隸。

  • 從站能夠接受來(lái)自其他從站的連接。除了將多個(gè)從站連接到同一個(gè)主站之外,從站也可以以層疊狀結(jié)構(gòu)連接到其他從站。自從Redis 4.0以來(lái),所有的子從服務(wù)器都會(huì)收到與主服務(wù)器完全相同的復(fù)制流。

  • Redis復(fù)制在主端是非阻塞的。這意味著當(dāng)一個(gè)或多個(gè)從機(jī)執(zhí)行初始同步或部分重新同步時(shí),主機(jī)將繼續(xù)處理查詢。

  • 復(fù)制在很大程度上也是非阻塞的。從服務(wù)器執(zhí)行初始同步時(shí),它可以使用舊版本的數(shù)據(jù)集處理查詢,假定您在redis.conf中配置了Redis。否則,如果復(fù)制流已關(guān)閉,則可以將Redis從屬程序配置為向客戶端返回錯(cuò)誤。但是,在初始同步之后,必須刪除舊數(shù)據(jù)集,并且必須加載新數(shù)據(jù)集。從站將在這個(gè)簡(jiǎn)短的窗口中阻塞傳入的連接(對(duì)于非常大的數(shù)據(jù)集可能只有很多秒)。自Redis 4.0以來(lái),可以配置Redis,以便舊數(shù)據(jù)集的刪除發(fā)生在不同的線程中,但是加載新的初始數(shù)據(jù)集仍然會(huì)在主線程中發(fā)生并阻止從屬。

  • 復(fù)制既可用于可伸縮性,也可用于只讀查詢的多個(gè)從站(例如,可將低速O(N)操作卸載到從站),或者僅用于數(shù)據(jù)安全。

  • 可以使用復(fù)制來(lái)避免讓主服務(wù)器將完整數(shù)據(jù)集寫入磁盤的成本:一種典型的技術(shù)包括配置主服務(wù)器redis.conf以避免永久保存到磁盤,然后連接配置為不時(shí)保存的從服務(wù)器或啟用AOF。然而,這個(gè)設(shè)置必須小心處理,因?yàn)橹匦聠?dòng)的主設(shè)備將從一個(gè)空數(shù)據(jù)集開(kāi)始:如果從設(shè)備嘗試與其同步,則從設(shè)備也將被清空。

當(dāng)master宕機(jī)的復(fù)制安全

在使用Redis復(fù)制的設(shè)置中,強(qiáng)烈建議在主服務(wù)器和從服務(wù)器中啟用持久性。如果這種情況不可行,例如由于磁盤速度非常慢導(dǎo)致的延遲問(wèn)題,則應(yīng)配置實(shí)例以避免重新啟動(dòng)后自動(dòng)重新啟動(dòng)。

為了更好地理解關(guān)閉配置為自動(dòng)重啟的主設(shè)備是否危險(xiǎn)的原因,請(qǐng)檢查以下故障模式,其中數(shù)據(jù)從主設(shè)備及其所有從設(shè)備擦除:

  1. 我們有一個(gè)設(shè)置,節(jié)點(diǎn)A作為主節(jié)點(diǎn),持久性關(guān)閉,節(jié)點(diǎn)B和C從節(jié)點(diǎn)A復(fù)制。
  2. 節(jié)點(diǎn)A崩潰,但它有一些自動(dòng)重新啟動(dòng)系統(tǒng),重新啟動(dòng)過(guò)程。但是由于持久性被關(guān)閉,節(jié)點(diǎn)將重新啟動(dòng)一個(gè)空的數(shù)據(jù)集。
  3. 節(jié)點(diǎn)B和C將從節(jié)點(diǎn)A復(fù)制,節(jié)點(diǎn)A是空的,所以它們將有效地銷毀它們的數(shù)據(jù)副本。
    當(dāng)Redis Sentinel用于高可用性時(shí),關(guān)閉主服務(wù)器上的持久性以及進(jìn)程的自動(dòng)重啟也是危險(xiǎn)的。例如,主機(jī)可以很快重啟,Sentinel不會(huì)檢測(cè)到故障,以便發(fā)生上述故障模式。

每次數(shù)據(jù)安全很重要,復(fù)制與配置為無(wú)持久性的主站一起使用時(shí),應(yīng)禁用實(shí)例的自動(dòng)重啟。

當(dāng)Redis Sentinel用于高可用性時(shí),關(guān)閉主服務(wù)器上的持久性以及進(jìn)程的自動(dòng)重啟也是危險(xiǎn)的。 例如,主機(jī)可以很快重啟,Sentinel不會(huì)檢測(cè)到故障,以便發(fā)生上述故障模式。

每次數(shù)據(jù)安全很重要,復(fù)制與配置為無(wú)持久性的主站一起使用時(shí),應(yīng)禁用實(shí)例的自動(dòng)重啟。

Redis復(fù)制如何工作

每個(gè)Redis master都有一個(gè)復(fù)制ID:它是一個(gè)大的偽隨機(jī)字符串,標(biāo)記數(shù)據(jù)集的給定故事。 每個(gè)主設(shè)備也會(huì)獲得一個(gè)偏移量,該設(shè)置為生成的每個(gè)復(fù)制流字節(jié)增加以發(fā)送到從設(shè)備,以便使用修改數(shù)據(jù)集的新更改更新從設(shè)備的狀態(tài)。 即使沒(méi)有從機(jī)連接,復(fù)制偏移量也會(huì)增加,所以基本上每一對(duì)給定的:
識(shí)別主數(shù)據(jù)集的確切版本。

當(dāng)從站連接到主站時(shí),它們使用PSYNC命令來(lái)發(fā)送它們的舊主站復(fù)制ID以及到目前為止處理的偏移量。這樣主人可以發(fā)送所需的增量部分。但是,如果主緩沖區(qū)中沒(méi)有足夠的積壓,或者從服務(wù)器引用了不再知道的歷史記錄(復(fù)制標(biāo)識(shí)),則會(huì)發(fā)生完全重新同步:在這種情況下,從服務(wù)器將獲得數(shù)據(jù)集的完整副本, 從頭開(kāi)始??。

這是完全同步如何更詳細(xì)地工作:

  • 主人開(kāi)始一個(gè)后臺(tái)保存過(guò)程,以生成一個(gè)RDB文件。同時(shí)開(kāi)始緩沖從客戶端收到的所有新的寫入命令。當(dāng)后臺(tái)保存完成后,主服務(wù)器將數(shù)據(jù)庫(kù)文件傳輸給從服務(wù)器,將其保存到磁盤上,然后將其加載到內(nèi)存中。主機(jī)會(huì)將所有緩沖的命令發(fā)送給從機(jī)。這是作為命令流完成的,并且與Redis協(xié)議本身的格式相同。

  • 你可以通過(guò)telnet自己嘗試一下。在服務(wù)器正在做一些工作的同時(shí)連接到Redis端口并發(fā)出SYNC命令。您將看到一個(gè)批量傳輸,然后主機(jī)接收到的每個(gè)命令都將在遠(yuǎn)程登錄會(huì)話中重新發(fā)出。實(shí)際上,SYNC是一個(gè)舊的協(xié)議,不再由較新的Redis實(shí)例使用,但仍然存在向后兼容性:它不允許部分重新同步,所以現(xiàn)在使用PSYNC。

  • 如前所述,當(dāng)主從鏈路出于某種原因關(guān)閉時(shí),從站能夠自動(dòng)重新連接。如果主站收到多個(gè)并發(fā)的從站同步請(qǐng)求,它將執(zhí)行一次后臺(tái)保存,以便為它們提供全部服務(wù)。

無(wú)盤復(fù)制

通常情況下,完全重新同步需要在磁盤上創(chuàng)建一個(gè)RDB文件,然后從磁盤重新加載相同的RDB,以便向從屬設(shè)備提供數(shù)據(jù)。

對(duì)于較慢的磁盤,對(duì)于主設(shè)備來(lái)說(shuō)這可能是一個(gè)非常緊張的操作。 Redis 2.8.18版是第一個(gè)支持無(wú)盤復(fù)制的版本。 在此設(shè)置中,子進(jìn)程直接通過(guò)線將RDB發(fā)送到從服務(wù)器,而不使用磁盤作為中間存儲(chǔ)。

全量復(fù)制開(kāi)銷

  • bgsave時(shí)間
  • RDB文件網(wǎng)絡(luò)傳輸時(shí)間
  • 從節(jié)點(diǎn)清空數(shù)據(jù)時(shí)間
  • 從節(jié)點(diǎn)加載RDB時(shí)間
  • 可能的AOF重寫時(shí)間

部分復(fù)制

連接斷開(kāi)時(shí),master會(huì)寫一個(gè)復(fù)制緩沖區(qū)的命令,slave再連接master時(shí)候會(huì)把自己的偏量值offset和runid告訴master,如果丟失數(shù)據(jù)在buffer緩存的一個(gè)范圍內(nèi),則master把緩沖區(qū)隊(duì)列的數(shù)據(jù)給slave。然后再把部分?jǐn)?shù)據(jù)同步給slave

復(fù)制的配置

slaveof命令
  1. 復(fù)制命令
slaveof 127.0.0.1 6380

丟棄舊數(shù)據(jù)集,轉(zhuǎn)而開(kāi)始對(duì)新主服務(wù)器進(jìn)行同步。

  1. 取消復(fù)制
slaveof no one

將使得這個(gè)從屬服務(wù)器關(guān)閉復(fù)制功能,并從從屬服務(wù)器轉(zhuǎn)變回主服務(wù)器,原來(lái)同步所得的數(shù)據(jù)集不會(huì)被丟棄。

配置

主要修改4個(gè)參數(shù):

  1. port;
  2. logfile;
  3. slaveof;
  4. pidfile;
  5. daemonize(是否在后臺(tái)執(zhí)行)
然后再添加配置
slaveof ip port
slave-read-only yes #設(shè)置只讀
兩種方式比較
方式 命令 配置
優(yōu)點(diǎn) 無(wú)需重啟 統(tǒng)一配置
缺點(diǎn) 不便于管理 需要重啟
實(shí)戰(zhàn)
  1. 我配置了一個(gè)端口為6379,和端口為6380的服務(wù),并在后臺(tái)啟動(dòng)
#6379配置
port 6379
pidfile /var/run/redis_6379.pid
# slaveof <masterip> <masterport>
logfile "6379.log"
daemonize yes


#6380配置
port 6380
pidfile /var/run/redis_6380.pid
slaveof 127.0.0.1 6379
masterauth xxxxx    #如果master有密碼,則需要設(shè)置
logfile "6380.log"
daemonize yes
  1. 對(duì)6379執(zhí)行命令 info replication

    對(duì)6380執(zhí)行命令 info replication
  2. 然后我在主機(jī)上set一個(gè)東西,在slave上獲取


    image.png
  3. 同步數(shù)據(jù)

在master的cli中執(zhí)行slaveof 127.0.0.1 6380

最后編輯于
?著作權(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)書(shū)系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

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

  • 國(guó)家電網(wǎng)公司企業(yè)標(biāo)準(zhǔn)(Q/GDW)- 面向?qū)ο蟮挠秒娦畔?shù)據(jù)交換協(xié)議 - 報(bào)批稿:20170802 前言: 排版 ...
    庭說(shuō)閱讀 12,554評(píng)論 6 13
  • Spring Cloud為開(kāi)發(fā)人員提供了快速構(gòu)建分布式系統(tǒng)中一些常見(jiàn)模式的工具(例如配置管理,服務(wù)發(fā)現(xiàn),斷路器,智...
    卡卡羅2017閱讀 136,711評(píng)論 19 139
  • 那時(shí)候我不知道這段看起來(lái)波瀾不興甚至乏味的時(shí)光是往后再也尋覓不到的 每當(dāng)懷念的時(shí)候也就只能咂咂舌頭試圖回味藏在味蕾...
    周瀾笙笙閱讀 245評(píng)論 0 0
  • 一 無(wú)論大家怎么說(shuō),不要以貌取人。 但其實(shí),50%的人都還是以貌取人的,尤其是在第一次見(jiàn)面時(shí)。這個(gè)貌,不單指相貌,...
    吃酒ChiJiu閱讀 1,789評(píng)論 0 16
  • 感覺(jué)累了,眼睛都困頓,想休息,又害怕休息下來(lái),趕不上別人的步伐,落后于人。
    帥帥娃娃閱讀 281評(píng)論 0 0

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