91欧美超碰AV自拍|国产成年人性爱视频免费看|亚洲 日韩 欧美一厂二区入|人人看人人爽人人操aV|丝袜美腿视频一区二区在线看|人人操人人爽人人爱|婷婷五月天超碰|97色色欧美亚州A√|另类A√无码精品一级av|欧美特级日韩特级

0
  • 聊天消息
  • 系統(tǒng)消息
  • 評論與回復(fù)
登錄后你可以
  • 下載海量資料
  • 學(xué)習(xí)在線課程
  • 觀看技術(shù)視頻
  • 寫文章/發(fā)帖/加入社區(qū)
會員中心
創(chuàng)作中心

完善資料讓更多小伙伴認識你,還能領(lǐng)取20積分哦,立即完善>

3天內(nèi)不再提示

一文深入Redis主從復(fù)制的原理詳解

數(shù)據(jù)分析與開發(fā) ? 來源:ITPUB技術(shù)小棧 ? 作者:ITPUB技術(shù)小棧 ? 2021-02-04 16:13 ? 次閱讀
加入交流群
微信小助手二維碼

掃碼添加小助手

加入工程師交流群

復(fù)制原理

1.復(fù)制過程

復(fù)制的過程步驟如下:

1、從節(jié)點執(zhí)行 slaveof 命令

2、從節(jié)點只是保存了 slaveof 命令中主節(jié)點的信息,并沒有立即發(fā)起復(fù)制

3、從節(jié)點內(nèi)部的定時任務(wù)發(fā)現(xiàn)有主節(jié)點的信息,開始使用 socket 連接主節(jié)點

4、連接建立成功后,發(fā)送 ping 命令,希望得到 pong 命令響應(yīng),否則會進行重連

5、如果主節(jié)點設(shè)置了權(quán)限,那么就需要進行權(quán)限驗證;如果驗證失敗,復(fù)制終止。

6、權(quán)限驗證通過后,進行數(shù)據(jù)同步,這是耗時最長的操作,主節(jié)點將把所有的數(shù)據(jù)全部發(fā)送給從節(jié)點。

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

2.數(shù)據(jù)間的同步

上面說的復(fù)制過程,其中有一個步驟是“同步數(shù)據(jù)集”,這個就是現(xiàn)在講的‘?dāng)?shù)據(jù)間的同步’。

redis 同步有 2 個命令:

sync 和 psync,前者是 redis 2.8 之前的同步命令,后者是 redis 2.8 為了優(yōu)化 sync 新設(shè)計的命令。我們會重點關(guān)注 2.8 的 psync 命令。

psync 命令需要 3 個組件支持:

1、主從節(jié)點各自復(fù)制偏移量 2、主節(jié)點復(fù)制積壓緩沖區(qū) 3、主節(jié)點運行 ID

主從節(jié)點各自復(fù)制偏移量:

1、參與復(fù)制的主從節(jié)點都會維護自身的復(fù)制偏移量。 2、主節(jié)點在處理完寫入命令后,會把命令的字節(jié)長度做累加記錄,統(tǒng)計信息在 info replication 中的 masterreploffset 指標(biāo)中。 3、從節(jié)點每秒鐘上報自身的的復(fù)制偏移量給主節(jié)點,因此主節(jié)點也會保存從節(jié)點的復(fù)制偏移量。 4、從節(jié)點在接收到主節(jié)點發(fā)送的命令后,也會累加自身的偏移量,統(tǒng)計信息在 info replication 中。 5、通過對比主從節(jié)點的復(fù)制偏移量,可以判斷主從節(jié)點數(shù)據(jù)是否一致。

主節(jié)點復(fù)制積壓緩沖區(qū):

1、復(fù)制積壓緩沖區(qū)是一個保存在主節(jié)點的一個固定長度的先進先出的隊列。默認大小 1MB。

2、這個隊列在 slave 連接是創(chuàng)建。這時主節(jié)點響應(yīng)寫命令時,不但會把命令發(fā)送給從節(jié)點,也會寫入復(fù)制緩沖區(qū)。

3、他的作用就是用于部分復(fù)制和復(fù)制命令丟失的數(shù)據(jù)補救。通過 info replication 可以看到相關(guān)信息。

主節(jié)點運行 ID:

1、每個 redis 啟動的時候,都會生成一個 40 位的運行 ID。

2、運行 ID 的主要作用是用來識別 Redis 節(jié)點。如果使用 ip+port 的方式,那么如果主節(jié)點重啟修改了 RDB/AOF 數(shù)據(jù),從節(jié)點再基于偏移量進行復(fù)制將是不安全的。所以,當(dāng)運行 id 變化后,從節(jié)點將進行全量復(fù)制。也就是說,redis 重啟后,默認從節(jié)點會進行全量復(fù)制。

如果在重啟時不改變運行 ID 呢?

1、可以通過 debug reload 命令重新加載 RDB 并保持運行 ID 不變。從而有效的避免不必要的全量復(fù)制。

2、他的缺點則是:debug reload 命令會阻塞當(dāng)前 Redis 節(jié)點主線程,因此對于大數(shù)據(jù)量的主節(jié)點或者無法容忍阻塞的節(jié)點,需要謹慎使用。一般通過故障轉(zhuǎn)移機制可以解決這個問題。

psync 命令的使用方式:

命令格式為 psync{runId}{offset}

runId:從節(jié)點所復(fù)制主節(jié)點的運行 id offset:當(dāng)前從節(jié)點已復(fù)制的數(shù)據(jù)偏移量

psync 執(zhí)行流程:

84f1b232-584b-11eb-8b86-12bb97331649.png

流程說明:從節(jié)點發(fā)送 psync 命令給主節(jié)點,runId 就是目標(biāo)主節(jié)點的 ID,如果沒有默認為 -1,offset 是從節(jié)點保存的復(fù)制偏移量,如果是第一次復(fù)制則為 -1.

主節(jié)點會根據(jù) runid 和 offset 決定返回結(jié)果:

1、如果回復(fù) +FULLRESYNC {runId} {offset} ,那么從節(jié)點將觸發(fā)全量復(fù)制流程。

2、如果回復(fù) +CONTINUE,從節(jié)點將觸發(fā)部分復(fù)制。

3、如果回復(fù) +ERR,說明主節(jié)點不支持 2.8 的 psync 命令,將使用 sync 執(zhí)行全量復(fù)制。

到這里,數(shù)據(jù)之間的同步就講的差不多了,篇幅還是比較長的。主要是針對 psync 命令相關(guān)之間的介紹。

3.全量復(fù)制

全量復(fù)制是 Redis 最早支持的復(fù)制方式,也是主從第一次建立復(fù)制時必須經(jīng)歷的的階段。觸發(fā)全量復(fù)制的命令是 sync 和 psync。之前說過,這兩個命令的分水嶺版本是 2.8,redis 2.8 之前使用 sync 只能執(zhí)行全量不同,2.8 之后同時支持全量同步和部分同步。

流程如下:

852b91aa-584b-11eb-8b86-12bb97331649.png

介紹一下上圖步驟:

1、發(fā)送 psync 命令(spync ?-1)

2、主節(jié)點根據(jù)命令返回 FULLRESYNC

3、從節(jié)點記錄主節(jié)點 ID 和 offset

4、主節(jié)點 bgsave 并保存 RDB 到本地

5、主節(jié)點發(fā)送 RBD 文件到從節(jié)點

6、從節(jié)點收到 RDB 文件并加載到內(nèi)存中

7、主節(jié)點在從節(jié)點接受數(shù)據(jù)的期間,將新數(shù)據(jù)保存到“復(fù)制客戶端緩沖區(qū)”,當(dāng)從節(jié)點加載 RDB 完畢,再發(fā)送過去。(如果從節(jié)點花費時間過長,將導(dǎo)致緩沖區(qū)溢出,最后全量同步失?。?8、從節(jié)點清空數(shù)據(jù)后加載 RDB 文件,如果 RDB 文件很大,這一步操作仍然耗時,如果此時客戶端訪問,將導(dǎo)致數(shù)據(jù)不一致,可以使用配置slave-server-stale-data 關(guān)閉. 9、從節(jié)點成功加載完 RBD 后,如果開啟了 AOF,會立刻做 bgrewriteaof。

以上加粗的部分是整個全量同步耗時的地方。

注意:

1、如過 RDB 文件大于 6GB,并且是千兆網(wǎng)卡,Redis 的默認超時機制(60 秒),會導(dǎo)致全量復(fù)制失敗。可以通過調(diào)大 repl-timeout 參數(shù)來解決此問題。

2、Redis 雖然支持無盤復(fù)制,即直接通過網(wǎng)絡(luò)發(fā)送給從節(jié)點,但功能不是很完善,生產(chǎn)環(huán)境慎用。

4.部分復(fù)制

當(dāng)從節(jié)點正在復(fù)制主節(jié)點時,如果出現(xiàn)網(wǎng)絡(luò)閃斷和其他異常,從節(jié)點會讓主節(jié)點補發(fā)丟失的命令數(shù)據(jù),主節(jié)點只需要將復(fù)制緩沖區(qū)的數(shù)據(jù)發(fā)送到從節(jié)點就能夠保證數(shù)據(jù)的一致性,相比較全量復(fù)制,成本小很多。

步驟如下:

854c17ea-584b-11eb-8b86-12bb97331649.png

1、當(dāng)從節(jié)點出現(xiàn)網(wǎng)絡(luò)中斷,超過了 repl-timeout 時間,主節(jié)點就會中斷復(fù)制連接。

2、主節(jié)點會將請求的數(shù)據(jù)寫入到“復(fù)制積壓緩沖區(qū)”,默認 1MB。

3、當(dāng)從節(jié)點恢復(fù),重新連接上主節(jié)點,從節(jié)點會將 offset 和主節(jié)點 id 發(fā)送到主節(jié)點

4、主節(jié)點校驗后,如果偏移量的數(shù)后的數(shù)據(jù)在緩沖區(qū)中,就發(fā)送 cuntinue 響應(yīng) —— 表示可以進行部分復(fù)制

5、主節(jié)點將緩沖區(qū)的數(shù)據(jù)發(fā)送到從節(jié)點,保證主從復(fù)制進行正常狀態(tài)。

5.心跳

主從節(jié)點在建立復(fù)制后,他們之間維護著長連接并彼此發(fā)送心跳命令。

心跳的關(guān)鍵機制如下:

1、中從都有心跳檢測機制,各自模擬成對方的客戶端進行通信,通過 client list 命令查看復(fù)制相關(guān)客戶端信息,主節(jié)點的連接狀態(tài)為 flags = M,從節(jié)點的連接狀態(tài)是 flags = S。

2、主節(jié)點默認每隔 10 秒對從節(jié)點發(fā)送 ping 命令,可修改配置 repl-ping-slave-period 控制發(fā)送頻率。

3、從節(jié)點在主線程每隔一秒發(fā)送 replconf ack{offset} 命令,給主節(jié)點上報自身當(dāng)前的復(fù)制偏移量。

4、主節(jié)點收到 replconf 信息后,判斷從節(jié)點超時時間,如果超過 repl-timeout 60 秒,則判斷節(jié)點下線。

85898ada-584b-11eb-8b86-12bb97331649.png

注意:為了降低主從延遲,一般把 redis 主從節(jié)點部署在相同的機房/同城機房,避免網(wǎng)絡(luò)延遲帶來的網(wǎng)絡(luò)分區(qū)造成的心跳中斷等情況。

6.異步復(fù)制

主節(jié)點不但負責(zé)數(shù)據(jù)讀寫,還負責(zé)把寫命令同步給從節(jié)點,寫命令的發(fā)送過程是異步完成,也就是說主節(jié)點處理完寫命令后立即返回客戶度,并不等待從節(jié)點復(fù)制完成。

異步復(fù)制的步驟很簡單,如下:

1、主節(jié)點接受處理命令 2、主節(jié)點處理完后返回響應(yīng)結(jié)果 3、對于修改命令,異步發(fā)送給從節(jié)點,從節(jié)點在主線程中執(zhí)行復(fù)制的命令。

85a8bcde-584b-11eb-8b86-12bb97331649.png

總結(jié)

本文主要分析了 Redis 的復(fù)制原理,包括復(fù)制過程,數(shù)據(jù)之間的同步,全量復(fù)制的流程,部分復(fù)制的流程,心跳設(shè)計,異步復(fù)制流程。

其中,可以看出,RDB 數(shù)據(jù)之間的同步非常耗時。所以,Redis 在 2.8 版本退出了類似增量復(fù)制的 psync 命令,當(dāng) Redis 主從直接發(fā)生了網(wǎng)絡(luò)中斷,不會進行全量復(fù)制,而是將數(shù)據(jù)放到緩沖區(qū)(默認 1MB)里,在通過主從之間各自維護復(fù)制 offset 來判斷緩存區(qū)的數(shù)據(jù)是否溢出,如果沒有溢出,只需要發(fā)送緩沖區(qū)數(shù)據(jù)即可,成本很小,反之,則要進行全量復(fù)制,因此,控制緩沖區(qū)大小非常的重要。

責(zé)任編輯:lq

聲明:本文內(nèi)容及配圖由入駐作者撰寫或者入駐合作網(wǎng)站授權(quán)轉(zhuǎn)載。文章觀點僅代表作者本人,不代表電子發(fā)燒友網(wǎng)立場。文章及其配圖僅供工程師學(xué)習(xí)之用,如有內(nèi)容侵權(quán)或者其他違規(guī)問題,請聯(lián)系本站處理。 舉報投訴
  • 數(shù)據(jù)
    +關(guān)注

    關(guān)注

    8

    文章

    7335

    瀏覽量

    94804
  • Redis
    +關(guān)注

    關(guān)注

    0

    文章

    392

    瀏覽量

    12191

原文標(biāo)題:一文深入 Redis 主從復(fù)制的原理詳解,權(quán)威又科學(xué)

文章出處:【微信號:DBDevs,微信公眾號:數(shù)據(jù)分析與開發(fā)】歡迎添加關(guān)注!文章轉(zhuǎn)載請注明出處。

收藏 人收藏
加入交流群
微信小助手二維碼

掃碼添加小助手

加入工程師交流群

    評論

    相關(guān)推薦
    熱點推薦

    Redis哨兵模式的自動故障檢測與主從切換實戰(zhàn)

    Redis 主從復(fù)制解決了讀擴展和數(shù)據(jù)冗余問題,但主節(jié)點故障時需要人工介入切換,這在生產(chǎn)環(huán)境中是不可接受的。Sentinel(哨兵)模式在主從架構(gòu)之上增加了自動故障檢測和故障轉(zhuǎn)移能力,是 Re
    的頭像 發(fā)表于 02-27 11:05 ?139次閱讀

    Redis內(nèi)存管理、持久化策略與慢查詢排查分析

    Redis 在生產(chǎn)環(huán)境中承擔(dān)著緩存、會話存儲、消息隊列、分布式鎖等多種角色。隨著數(shù)據(jù)量增長和并發(fā)壓力上升,內(nèi)存碎片、持久化 I/O 抖動、慢查詢堆積這三類問題會逐漸顯現(xiàn),直接影響服務(wù)延遲和穩(wěn)定性。Redis 8.x 在內(nèi)存管理和持久化機制上做了若干改進,但核心調(diào)優(yōu)思路與
    的頭像 發(fā)表于 02-27 11:00 ?153次閱讀

    詳解SN65HVD888:RS - 485總線通信的得力助手

    詳解SN65HVD888:RS-485總線通信的得力助手 作為電子工程師,我們在設(shè)計工業(yè)通信系統(tǒng)時,常常會與RS - 485總線打交道。RS - 485憑借其長距離、高抗干擾能力等優(yōu)點,在工業(yè)
    的頭像 發(fā)表于 12-23 11:15 ?457次閱讀

    Redis集群部署配置詳解

    Redis集群是種分布式Redis解決方案,通過數(shù)據(jù)分片和主從復(fù)制實現(xiàn)高可用性和橫向擴展。集群將整個數(shù)據(jù)集分割成16384個哈希槽(hash slots),每個節(jié)點負責(zé)
    的頭像 發(fā)表于 07-17 11:04 ?1012次閱讀

    Redis集群部署與性能優(yōu)化實戰(zhàn)

    Redis作為高性能的內(nèi)存數(shù)據(jù)庫,在現(xiàn)代互聯(lián)網(wǎng)架構(gòu)中扮演著關(guān)鍵角色。作為運維工程師,掌握Redis的部署、配置和優(yōu)化技能至關(guān)重要。本文將從實戰(zhàn)角度出發(fā),詳細介紹Redis集群的搭建、性能優(yōu)化以及監(jiān)控運維的核心技術(shù)。
    的頭像 發(fā)表于 07-08 17:56 ?868次閱讀

    詳解Rsync備份服務(wù)器

    備份就是把文件在復(fù)制份存放到另個位置(簡單說就是給源文件增加個副本)以防原始數(shù)據(jù)丟失或損壞。
    的頭像 發(fā)表于 06-30 13:57 ?932次閱讀
    <b class='flag-5'>一</b><b class='flag-5'>文</b><b class='flag-5'>詳解</b>Rsync備份服務(wù)器

    【經(jīng)驗分享】在Omni3576上編譯Redis-8.0.2源碼,并安裝及性能測試

    本文首先介紹Redis是什么,然后介紹如何在Omni3576上編譯Redis-8.0.2源碼,以及從源碼編譯、安裝Redis,最后介紹如何在Omni3576上運行Redis性能測試,并
    的頭像 發(fā)表于 06-05 08:05 ?986次閱讀
    【經(jīng)驗分享】在Omni3576上編譯<b class='flag-5'>Redis</b>-8.0.2源碼,并安裝及性能測試

    【幸狐Omni3576邊緣計算套件試用體驗】Redis最新8.0.2版本源碼安裝及性能測試

    的結(jié)果進行對比。 Redis是什么 維基百科的介紹是: Redis個使用ANSI C編寫的開源、支持網(wǎng)絡(luò)、基于內(nèi)存、分布式、可選持久性的鍵值對存儲數(shù)據(jù)庫。
    發(fā)表于 06-03 01:28

    利用dockerfile搭建mysql主從集群和redis集群

    ==MySQL主從同步(Replication)是種實現(xiàn)數(shù)據(jù)冗余和高可用性的技術(shù),通過將主數(shù)據(jù)庫(Master)的變更操作同步到個或多個從數(shù)據(jù)庫(Slave),實現(xiàn)數(shù)據(jù)的實時或準(zhǔn)實時復(fù)制
    的頭像 發(fā)表于 05-14 11:38 ?2111次閱讀
    利用dockerfile搭建mysql<b class='flag-5'>主從</b>集群和<b class='flag-5'>redis</b>集群

    帶你深入剖析RedCap技術(shù)

    隨著3GPPR17RedCap標(biāo)準(zhǔn)的凍結(jié),業(yè)界對RedCap技術(shù)的關(guān)注持續(xù)升溫。要將RedCap有效引入并服務(wù)于各行各業(yè),亟需明確其在5G承載體系中的能力定位,并深入分析當(dāng)前5G行業(yè)發(fā)展所面臨的痛點
    的頭像 發(fā)表于 05-14 10:53 ?3854次閱讀
    <b class='flag-5'>一</b><b class='flag-5'>文</b>帶你<b class='flag-5'>深入</b>剖析RedCap技術(shù)

    【必看】開關(guān)電源中每個元器件的計算+51頁圖文詳解

    開關(guān)電源的各個元器件怎么計算?損耗怎么估算?散熱器的大小怎么計算? 51頁圖文詳解,帶你弄懂! 純分享貼,有需要可以直接下載附件獲取完整資料! (如果內(nèi)容有幫助可以關(guān)注、點贊、評論支持
    發(fā)表于 05-12 16:20

    Redis 再次開源!

    “ ?Redis 現(xiàn)已采用 AGPLv3 開源許可證。? ” Redis CEO 的 Blog 以下是 Redis CEO Rowan Trollope 的 Blog: 像 AWS 和 GCP 這樣
    的頭像 發(fā)表于 05-06 18:26 ?941次閱讀

    華為與陜投集團簽署深入合作協(xié)議

    日前;陜西文化產(chǎn)業(yè)投資控股(集團)有限公司(以下簡稱“陜投集團”)與華為技術(shù)有限公司(以下簡稱“華為”)簽署深入合作協(xié)議。陜投集團黨委書記、董事長黃勇,華為高級副總裁鄒志磊見證簽約。陜
    的頭像 發(fā)表于 04-23 17:04 ?1087次閱讀

    EM儲能網(wǎng)關(guān) ZWS智慧儲能云應(yīng)用(11) — 級架構(gòu) 主從架構(gòu)

    不同。為了適配用戶面臨的復(fù)雜現(xiàn)場環(huán)境,滿足更深層次的管理和維護需求,ZWS智慧儲能云平臺支持兩種架構(gòu):級架構(gòu)和主從架構(gòu)。級架構(gòu)&主從架構(gòu)支持1.架構(gòu)圖示常見的
    的頭像 發(fā)表于 04-17 13:00 ?779次閱讀
    EM儲能網(wǎng)關(guān) ZWS智慧儲能云應(yīng)用(11) — <b class='flag-5'>一</b>級架構(gòu) <b class='flag-5'>主從</b>架構(gòu)

    redis三種集群方案詳解

    Redis中提供的集群方案總共有三種(redis節(jié)點不超過10G內(nèi)存)。
    的頭像 發(fā)表于 03-31 10:46 ?1541次閱讀
    <b class='flag-5'>redis</b>三種集群方案<b class='flag-5'>詳解</b>