Redis | Redis集群模式技術原理介紹

關注:CodingTechWork

Redis 集群模式概述

??Redis 集群(Cluster)模式是 Redis 官方提供的分布式解決方案,旨在解決單機 Redis 在數據量和性能上的限制。它通過數據分片、高可用性和自動故障轉移等特性,提供了水平擴展和高可用性。

技術原理

Hash Slot 分片機制

??Redis 集群采用 Hash Slot(哈希槽) 機制進行數據分片。集群中共有 16384 個槽位,每個鍵通過 CRC16 算法映射到一個槽位上,槽位再分配到不同的節點上。這種機制支持動態遷移允許在運行時調整槽位分配,從而實現水平擴展。

去中心化架構

??Redis 集群采用 去中心化架構,沒有中心節點。每個節點都保存集群的部分數據,并通過 Gossip 協議 與其他節點通信,維護集群的狀態。這種架構提高了系統的可擴展性和容錯能力。

Master-Replica 模型

??每個槽位至少包含一個主節點(Master)和多個從節點(Replica)。主節點負責處理寫操作,從節點則提供數據冗余和讀擴展。當主節點故障時,從節點會自動提升為主節點,確保服務的高可用性。

故障檢測與自動轉移

??Redis 集群通過 Raft 協議 選舉新的主節點。當一個節點被判定為故障時,其他節點會通過投票機制選出一個新的主節點,整個過程通常在 200 毫秒內完成。客戶端會自動重定向到新的主節點,確保業務無感知。

使用方式

環境準備

假設我們有三臺主機,分別用于部署 Redis 集群的主節點和從節點:

IP主機名角色
192.168.182.110local-168-182-110主節點、從節點
192.168.182.111local-168-182-111主節點、從節點
192.168.182.112local-168-182-112主節點、從節點

配置 Redis 集群

  1. 創建配置文件:為每個節點創建獨立的配置文件。

    mkdir -p /opt/software/redis-7.0.3/cluster/redis_{7001..7003}
    cp /usr/local/redis/redis.conf /usr/local/redis/cluster_redis_7001.conf
    cp /usr/local/redis/redis.conf /usr/local/redis/cluster_redis_7002.conf
    cp /usr/local/redis/redis.conf /usr/local/redis/cluster_redis_7003.conf
    
  2. 修改配置文件:以 cluster_redis_7001.conf 為例。

    bind 192.168.182.110
    port 7001
    daemonize yes
    pidfile "/var/run/cluster_redis_7001.pid"
    logfile "/usr/local/redis/cluster_redis_7001.log"
    dir "/opt/software/redis-7.0.3/cluster/redis_7001"
    masterauth "123456"
    requirepass "123456"
    appendonly yes
    cluster-enabled yes
    cluster-config-file nodes_7001.conf
    cluster-node-timeout 15000
    
  3. 復制配置文件:將配置文件復制到其他主機,并修改 IP 地址。

    scp -r /usr/local/redis/cluster_redis_{7001..7003}.conf local-168-182-111:/usr/local/redis/
    scp -r /usr/local/redis/cluster_redis_{7001..7003}.conf local-168-182-112:/usr/local/redis/
    

啟動 Redis 服務

在每臺主機上啟動 Redis 服務。

redis-server /usr/local/redis/cluster_redis_7001.conf
redis-server /usr/local/redis/cluster_redis_7002.conf
redis-server /usr/local/redis/cluster_redis_7003.conf

創建集群

使用 redis-cli 創建集群。

redis-cli -a 123456 --cluster create \
192.168.182.110:7001 192.168.182.110:7002 192.168.182.110:7003 \
192.168.182.111:7001 192.168.182.111:7002 192.168.182.111:7003 \
192.168.182.112:7001 192.168.182.112:7002 192.168.182.112:7003 \
--cluster-replicas 2

常用命令

  • 查看集群信息

    redis-cli -c -h 192.168.182.110 -p 7001
    CLUSTER INFO
    CLUSTER NODES
    
  • 增加節點

    CLUSTER MEET <IP> <PORT>
    
  • 刪除節點

    CLUSTER FORGET <node_id>
    
  • 更改節點角色

    CLUSTER REPLICATE <master_node_id>
    
  • 保存配置

    CLUSTER SAVECONFIG
    

Redis 集群的優勢

橫向擴展能力

??Redis 集群支持數據分片,數據按槽位均勻分布,單集群理論上可支持 1000+ 節點。相比單機,集群模式在查詢和寫入性能上有顯著提升。

高可用性

  • 故障自動檢測:節點故障判定僅需 15 秒(可配置)。
  • 智能故障轉移:通過 Raft 協議選舉新主節點,切換過程平均 200 毫秒。
  • 服務不中斷:客戶端自動重定向機制確保業務無感知。

運維便捷性

  • 原生支持:無需第三方組件,如 Twemproxy。
  • 動態擴容:支持在線添加節點。
  • 平滑升級:支持滾動重啟不影響服務。

性能提升

??集群模式支持多個主節點和從節點,查詢和寫入操作可以分散到多個節點,提升系統的并發處理能力。

適用場景

適用場景

  1. 數據規模超過單機內存容量(如 500GB+)。
  2. 需要 99.99% 以上可用性保障。
  3. 業務允許最終一致性。

不適用場景

  1. 需要強事務保證的金融業務。
  2. 頻繁跨分片查詢的復雜分析場景。
  3. 超低延遲要求的實時交易系統。

最佳實踐

容量規劃

  • 每個分片預留 20% 內存緩沖。
  • 控制單個分片不超過 30GB。

客戶端配置

JedisClusterConfig config = new JedisClusterConfig.Builder().setMaxRedirects(5)  // 設置最大重定向次數,防止在故障轉移期間客戶端重定向過多.setPassword("123456")  // 設置連接密碼,如果集群啟用了密碼認證.build();// 定義集群節點
Set<HostAndPort> nodes = new HashSet<>();
nodes.add(new HostAndPort("192.168.182.110", 7001));
nodes.add(new HostAndPort("192.168.182.110", 7002));
nodes.add(new HostAndPort("192.168.182.110", 7003));
nodes.add(new HostAndPort("192.168.182.111", 7001));
nodes.add(new HostAndPort("192.168.182.111", 7002));
nodes.add(new HostAndPort("192.168.182.111", 7003));
nodes.add(new HostAndPort("192.168.182.112", 7001));
nodes.add(new HostAndPort("192.168.182.112", 7002));
nodes.add(new HostAndPort("192.168.182.112", 7003));// 創建 JedisCluster 實例
JedisCluster jedisCluster = new JedisCluster(nodes, config);// 使用 JedisCluster 進行操作
try (JedisCluster jedisCluster) {// 設置鍵值對jedisCluster.set("key", "value");// 獲取鍵值對String value = jedisCluster.get("key");System.out.println("Retrieved value: " + value);// 執行其他操作...
} catch (Exception e) {e.printStackTrace();
}

監控與報警

  1. 監控集群狀態

    • 使用 Redis 提供的 INFOCLUSTER INFO 命令定期檢查集群的狀態。
    • 可以通過工具如 Prometheus 和 Grafana 監控集群的性能指標(如內存使用率、CPU 使用率、響應時間等)。
  2. 報警機制

    • 設置報警閾值,當節點故障、性能下降或數據遷移失敗時,通過郵件、短信或即時通訊工具通知管理員。
    • 使用開源工具如 Alertmanager 配合 Prometheus 實現報警功能。

備份與恢復

  1. 定期備份

    • 配置 Redis 的持久化機制(如 RDB 和 AOF),確保數據可以定期備份到磁盤。
    • 使用工具如 redis-backup 定期備份集群數據。
  2. 災難恢復

    • 制定災難恢復計劃,確保在重大故障時能夠快速恢復服務。
    • 定期測試備份數據的恢復流程,確保備份數據的完整性和可用性。

性能優化

  1. 連接池管理

    • 使用連接池管理連接,提高資源利用率,減少連接創建和銷毀的開銷。
    • 配置合理的連接池參數,如最大連接數、最小空閑連接數等。
  2. 負載均衡

    • 通過客戶端或代理層實現負載均衡,確保請求均勻分布到各個節點。
    • 使用 Redis Cluster 的自動負載均衡功能,動態調整槽位分配。
  3. 緩存策略

    • 合理配置緩存策略,避免緩存穿透和緩存雪崩問題。
    • 使用分布式鎖等機制,確保緩存操作的線程安全。

安全措施

  1. 網絡隔離

    • 使用防火墻和安全組限制對 Redis 集群的訪問,僅允許信任的客戶端連接。
    • 配置 Redis 的 bind 參數,限制監聽的 IP 地址。
  2. 數據加密

    • 使用 SSL/TLS 加密客戶端與服務器之間的通信,防止數據在傳輸過程中被竊取。
    • 配置 Redis 的 tls 參數,啟用加密通信。
  3. 訪問控制

    • 配置 Redis 的 user 命令,為不同用戶分配不同的權限,限制對敏感操作的訪問。
    • 使用密碼認證機制,確保只有授權用戶可以訪問集群。

總結

??Redis 集群模式通過數據分片、高可用性和自動故障轉移等特性,提供了水平擴展和高可用性。它適用于數據量大、對高可用性和性能要求較高的場景。通過合理配置和管理,Redis 集群可以大大增強系統的擴展性和可靠性,滿足大規模生產環境的需求。

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

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

相關文章

Servlet小結

視頻鏈接&#xff1a;黑馬servlet視頻全套視頻教程&#xff0c;快速入門servlet原理servlet實戰 什么是Servlet&#xff1f; 菜鳥教程&#xff1a;Java Servlet servlet&#xff1a; server applet Servlet是一個運行在Web服務器&#xff08;如Tomcat、Jetty&#xff09;或應用…

數據庫進階之MySQL 程序

1.目標 1> 了解mysqlId服務端程序 2> 掌握mysql客戶端程序的使用 3> 了解工具包中的其他程序 2. MySQL程序簡介 本章介紹 MySQL 命令?程序以及在運?這些程序時指定選項的?般語法(如:mysql -uroot -p)。 對常?程序進?詳細的講解(實用工具的使用方法)&#xf…

VS2022 設置 Qt Project Settings方法

本文解決的問題&#xff1a;創建完成后&#xff0c;如需要用到Sql或者Socket等技術&#xff0c;需要設置Qt Project Settings&#xff1b; 1、打開VS2022編譯器&#xff0c;創建QT項目工程 2、創建完成后&#xff0c;點擊 解決方案 →右鍵屬性 3、選擇 Qt Project Settings →…

React:封裝一個評論回復組件

分析 用戶想要一個能夠顯示評論列表&#xff0c;并且允許用戶進行回復的組件。可能還需要支持多級回復&#xff0c;也就是對回復進行再回復。然后&#xff0c;我要考慮組件的結構和功能。 首先&#xff0c;數據結構方面&#xff0c;評論應該包含id、內容、作者、時間&#xf…

wx讀書某sign算法詳解

未加固 版本&#xff1a;9.2.3 前置知識&#xff1a; (v41 & 0xFFFFFFFFFFFFFFFELL) 是一種高效的奇偶檢查方法&#xff0c;用于判斷數值 v41 是否為奇數。 std::sort<std::lessstd::string,std::string &,std::string>(a1, v6, s); 排序算法 # 完全等價的字…

Django的異步任務隊列管理_Celery

1 基本原理 Celery 是一個異步任務隊列&#xff0c;能夠將耗時操作&#xff08;如發郵件、處理圖片、網絡爬蟲等&#xff09;從 Django 主線程中分離出來&#xff0c;由后臺的 worker 處理&#xff0c;避免阻塞請求。Celery 作為獨立運行的后臺進程&#xff08;Worker&#xf…

【計算機網絡】Linux網絡的幾個常用命令

&#x1f4da; 博主的專欄 &#x1f427; Linux | &#x1f5a5;? C | &#x1f4ca; 數據結構 | &#x1f4a1;C 算法 | &#x1f152; C 語言 | &#x1f310; 計算機網絡 相關文章&#xff1a;計算機網絡專欄 目錄 ping&#xff08;檢測網絡連通性&#xff09;…

全開源、私有化部署!輕量級用戶行為分析系統-ClkLog

ClkLog是一款支持私有化部署的全開源埋點數據采集與分析系統&#xff0c;兼容Web、App、小程序多端埋點&#xff0c;快速洞察用戶訪問路徑、行為軌跡&#xff0c;并生成多維用戶畫像。助力中小團隊搭建輕量靈活的用戶行為分析平臺。 為什么需要一款私有化的埋點分析系統&#x…

golang定時器的精度

以 go1.23.3 linux/amd64 為例。 定時器示例代碼&#xff1a; package mainimport ("context""fmt""time" )var ctx context.Contextfunc main() {timeout : 600 * time.Secondctx, _ context.WithTimeout(context.Background(), timeout)dea…

svn 遠程服務搜索功能

svn服務器沒有遠程搜索功能&#xff0c;靠人工檢索耗時耗力&#xff0c;當服務器文件過多時&#xff0c;全部checkout到本地檢索&#xff0c;耗時太久。 1. TortoiseSVN 安裝注意事項 下載官網地址&#xff1a;https://tortoisesvn.en.softonic.com/download 安裝時選中 co…

uniapp-商城-39-shop 購物車 選好了 進行訂單確認4 配送方式2 地址頁面

上面講基本的樣式和地址信息&#xff0c;但是如果沒有地址就需要添加地址&#xff0c;如果有不同的地址就要選地址。 來看看處理方式&#xff0c; 1、回顧 在delivery-layout中 methods:{goAddress(){uni.navigateTo({url:"/pagesub/pageshop/address/addrlist"})…

Linux命令-iostat

iostat 命令介紹 iostat 是一個用于監控 Linux 系統輸入/輸出設備加載情況的工具。它可以顯示 CPU 的使用情況以及設備和分區的輸入/輸出統計信息&#xff0c;對于診斷系統性能瓶頸&#xff08;如磁盤或網絡活動緩慢&#xff09;特別有用。 語法&#xff1a; iostat [options…

vue2關于Node.js17及以上報digital envelope錯誤的解決辦法

文章目錄 簡介錯誤原因解決方案設置環境變量修改package.json安裝舊版本Node.js更新依賴項更改加密設置 簡介 digital envelope routines::unsupported錯誤?通常發生在Node.js版本升級到17或更高版本后&#xff0c;因為這些版本開始使用OpenSSL 3.0&#xff0c;它對算法和密鑰…

LLM - Large Language Model

回顧2024&#xff1a;與LLM又相伴一年的經歷與思考 - 知乎萬字長文入門大語言模型&#xff08;LLM&#xff09; - 知乎“大模型本質就是兩個文件&#xff01;”特斯拉前AI總監爆火LLM科普&#xff0c;時長1小時&#xff0c;面向普通大眾 - 知乎大模型本質及趨勢剖析&#xff0c…

Linux 內核網絡協議棧中的關鍵數據結構:inet_skb_parm 與 ip_options

在 Linux 內核的網絡協議棧中,數據包的高效處理依賴于一系列精心設計的數據結構。這些結構體不僅需要存儲網絡數據的元信息,還需支持復雜的協議邏輯(如路由、分片、安全策略等)。本文聚焦兩個核心結構體 struct inet_skb_parm 和 struct ip_options,解析它們的設計原理、功…

如何修復卡在恢復模式下的 iPhone:簡短指南

Apple 建議使用恢復模式作為最后的手段&#xff0c;以便在 iPhone 啟動循環或顯示 Apple 標志時恢復 iPhone。這是解決持續問題的簡單方法&#xff0c;但您很少使用。但是&#xff0c;當您的 iPhone 卡住恢復模式本身時&#xff0c;您會怎么做&#xff1f;雖然 iPhone 卡在這種…

10前端項目----商品詳情頁/滾輪行為

商品詳情頁面 商品詳情組件發送請求獲取相應商品詳情信息組件展示數據 優化一下路由配置代碼滾輪自動置頂 商品詳情組件 路由配置 點擊商品進行跳轉—將Detail組件變成路由組件 從商品到詳情&#xff0c;肯定需要傳參(產品ID)告訴Detail是哪個商品&#xff0c;需要展示哪個商品…

DIFY 又跟新了,來到 1.3.0 版本,看正文

歡迎來到 1.3.0 版本&#xff01;添加了各種巧妙的功能、修復了錯誤&#xff0c;并帶來了一些新功能&#xff1a; 一、核心亮點&#xff1a; 結構化輸出 1、LLM 節點新增JSON Schema編輯器&#xff0c;確保大語言模型能夠返回符合預設格式的JSON數據。這一功能有助于提升數據…

git檢查提交分支和package.json的version版本是否一致

這里寫自定義目錄標題 一、核心實現步驟?1.安裝必要依賴?2.初始化 Husky?3.創建校驗腳本?4.配置 lint-staged?5.更新 Husky 鉤子? 三、工作流程說明?四、注意事項? 以下是基于 Git Hooks 的完整解決方案&#xff0c;通過 husky 和自定義腳本實現分支名與版本號一致性校…

react-navigation-draw抽屜導航

心得寫在前面分享給大家&#xff1a; 我的實現方法&#xff0c;并沒有完全安裝官網來做&#xff0c;而是進行了簡化&#xff0c;效果是一樣的。沒有按照官網說的修改metro.config.js文件&#xff0c;同時也沒有 react-native-gesture-handler 的安裝后&#xff0c;我們需要有條…