
文章目錄一、先搞懂我們為什么需要Redis集群二、Redis集群核心底層16384哈希槽是什么小坑提醒三、實操CentOS7搭建3主3從Redis集群前置準備步驟1創建集群目錄與獨立配置文件步驟2啟動6個Redis節點步驟3一鍵創建集群重點易錯點步驟4集群客戶端連接-c參數不能丟四、集群故障自動恢復機制面試高頻場景1單個主節點宕機如6379下線場景2某一組主從全部宕機五、集群優缺點總結優點缺點六、學習復盤集群、主從、哨兵三者怎么選Redis集群總結一、為什么要用Redis集群二、核心原理16384哈希槽三、CentOS7搭建實操要點四、集群優缺點優點缺點五、SpringBoot整合Redis集群六、三種Redis架構適用場景七、學習總結一、先搞懂我們為什么需要Redis集群先回憶之前學的架構單機Redis、一主多從哨兵模式都有明顯短板這也是集群誕生的核心原因容量瓶頸單臺Redis內存有限百萬級商品、用戶緩存根本存不下主從只是復制數據不能擴容存儲空間數據只能存在主節點一臺機器。并發上限低所有寫操作只能打在唯一主節點海量秒殺、首頁緩存場景下單節點CPU、網絡IO直接打滿無法分攤寫壓力。主從哨兵有硬傷哨兵只能做故障自動切換不能水平分片存儲數據所有key全量存在主庫擴容只能換更高配置服務器成本極高無法分布式橫向拓展。Redis Cluster3.0推出無中心化集群完美解決兩大痛點數據分片存儲、讀寫分布式擴容同時自帶主從故障自動切換是企業生產主流緩存架構。二、Redis集群核心底層16384哈希槽是什么這是集群最核心的概念考試、面試必考點我當初理解了半天才通透槽位總數固定163840~16383Redis把所有緩存key均勻劃分到16384個哈希槽每個主節點負責一部分槽數據按槽分片存放。key歸屬計算規則CRC16(key) % 16384通過CRC16算法算出key的校驗值對16384取模得到這個key對應的哈希槽編號客戶端自動路由到對應主節點讀寫。分片示例3主架構主節點10 ~ 5460 槽主節點25461 ~ 10922 槽主節點310923 ~ 16383 槽每個主節點搭配從節點標準3主3從一個槽的主節點宕機對應從自動升級為主保證數據不丟失、集群可用。小坑提醒集群環境下不在同一個哈希槽的多個key不能用mset、mget批量操作直接報CROSSSLOT跨槽錯誤解決方案哈希標簽{分組標識}大括號內內容參與哈希計算相同大括號的key會落到同一個槽mset user{order}:1 zhang user{order}:2 li兩個key都根據order計算槽位支持批量操作。三、實操CentOS7搭建3主3從Redis集群課程里用6個Redis實例端口6379/6380/6381主、6389/6390/6391從全程命令親測可用報錯點全部標注前置準備已編譯安裝Redis6.2.1gcc環境正常關閉防火墻/開放6379~6391端口注釋bind 127.0.0.1關閉保護模式protected-mode no否則外部/集群節點無法通信步驟1創建集群目錄與獨立配置文件# 新建集群文件夾mkdirredis-clustercdredis-cluster# 拷貝基礎redis配置cp/opt/redis-6.2.1/redis.conf ./復制6份配置分別修改端口、pid、rdb文件名必須開啟集群三大參數核心配置# 開啟集群模式 cluster-enabled yes # 集群節點信息存儲文件每個實例名字區分 cluster-config-file nodes-6379.conf # 節點失聯超時15秒超時觸發主從切換 cluster-node-timeout 15000批量替換端口小技巧vim全局替換:%s/6379/63806份文件快速改完。步驟2啟動6個Redis節點redis-server redis6379.conf redis-server redis6380.conf redis-server redis6381.conf redis-server redis6389.conf redis-server redis6390.conf redis-server redis6391.conf# 查看進程確認全部啟動ps-ef|grepredis啟動成功后目錄自動生成nodes-xxxx.conf節點記錄文件。步驟3一鍵創建集群重點易錯點進入redis源碼src目錄執行創建命令必須寫服務器真實IP不能127.0.0.1否則集群節點互通失敗cd/opt/redis-6.2.1/src redis-cli--clustercreate192.168.10.130:6379192.168.10.130:6380192.168.10.130:6381192.168.10.130:6389192.168.10.130:6390192.168.10.130:6391 --cluster-replicas1參數解釋--cluster-replicas 1每個主節點分配1個從節點3主3從完美架構。執行后輸入yes確認哈希槽分配出現All 16384 slots covered代表集群搭建成功步驟4集群客戶端連接-c參數不能丟# -c 開啟集群自動重定向無此參數跨槽讀寫報錯redis-cli-c-p6379# 查看集群全部節點信息cluster nodes# 查看指定key所屬哈希槽cluster keys k1寫入測試set k1 v1終端會自動提示重定向到對應節點集群路由機制生效。四、集群故障自動恢復機制面試高頻場景1單個主節點宕機如6379下線集群其他節點檢測到6379超時失聯6379對應的從節點6390自動升級為主節點接管0~5460所有哈希槽3 原有主節點6379重啟后自動變成新主6390的從節點整個集群正常讀寫無停機。場景2某一組主從全部宕機由配置cluster-require-full-coverage控制yes默認16384槽無法全部覆蓋整個集群直接不可用no僅丟失該組槽的數據無法讀寫其余節點正常工作。生產環境建議改為no降低整體故障影響范圍。五、集群優缺點總結優點數據分片存儲橫向擴容內存突破單機容量限制讀寫分離分布式分攤并發寫壓力分散到多主節點內置主從復制自動故障轉移無需額外部署哨兵無中心化架構任意節點可接收客戶端請求自動路由。缺點多鍵批量操作限制無哈希標簽無法跨槽mget/mset事務僅支持單個哈希槽內key跨槽不支持事務搭建、運維復雜度高于單機、哨兵架構批量數據備份、擴容遷移操作流程更繁瑣。六、學習復盤集群、主從、哨兵三者怎么選很多同學學完混淆一張表分清適用場景架構核心能力適用場景缺陷單機Redis簡單緩存、五大數據類型小型項目、本地測試、低并發容量、并發上限極低無高可用一主多從哨兵讀寫分離、自動故障切換中等項目數據量不大僅需高可用無法分片擴容所有數據存主庫Redis集群分片擴容自動容災大型互聯網、高并發海量緩存多鍵、事務有使用限制運維復雜Redis集群總結一、為什么要用Redis集群單機內存、并發上限低一主多從哨兵僅實現故障切換無法拆分數據橫向擴容。Redis Cluster為3.0推出的無中心化集群同時實現數據分片存儲、分布式分攤讀寫壓力自帶主從自動容災。二、核心原理16384哈希槽固定0~16383共16384個哈希槽通過CRC16(key)%16384計算key歸屬槽位分散存儲到多臺主節點標準部署3主3從每個主節點搭配一臺從機主節點宕機時對應從自動升級為主不同槽位key不能執行mset/mget使用哈希標簽{xxx}大括號內字符參與哈希計算讓多key落到同一槽支持批量操作。三、CentOS7搭建實操要點6個實例6379/6380/6381為主6389/6390/6391為從配置文件必須開啟cluster-enabled yes等集群三項核心參數創建集群命令必須填寫服務器真實內網IP禁止127.0.0.1--cluster-replicas 1代表每個主分配1臺從客戶端連接集群需加-c參數開啟槽位自動重定向故障規則cluster-require-full-coverageyes時任意一組主從全宕整個集群不可改為no僅對應槽位數據無法訪問其余正常。四、集群優缺點優點數據分片突破單機內存與并發瓶頸內置主從復制無需額外部署哨兵無中心化任意節點均可接收客戶端請求。缺點跨槽多鍵、事務存在使用限制部署、運維復雜度高于單機、哨兵架構。五、SpringBoot整合Redis集群引入redis啟動器與連接池依賴yml配置集群全部節點地址自定義RedisTemplate使用String序列化key、Jackson序列化value解決亂碼模板底層自動完成哈希槽路由無需手動計算。六、三種Redis架構適用場景單機小型項目、本地測試低并發低數據量主從哨兵中小型項目只需高可用無需海量數據擴容Redis集群大型互聯網項目高并發、海量緩存需要分布式分片擴容。七、學習總結哈希分片是分布式中間件通用設計思路實操高頻踩坑點localhost集群互通失敗、忘記-c參數、跨槽執行批量指令哈希槽、集群搭建、架構對比是期末、后端面試核心考點。