Redis主從架構哨兵模式

文章目錄

  • 概述
  • 一、主從搭建實例
  • 二、主從同步原理
  • 三、哨兵架構
    • 3.1、搭建哨兵架構
    • 3.2、演示故障恢復
    • 3.3、哨兵日志


概述

??在生產環境下,Redis通常不會單機部署,為了保證高可用性,通常使用主從模式集群架構,同時也面臨著一些問題:

  • 集群的拓撲結構
  • 主節點和從節點各自負責的工作
  • 主節點和從節點如何保證數據的一致性,如何同步數據
  • 主節點發生故障,從節點如何感知到并且重新選舉主節點,達到自動切換的目的

??集群通常會使用一主多從主 - 從 - 從的架構:
在這里插入圖片描述
??為了緩解主從復制風暴的問題,可以使用主 - 從 - 從的架構,即從節點也承擔一些同步數據的工作:
在這里插入圖片描述
??主節點通常負責處理用戶的寫請求,從節點處理用戶的讀請求


一、主從搭建實例

??簡單地搭建一個主從架構,從節點的兩個作用:給用戶讀取數據,同步數據。

  1. 復制一份配置文件,并且修改文件中的關鍵信息

在這里插入圖片描述
修改端口
在這里插入圖片描述
修改從節點的PID
在這里插入圖片描述
修改日志名
在這里插入圖片描述
修改數據存放目錄
在這里插入圖片描述
表明主節點
在這里插入圖片描述
配置從節點只讀

  1. 啟動從節點

在這里插入圖片描述

  1. 連接從節點

在這里插入圖片描述

  1. 觀察到從節點的數據,和主節點是同步的

在這里插入圖片描述

二、主從同步原理

??主要分為全量復制增量復制兩部分:

  • 從節點第一次啟動,會全量復制主節點的所有數據。從節點根據配置文件中的replicaof 主節點ip 主節點端口,獲取主節點的信息
    • 向主節點發送psync命令請求同步
    • 同時建立socket長連接
  • 主節點接收到命令,使用bgsave命令生成接收到命令這一刻的rdb文件。(和配置文件有沒有開啟rdb是沒有關系的,配置文件的是被動rdb,即符合配置的策略才會進行,而這里是服務端發起的主動rdb)
    • 生成rdb的過程中,有可能產生新的命令,因為是bgsave不阻塞的,放入一個repl buffer緩存中。
    • rdb發給從節點
  • 從節點清理掉舊數據,重新加載rdb數據。
  • 主節點將repl buffer緩存中的命令發給從節點。
  • 從節點執行repl buffer緩存中的命令到內存。
  • 主節點持續通過socket連接將后續命令發送給從節點。

??除了從節點第一次連接主節點觸發的全量同步,還可能存在一種情況,從節點和主節點斷開連接一段時間,然后又重新連接上了主節點,例如在斷開前,主節點最新數據為10,從節點的數據也同步到了10。但是從節點和主節點斷開了連接。等到從節點再次連接上時,主節點的最新數據變成了20。此時觸發的就應該是增量同步,主節點向從節點同步11-20之間的數據:

  • 從節點重新建立socket長連接
  • 主節點有一個緩存區,repl backlog buffer 記錄最近寫命令的緩存。(可以在配置文件中配置,默認大小為1M。緩存滿了之后會刷新掉)
  • 從節點將同步數據的偏移量psync(offset)發給主節點,(斷開連接之前,從節點在主節點同步了10條數據,而此時主節點有了20條數據)
  • 主節點根據偏移量,從緩沖區找命令
    • 能找到,將offest之后的命令,都同步給從節點
    • 找不到,說明斷開的時間太長了,就全量同步

??主節點和從節點的同步,是通過緩存區 + rdb的方式實現的,如果同一時刻主節點需要生成快照復制給大量的從節點,那么對于性能的損失較大,這種場景也稱為主從同步風暴,可以通過使用主 - 從 - 從架構的方式緩解。

三、哨兵架構

??哨兵架構是指,在主從架構上,使用哨兵集群去進行監控。普通的主從架構,主節點掛了,需要手動操作更換從節點為主節點,讓其他從節點去復制。在哨兵架構下則可以自動恢復。哨兵去監聽主節點和從節點,當主節點掛了,哨兵去重新選舉主節點。
??客戶端訪問的是哨兵,但是哨兵可以監控到所有節點。哨兵會將主節點的信息推送給客戶端,相當于客戶端還是和主節點通信。

3.1、搭建哨兵架構

??哨兵架構的搭建:

  1. 復制一份redis目錄下的sentinel.conf文件,并且修改配置

在這里插入圖片描述
端口號,文件目錄,pid等
在這里插入圖片描述
設置有多少個sentinel認為master失效時,master才算真正失效,才能開啟新的選舉

  1. 哨兵也推薦集群部署(3臺),可以復制上面的配置文件,對于端口號等信息進行對應的修改,然后啟動哨兵:

在這里插入圖片描述
目前的架構:

  • 6379:主節點
  • 6380:從節點1
  • 6381:從節點2
  • 26379:哨兵節點1
  • 26380:哨兵節點2
  • 26381:哨兵節點3

3.2、演示故障恢復

??案例工程:配置信息

server:port: 8080spring:redis:database: 0timeout: 3000sentinel:    #哨兵模式master: mymaster #主服務器所在集群名稱nodes: 192.168.101.128:26379,192.168.101.128:26380,192.168.101.128:26381
#    cluster:
#      nodes: 192.168.101.128:8001,192.168.101.128:8002,192.168.101.128:8003,192.168.101.128:8004,192.168.101.128:8005,192.168.101.128:8006lettuce:pool:max-idle: 50min-idle: 10max-active: 100max-wait: 1000

??案例工程,訪問/test_sentinel接口,每隔1s向redis中存入一條數據

@RestController
public class IndexController {private static final Logger logger = LoggerFactory.getLogger(IndexController.class);@Autowiredprivate StringRedisTemplate stringRedisTemplate;/*** 測試節點掛了哨兵重新選舉新的master節點,客戶端是否能動態感知到** @throws InterruptedException*/@RequestMapping("/test_sentinel")public void testSentinel() throws InterruptedException {int i = 1;while (true){try {stringRedisTemplate.opsForValue().set("test"+i, i+""); //jedis.set(key,value);System.out.println("設置key:"+ "test" + i);i++;Thread.sleep(1000);}catch (Exception e){logger.error("錯誤:", e);}}}}

??連接虛擬機上的redis,需要開放端口或者關閉防火墻,否則報圖上的錯誤:
在這里插入圖片描述
??啟動程序,不斷地向redis中塞值:
在這里插入圖片描述

??將主節點的進程關閉:
在這里插入圖片描述
??6379主節點斷開連接
在這里插入圖片描述
??觀察哨兵重新選舉:
在這里插入圖片描述
??6381被設置成了新的主節點,可以通過info命令查詢
在這里插入圖片描述
??6380從節點的新主節點為6381:
在這里插入圖片描述
??如果舊的主節點恢復運行了,會變成從節點

在這里插入圖片描述

3.3、哨兵日志

??通過哨兵日志的部分信息,可以體現出監控集群重新選舉的過程:

# 哨兵監控到主節點下線
44861:X 25 Jun 2025 21:52:18.410 # +sdown master mymaster 192.168.101.128 6379	
# 標記主節點為不可用,quorum 2/2表示至少有兩個哨兵認定了主節點為不可用,可以下定論為主節點下線。
44861:X 25 Jun 2025 21:52:18.505 # +odown master mymaster 192.168.101.128 6379 #quorum 2/2
# 發起一次新的選舉周期
44861:X 25 Jun 2025 21:52:18.506 # +new-epoch 1
# 啟動故障轉移,將會選舉新的主節點。
44861:X 25 Jun 2025 21:52:18.506 # +try-failover master mymaster 192.168.101.128 6379
# 投票給67638d61e36685f6509df1622f17bb60041dbabb 節點
44861:X 25 Jun 2025 21:52:18.507 # +vote-for-leader 67638d61e36685f6509df1622f17bb60041dbabb 1
# 哨兵集群中的其他兩個節點,都投票給67638d61e36685f6509df1622f17bb60041dbabb 節點
44861:X 25 Jun 2025 21:52:18.509 # cf6af8e65382739aa40cd0407e8a3d8f0e122d06 voted for 67638d61e36685f6509df1622f17bb60041dbabb 1
44861:X 25 Jun 2025 21:52:18.509 # 191cb89148e07d0e79a5ded4fcfe8320ae976b5a voted for 67638d61e36685f6509df1622f17bb60041dbabb 1
# 67638d61e36685f6509df1622f17bb60041dbabb 成為新的主節點,并獲得領導者身份。
44861:X 25 Jun 2025 21:52:18.566 # +elected-leader master mymaster 192.168.101.128 6379
# 選擇一個從節點作為主節點
44861:X 25 Jun 2025 21:52:18.566 # +failover-state-select-slave master mymaster 192.168.101.128 6379
# 選擇從節點 192.168.101.128:6381 作為新的主節點。
44861:X 25 Jun 2025 21:52:18.659 # +selected-slave slave 192.168.101.128:6381 192.168.101.128 6381 @ mymaster 192.168.101.128 6379
# 新的主節點 192.168.101.128:6381 會停止同步原來的主節點,并準備成為獨立的主節點。
44861:X 25 Jun 2025 21:52:18.659 * +failover-state-send-slaveof-noone slave 192.168.101.128:6381 192.168.101.128 6381 @ mymaster 192.168.101.128 6379
# 等待新的主節點完成晉升過程。
44861:X 25 Jun 2025 21:52:18.721 * +failover-state-wait-promotion slave 192.168.101.128:6381 192.168.101.128 6381 @ mymaster 192.168.101.128 6379
# 192.168.101.128:6381 成為新的主節點,完成晉升。
44861:X 25 Jun 2025 21:52:18.785 # +promoted-slave slave 192.168.101.128:6381 192.168.101.128 6381 @ mymaster 192.168.101.128 6379
# 將其他從節點重新配置,使其從新的主節點同步數據。
44861:X 25 Jun 2025 21:52:18.785 # +failover-state-reconf-slaves master mymaster 192.168.101.128 6379
# mymaster 恢復到正常狀態,移除其不可用狀態。
44861:X 25 Jun 2025 21:52:19.675 # -odown master mymaster 192.168.101.128 6379
#將 192.168.101.128:6380 配置為從新的主節點同步。
44861:X 25 Jun 2025 21:52:19.802 * +slave-reconf-inprog slave 192.168.101.128:6380 192.168.101.128 6380 @ mymaster 192.168.101.128 6379
# 192.168.101.128:6380 完成了重新配置,開始從新的主節點同步。
44861:X 25 Jun 2025 21:52:19.802 * +slave-reconf-done slave 192.168.101.128:6380 192.168.101.128 6380 @ mymaster 192.168.101.128 6379
# 故障轉移過程完成,192.168.101.128:6381 成為新的主節點,集群恢復正常。
44861:X 25 Jun 2025 21:52:19.894 # +failover-end master mymaster 192.168.101.128 6379
# 原來的主節點 192.168.101.128:6379 被替換為新的主節點 192.168.101.128:6381。
44861:X 25 Jun 2025 21:52:19.894 # +switch-master mymaster 192.168.101.128 6379 192.168.101.128 6381
# 6380 6379 作為從節點,從6381進行同步
44861:X 25 Jun 2025 21:52:19.894 * +slave slave 192.168.101.128:6380 192.168.101.128 6380 @ mymaster 192.168.101.128 6381
44861:X 25 Jun 2025 21:52:19.894 * +slave slave 192.168.101.128:6379 192.168.101.128 6379 @ mymaster 192.168.101.128 6381

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

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

相關文章

基于深度學習yolov5的安全帽實時識別檢測系統

摘要:在現代工業和建筑行業中,確保員工的安全是至關重要的一環。安全帽作為一項基礎的個人防護設備,對于降低頭部受傷的風險發揮著關鍵作用。然而,確保工作人員在施工現場始終正確佩戴安全帽并非易事。傳統的人工檢查方法不僅效率…

GitLab 18.1 發布 Runner、無效的個人訪問令牌查看等功能,可升級體驗!

GitLab 是一個全球知名的一體化 DevOps 平臺,很多人都通過私有化部署 GitLab 來進行源代碼托管。極狐GitLab 是 GitLab 在中國的發行版,專門為中國程序員服務。可以一鍵式部署極狐GitLab。 學習極狐GitLab 的相關資料: 極狐GitLab 官網極狐…

量子計算與AI融合 - 企業級安全威脅應對

量子計算(QC)雖帶來萬億級市場機遇(2025-2035年),但潛藏重大安全風險:可能破解現有加密系統,催生"現在竊取,未來解密"攻擊。美國NIST已啟動后量子加密標準,但技…

Excel:filter函數實現動態篩選的方法

filter的意思是“過濾、篩選”,動態篩選,FILTER()函數可以將對篩選區域內容,并將結果自動溢出生成一個新區域,以下是函數的使用方法: (一)情景:給定兩列數據,我需要根據…

蘭洋科技上合組織論壇發表專題分享,全球液冷布局引領綠色算力未來

2025年6月17-19日,中國—上海合作組織數字技術合作發展論壇在新疆克拉瑪依市舉辦。作為第四次上海合作組織成員國信息通信技術發展部門負責人會議的配套會議,論壇以“數字化轉型助力可持續發展,數字包容促進上合共同繁榮”為主題,…

LED-Merging: 無需訓練的模型合并框架,兼顧LLM安全和性能!!

摘要:對預訓練大型語言模型(LLMs)進行微調以適應特定任務,會帶來巨大的計算和數據成本。雖然模型合并提供了一種無需訓練的解決方案,用于整合多個特定任務的模型,但現有方法存在安全性與效用性之間的沖突&a…

火山引擎向量數據庫 Milvus 版正式開放

資料來源:火山引擎-開發者社區 隨著AI技術的不斷演進發展,非結構化數據也迎來了爆發式的增長。Milvus作為一款為大規模向量相似度搜索和 AI 應用開發設計的開源向量數據庫系統,目前已在業界占據領導地位。當前 Milvus 已經被 5,000 家企業所…

SQL SERVER存儲過程

什么是存儲過程 SQL 存儲過程(Stored Procedure)是一個在數據庫中預編譯并存儲的一組 SQL 語句。它們可以包含查詢、插入、更新、刪除等數據庫操作,甚至包括控制流語句(如條件判斷、循環等)。存儲過程可以通過調用來執…

Lombok注解 - 提高Java開發效率

01 繁瑣編碼 初入 Java 開發領域時,編寫實體類的瑣碎經歷想必各位都深有感觸。 每當創建一個實體類,鋪天蓋地的 getter、setter、toString 方法接踵而至,手指在鍵盤上頻繁敲擊,酸痛不已。 而 Lombok 這一神器的出現&#xff0c…

Linux修改uboot啟動延時方法詳細攻略,觸覺智能RK3568開發板演示

修改uboot延時 首先查找defconfig文件 ./build.sh uboot #通過編譯日志查看使用的defconfig文件ls u-boot/configs/*3568* #在SDK根目錄下執行該操作 如圖標注處就是所使用的u-boot配置文件。 然后修改延時數: vim u-boot/configs/rk3568_defconfig 將CONFIG_BOO…

dockers virbox 安裝

sudo apt remove docker docker-engine docker.io containerd runc 更新包索引并安裝依賴 sudo apt update sudo apt install ca-certificates curl gnupg 添加Docker官方GPG密鑰 sudo install -m 0755 -d /etc/apt/keyrings curl -fsSL https://download.docker.com/linux…

Restormer: Efficient Transformer for High-Resolution Image Restoration 論文閱讀

題目 (Title): Restormer:用于高分辨率圖像恢復的高效Transformer 摘要 (Abstract): 由于卷積神經網絡(CNN)在從大規模數據中學習可泛化的圖像先驗方面表現出色,這些模型已被廣泛應用于圖像恢復及相關任務。最近,另一…

音視頻開發協議棧全景解析

音視頻開發協議棧全景解析 引言:協議棧的重要性與演進 在當今數字化時代,音視頻技術已成為互聯網基礎設施的核心組成部分。從視頻會議、直播到智能安防、元宇宙應用,音視頻協議棧的設計直接影響著用戶體驗質量(QoE)。作為開發者&#xff0c…

Java面試題025:一文深入了解數據庫Redis(1)

歡迎大家關注我的JAVA面試題專欄,該專欄會持續更新,從原理角度覆蓋Java知識體系的方方面面。 一文吃透JAVA知識體系(面試題)https://bl

Python:調用json.dumps處理datetime對象數據

文章目錄 前言一、查詢SQL語句中數據轉換1、思路2、示例3、常用格式化模式4、注意事項 二、自定義JSONEncoder處理1、思路2、示例3、使用方法 寫在結尾 前言 使用Python開發查詢PostgreSQL數據庫,返回數據中有timestamp類型數據字段。如果使用json.dumps轉換成json對…

QT6 源(130)視圖模型架構中的字符串列表模型 QStringListModel:成員函數,本類的繼承關系圖以及源碼注釋

(1)字符串列表型的 model ,可以交給視圖 view 來顯示,也可以由組合框 comboBox 讀取其中的內容 : (2)以下開始學習本字符串 model 里的成員函數,本類沒有再定義信號與槽函數 &#x…

dockerfile命令及構建+docker-compose安裝構建

一,dockerfile常用命令 命令介紹FROM–指定基礎鏡像LABEL作者信息USER切換運行屬主身份WORKDUR切換工作目錄ENV用于docker容器設置環境變量RUN用來執行命令行的命令COPY把宿主機文件復制到鏡像中去ADD將文件路徑復制添加到容器內部路徑EXPOSE為容器打開指定要監聽的…

數學:逆元,同余

逆元,同余 0.引言1.同余1.1 同余的基本性質1.2 解同余線性方程 2.逆元費馬小定理求逆元(m必需為質數)擴展歐幾里得求逆元(使用任意互質的a和m) 0.引言 本文講述什么是逆元,如何求逆元。求逆元的兩種常規方法。然后知道…

廣州華銳互動:技術與創意雙驅動的 VR 先鋒?

廣州華銳互動能夠在眾多 VR 公司中嶄露頭角,離不開其強大的技術實力和源源不斷的創意靈感 。在技術研發方面,廣州華銳互動組建了一支專業的技術團隊,團隊成員均具備扎實的技術功底和豐富的行業經驗,他們專注于 VR、AR、3D 等核心技…

教育培訓教學通用PPT模版

教育培訓通用PPT模版,兒童教育PPT模版,公開課件教學PPT模版,讀書筆記PPT模版,古風PPT模版,教育教學通用PPT模版 教育培訓教學通用PPT模版:https://pan.quark.cn/s/6c2ed020e398