Redis組件介紹(五)

来源:https://www.cnblogs.com/cjybigdatablog/p/18393328
-Advertisement-
Play Games

寫在前面 今天繼續學習redis後面的知識。 Redis 哨兵機制 哨兵 Sentinel 機制 Sentinel(哨兵)是 Redis 的高可用性解決方案。由一個或多個 Sentinel 實例組成的 Sentinel 系統可以監視任意多個主伺服器,以及這些主伺服器屬下的所有從伺服器。當被監視的主服 ...


寫在前面

今天繼續學習redis後面的知識。

Redis 哨兵機制

哨兵 Sentinel 機制

Sentinel(哨兵)是 Redis 的高可用性解決方案。由一個或多個 Sentinel 實例組成的 Sentinel 系統可以監視任意多個主伺服器,以及這些主伺服器屬下的所有從伺服器。當被監視的主伺服器進入下線狀態時,Sentinel 會自動將下線主伺服器屬下的某個從伺服器升級為新的主伺服器。簡單來說,哨兵就是帶有自動故障轉移功能的主從架構。

無法解決:

  1. 單節點併發壓力問題
  2. 單節點記憶體和磁碟物理上限

哨兵架構原理

Redis 集群

集群

Redis 從 3.0 開始支持 Cluster 模式。Redis 集群支持節點的自動發現、支持從主節點的選舉和容錯、支持線上分片(sharding)等特性。
PING PONG 協議(心跳機制)

集群搭建

創建集群

  1. 準備環境安裝 Ruby 以及 Redis 集群依賴

    yum install -y ruby rubygems
    # https://rubygems.org/gems/redis/versions
    gem install redis-xxx.gem
    
  2. 在一臺機器創建 7 個目錄

    # 創建目錄並複製配置文件
    cp /usr/local/soft/bigdata17/redis-install/redis-7.0.0/redis.conf ./7000/
    cp /usr/local/soft/bigdata17/redis-install/redis-7.0.0/redis.conf ./7001/
    cp /usr/local/soft/bigdata17/redis-install/redis-7.0.0/redis.conf ./7002/
    cp /usr/local/soft/bigdata17/redis-install/redis-7.0.0/redis.conf ./7003/
    cp /usr/local/soft/bigdata17/redis-install/redis-7.0.0/redis.conf ./7004/
    cp /usr/local/soft/bigdata17/redis-install/redis-7.0.0/redis.conf ./7005/
    cp /usr/local/soft/bigdata17/redis-install/redis-7.0.0/redis.conf ./7007/
    
  3. 修改不同目錄配置文件

    # 編輯配置文件(例如 ./7000/redis.conf)
    port 7000                           # 修改埠
    # bind 127.0.0.1 -::1              # 開啟遠程連接
    protected-mode no
    daemonize yes                       # 開啟後臺運行
    dbfilename dump-7000.rdb            # 每台機器的文件不能一樣
    cluster-enabled yes                 # 開啟集群模式
    cluster-config-file nodes-7000.conf # 集群節點配置文件
    cluster-node-timeout 5000           # 集群節點超時時間
    appendonly yes                      # 開啟 AOF 持久化
    appendfilename "appendonly-7000.aof" # 修改 AOF 文件名
    appenddirname "appendonlydir-7000"
    
  4. 指定不同目錄配置文件啟動七個節點

    redis-server 7000/redis.conf
    redis-server 7001/redis.conf
    redis-server 7002/redis.conf
    redis-server 7003/redis.conf
    redis-server 7004/redis.conf
    redis-server 7005/redis.conf
    redis-server 7006/redis.conf
    
  5. 複製集群操作腳本到 bin 目錄中

    cp /usr/local/soft/bigdata17/redis-install/redis-7.0.0/src/redis-trib.rb /usr/local/soft/redis/bin/
    

    對於 Redis 7.0.0 之後的版本,使用以下命令:

    redis-cli --cluster create 192.168.40.110:7000 192.168.40.110:7001 192.168.40.110:7002 192.168.40.110:7003 192.168.40.110:7004 192.168.40.110:7005 --cluster-replicas 1
    

  1. 查看集群狀態

    # 查看集群狀態
    redis-cli --cluster check 192.168.40.110:7000
    

集群節點狀態說明

  • 主節點

    • 主節點存在 hash slots,且主節點的 hash slots 沒有交叉
    • 主節點不能刪除
    • 一個主節點可以有多個從節點
    • 主節點宕機時多個副本之間自動選舉主節點
  • 從節點

    • 從節點沒有 hash slots
    • 從節點可以刪除
    • 從節點不負責數據的寫,只負責數據的同步

使用集群

  1. 添加節點(預設為從)

    # 添加主節點
    redis-cli --cluster add-node 192.168.40.110:7006 192.168.40.110:7000 --cluster-slave
    

    註意:1. 該節點必須以集群模式啟動 2. 預設情況下該節點是以 master 節點形式添加

  2. 刪除副本節點

    # 刪除節點
    redis-trib.rb del-node 192.168.40.110:7002 0ca3f102ecf0c888fc7a7ce43a13e9be9f6d3dd1
    

    註意: 1. 被刪除的節點必須是從節點或沒有被分配 hash slots 的節點

Redis 面試題與理解

穿透(要查詢的數據根本不存在)

穿透指用戶查詢數據時,如果數據既不存在於資料庫中,也不存在於緩存中,那麼每次請求都會直接訪問資料庫,從而繞過緩存,導致資料庫負載增加。

穿透解決方案

  1. 對空值進行緩存
    類似於上面的例子,雖然資料庫中沒有 id=-1234 的用戶數據,但可以在 Redis 中緩存一個空值(key=-1234,value=null),以避免頻繁查詢資料庫。

  2. 實時監控
    對 Redis 進行實時監控,發現命中率下降時進行排查,結合運維人員分析訪問對象和數據,設置黑名單限制服務。

  3. 使用布隆過濾器
    使用 BitMap 作為布隆過濾器,將所有可訪問的資源通過簡單的映射關係放入布隆過濾器中,當請求到來時,先進行布隆過濾器判斷,如果有則放行,否則攔截。

  4. 介面校驗
    對無效請求(例如 id=-1234)進行攔截,防止其到達 Redis 或資料庫。

雪崩(一批數據有,但過期時間到了)

雪崩指大量數據在同一時刻過期,導致大量請求落到資料庫,造成資料庫壓力增加,嚴重時可能導致資料庫宕機。

雪崩解決方案

  1. 使用互斥鎖(Mutex Lock)或分散式鎖
    只允許一個請求訪問後端數據源,其他請求等待並共用結果。

  2. 將失效時間分散開
    使用隨機數生成緩存的過期時間,避免集中失效。

  3. 使用多級緩存架構
    例如使用 nginx 緩存 + Redis 緩存 + 其他緩存,不同層使用不同緩存,可靠性更強。

  4. 設置緩存標記
    記錄緩存數據是否過期,過期時觸發後臺線程更新實際的 key。

  5. 設置熱點數據的永不過期或較長過期時間
    減少熱點數據失效的機會。

擊穿(針對某一個數據突然過期,直接查資料庫)

擊穿指高併發情況下,當一個 key 突然失效,大量請求直接訪問資料庫,可能導致資料庫負載過高。

擊穿解決方案

  1. 為緩存數據設置不同的過期時間
    避免集中失效,監控數據,適時調整。

  2. 引入兩級緩存架構
    使用本地緩存(如 Guava Cache)作為第一級緩存,Redis 作為第二級緩存,設置不同的過期時間。

  3. 針對熱點數據預載入
    保證緩存不會在同一時間全部失效。

總結

如果大量的請求在redis上得不到響應,那麼就會導致這些請求會直接去訪問DB,導致DB的壓力瞬間變大而卡死或者宕機。

  • 大量高併發請求打在 Redis 上
  • Redis 上的資源未能響應時,直接訪問資料庫
  • 資料庫壓力瞬間增大,可能導致資料庫宕機,引發一系列“災害”

您的分享是我們最大的動力!

-Advertisement-
Play Games
更多相關文章
  • 32位配置寄存器:GPIOx_CRL,GPIOx_CRH 32位數據寄存器:GPIOx_IDR,GPIOx_ODR 32位置位/複位寄存器:GPIOx_BSRR 16位複位寄存器:GPIOx_BRR 32位鎖定寄存器:GPIOx_LCKR GPIO 寄存器詳解 CRL 32位埠配置低寄存器(GPI ...
  • 嵌入式STM32單片機開發環境配置教學Win/Mac · 本教程支持Windows和Mac · Windows可選的開發軟體為Keil、Clion、STM32CubeMX,可自由選擇開發方式 · Mac的開發環境為(Clion+OpenOCD+STM32CubeMX),僅支持HAL庫 · 本博客同步 ...
  • Multipass 虛擬機 ssh 登錄(密碼方式) [!NOTE] 以 Ubuntu 24,04 LTS 為例 準備工作 為了演示新建一個示例虛擬機。 multipass launch --name vm01 -c 4 -m 4G -d 100G --network bridged 操作步驟 進入 ...
  • 實踐環境 CentOS-7-x86_64-DVD-2009 簡介 Firewalld是一種簡單的、有狀態的、基於區域(zone-based)的防火牆。策略和區域用於組織防火牆規則。網路在邏輯上被劃分為多個區域,它們之間的流量可以通過策略進行管理。 查看防火牆狀態 # service firewall ...
  • STM32 與 linux 雙向串口通信實驗 本文記錄STM32 與 linux 雙向串口通信,包含stm32發送、Linux阻塞式接收;Linux發送,STM32阻塞式接收;本實驗的目的在於調通數據鏈路,為之後使用奠定基礎。 實驗平臺為: STM32方面用的是STM32H723ZGT6為核心的開發 ...
  • Linux 腳本文件 shebang (!#) 行最大為何只有 128 位元組?為何最多只能指定一個參數?如何將這些參數排列在參數列表前面?本文通過閱讀 Linux 內核源碼,一一為你揭秘 ...
  • 前言 將一個處於睡眠狀態或者新創建的進程加入就緒隊列時會產生喚醒搶占檢查,被喚醒的任務一般期望能夠立刻執行,發生搶占能夠滿足被喚醒任務的實時性需求。CFS調度器的喚醒搶占能否成功會受到sysctl_sched_wakeup_granularity的影響,該參數能控制喚醒搶占發生的概率。頻繁的搶占有可 ...
  • FFmpeg是一個開源的多媒體框架,它可以處理各種音頻和視頻格式的轉換、解碼、編碼和流處理。它提供了一套豐富的庫和工具,廣泛應用於視頻點播、直播、多媒體處理、游戲開發等領域。 FFmpeg的主要組件包括: libavformat - 用於音頻和視頻的多媒體容器的多路復用和解復用。支持多種格式,如MP ...
一周排行
    -Advertisement-
    Play Games
  • 移動開發(一):使用.NET MAUI開發第一個安卓APP 對於工作多年的C#程式員來說,近來想嘗試開發一款安卓APP,考慮了很久最終選擇使用.NET MAUI這個微軟官方的框架來嘗試體驗開發安卓APP,畢竟是使用Visual Studio開發工具,使用起來也比較的順手,結合微軟官方的教程進行了安卓 ...
  • 前言 QuestPDF 是一個開源 .NET 庫,用於生成 PDF 文檔。使用了C# Fluent API方式可簡化開發、減少錯誤並提高工作效率。利用它可以輕鬆生成 PDF 報告、發票、導出文件等。 項目介紹 QuestPDF 是一個革命性的開源 .NET 庫,它徹底改變了我們生成 PDF 文檔的方 ...
  • 項目地址 項目後端地址: https://github.com/ZyPLJ/ZYTteeHole 項目前端頁面地址: ZyPLJ/TreeHoleVue (github.com) https://github.com/ZyPLJ/TreeHoleVue 目前項目測試訪問地址: http://tree ...
  • 話不多說,直接開乾 一.下載 1.官方鏈接下載: https://www.microsoft.com/zh-cn/sql-server/sql-server-downloads 2.在下載目錄中找到下麵這個小的安裝包 SQL2022-SSEI-Dev.exe,運行開始下載SQL server; 二. ...
  • 前言 隨著物聯網(IoT)技術的迅猛發展,MQTT(消息隊列遙測傳輸)協議憑藉其輕量級和高效性,已成為眾多物聯網應用的首選通信標準。 MQTTnet 作為一個高性能的 .NET 開源庫,為 .NET 平臺上的 MQTT 客戶端與伺服器開發提供了強大的支持。 本文將全面介紹 MQTTnet 的核心功能 ...
  • Serilog支持多種接收器用於日誌存儲,增強器用於添加屬性,LogContext管理動態屬性,支持多種輸出格式包括純文本、JSON及ExpressionTemplate。還提供了自定義格式化選項,適用於不同需求。 ...
  • 目錄簡介獲取 HTML 文檔解析 HTML 文檔測試參考文章 簡介 動態內容網站使用 JavaScript 腳本動態檢索和渲染數據,爬取信息時需要模擬瀏覽器行為,否則獲取到的源碼基本是空的。 本文使用的爬取步驟如下: 使用 Selenium 獲取渲染後的 HTML 文檔 使用 HtmlAgility ...
  • 1.前言 什麼是熱更新 游戲或者軟體更新時,無需重新下載客戶端進行安裝,而是在應用程式啟動的情況下,在內部進行資源或者代碼更新 Unity目前常用熱更新解決方案 HybridCLR,Xlua,ILRuntime等 Unity目前常用資源管理解決方案 AssetBundles,Addressable, ...
  • 本文章主要是在C# ASP.NET Core Web API框架實現向手機發送驗證碼簡訊功能。這裡我選擇是一個互億無線簡訊驗證碼平臺,其實像阿裡雲,騰訊雲上面也可以。 首先我們先去 互億無線 https://www.ihuyi.com/api/sms.html 去註冊一個賬號 註冊完成賬號後,它會送 ...
  • 通過以下方式可以高效,並保證數據同步的可靠性 1.API設計 使用RESTful設計,確保API端點明確,並使用適當的HTTP方法(如POST用於創建,PUT用於更新)。 設計清晰的請求和響應模型,以確保客戶端能夠理解預期格式。 2.數據驗證 在伺服器端進行嚴格的數據驗證,確保接收到的數據符合預期格 ...