Redis主從模式、哨兵模式和叢集的相關操作
1、主從模式
(1)特點
有且僅有一個主節點Master,從節點slave可以有
主節點master可讀可寫,從節點slave只能讀;主節點將讀的操作交給了從節點,變向的提高了自己寫的能力
(2)配置步驟(同一臺伺服器,利用不同埠進行部署)
1】在/usr/local目錄下,建立一個/redis/master-slave目錄
2】 在master-slave目錄下,建立三個子目錄6380、6381、6382
3】 依次拷貝redis解壓目錄下的redis.conf配置檔案,到這三個子目錄中
4】 進入6380目錄,修改redis.conf,將port埠修改成6380即可
5】 進入6381目錄,修改redis.conf,將port埠改成6381,同時指定開啟主從複製
6】 進入6382目錄,修改redis.conf,將port埠改成6382,同時指定開啟主從複製
(3)測試
1】啟動每個redis節點,檢視輸入日誌(每啟動一個redis從節點時,主節點的日誌就會提示從節點連線資訊)
[root@node0719 master-slave]# cd 6380 && redis-server ./redis.conf [root@node0719 master-slave]# cd 6381 && redis-server ./redis.conf [root@node0719 master-slave]# cd 6382 && redis-server ./redis.conf
2】在每個redis節點進行讀寫操作(即:”set user:name zhangsan“和”get user:name“)
結論:當主節點寫入資料時,系統會同步到從節點;主節點可讀可寫操作,而從節點只能讀操作
(4)優缺點
1】主從模型可以提高讀的能力,在一定程度上緩解了寫的能力
2】主節點宕機了,整個叢集就沒有可寫的節點了
2、哨兵模式(Sentinel)
(1)特點:
哨兵模式的任務是:監控(Monitoring)、提醒(Notification)、自動故障遷移(Automatic failover)
1】監控: Sentinel 會不斷地檢查你的主伺服器和從伺服器是否運作正常
Sentinel可以監控任意多個Master和該Master下的Slaves。(即多個主從模式)
同一個哨兵下的、不同主從模型,彼此之間相互獨立。
Sentinel會不斷檢查Master和Slaves是否正常
2】提醒: 當被監控的某個 Redis 伺服器出現問題時, Sentinel 可以通過 API 向管理員或者其他應用程式傳送通知
3】自動故障遷移:當主節點伺服器不能正常工作時,Sentinel會自動將其中一個從節點伺服器升級為新的主節點伺服器,讓故障伺服器失效
Sentinel網路: 當只有一個sentinel的時候,如果這個sentinel掛掉了,那麼就無法實現自動故障切換了;在sentinel網路中,只要還有一個sentinel活著,就可以實現故障切換。
(2)自動故障遷移中故障切換的過程
1】投票(過半原則),確定有問題主伺服器是否下線
2】選舉(過半原則),選舉一個從節點(slave)伺服器作為主節點master伺服器
3】原master節點重新上線後,自動轉為當前master的從節點
(3)哨兵模式部署
由於哨兵模式的故障遷移時切換採用過半原則,所有至少要配置三個Sentinel例項(必須為奇數)
由於哨兵模式與節點相互獨立,只是對節點進行監控作用,所有需要存在一個正在執行的主從模式
1】配置Sentinel
在/usr/local目錄下,建立/redis/sentinels/目錄
在/sentinels目錄下,以次建立s1、s2、s3三個子目錄中
依次拷貝redis解壓目錄下的sentinel.conf檔案,到這三個子目錄中
[root@node0719 local]# mkdir -p redis/sentinels
[root@node0719 sentinels]# mkdir s1 s2 s3
[root@node0719 sentinels]# cp /root/redis-3.2.9/sentinel.conf ./s1/
[root@node0719 sentinels]# cp /root/redis-3.2.9/sentinel.conf ./s2/
[root@node0719 sentinels]# cp /root/redis-3.2.9/sentinel.conf ./s3/
依次修改s1、s2、s3子目錄中的sentinel.conf檔案,修改埠,並指定要監控的主節點。(從節點不需要指定,sentinel會自動識別)
S1哨兵配置如下:
S2/S3哨兵配置如S1只是埠號不一樣,監控的主節點一致
(4)測試
關閉主節點master觀察輸出日誌,發現確實重新指定一個主節點,當該節點再次上線時,該節點成為新主節點的從節點
(5)優缺點
優點:Sentinel哨兵模式,確實能實現自動故障切換。提供穩定的服務
缺點:仍然只有一個Master節點。當併發寫請求較大時,哨兵模式並不能緩解寫壓力
3、Redis-cluster叢集
由於哨兵模式在同一時刻只有一個主節點master具有寫的能力,所有無法滿足併發寫入請求較大時的需求
通過叢集模式提供多個master主節點,每個節點都可以讀寫,節點之間可以互相通訊;整個叢集無中心節點
(1)準備工作:
1】安裝ruby環境(如果已存在就不需要再次安裝)
redis叢集管理工具redis-trib.rb依賴ruby環境,首先需要安裝ruby環境:
yum -y install ruby
yum -y install rubygems
2】 安裝ruby和redis的介面程式
將下載好的 redis-3.0.0.gem拷貝 至/usr/local下,執行安裝:
gem install /usr/local/redis-3.0.0.gem
(2)建立節點
1】 Redis叢集最少需要6個節點,可以分佈在一臺或者多臺主機上。(同一臺主機上用不同埠表示不同節點)
主節點:192.168.56.3:7001 192.168.56.3:7002 192.168.56.3:7003
從節點:192.168.56.3:7004 192.168.56.3:7005 192.168.56.3:7006
2】 在/usr/local/redis下建立redis-cluster目錄,其下建立7001、7002。。7006目錄,拷貝原始的redis.conf檔案到每個700x資料夾下,並修改相關配置,埠號、開啟叢集、開啟後臺執行、繫結主機及日誌檔案位置等設定
必選配置:
port 700X
bind 192.168.23.3
cluster-enabled yes
建議配置:
daemonized yes
logfile /usr/local/redis/redis-cluster/700X/node.log
(3)啟動每個節點
[root@node5 redis-cluster]# cd 7001 && redis-server ./redis.conf
[root@node5 7001]# cd ..
[root@node5 redis-cluster]# cd 7002 && redis-server ./redis.conf
[root@node5 7002]# cd ..
[root@node5 redis-cluster]# cd 7003 && redis-server ./redis.conf
[root@node5 7003]# cd ..
[root@node5 redis-cluster]# cd 7004 && redis-server ./redis.conf
。。。。
(注意:每次啟動一個節點必須在不同的位置,否則無法啟動)
檢視每個節點啟動資訊(ps -aux |grep redis)
[root@node5 ~]# ps -aux |grep redis
Warning: bad syntax, perhaps a bogus '-'? See /usr/share/doc/procps-3.2.8/FAQ
root 2319 0.4 0.5 137632 9764 ? Ssl 18:47 0:01 redis-server 192.168.100.251:7001 [cluster]
root 2346 0.6 0.5 137632 9764 ? Ssl 18:48 0:00 redis-server 192.168.100.251:7002 [cluster]
root 2352 0.5 0.5 137632 9768 ? Ssl 18:48 0:00 redis-server 192.168.100.251:7003 [cluster]
root 2358 0.3 0.4 137632 7720 ? Ssl 18:49 0:00 redis-server 192.168.100.251:7004 [cluster]
root 2363 0.2 0.4 137632 7712 ? Ssl 18:50 0:00 redis-server 192.168.100.251:7005 [cluster]
root 2368 1.1 0.4 137632 7716 ? Ssl 18:50 0:00 redis-server 192.168.100.251:7006 [cluster]
(4)建立叢集(把每個啟動的節點全部加入叢集)
執行redis-trib.rb(檔案位置: redis原始碼存放目錄redis/redis-4.10.3/src下,.rb檔案依賴ruby環境),
[root@node5 src]# ./redis-trib.rb create --replicas 1 192.168.159.10:7001 192.168.159.10:7002 192.168.159.10:7003
192.168.159.10:7004 192.168.159.10:7005 192.168.159.10:7006
注:--replicas 1 1其實代表的是一個比例,就是主節點數/從節點數的比例,按照命令中IP:PORT的順序,先是3個主節點,然後是3個從節點
(5)檢視叢集資訊
在叢集建立成功之後,叢集可以包含多個可讀寫的主節點,叢集無中心節點;
可以通過登入任意一個redis節點檢視叢集資訊
[root@node5 bin]# ./redis-cli -c -h 192.168.100.251 -p 7001
192.168.100.251:7001>
注:-c表示以叢集方式連線redis,-h指定ip地址,-p指定埠號
查詢叢集節點資訊,執行 cluster nodes
查詢叢集狀態資訊,執行cluster info
192.168.100.251:7001> cluster info
cluster_state:ok
cluster_slots_assigned:16384
cluster_slots_ok:16384
cluster_slots_pfail:0
cluster_slots_fail:0
cluster_known_nodes:6
cluster_size:3
cluster_current_epoch:8
cluster_my_epoch:8
cluster_stats_messages_sent:9423
cluster_stats_messages_received:3362
192.168.100.251:7001>
(6)向叢集新增master主節點
【1】建立並新增節點
1)建立新的節點7007並啟動節點服務
2)執行新增命令:./redis-trib.rb add-node 192.168.100.251:7007 192.168.100.251:7001
3)檢視節點叢集資訊7007是否加入叢集,是否為master
【2】給新加主節點分配槽位
1)連線上叢集(連線叢集中任意一個可用節點都行)
./redis-trib.rb reshard 192.168.23.3:7001
2)輸入分配槽位的數量
3)輸入接收槽位的節點id (分配的槽位給誰,節點id可以同cluster nodes檢視)
4)輸入源節點id(即從哪個節點分離出來要分配的槽位,節點id可以同cluster nodes檢視),原節點id輸入完後,以done命令為結束標誌(源節點輸入all表示從其他主節點分配)
5)分配完成後,輸入開始進行槽位移動
至此主節點新增完成
(7)新增slave從節點
【1】建立新節點7008並啟動節點服務
【2】執行新增節點命令:./redis-trib.rb add-node --slave --master-id masterID newNodIP:port MasterIP:port
masterID 主節點id,從cluster nodes資訊中檢視
newNodIP:port 新增節點的ip:埠
MasterIP:port 主節點的ip:埠
例如:將7008節點新增到7007下,909c349f5f2d4db015101fb7c4e3c227a74ad382為7007節點id(可通過cluster nodes 檢視節點資訊)
./redis-trib.rb add-node --slave --master-id 909c349f5f2d4db015101fb7c4e3c227a74ad382 192.168.4.253:7008 192.168.4.253:7007
注:此處常見錯誤(原因原來該結點在叢集中的配置資訊已經生成cluster-config-file指定的配置檔案中)
[ERR] Node XXXXXX is not empty. Either the node already knows other nodes (check with CLUSTER NODES) or contains some key in database 0
解決方法:刪除生成的配置檔案nodes.conf,刪除後再執行./redis-trib.rb add-node指令。
(8)刪除節點
執行刪除節點命令:./redis-trib.rb del-nodenodeIP:portnodeID
nodeIP:port待刪除節點的ip:埠
nodeID待刪除節點的id,從cluster node中檢視
注:刪除主節點的時候會報錯,原因是,主節點佔有槽位
[ERR] Node 127.0.0.1:7005 is not empty! Reshard data away and try again.
此時需要交要刪除節點的槽位分配出去,再執行刪除(槽位分配課參照新增主節點時的槽位分配步驟)