前言
- 本文主要對Redis的單點模式、主從模式、Sentinel模式、cluster模式做一個簡單介紹,並且每一個都進行演示案例
- 相關的細節請參閱文章中給出的鏈接,幾乎涵蓋了所有Redis在集羣方面的知識點(語法方面)
一、Redis集羣知識點總覽
- Redis有如下幾種工作模式:
- ①單點模式
- ②主從複製模式
- ③Sentinel模式(哨兵模式)
- ④cluster模式(集羣模式)
①單點模式
- 單節點實例還是比較簡單的,平時做個測試,寫個小程序如果需要用到緩存的話,啓動一個Redis還是很輕鬆的,做爲一個 key/value數據庫也是可以勝任的
- 在實際開發場景中幾乎不會使用
②主從複製模式
- 在分佈式系統中爲了解決單點問題,通常會把數據複製多個副本部署到其他機器,滿足故障恢復和負載均衡等需求。Redis也是如此,它爲我們提供了複製功能,實現了相同數據的多個Redis副本
- 主從模式一般用來:
- 備份數據:這樣當一個節點損壞(指不可恢復的硬件損壞)時,數據因爲有備份,可以方便恢復
- 負載均衡:所有客戶端都訪問一個節點肯定會影響Redis工作效率,有了主從以後,查詢操作就可以通過查詢從節點來完成
- 主從模式缺點:
- master 節點掛了以後,redis 就不能對外提供寫服務了,因爲剩下的 slave 不能成爲master
- 這個缺點影響是很大的,尤其是對生產環境來說,是一刻都不能停止服務的,所以一般的生產壞境是不會單單隻有主從模式的。所以有了下面的 sentinel 模式
- 備註:主從模式做到高可用,除了sentinel模式,還有lvs+keepalived方案可以解決
- 主從複製模式的相關文章請參閱(幾乎包含所有知識點):
③Sentinel模式(哨兵模式)
- 主從模式雖然實現了數據的分離,但是沒提高可用性,也就是說當主節點宕機之後,所有從節點也跟着不能再使用。爲了提高高可用性,Redis提供了Sentinel模式
- Redis Sentinel是Redis高可用的實現方案。Sentinel是一個管理多個Redis實例的工具,它可 以實現對Redis的監控、通知、自動故障轉移
- sentinel模式基本可以滿足一般生產的需求,具備高可用性。但是當數據量過大到一臺服務器存放不下的情況時,主從模式或 sentinel模式就不能滿足需求了,這個時候需要對存儲的數據進行分片,將數據存儲到多個Redis實例中,就是下面要介紹的cluster模式
- Sentinel模式的相關文章請參閱(幾乎包含所有知識點):
④cluster模式(集羣模式)
- Redis Cluster是Redis的分佈式解決方案,在3.0版本正式推出,有效地解決了Redis分佈式方面的需求。當遇到單機內存、併發、流量等瓶頸時,可以採用Cluster架構方案達到負載均衡的目的
- 主要是針對海量數據+高併發+高可用的場景,海量數據,如果你的數據量很大,那麼建議就用 redis cluster
- cluster模式的相關文章請參閱(幾乎包含所有知識點):
- https://blog.csdn.net/qq_41453285/article/details/106420056
- https://blog.csdn.net/qq_41453285/article/details/106451296
- https://blog.csdn.net/qq_41453285/article/details/106456106
- https://blog.csdn.net/qq_41453285/article/details/106460256
- https://blog.csdn.net/qq_41453285/article/details/106463895
- https://blog.csdn.net/qq_41453285/article/details/106464512
- https://blog.csdn.net/qq_41453285/article/details/106481966
二、主從複製演示案例
- 第一步:創建一個redis-slave目錄作爲複製相關的目錄,然後進入redis-slave目錄進去創建redis11、redis12、redis13三個目錄,用來存放三個redis節點,其中redis11作爲主節點,redis12、redis13作爲從節點都複製於redis11
mkdir redis-slave
cd redis-slave
mkdir redis11 redis12 redis13
- 第二步:分別進入redis11、redis12、redis13目錄創建redis11-8001.conf、redis12-8002.conf、redis13-8003.conf三個配置文件,用來啓動三個節點
# redis11-8001.conf
bind 0.0.0.0
port 8001
logfile "redis11-8001.log"
dbfilename "dump-redis11-8001.rdb"
daemonize yes
rdbcompression yes
# redis12-8002.conf
bind 0.0.0.0
port 8002
logfile "redis11-8002.log"
dbfilename "dump-redis12-8002.rdb"
daemonize yes
rdbcompression yes
#複製主節點
slaveof 127.0.0.1 8001
# redis11-8003.conf
bind 0.0.0.0
port 8003
logfile "redis11-8003.log"
dbfilename "dump-redis13-8003.rdb"
daemonize yes
rdbcompression yes
#複製主節點
slaveof 127.0.0.1 8001
- 第三步:在cluster-slave目錄下創建如下shell腳本(start-all.sh),用來啓動三個節點
#!/bin/bash
cd redis11/
redis-server redis11-8001.conf &
cd ..
cd redis12/
redis-server redis12-8002.conf &
cd ..
cd redis13/
redis-server redis13-8003.conf &
cd ..
- 第四步:爲腳本添加可執行權限,然後啓動腳本,啓動之後,可以通過netstat查看情況
chmod +x start-all.sh
./start-all.sh
netstat -anop | grep redis
- 第五步:進入主節點或從節點,輸入下面的命令可以查看主從複製的信息
info replication
- 第六步:測試主從模式,首先進入8001、8002、8003節點查看都無name鍵。然後進入8001建立name鍵,值爲dongshao,之後再查看都成功顯示
三、sentienl模式演示案例
- 第一步:創建一個redis-sentinel目錄作爲哨兵相關的目錄,然後進入redis-sentinel目錄進去創建redis21、redis22、redis23三個目錄,用來存放三個redis節點,其中redis21作爲主節點,redis22、redis23作爲從節點都複製於redis21
mkdir redis-sentinel
cd redis-sentinel
mkdir redis21 redis22 redis23
- 第二步:分別進入redis21、redis22、redis23目錄創建redis21-9001.conf、redis22-9002.conf、redis23-9003.conf三個配置文件,用來啓動三個節點
# redis21-9001.conf
bind 0.0.0.0
port 9001
logfile "redis21-9001.log"
dbfilename "dump-redis21-9001.rdb"
daemonize yes
rdbcompression yes
# redis22-9002.conf
bind 0.0.0.0
port 9002
logfile "redis22-9002.log"
dbfilename "dump-redis22-9002.rdb"
daemonize yes
rdbcompression yes
#複製主節點
slaveof 127.0.0.1 9001
# redis23-9003.conf
bind 0.0.0.0
port 9003
logfile "redis23-9003.log"
dbfilename "dump-redis23-9003.rdb"
daemonize yes
rdbcompression yes
#複製主節點
slaveof 127.0.0.1 9001
- 第三步:在redis-sentinel目錄中創建一個sentienl目錄用來存放sentinel節點的相關配合,然後在sentienl目錄中再創建一個sentinel-26379.conf作爲配置文件,命令與配置文件內容如下:
mkdir sentinel
vim sentinel/sentinel-26379.conf
# sentinel-26379.conf
# 端口號默認爲26379
port 26379
daemonize yes
logfile "sentinel-26379.log"
# 監控的主節點爲9001節點, 1代表主節點失敗至少需要1個sentinel節點同意
sentinel monitor mymaster 127.0.0.1 9001 1
sentinel down-after-milliseconds mymaster 30000
sentinel failover-timeout mymaster 180000
sentinel deny-scripts-reconfig yes
- 第四步:在cluster-sentinel目錄下創建如下shell腳本(start-all.sh),用來啓動三個節點和sentinel節點
#!/bin/bash
cd redis21/
redis-server redis21-9001.conf &
cd ..
cd redis22/
redis-server redis22-9002.conf &
cd ..
cd redis23/
redis-server redis23-9003.conf &
cd ..
cd sentinel/
redis-sentinel sentinel-26379.conf &
cd ..
- 第五步:爲腳本添加可執行權限,然後啓動腳本,啓動之後,可以通過netstat查看情況
chmod +x start-all.sh
./start-all.sh
netstat -anop | grep redis
- 第六步:在sentinel中輸入下面的命令可以來查看相關信息
redis-cli -p 26379 info sentinel
- 第七步:測輸入下面的命令可以看到當前sentinel監控的主節點爲9001節點
redis-cli -p 26379 sentinel master mymaster
- 第八步:通過kill命令,我們將9001節點關閉
- 第九步:等到failover-timeout參數所指定的180000毫秒過去之後,再次查看sentinel監控的主節點,發現變爲了9003(這是自動完成的)
四、cluster模式演示案例
- 第一步:創建一個redis-cluster目錄作爲cluster相關的目錄,然後進入redis-cluster目錄進去創建redis01、redis02、redis03、redis04、redis05、redis06六個目錄,用來存放6個redis節點,
mkdir redis-cluster
cd redis-cluster
mkdir redis01 redis02 redis03 redis04 redis05 redis06
- 第二步:分別進入redis01、redis02、redis03、redis04、redis05、redis06目錄創建redis01.conf、redis02.conf、redis03.conf、redis04.conf、redis05.conf、redis06.conf六個配置文件。下面就不列出配置文件了(文件太多內容太多),我們以redis的默認配置文件爲基礎然後修改,先修改各自對應的端口(分別爲7001、7002、7003、7004、7005、7006),然後修改daemonize爲yes,然後將cluster-enabled改爲yes
- 第三步:在cluster-cluster目錄下創建如下shell腳本(start-all.sh),用來啓動6個節點
#!/bin/bash
cd redis01
redis-server redis.conf &
cd ..
cd redis02
redis-server redis.conf &
cd ..
cd redis03
redis-server redis.conf &
cd ..
cd redis04
redis-server redis.conf &
cd ..
cd redis05
redis-server redis.conf &
cd ..
cd redis06
redis-server redis.conf &
cd ..
- 第四步:爲腳本添加可執行權限,然後啓動腳本,啓動之後,可以通過netstat查看情況可以看到六個節點啓動
chmod +x start-all.sh
./start-all.sh
netstat -anop | grep redis
- 第五步:用一個redis客戶端,輸入下面的命來開啓集羣,輸入命令之後輸入yes,然後redis開始配置集羣,最後顯示成功
# 創建3個集羣主節點和3個集羣從節點
redis-cli --cluster create --cluster-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
- 第六步:測可以輸入下面的命令來檢查集羣的完整性
redis-cli --cluster check 127.0.0.1:7001