Redis集群(windows版本操作)
一、概念篇
Redis集群的三種模式
1.主從模式
2.Sentinel模式
3.cluster模式
主從模式
一主多從的特點如圖,整個集群只有一個master,
1.master負責寫數據(master也可以讀),slave負責讀數據
2.master如果故障集群將無法提供寫服務(因為不會選出新的master),將主服務器重啟即可恢復。
3.當寫操作發生時會master會將數據發送給slave,保證數據一致性
4.slave如果重啟需要重新使用slaveof指令連接集群
鏈表式主從
?特殊的主從模式,缺點是如果slave0故障了后邊的slava1與slava2都無法正常同步數據了。優點是減輕了master的同步數據負擔,master只負責它的從節點的數據同步。
sentinel模式
sentinel的意思是哨兵,顧名思義就是一個哨兵監控著Redis集群的master是否故障,如果master故障了將由sentinel開啟投票選舉出一個新的master,當故障的master重啟時,故障重啟的master將會成為新master的slave。
主從復制數據同步流程
slave啟動完成時,立即向master發送同步請求。master收到同步請求后觸發RDB策略,保存當前時間的master數據集,并把該RDB文件發送給slave,slave根據此RDB文件進行數據同步。
另外每當master執行寫操作之后,都會將該操作發送至從服務器與之同步。
cluster模式?
如果不需要擴容一般是不需要用到cluster模式的(不存在Redis內存放不下的情況),但如果Redis已經容量不夠了則必須使用cluster。上面的主從模式只解決了高可用的問題,想容量大還得看cluster。假設我們現在的內存是16G,而Redis中要放的內存有48G,此時我們可以將Redis分為三塊,如圖(實際情況請對內存與需求做評估后決定)。
?可見cluster實現了redis的水平擴容。
二、操作(說明:由于鏈表式主從是特殊的主從模式,配置方式與主從模式一致,故不再進行演示)
下面我們以Windows版本Redis演示集群操作
主從模式
1.下載Redis,GitHubWindows版本下載。
2.解壓文件后復制兩份同樣的文件,修改文件夾名稱方便識別。
3.修改每個文件夾中的?redis.windows.conf文件,將port改為對應的port,并且將dbfilename改為不同的值。
6379
?6380
?
?
?剩下的6381如法炮制。
4.創建redis-server.bat文件在對應的文件夾目錄下(三個redis副本皆需要此文件),右鍵編輯粘貼下面腳本保存退出。
redis-server.exe redis.windows.conf5.創建redis-cli.bat文件在對應的文件夾目錄下(三個redis副本皆需要此文件),右鍵編輯粘貼下面腳本保存退出(請自行修改相應的port)。
redis-cli.exe -p 6379此時每個redis文件夾內應該有如下兩個bat文件
6.在對應的redis文件夾中啟動redis-server.bat文件。
7.在對應的redis文件夾中啟動?redis-cli.bat文件
8.6380 、 6381兩臺redis通過 slaveof 127.0.0.1 6379 命令來選擇6379當master。執行命令后,6379為master,6380,6381為slave。
?
此時主從模式搭建成功,我們來試試效果
測試也沒問題,搭建成功后我們再來觀看一些主從模式的特性。
當master故障時(把master關掉):
?
?info replication命令可以查看redis副本的狀態。可以看到master的status為down。
?首先可以看到我們依舊能正常讀,但因為master故障我們無法往集群中寫入數據。并且兩臺slave并沒有任何一臺被提升為master,我們可以從server的log看到兩臺slave一直在等待master重啟。
?此時我們將master重新啟動(啟動redis-server.bat文件)
?當master重新連接集群時,兩臺slave將與master進行數據同步(我這里因為默認的RDB策略未保存RDB文件所以數據被清空了)。
?再使用master寫入k1 v1
當slave故障時重啟會不會重新與集群連接呢?讓我們看看
先關掉6381
重啟6381之后再使用info replication觀察它的信息
?
所以當slave故障重啟后我們需要重新使用slaveof 命令來與master重連。
測試到這里可以很清楚的看見與我們概念篇的描述相符合。
sentinel模式
sentinel模式以主從模式為基礎,所以在這里我們與上面一樣啟動6379,6380,6381三臺redis實例,6380,6381執行slave of 6379指令,6379為master,另外兩臺為slave。
1.現在我們要做的事是創建sentinel.conf配置文件
?sentinel配置文件解釋:
port sentinel服務運行的端口 sentinel monitor <實例名稱(自定義)> <IP> <PORT> sentinel down-after-milliseconds <實例名稱> <timeout(ms)> : 指定的實例名稱在指定的毫秒內如果未響應則判定實例故障 sentinel parallel-syncs <實例名稱> <number> 故障時只能有<number>個redis slave做同步操作 sentinel failover-timeout mymaster <timeout(ms)> : 指定時間內未完成failover event,則判定failover失敗6379的sentinel配置文件
port 10000 sentinel monitor 6379 127.0.0.1 6379 1 sentinel down-after-milliseconds 6379 10000 sentinel parallel-syncs 6379 2 sentinel failover-timeout 6379 100006380
port 10001 sentinel monitor 6379 127.0.0.1 6379 1 sentinel down-after-milliseconds 6379 10000 sentinel parallel-syncs 6379 2 sentinel failover-timeout 6379 100006381
port 10002 sentinel monitor 6379 127.0.0.1 6379 1 sentinel down-after-milliseconds 6379 10000 sentinel parallel-syncs 6379 2 sentinel failover-timeout 6379 100002.在各個redis文件夾下創建redis-sentinel.bat文件
redis-server.exe sentinel.conf --sentinel3.去6379、6380、6381下啟動redis-sentinel.bat,成功如下圖所見
4.現有6379,6380,6381三臺Redis實例,6379為master、其他兩臺為slave
?
現在我們開始測試sentinel模式,當6379故障時會發生什么?
關掉6379實例。
?
?從圖中可以觀察到在sentinel模式下,6379master故障時,6380被選舉為master,并且6381自動切換為6380的slave。
可見sentinel模式自動選舉master,有這種模式我想我們再也不需要深更半夜爬起來重啟redis了,于是我們可以下出結論,與主從模式對比,肯定選擇sentinel模式。
cluster模式
說明:我們將創建一個三主三從的集群。
1.復制6個Redis文件夾,分別修改對應的配置文件。
?配置文件修改
port 6379 #改為對應的端口號 cluster-enabled yes cluster-config-file nodes-6379.conf #改為對應的端口號以區分 cluster-node-timeout 150002.創建bat文件
title redis-a-6379; redis-server.exe redis.windows.conf請如上創建其他bat文件。
3.安裝ruby(我也不想裝,redis集群腳本需要ruby環境)
Ruby-Downloads?下載地址。
下載完成后打開exe文件安裝就好了。
安裝完成出現此內容時選1
如果出現這種東西就是網速太慢(我是開代理解決的,各位可以關掉窗口打開CMD輸入
gem sources --add https://gems.ruby-china.org/ --remove https://rubygems.org/
gem sources -l)
?使用ruby-v出現下圖內容時表示安裝完成
?安裝redis依賴?
gem?install?redis
4.下載集群腳本redis-trib.rb
redis-trib.rb 下載_new Girl的博客-CSDN博客_redis-trib.rb下載?這位老哥這里可以下載。
下載后放到這個位置中
5.先啟動所有的redis實例
cmd到redis-trib.rb文件中,執行
ruby redis-trib.rb create --replicas 1 127.0.0.1:6379 127.0.0.1:6389 127.0.0.1:6398 127.0.0.1:6380 127.0.0.1:6390 127.0.0.1:6399 命令
(--replicas的意義是指定集群中每個master配備幾個slave。)
?最后一行是問我們是否接收此分配:輸入yes。
?可以看到這次分配 6380,6390,6399是master,其他三臺是slave。
?至此Redis的集群搭建完成。
6.通過集群方式連接redis cluster
? 創建bat文件,
redis-cli -c -p 6379運行bat文件,
?使用cluster nodes命令查看集群信息:
關于slot的說明
?每個Redis集群中總共有16383個slot(簡單理解為一個范圍),當有一個K V鍵值對想被放入集群時,首先對key進行計算,看此值屬于哪個slot(范圍),這一對鍵值對就會被放入哪個master中,因為此機制,redis集群才能實現水平擴容。
?可以看到5493值被放入了6389,正好符合上面的slot。
關于Redirected說明
如果要get的值或者set的值不在此次連接的實例上,因為redis的無中心化配置,將會切換到對應的實例上。?
7. 測試--當master故障會如何?
關閉6398實例。
當6398故障時,我們任然可以從6399實例獲取到k1的value
?
可以看到6399實例被提升為master了。?當6398重啟時,角色將從master轉為slave。
如果某一節點的master-slave全部掛掉了,集群是否還可用?此時我們關掉6379與6380。
所以,此處在配置文件總的配置cluster-require-full-coverage如果設置為yes時,整個集群也會down。如果配置為no,?那么集群可以使用,該slot范圍無法再存儲與讀取數據。有興趣的小伙伴可以試一試。
至此已將所有的redis集群模式介紹完成,有何不妥之處還請各位指正,謝謝!
注意:請刪除每個redis文件夾下的此文件再啟動,否則會出現錯誤
總結
以上是生活随笔為你收集整理的Redis集群(windows版本操作)的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 财务管理能力模型(转载)
- 下一篇: 算法题放苹果:把M个相同的苹果放到N个完