Redis集群
Redis集群
一、Redis集群
Redis集群是一種使用分布式技術將數據分散存儲在多個節點上的解決方案。它可以提供高可用性、擴展性和性能的優勢。
Redis集群通過分片(Sharding)來存儲數據。數據被平均分配到多個節點上,每個節點負責存儲一部分數據。這樣可以將負載分散到多個節點上,并提高整體的讀寫性能和存儲容量。
在Redis集群中,存在以下幾個關鍵的組件和概念:
1.節點(Node):
Redis集群由多個節點組成,每個節點都是一個獨立運行的Redis實例。每個節點都有一個唯一的節點ID。
2.主節點(Master):
每個節點中的一個Redis實例被選舉為主節點,負責處理寫操作,并將數據同步到從節點。
3.從節點(Slave):
每個節點中的其他Redis實例作為從節點,只能進行讀操作,并通過異步復制的方式從主節點獲取數據更新。
4.握手(Handshake):
當一個Redis客戶端連接到集群時,它會與集群進行握手,從而了解集群中所有的節點信息。
5.數據分片(Data Sharding):
集群將數據劃分為多個槽位(Slots),默認有16384個槽位。每個節點被分配一部分槽位來存儲數據。
6.槽位遷移(Slots Migration):
當節點加入或離開集群時,槽位的分配會發生變化,Redis集群會自動進行槽位遷移,將槽位重新分配給合適的節點。
7.故障轉移(Failover):
當主節點發生故障時,Redis集群會自動進行故障轉移,選舉一個從節點作為新的主節點,確保系統的可用性。
Redis集群有幾種模式
Redis集群分三種模式:主從模式、sentinel模式、Redis Cluster
三種方式詳解:
http://www.rzrgm.cn/coolops/p/12809893.html
1.主從復制模式:
在主從復制模式中,存在一個主節點(Master)和多個從節點(Slave)。主節點負責處理寫操作,并將數據同步到從節點。從節點只能進行讀操作,并通過異步復制的方式從主節點獲取數據更新。這種模式可以提供一定程度的高可用性和讀擴展性,但主節點故障時需要手動切換到一個從節點作為新的主節點。
- sentinel(哨兵)模式:
哨兵模式是一種基于主從復制的高可用解決方案,用于監控和管理Redis集群中的主節點的故障轉移
在哨兵模式中,有一個或多個哨兵節點(Sentinel)實例運行在獨立的進程上。哨兵節點負責監控Redis集群中的主節點和從節點,并在主節點故障時自動執行故障轉移操作。
具體工作流程如下:
- 哨兵節點通過發送命令和接收響應來監控Redis節點的狀態,包括主節點和從節點。
- 當主節點失效(無法訪問)時,哨兵節點會通過投票機制選舉一個從節點作為新的主節點。
- 選舉出的新主節點會通知其他哨兵節點和Redis客戶端更新主節點信息,并進行故障轉移操作。
- 故障轉移完成后,其他從節點會自動切換到新的主節點并重新執行復制操作。
哨兵模式提供以下優勢:
- 高可用性:當主節點發生故障時,哨兵可以自動發現故障,并選擇一個新的主節點來繼續提供服務,從而實現快速的故障轉移。
- 自動化管理:哨兵節點能夠自動監控和管理Redis集群中的節點,包括故障檢測、選舉和故障轉移等操作,減輕了管理員的負擔。
- 配置管理:通過哨兵模式,可以動態管理Redis主節點的變更和配置更新,如添加新的從節點、刪除節點或修改配置。
哨兵模式通常適用于中小規模的Redis部署,對主從切換和自動化故障轉移有較為簡單的需求。
- Redis Cluster模式:
Redis Cluster詳細:
http://www.rzrgm.cn/jian0110/p/14002555.html
Redis Cluster是Redis官方提供的原生分布式解決方案。在Redis Cluster模式中,數據被分散存儲在多個節點上,每個節點都持有部分數據槽(Slots)。集群使用Gossip協議進行節點間的信息交換和數據遷移。Redis Cluster提供了自動化的故障轉移、節點管理和數據重定向等功能,以實現高可用性和水平擴展。這種模式是推薦的分布式部署方式。
Redis Cluster特點
- 多主多從,去中心化:從節點作為備用,復制主節點,不做讀寫操作,不提供服務
- 不支持處理多個key:因為數據分散在多個節點,在數據量大高并發的情況下會影響性能;
- 支持動態擴容節點;
- 節點之間相互通信,相互選舉,不再依賴sentinel:準確來說是主節點之間相互“監督”,保證及時故障轉移
- 為了實現集群的高可用,即判斷節點是否健康(能否正常使用),redis-cluster有這么一個投票容錯機制:如果集群中超過半數的節點投票認為某個節點掛了,那么這個節點就掛了(fail)。這是判斷節點是否掛了的方法
- 每個Redis集群理論上最多可以有16384個節點
主從復制模式和Redis Cluster模式的區別
1.相比較sentinel模式,多個master節點保證主要業務(比如master節點主要負責寫)穩定性,不需要搭建多個sentinel實例監控一個master節點;
2.相比較一主多從的模式,不需要手動切換,具有自我故障檢測,故障轉移的特點;
3.相比較其他兩個模式而言,對數據進行分片(sharding),不同節點存儲的數據是不一樣的;
4.從某種程度上來說,Sentinel模式主要針對高可用(HA),而Cluster模式是不僅針對大數據量,高并發,同時也支持HA。
- 主從復制模式適用于較小規模的部署和讀寫分離、負載均衡需求。Redis Cluster模式適用于大規模的分布式部署、高可用性和水平擴展需求
Redis Cluster中,節點之間的通信
在Redis Cluster中,節點之間通過建立 TCP 連接,使用 gossip 協議來傳播集群的信息,節點內部通信端口是服務端口 + 10000
舉個例子,啟動 Redis 服務之后會有一個 6379 端口(對外端口)和一個 16379 端口(對內通信端口)
Gossip協議是一種去中心化的通信協議,它允許節點通過相互交換信息來達成共識。在Redis Cluster中,每個節點都會與其他節點進行定期的Gossip通信,以實現集群的管理和數據分片的均衡。
具體的通信流程如下:
- 每個節點都會維護一個關于集群狀態的本地視圖,其中包含有關其他節點的信息。
- 節點定期進行Gossip通信,將本地視圖中的信息發送給其他節點,并接收其他節點的信息。
- 當節點接收到其他節點的信息時,它會將接收到的信息與本地視圖進行比較,并根據一定的規則來更新本地視圖。
- 更新后的本地視圖會用于集群的管理操作,如故障檢測、故障轉移、數據遷移等。
通過Gossip協議,Redis Cluster中的節點可以相互了解彼此的狀態,并進行動態的集群管理。當有新節點加入或節點出現故障時,節點會通過Gossip通信來傳播和更新集群狀態,從而實現節點的動態擴縮容和故障恢復。
Gossip協議的優勢在于它的去中心化特性,使得節點之間的通信更為靈活和高效。每個節點都具備相同的角色,沒有中心節點或集中式的決策機制,從而提高了系統的可伸縮性和容錯性。
需要注意的是,Redis Cluster中的Gossip通信是基于TCP協議進行的,節點之間通過互相發現和建立TCP連接來實現通信。
Redis Cluster搭建:
1.準備工作:
下載redis對應版本(版本必需要3.0以上)
Windows安裝Redis:
https://blog.csdn.net/weixin_44893902/article/details/123087435
Redis官網:
https://redis.io/
下載并安裝Ruby語言環境
下載地址:https://rubyinstaller.org/downloads/

如果你的電腦是64位,選擇x64下載;否則,32位選擇x86下載。這里選擇倒數第二個下載
下載完成后,打開文件,啟動 Ruby 安裝向導。
點擊 Next,繼續向導,記得勾選 Add Ruby executables to your PATH,直到 Ruby 安裝程序完成 Ruby 安裝為止。
(注意:安裝路徑必須是英文)

如果您的安裝沒有適當地配置環境變量,接下來您可能需要進行環境變量的配置,
下載ruby環境下Redis的驅動
在當前ruby目錄下,打開cmd終端,輸入gem install redis (下載的是最新版本)
路徑:

執行結果:

下載Redis官方提供的創建Redis集群的ruby腳本文件redis-trib.rb
下載地址:https://redis.io/download/

(注意,要選擇和自己安裝的Redis版本一致)

查看版本號:
把redis-trib解壓后找到src路徑

把這個文件復制到集群文件夾下

將解壓后的redis文件夾復制n份(n為集群節點數)到目標文件夾RedisCluster并將文件夾重命名

修改每個文件夾下的 redis.windows.conf
修改以下集群配置信息:(端口號可以一鍵替換)
- port 7000 —端口號
- cluster-enabled yes —避免在使用JedisCluster集群代碼獲取時報錯
- cluster-config-file nodes-7000.conf —該節點的配置信息,服務啟動后會在同目錄下生成nodes-端口號.conf文件
- cluster-node-timeout 15000 —時間調整為15000,在創建集群時不會超時
- appendonly yes
- bind 后面是ip地址
(注意:這些前面的#要去掉,不能有多余的空格)

6.修改你的bind鏈接地址為本地ip:

編寫每個Redis節點啟動方式:
1.編寫一個 bat 來啟動 redis,在每個節點目錄下建立 startup.bat,內容如下:
title redis_8081
redis-server.exe redis.windows.conf
(title是cmd窗口名 根據個人愛好輸入.)
2.或者可以把Redis的每個節點升級為服務
用管理員打開命令提示符:
啟動Redis服務:(沒出現error就代表成功,必須在節點的文件夾路徑下)
redis-server.exe --service-install redis.windows.conf --service-name redis7001

redis-server --service-start --service-name redis7001(沒用過可以試試)
刪除Redis服務:
redis-server.exe --service-uninstall --service-name redis7001

停止Redis服務:
redis-server --service-stop --service-name redis7001(沒用過可以試試)
重啟Redis服務:(沒用過可以試試)
redis-server --service-rewrite-config --service-name redis7001
redis-server --service-stop --service-name redis7001
redis-server --service-start --service-name redis7001
啟動每個節點雙擊每個節點下的 startup.bat,執行集群構建腳本或者啟動每個redis服務

到目標文件夾RedisCluster中打開命令窗口(比如進入6379文件夾),輸入以下指令:
ruby redis-trib.rb create --replicas 1 127.0.0.1:7001 127.0.0.1:7002 127.0.0.1:7003 127.0.0.1:7004 127.0.0.1:7005 127.0.0.1:7006
上述命令 --replicas 1 表示每個主節點擁有從節點個數為1。
master節點(主節點)不能少于3個,所以我們用了6個redis(3主+3從)

中途有個地方需要手動輸入yes即可

擴展:
檢查節點狀態:
在節點路徑下cmd
redis-cli.exe -h 10.31.56.9 -p 7001
查看節點集群信息:
CLUSTER NODES

清空當前節點集群信息:
FLUSHALL

Redis面試:
https://zhuanlan.zhihu.com/p/568969982
Redis在項目中的應用:
1,下載NuGet包:

2,建Redis幫助類:


浙公網安備 33010602011771號