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