婷婷综合国产,91蜜桃婷婷狠狠久久综合9色 ,九九九九九精品,国产综合av

主頁 > 知識庫 > redis主從復制原理的深入講解

redis主從復制原理的深入講解

熱門標簽:臺灣電銷 四川穩定外呼系統軟件 南京手機外呼系統廠家 400電話辦理的口碑 一個地圖標注多少錢 高碑店市地圖標注app 廊坊外呼系統在哪買 地圖標注工廠入駐 b2b外呼系統

前言

Redis持久化保證了即使redis服務重啟也不會丟失數據,因為redis服務重啟后會將硬盤上持久化的數據恢復到內存中,但是當redis服務器的硬盤損壞了可能會導致數據丟失,如果通過redis的主從復制機制就可以避免這種單點故障。

本文主要針對redis主從復制的原理進行了講解,分享出來供大家參考學習,下面話不多說了,來一起看看詳細的介紹吧

1.復制過程

2.數據間的同步

3.全量復制

4.部分復制

5.心跳

6.異步復制

1.復制過程

  1. 從節點執行 slaveof 命令。
  2. 從節點只是保存了 slaveof 命令中主節點的信息,并沒有立即發起復制。
  3. 從節點內部的定時任務發現有主節點的信息,開始使用 socket 連接主節點。
  4. 連接建立成功后,發送 ping 命令,希望得到 pong 命令響應,否則會進行重連。
  5. 如果主節點設置了權限,那么就需要進行權限驗證,如果驗證失敗,復制終止。
  6. 權限驗證通過后,進行數據同步,這是耗時最長的操作,主節點將把所有的數據全部發送給從節點。
  7. 當主節點把當前的數據同步給從節點后,便完成了復制的建立流程。接下來,主節點就會持續的把寫命令發送給從節點,保證主從數據一致性。

2.數據間的同步

上面說的復制過程,其中有一個步驟是“同步數據集”,這個就是現在講的“數據間的同步”。

redis 同步有 2 個命令:sync 和 psync,前者是 redis 2.8 之前的同步命令,后者是 redis 2.8 為了優化 sync 新設計的命令。我們會重點關注 2.8 的 psync 命令。

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

  1. 主從節點各自復制偏移量
  2. 主節點復制積壓緩沖區
  3. 主節點運行 ID

主從節點各自復制偏移量:

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

主節點復制積壓緩沖區:

  1. 復制積壓緩沖區是一個保存在主節點的一個固定長度的先進先出的隊列,默認大小 1MB。
  2.  這個隊列在 slave 連接是創建。這時主節點響應寫命令時,不但會把命令發送給從節點,也會寫入復制緩沖區。
  3. 他的作用就是用于部分復制和復制命令丟失的數據補救。通過 info replication 可以看到相關信息。

主節點運行 ID:

  1. 每個 redis 啟動的時候,都會生成一個 40 位的運行 ID。
  2. 運行 ID 的主要作用是用來識別 Redis 節點。如果使用 ip+port 的方式,那么如果主節點重啟修改了 RDB/AOF 數據,從節點再基于偏移量進行復制將是不安全的。所以,當運行 id 變化后,從節點將進行全量復制。也就是說,redis 重啟后,默認從節點會進行全量復制。

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

  1. 可以通過 debug reload 命令重新加載 RDB 并保持運行 ID 不變,從而有效的避免不必要的全量復制。
  2. 缺點是:debug reload 命令會阻塞當前 Redis 節點主線程,因此對于大數據量的主節點或者無法容忍阻塞的節點,需要謹慎使用。一般通過故障轉移機制可以解決這個問題。

psync 命令的使用方式:

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

  runId:從節點所復制主節點的運行 id

  offset:當前從節點已復制的數據偏移量

psync 執行流程:

流程說明:

從節點發送 psync 命令給主節點,runId 就是目標主節點的 ID,如果沒有默認為 -1,offset 是從節點保存的復制偏移量,如果是第一次復制則為 -1.

主節點會根據 runid 和 offset 決定返回結果:

  1. 如果回復 +FULLRESYNC {runId} {offset} ,那么從節點將觸發全量復制流程。
  2. 如果回復 +CONTINUE,從節點將觸發部分復制。
  3. 如果回復 +ERR,說明主節點不支持 2.8 的 psync 命令,將使用 sync 執行全量復制。

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

3.全量復制

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

流程如下:

發送 psync 命令(spync ? -1)

主節點根據命令返回 FULLRESYNC

從節點記錄主節點 ID 和 offset

  1. 發送 psync 命令(spync ? -1)
  2. 主節點根據命令返回 FULLRESYNC
  3. 從節點記錄主節點 ID 和 offset
  4. 主節點 bgsave 并保存 RDB 到本地
  5. 主節點發送 RBD 文件到從節點
  6. 從節點收到 RDB 文件并加載到內存中
  7. 主節點在從節點接受數據的期間,將新數據保存到“復制客戶端緩沖區”,當從節點加載 RDB 完畢,再發送過去。(如果從節點花費時間過長,將導致緩沖區溢出,最后全量同步失敗)
  8. 從節點清空數據后加載 RDB 文件,如果 RDB 文件很大,這一步操作仍然耗時,如果此時客戶端訪問,將導致數據不一致,可以使用配置slave-server-stale-data 關閉.
  9. 從節點成功加載完 RBD 后,如果開啟了 AOF,會立刻做 bgrewriteaof。

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

注意:

如過 RDB 文件大于 6GB,并且是千兆網卡,Redis 的默認超時機制(60 秒),會導致全量復制失敗。可以通過調大 repl-timeout 參數來解決此問題。 Redis 雖然支持無盤復制,即直接通過網絡發送給從節點,但功能不是很完善,生產環境慎用。

4.部分復制

當從節點正在復制主節點時,如果出現網絡閃斷和其他異常,從節點會讓主節點補發丟失的命令數據,主節點只需要將復制緩沖區的數據發送到從節點就能夠保證數據的一致性,相比較全量復制,成本小很多。

  1. 當從節點出現網絡中斷,超過了 repl-timeout 時間,主節點就會中斷復制連接。
  2. 主節點會將請求的數據寫入到“復制積壓緩沖區”,默認 1MB。
  3. 當從節點恢復,重新連接上主節點,從節點會將 offset 和主節點 id 發送到主節點。
  4. 主節點校驗后,如果偏移量的數后的數據在緩沖區中,就發送 cuntinue 響應 —— 表示可以進行部分復制。
  5. 主節點將緩沖區的數據發送到從節點,保證主從復制進行正常狀態。

5.心跳

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

心跳的關鍵機制如下:

  1. 中從都有心跳檢測機制,各自模擬成對方的客戶端進行通信,通過 client list 命令查看復制相關客戶端信息,主節點的連接狀態為 flags = M,從節點的連接狀態是 flags = S。
  2. 主節點默認每隔 10 秒對從節點發送 ping 命令,可修改配置 repl-ping-slave-period 控制發送頻率。
  3. 從節點在主線程每隔一秒發送 replconf ack{offset} 命令,給主節點上報自身當前的復制偏移量。
  4. 主節點收到 replconf 信息后,判斷從節點超時時間,如果超過 repl-timeout 60 秒,則判斷節點下線。

注意:

為了降低主從延遲,一般把 redis 主從節點部署在相同的機房/同城機房,避免網絡延遲帶來的網絡分區造成的心跳中斷等情況。

6.異步復制

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

異步復制的步驟很簡單,如下:

  1. 主節點接受處理命令。
  2. 主節點處理完后返回響應結果 。
  3. 對于修改命令,異步發送給從節點,從節點在主線程中執行復制的命令。

總結

本文主要分析了 Redis 的復制原理,包括復制過程,數據之間的同步,全量復制的流程,部分復制的流程,心跳設計,異步復制流程。其中,可以看出,RDB 數據之間的同步非常耗時。所以,Redis 在 2.8 版本退出了類似增量復制的 psync 命令,當 Redis 主從直接發生了網絡中斷,不會進行全量復制,而是將數據放到緩沖區(默認 1MB)里,在通過主從之間各自維護復制 offset 來判斷緩存區的數據是否溢出,如果沒有溢出,只需要發送緩沖區數據即可,成本很小,反之,則要進行全量復制,因此,控制緩沖區大小非常的重要。

好了,以上就是這篇文章的全部內容了,希望本文的內容對大家的學習或者工作具有一定的參考學習價值,謝謝大家對腳本之家的支持。

您可能感興趣的文章:
  • 淺談Redis主從復制以及主從復制原理
  • 詳解Redis主從復制實踐
  • Redis持久化與主從復制的實踐
  • 使用Docker搭建Redis主從復制的集群
  • Redis全量復制與部分復制示例詳解
  • Redis主從復制詳解
  • CentoS6.5環境下redis4.0.1(stable)安裝和主從復制配置方法
  • Redis教程(九):主從復制配置實例
  • 詳解Redis復制原理

標簽:伊春 南寧 拉薩 甘南 畢節 河源 泰州 定州

巨人網絡通訊聲明:本文標題《redis主從復制原理的深入講解》,本文關鍵詞  redis,主從,復制,原理,的,;如發現本文內容存在版權問題,煩請提供相關信息告之我們,我們將及時溝通與處理。本站內容系統采集于網絡,涉及言論、版權與本站無關。
  • 相關文章
  • 下面列出與本文章《redis主從復制原理的深入講解》相關的同類信息!
  • 本頁收集關于redis主從復制原理的深入講解的相關信息資訊供網民參考!
  • 推薦文章
    主站蜘蛛池模板: 承德县| 沧州市| 嘉禾县| 沽源县| 定南县| 南阳市| 昌宁县| 平遥县| 乌兰察布市| 建瓯市| 新沂市| 福鼎市| 岑巩县| 台江县| 郁南县| 湖口县| 灵台县| 加查县| 新田县| 天峨县| 寻乌县| 赤壁市| 北宁市| 明星| 浙江省| 台山市| 山西省| 宣威市| 吉隆县| 肇州县| 浙江省| 大埔县| 沙雅县| 晋江市| 康乐县| 沾化县| 红桥区| 五寨县| 左权县| 壶关县| 丰原市|