Redis6.x高可用之Cluster叢集和分片
阿新 • • 發佈:2021-08-04
目錄
1.Cluster叢集介紹
-
背景
- Sentinel解決了主從架構故障自動遷移的問題
- 但是Master主節點的寫能力和儲存能力依舊受限
- 使用redis的叢集cluster就是為了解決單機redis容量有限的問題,將資料按一定的規則分配到多臺機器
-
什麼是叢集Cluster
- 是一組相互獨立的、通過高速網路互聯的計算機,它們構成了一個組,並以單一系統的模式加以管理
- 容易和分散式弄混,分散式系統簡單的可以認為是一個龐大的系統,進行拆分多個小系統
-
redis叢集模式介紹
- Cluster模式是redis3.0開始推出
- 採用無中心結構,每個節點儲存資料和整個叢集狀態,每個節點都和其他所有節點連線
- 官方要求:至少6個節點才可以保證高可用,即3主3從;擴充套件性強、更好做到高可用
- 各個節點會互相通訊,採用gossip協議交換節點元資料資訊
- 資料分散儲存到各個節點上
2.Cluster資料分片和虛擬雜湊槽介紹
-
背景
- 主節點的寫能力和儲存能力受限
- 單臺機器無法滿足需求,因此把資料分散儲存到多個機器
- 類似案例:mysql分庫分表
-
常見的資料分割槽演算法
- 雜湊取模:對選擇的partitioning key計算其雜湊值,得到的雜湊值就是對應的分割槽
- 範圍分片:通過確定分割槽鍵是否在某個範圍內來選擇分割槽
- 一致性Hash分割槽
- redis cluster叢集沒有采用一致性雜湊方案,而是採用【資料分片】中的雜湊槽來進行資料儲存與讀取的
-
什麼是redis的雜湊槽slot
- redis叢集預分好16384個槽,當需要在redis叢集中放置一個key-value時,根據CRC16(key) mod 16384的值,決定將一個key放到哪個桶中
-
大體流程
-
假設主節點的數量為3,將16384個槽位按照【使用者自己的規則】去分配這3個節點,每個節點複製一部分槽位
- 節點1的槽位區間範圍為0-5460
- 節點2的槽位區間範圍為5461-10922
- 節點3的槽位區間範圍為10923-16383
- 注意:從節點是沒有槽位的,只有主節點才有
-
儲存查詢
- 對要儲存查詢的鍵進行CRC16雜湊運算,得到一個值,並取模16384,判斷這個值在哪個節點的範圍區間
- 假設CRC16("test_key")%16384=3000,就是節點一
- CRC16演算法不是簡單的hash演算法,是一種校驗演算法
-
-
使用雜湊槽的好處就在於可以方便的新增或移除節點
- 當需要增加節點時,只需要把其他節點的某些雜湊槽挪到新節點就可以了
- 當需要移除節點時,只需要把移除節點上的雜湊槽挪到其他節點就行了
3.Cluster叢集環境搭建
-
說明
- 舊版本的需要使用ruby語言進行構建,新版5之後直接用redis-cli即可
- 6個節點,三主三從,主從節點會自動分配,不是人工指定
- 主節點故障後從節點會替換主節點
-
注意點:把之前的RDB、AOF檔案刪除
-
配置
bind 0.0.0.0 port 6381 daemonize yes requirepass "123456" logfile "/usr/local/redis/temp/redis6381.log" dbfilename "redis6381.rdb" dir "/usr/local/redis/temp" appendonly yes appendfilename "appendonly6381.aof" masterauth "123456" # 是否開啟叢集 cluster-enabled yes # 生成的node檔案,記錄叢集節點資訊,預設為nodes.conf cluster-config-file nodes-6381.conf # 節點連線超時時間 cluster-node-timeout 20000 # 叢集節點的ip,當前節點的ip cluster-announce-ip 123.57.94.239 # 叢集節點對映埠 cluster-announce-port 6381 # 叢集節點匯流排埠,節點之間互相通訊,常規埠+1萬 cluster-announce-bus-port 16381
-
啟動6個節點
./bin/redis-server ./temp/redis6381.conf ./bin/redis-server ./temp/redis6382.conf ./bin/redis-server ./temp/redis6383.conf ./bin/redis-server ./temp/redis6384.conf ./bin/redis-server ./temp/redis6385.conf ./bin/redis-server ./temp/redis6386.conf
-
加入叢集(其中一個節點執行即可)
- --cluster:構建叢集全部節點資訊
- --cluster-replicas 1:主從節點的比例,1表示一主一從的方式
./bin/redis-cli -a 123456 --cluster create 123.57.94.239:6381 123.57.94.239:6382 123.57.94.239:6383 123.57.94.239:6384 123.57.94.239:6385 123.57.94.239:6386 --cluster-replicas 1
-
檢查狀態資訊(其中一個節點執行即可)
./bin/redis-cli -a 123456 --cluster check 123.57.94.239:6381
4.Cluster叢集讀寫命令
-
叢集狀態
./bin/redis-cli -c -a 123456 -p 6381 # 叢集資訊 cluster info # 節點資訊 cluster nodes
-
測試叢集讀寫命令set/get
- key雜湊運算計算槽位置
- 槽在當前節點的話直接插入/讀取,否則自動轉向到對應的節點
-
操作都是主節點操作,從節點只是備份
-
流程解析
- 啟動應用
- 加入叢集
- 從節點請求複製主節點(主從複製)
- 先全量
- 再增量
5.Cluster叢集整合SpringBoot
-
配置檔案
spring: redis: cluster: # 最大轉發次數 max-redirects: 3 nodes: 123.57.94.239:6381,123.57.94.239:6382,123.57.94.239:6383,123.57.94.239:6384,123.57.94.239:6385,123.57.94.239:6386 cache: # 指定快取型別 type: redis password: 123456
-
高可用架構總結
- 主從模式:讀寫分離、備份,一個master可以有多個slaves
- 哨兵sentinel:監控,自動轉移,哨兵發現主伺服器掛了後,就會從slave中重新選舉一個主伺服器
- 叢集:為了解決單機redis容量有限的問題,將資料按一定的規則分配到多臺機器,記憶體/QPS不受限於單機,提高併發量