1. 程式人生 > 實用技巧 >Redis主從模式、哨兵模式和叢集的相關操作

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.

此時需要交要刪除節點的槽位分配出去,再執行刪除(槽位分配課參照新增主節點時的槽位分配步驟)