超詳細,多圖文介紹redis集羣方式並搭建redis僞集羣

超詳細,多圖文介紹redis集羣方式並搭建redis僞集羣

超多圖文,對新手友好度極好。敲命令的過程中,難免會敲錯,但爲了截好一張合適的圖,一旦出現一點問題,爲了好的演示效果,就要從頭開始敲。且看且珍惜。

再認識redis集羣前,若想先知道redis單機版的可查看,springboot整合redis。好了,下面開始了。

每個redis實例可稱爲一個節點,安裝redis並以默認端口啓動是節點,不關閉,以另一個端口啓動,是一個新節點。在另一臺機器安裝redis並啓動,也是一個新節點。

節點分爲主節點 (master) ,從節點 (slave) ,數據從主節點向多個從節點上同步 。

redis3.0開始支持集羣,redis集羣是沒有統一的入口的,客戶端(client)連接集羣的時候連接集羣中的任意節點(node)即可,集羣內部的節點是相互通信的(PING-PONG機制)。

一,集羣方式

1,主從模式

一個master可以擁有多個slave,但是一個slave只能對應一個master。這樣,當某個slave掛了不影響其他slave的讀和master的讀和寫,重新啓動後會,數據會從master上同步過來。

在主從模式下,因爲只有一個主節點可以寫,而主,從節點都可以讀,所以通常主節點負責寫,從節點負責讀。

redis主從模式_lgx211
但是,當唯一的master掛了以後,雖然這樣並不影響slave的讀,但redis也不再提供寫服務,需要將master重啓後,redis才重新對外提供寫服務。

2,Sentinel模式

sentinel模式是建立在主從模式的基礎上,避免單個master掛了以後,redis不能提供寫服務。因爲從節點上備份了主節點的所有數據,那麼當master掛了以後,sentinel會在slave中選擇一個做爲master,並修改它們的配置文件,其他slave的配置文件也會被修改,比如slaveof屬性會指向新的master,比如之前配置的密碼。此時,客戶端就不是直接連接Redis,而是連接sentinel的ip和port,由sentinel來提供具體Redis服務。
Sentinel模式_lgx211
把之前掛了的master重新啓動後,它將不再是master而是做爲slave接收新的master的同步數據。

3,Cluster模式

Cluster模式是建立在Sentinel模式的基礎上的,當數據多到需要動態擴容的時候,前面兩種就不行了,需要對數據進行分片,根據一定的規則把redis數據分配到多臺機器。
Cluster模式_lgx211
該模式就支持動態擴容,可以在線增加或刪除節點,而且客戶端可以連接任何一個主節點進行讀寫,不過此時的從節點僅僅只是備份的作用。至於爲何能做到動態擴容,主要是因爲Redis 集羣沒有使用一致性hash, 而是使用的哈希槽。Redis 集羣會有16384個哈希槽,每個key通過CRC16校驗後對16384取模來決定放置哪個槽,而集羣的每個節點負責一部分hash槽。

那麼這樣就很容易添加或者刪除節點, 比如如果我想新添加個新節點, 我只需要從已有的節點中得部分槽到過來;如果我想移除某個節點,就只需要將該節點的槽移到其它節點上,然後將沒有任何槽的A節點從集羣中移除即可。由於從一個節點將哈希槽移動到另一個節點並不會停止服務,所以無論添加刪除或者改變某個節點的哈希槽的數量都不會造成集羣不可用的狀態。

需要注意的是,該模式下不支持同時處理多個key(如MSET/MGET),因爲redis需要把key均勻分佈在各個節點上,併發量很高的情況下同時創建key-value會降低性能並導致不可預測的行爲。

二,搭建集羣

這裏就直接搭建較爲複雜的Cluster模式集羣,也是企業級開發過程中使用最多的。

1,準備工作

Linux可以連接外網,有wget(用於在線下載redis),系統安裝好gcc環境,(不然編譯redis會報錯)。

2,下載、解壓、移到指定目錄,編譯Redis
wget http://download.redis.io/releases/redis-5.0.4.tar.gz
tar xzf redis-5.0.4.tar.gz
mv redis-5.0.4  /usr/local/redis
cd /usr/local/redis/redis-5.0.4
make
make install

安裝完成,在/usr/local/bin/目錄下就會看見
在這裏插入圖片描述

3,建redis各節點目錄
mkdir /usr/local/redis-cluster
cd /usr/local/redis-cluster
mkdir -p 9001/data 9002/data 9003/data 9004/data 9005/data 9006/data
mkdir bin

最終目錄結構如下
在這裏插入圖片描述

4,redis集羣的運行腳本

把之前安裝好的redis的src目錄下運行腳本拷貝過來,每個redis版本的運行腳本有細微差異,請以你自己的版本爲準,就是下圖綠色部分。

cd /usr/local/redis/redis-5.0.4/src
cp  mkreleasehdr.sh redis-benchmark redis-check-aof  redis-check-rdb redis-cli redis-sentinel redis-server redis-trib.rb /usr/local/redis-cluster/bin

在這裏插入圖片描述
最終效果如下圖所示
在這裏插入圖片描述

5,批量複製redis實例
cp /usr/local/redis/redis-5.0.4/* /usr/local/redis-cluster/9001
cp /usr/local/redis/redis-5.0.4/* /usr/local/redis-cluster/9002
cp /usr/local/redis/redis-5.0.4/* /usr/local/redis-cluster/9003
cp /usr/local/redis/redis-5.0.4/* /usr/local/redis-cluster/9004
cp /usr/local/redis/redis-5.0.4/* /usr/local/redis-cluster/9005
cp /usr/local/redis/redis-5.0.4/* /usr/local/redis-cluster/9006

最終效果圖如下所示
在這裏插入圖片描述

6,逐個修改redis配置

以 9001 的爲例子,其餘五個類似。

cd /usr/local/redis-cluster/9001
vi redis.conf

在這裏插入圖片描述
打開配置文件,按 i 進入編輯模式,按照出現的順序,主要需要修改的地方是

  • bind 192.168.119.128(綁定當前電腦的 IP,這是我虛擬機的,你綁定成你虛擬機的ip)
  • port 9001(因爲我這是一臺機器運行6個redis實例,所以要啓動6個實例,得爲它配置6個不同的端口,若你是6臺機器,默認的端口就行,無需更改)
  • daemonize yes(這是設置是否後臺啓動 Redis,默認 no ,但是生產環境肯定要默認就開啓 Redis,所以這裏設置爲 yes 。)
  • pidfile /var/run/redis_9001.pid(_9001這個一定要和第一個配置的端口一樣)
  • dir /usr/local/redis-cluster/9001/data/(數據文件存放位置,我換成指定目錄下存放)
  • appendonly yes
  • cluster-enabled yes(啓動集羣模式)
  • cluster-config-file nodes9001.conf(9001這個也要和之前的端口對應)
  • cluster-node-timeout 15000(超時時間)
    在這裏插入圖片描述
    完成以上修改,Esc退出編輯模式,輸入:wq 保存並退出。 類似同樣的操作操作再來五次。

若是對redis的配置文件有興趣,我在學習的過程中找到個詳細的翻譯版,可點擊鏈接進去學習。

redis配置中文翻譯

7,逐個啓動redis節點
cd /usr/local/redis-cluster
/usr/local/bin/redis-server /usr/local/redis-cluster/9001/redis.conf 
/usr/local/bin/redis-server /usr/local/redis-cluster/9002/redis.conf 
/usr/local/bin/redis-server /usr/local/redis-cluster/9003/redis.conf 
/usr/local/bin/redis-server /usr/local/redis-cluster/9004/redis.conf 
/usr/local/bin/redis-server /usr/local/redis-cluster/9005/redis.conf 
/usr/local/bin/redis-server /usr/local/redis-cluster/9006/redis.conf

運行效果如圖所示
在這裏插入圖片描述
現在檢查一下是否成功開啓,如下圖所示,都開啓成功。

ps -el | grep redis

在這裏插入圖片描述

8,搭建集羣

此時的節點雖然都啓動成功了,但他們還不在一個集羣裏面,不能互相發現,測試會報錯:(error) CLUSTERDOWN Hash slot not served

/usr/local/redis-cluster/bin/redis-cli -h 192.168.119.128 -p 9001
keys *
set name mafly

如下圖所示
在這裏插入圖片描述
解決報錯,如果你是redis5.0以前的,你需要安裝集羣所需的ruby相關依賴

yum install ruby
yum install rubygems
cd /usr/local/redis-cluster/
gem install redis

這步若安裝報錯,請查看Could not find a valid gem ‘redis’

如果你是redis5.0及之後的,無需安裝ruby依賴,redis安裝目錄裏內置了集羣命令行工具 redis-trib ,它是一個 Ruby 程序, 這個程序通過向實例發送特殊命令來完成創建新集羣, 檢查集羣, 或者對集羣進行重新分片工作。

redis-cli --cluster create 192.168.119.128:9001 192.168.119.128:9002 192.168.119.128:9003 192.168.119.128:9004 192.168.119.128:9005 192.168.119.128:9006 --cluster-replicas 1

–cluster-replicas 1 這個指的是從機的數量,表示我們希望爲集羣中的每個主節點創建一個從節點。

紅色選框是給三個主節點分配的共16384個槽點。

黃色選框是主從節點的分配情況。

藍色選框是各個節點的詳情。
在這裏插入圖片描述

9,測試

現在通過客戶端命令連接上,通過集羣命令看一下狀態和節點信息等

/usr/local/redis-cluster/bin/redis-cli -c -h 192.168.119.128 -p 9001
cluster info
cluster nodes

效果圖如下,集羣搭建成功。
在這裏插入圖片描述
現在往9001這個主節點寫入一條信息,我們可以在9002這個主節點取到信息,集羣間各個節點可以通信。

現在往9001這個主節點寫入一條信息,我們可以在9002這個主節點取到信息,集羣間各個節點可以通信。

 set name lgx
 get name

在這裏插入圖片描述

三,故障轉移

1,故障轉移機制詳解
  1. 集羣中的節點會向其它節點發送PING消息(該PING消息會帶着當前集羣和節點的信息),如果在規定時間內,沒有收到對應的PONG消息,就把此節點標記爲疑似下線。

  2. 當被分配了slot槽位的主節點中有超過一半的節點都認爲此節點疑似下線(就是其它節點以更高的頻次,更頻繁的與該節點PING-PONG),那麼該節點就真的下線。

  3. 其它節點收到某節點已經下線的廣播後,把自己內部的集羣維護信息也修改爲該節點已事實下線。

  4. 節點資格審查:然後對從節點進行資格審查,每個從節點檢查最後與主節點的斷線時間,如果該值超過配置文件的設置,那麼取消該從節點的資格。

  5. 準備選舉時間:這裏使用了延遲觸發機制,主要是給那些延遲低的更高的優先級,延遲低的讓它提前參與被選舉,延遲高的讓它靠後參與被選舉。(延遲的高低是依據之前與主節點的最後斷線時間確定的)

  6. 選舉投票:當從節點獲取選舉資格後,會向其他帶有slot槽位的主節點發起選舉請求,由它們進行投票,優先級越高的從節點就越有可能成爲主節點,當從節點獲取的票數到達一定數值時(如集羣內有N個主節點,那麼只要有一個從節點獲得了N/2+1的選票即認爲勝出),就會替換成爲主節點。

  7. 替換主節點:被選舉出來的從節點會執行slaveof no one把自己的狀態從slave變成master,然後執行clusterDelSlot操作撤銷故障主節點負責的槽,並執行 clusterAddSlot把這些槽分配給自己,之後向集羣廣播自己的pong消息,通知集羣內所有的節點,當前從節點已變爲主節點。

  8. 接管相關操作:新的主節點接管了之前故障的主節點的槽信息,接收和處理與自己槽位相關的命令請求。

2,故障轉移測試

這是之前集羣中具體節點的情況,我簡化成如下,可以向上回看圖片中的集羣信息。
原先集羣_lgx211
這裏關閉該9001端口的進程,即模擬該主節點掛掉。

 netstat -tunlp | grep 9001
 kill 15705

在這裏插入圖片描述
登錄掛掉的redis節點,會被拒絕服務,通過還在正常運行的某個主節點進入,然後再次查看集羣中的信息

/usr/local/redis-cluster/bin/redis-cli -c -h 192.168.119.128 -p 9001

/usr/local/redis-cluster/bin/redis-cli -c -h 192.168.119.128 -p 9002

cluster nodes

在這裏插入圖片描述
簡而言之,就是之前的集羣信息變成了如下所示
故障轉移後集羣_lgx211
現在,我重啓剛纔掛掉的主節點,重新查看集羣內部的節點情況,具體情況如下圖所示。

cd /usr/local/redis-cluster/

/usr/local/bin/redis-server /usr/local/redis-cluster/9001/redis.conf

/usr/local/redis-cluster/bin/redis-cli -c -h 192.168.119.128 -p 9002

cluster nodes

在這裏插入圖片描述
簡而言之,現在集羣內的節點情況如下

恢復後集羣_lgx211

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章