【redis】主從復制:拓撲結構、原理和psync命令解析

文章目錄

  • 拓撲
    • 一主一從
      • 相關問題
    • 一主多從
      • 相關問題
    • 樹形主從結構
      • 相關問題
  • 主從復制原理
    • 復制流程
  • psync 命令
    • 命令解析
      • replicatonid
      • offset
      • 總結
    • 運行流程

拓撲

若干個節點之間按照什么樣的方式來進行組織連接

一主一從

image.png

  • 都可以讀,從節點可以幫主節點分擔一部分的壓力
  • 只有主節點能寫
    解決了單點并發量不高和單點可能出現故障的情況

相關問題

  1. 寫請求太多
    但是如果寫請求太多,也會給主節點造成一些壓力。
  • 此時我們可以通過關閉主節點的 AOF,只在從節點上開啟 AOF 的方式降低主節點的壓力
  • AOF 需要將數據寫到硬盤上,而寫硬盤比寫內存要慢上不少,因此讓主節點就只寫內存,這樣主節點能支持的并發量就更大了
  1. 數據丟失
    但是這種設定方式,有一個嚴重的缺陷:主節點一旦掛了,不能讓他自動重啟(如果自動創奇,此時沒有 AOF 文件,就會丟失數據,進一步的主從結構,會把從節點的數據也給刪了)

改進辦法:當主節點掛了之后,就需要讓主節點從從節點這里獲取到 AOF 文件,然后再啟動

一主多從

在實際開發中,讀請求的數量是遠遠超過寫請求的,此時我們就可以用一主多從的結構

image.png|570

  • 主節點上的數據發生改變,就會把改變的數據同時同步給所有的從節點

相關問題

  1. 網絡帶寬壓力
    隨著從節點個數的增加,同步一條數據,就需要傳輸多次,主節點的網絡帶寬要壓力是很大的

解決辦法:使用樹形主從結構

樹形主從結構

可以有效的緩解主節點網絡帶寬壓力大的情況

image.png|518

  • 這樣就把同步數據的網絡壓力,均攤到多個節點上了,主節點就不需要那么高的網絡帶寬了

相關問題

  1. 同步時間變長
    一旦數據進行修改了,同步數據的延時是比一主多從結構要長的,

主從復制原理

復制流程

image.png|405

  1. 先保存主節點的 IP 和端口(在一個變量中)
  2. 然后建立一個 TCP 連接(三次握手)
  3. 通過 ping 命令,驗證主節點是否能夠正常工作(站在應用程序角度)
    • 上面的 TCP 三次握手,驗證的是通信雙方能否正常讀寫數據,而不是能否正常工作(站在系統層面)
    • 檢查路修好了沒(三次握手);檢查這輛車子是不是好的(ping
  4. redis 主節點如果開啟了密碼,就會觸發“權限認證”

上面的都是準備操作,最關鍵的復制操作就是第五步和第六步

  • 同步數據集:相當于全量同步。在進行同步的一瞬間,一次性把所有的數據都給我
  • 命令持續復制:相當于增量同步。后續再有數據變化,繼續進行同步

psync 命令

redis 提供了一個 psync 命令,完成數據同步的過程

  • 不需要我們手動執行,redis 服務器會在建立好主從同步關系之后,自動執行 psync
  • 從節點負責執行 pysnc,從節點從主節點這邊拉取數據(從節點主動要,而不是主節點主動給)

語法格式為:

PSYNC replicationid offset

命令解析

replicatonid

  • replicationid:理解成復制 Id,是主節點在啟動的時候生成的(從節點變成主節點的時候也會生成,下面有談到)
    • 即使是同一個主節點,每次重啟,生成的 replication id 都是不同的
    • 從節點和主節點建立了復制關系,就會從主節點這邊獲取到 replication id
    • 此處討論的都是一個主節點,多個從節點。

我們可以通過 info 命令,獲取到 replication id

info replication

image.png|472

  • 一般情況下,replid2 是用不到的

使用到 replid2 的情況

  • 有一個主節點 A,還有一個從節點 B。 A 生成 replid,B 獲取到 A 的 replid
  • 如果 A 和 B 通信過程中出現了一些網絡抖動,B 可能就會認為 A 掛了,于是 B 就會自己成為主節點,給自己生成一個 replid
  • 此時 B 也會記得舊的 replid,就是通過 replid2
  • 后續網絡穩定了,B 還可以根據 replid2 重新回到 A 的懷抱
    • 需要手動干預。不過哨兵機制可以自動完成這個過程

offset

可以理解成偏移量,主節點和從節點上都會維護偏移量(整數)

  • 主節點上:主節點會收到很多的修改操作的命令,每個命令都要占據幾個字節,主節點會把這些修改命令的字節數進行累加,就會得到一個逐漸變大的數字
  • 從節點上:描述了現在從節點這里的數據同步到哪里了
  • 如果從節點和主節點這里的偏移量一樣,就說明同步完成了
  • 從節點(slave)每秒鐘上報自身的復制偏移量給主節點

總結

replicationidoffset 共同描述了一個“數據集合

如果發現兩個機器,replicationid 一樣,offset 也一樣,就可以認為這兩個 redis 機器上存儲的數據就是完全一樣的

image.png|489

  • 主服務器看做銀行總行,從服務器看做分行
    • 總行里面有很多客戶,每個客戶都有一個自己的賬戶,用 replicationid 表示賬戶,offset 表示訂單數量
    • 比如張三的賬戶 replicationid123123,他此時轉出 100 元,總行實時記錄,訂單數量 offset 為 1,隨后同步給分行
  • 只要總行和分行里面,賬戶號 replicationid 和訂單數量 offset 一樣,就說明兩邊的數據是一樣的,如果分行的訂單數量 offset 比總行的少,那就說明還沒同步完成

運行流程

image.png

  • FULLRESYNC:全量數據的同步

  • CONTINEU:增量數據的同步

  • ERR:比較老版本的 redis 服務器不支持 psync(可以用 sync,會阻塞 redis 服務器)

  • psync 這里可以從主節點獲取全量數據,也可以獲取一部分數據,主要就是看 offset 這里的進度

    • offset 寫作 -1,就是獲取全量數據
      • 獲取所有數據是最穩妥的,但是會比較低效
    • offset 寫具體的正整數,則是從當前偏移量位置來進行獲取
      • 如果從節點之前已經從主節點這里復制過一部分數據了,就只需要把新的之前沒復制過的數據搞過來即可

不是從節點索要哪部分,主節點就一定給哪部分。主節點會自行判斷,看當前是否方便給哪部分數據,不方便就只能給全量數據了


什么時候進行全量復制?

  1. 首次和主節點進行數據同步
  2. 主節點不方便進行部分復制的時候

什么時候進行增量復制?

  • 從節點之前已經從主節點上復制過數據了。因為網絡抖動或者從節點重啟了,從節點需要重新從主節點這邊同步數據,此時看看能不能只同步一笑部分(大部分數據都是一致的)
    **

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/diannao/74264.shtml
繁體地址,請注明出處:http://hk.pswp.cn/diannao/74264.shtml
英文地址,請注明出處:http://en.pswp.cn/diannao/74264.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

[RoarCTF 2019]Easy Calc-3.23BUUCTF練習day5(2)

[RoarCTF 2019]Easy Calc-3.23BUUCTF練習day5(2) 解題過程 查看源碼 發現calc.php頁面,訪問一下 分析代碼 首先獲取$_GET[num]的值并賦給變量$str。然后定義了一個黑名單數組$blacklist,包含了一系列被禁止的字符或轉義字符,如空格、制表…

阻塞隊列:原理、應用及實現

阻塞隊列:原理、應用及實現 什么是阻塞隊列以生產消費者模型形象地理解阻塞隊列阻塞隊列實現生產消費者模型模擬實現阻塞隊列實現生產消費者模型 什么是阻塞隊列 阻塞隊列是一種特殊且實用的隊列數據結構,它同樣遵循 “先進先出” 的原則。與普通隊列不…

【開源寶藏】30天學會CSS - DAY5 第五課 脈沖動畫

以下是一個完整的漸進式教程,拆解如何用 HTML CSS 構建“Pulsar”水波脈沖動畫。通過閱讀,你將理解每個核心屬性與關鍵幀如何配合,讓一個小圓不斷散發動態波紋,并且文字始終停留在圓心。 第 0 步:項目概覽 文件結構示…

2060 裁紙刀

2060 裁紙刀 ??難度:簡單 🌟考點:2022、規律、思維 📖 📚 import java.util.Arrays; import java.util.LinkedList; import java.util.Queue; import java.util.Scanner;public class Main {static int N 100010…

TextView、AppCompatTextView和MaterialTextView該用哪一個?Android UI 組件發展史與演進對照表

在 Android 開發中,UI 組件一直在不斷演進,從最初的原生組件,到 Support Library(AppCompat 兼容庫),再到如今的 Material Design 組件。這篇文章將梳理 Android UI 組件的發展歷史,并提供詳細的…

python學習筆記--實現簡單的爬蟲(一)

任務:爬取豆瓣最受歡迎的250個電影的資料 鏈接:豆瓣電影 Top 250 用瀏覽器打開后,使用F12或鼠標右鍵--檢查,查看網頁的源代碼,分析網頁結構,如下圖所示: 分析后得知: 1.電影名位于…

Postgresql 刪除數據庫報錯

1、刪除數據庫時,報錯存在其他會話連接 ## 錯誤現象,存在其他的會話連接正在使用數據庫 ERROR: database "cs" is being accessed by other users DETAIL: There is 1 other session using the database.2、解決方法 ## 終止被刪除數據庫下…

self Attention為何除以根號dk?(全新角度)

全網最獨特解析:self Attention為何除根號dk? 一、假設條件:查詢向量和鍵向量服從正態分布 假設查詢向量 q i q_i qi?和鍵向量 k j k_j kj?的每個分量均為獨立同分布的隨機變量,且服從標準正態分布,即:…

numpy學習筆記10:arr *= 2向量化操作性能優化

numpy學習筆記10:arr * 2向量化操作性能優化 在 NumPy 中,直接對整個數組進行向量化操作(如 arr * 2)的效率遠高于顯式循環(如 for i in range(len(arr)): arr[i] * 2)。以下是詳細的解釋: 1. …

Cursor+Claude-3.5生成Android app

一、Android Studio下載 https://developer.android.com/studio?hlzh-tw#get-android-studio 等待安裝完成 二、新建工程 點擊new project 選擇Empty Activity 起一個工程名 當彈出這個框時 可以在settings里面選擇No proxy 新建好后如下 點擊右邊模擬器&#xff0c…

WPF Reactive 數據綁定

文章目錄 Combox 綁定List-通過枚舉綁定方法一:方法二:Button 綁定TextBlock綁定NumericUpDown綁定Expander綁定checkbox綁定NumericUpDownCombox 綁定List-通過枚舉綁定 方法一: ViewControl using Avalonia; using Avalonia.Controls; using Avalonia.Markup.Xaml; usin…

算法及數據結構系列 - 滑動窗口

系列文章目錄 算法及數據結構系列 - 二分查找 算法及數據結構系列 - BFS算法 算法及數據結構系列 - 動態規劃 算法及數據結構系列 - 雙指針 算法及數據結構系列 - 回溯算法 算法及數據結構系列 - 樹 文章目錄 滑動窗口框架思路經典題型76. 最小覆蓋子串567. 字符串的排列438. …

Android adb調試應用程序

啟動app 有的時候app不是預先安裝的,也不能從界面start一個app,這時需要后臺拉起app。 $adb shell am start package.name/Activity.name 例如,android原生camera app, 包名為com.android.camera2, mainActivity名為…

Java EE(15)——網絡原理——TCP協議解析一

一.確認應答/(確認)序列號 接收方接收到數據后,向發送方返回一個確認信號(ack),告訴發送方數據被成功接收。ACK報文段只是作為確認使用的,一般來說不攜帶應用層數據(載荷),也就是說只有報頭部分。但有可能…

node-ddk,electron 組件, 打開新窗口

node-ddk 打開新窗口 https://blog.csdn.net/eli960/article/details/146207062 也可以下載demo直接演示 http://linuxmail.cn/go#node-ddk 本文講解如何在渲染進程發起創建新窗口, 包括 window.open 在主進程定義窗口類型 import main, { NODEDDK } from "node-ddk…

git管理時keil項目忽略文件列表

在使用 Git 管理 Keil MDK(μVision 5)工程時,需要忽略編譯生成的臨時文件、調試文件、用戶配置等非必要內容。以下是忽略文件的詳細列表及說明,可直接保存為 .gitignore 文件: Keil MDK 工程的 .gitignore 文件 giti…

C#單例模式

單例模式 (Singleton),保證一個類僅有一個實例,并提供一個訪問它的全局訪問點。通常我們可以讓一個全局變量使得一個對象被訪問,但它不能防止你實例化對個對象,一個最好的辦法就是,讓類自身負責保護它的唯一實例。這個類可以保證沒…

ZYNQ的cache原理與一致性操作

在Xilinx Zynq SoC中,Cache管理是確保處理器與外部設備(如FPGA邏輯、DMA控制器)之間數據一致性的關鍵。Zynq的ARM Cortex-A9處理器包含L1 Cache(指令/數據)和L2 Cache,其刷新(Flush/Invalidate&…

Linux NFS、自動掛載與系統啟動管理指南

1. NFS客戶端掛載導出的目錄的方式 NFS(網絡文件系統) 允許將遠程服務器的目錄掛載到本地,像訪問本地文件一樣操作遠程文件。掛載方式主要有兩種: 手動掛載:使用 mount 命令(臨時生效,重啟后丟…

NO.55十六屆藍橋杯備戰|排序|插入|選擇|冒泡|堆|快速|歸并(C++)

插?排序 插?排序(Insertion Sort)類似于玩撲克牌插牌過程&#xff0c;每次將?個待排序的元素按照其關鍵字??插?到前?已排好序的序列中&#xff0c;按照該種?式將所有元素全部插?完成即可 #include <iostream> using namespace std; const int N 1e5 10; …