Redis Cluster集羣 升級 集羣伸縮和SpringBoot操作Redis 集羣

點贊多大膽,就有多大產!開源促使進步,獻給每一位技術使用者和愛好者!

乾貨滿滿,擺好姿勢,點贊發車

路漫漫其修遠兮,吾將上下而求索

集羣伸縮介紹

集羣伸縮說白了就是在Redis中上線和下線節點,比如我們上篇文章中使用了6臺節點3主3從來存儲數據,如果公司業務蒸蒸日上6臺節點不夠用我們就需要新增節點,這個叫做集羣擴容 ,如果有點涼或者高峯期過了就需要下線節點,這個叫做集羣縮容。這裏就說說Redis5.0.5版本怎麼去擴容和縮容集羣。

節點擴容

配置文件

這個配置和之前一樣,改改端口文件名即可

port 8006
daemonize yes
logfile "8006.log"
dir "/usr/local/redis-5.0.5/data/"
protected-mode no
dbfilename dump-8006.rdb
# 開啓集羣
cluster-enabled yes
# 集羣運行時文件
cluster-config-file nodes-8006.conf
# 是否集羣所有的節點都正常集羣纔可使用,改爲no
cluster-require-full-coverage no
# 節點請求超時時間 
cluster-node-timeout 15000
# 關閉保護模式
protected-mode no

啓動節點 

redis-server redis-8006.conf
redis-server redis-8007.conf

查看節點啓動狀態

添加節點

1、使用redis-cli --cluster help命令查看幫助

create:創建一個集羣
call:可以執行redis命令
add-node:將一個節點添加到集羣裏,第一個參數爲新節點的ip:port,第二個參數爲集羣中任意一個已經存在的節點的ip:port
del-node:移除一個節點
reshard:重新分片
check:檢查集羣狀態

2、使用add-node參數添加節點 

redis-cli --cluster add-node 127.0.0.1:8006 127.0.0.1:8000
redis-cli --cluster add-node 127.0.0.1:8007 127.0.0.1:8000

這裏抱歉一下:我運行出來的圖找不到了,所以借了一張,大概長這樣 

查看節點狀態

說明:我這裏大家看到我打有馬賽克,因爲這張圖是我分配完槽之後截的,因爲之前的圖一樣找不到了,大家會發現這裏多了兩臺節點8006和6007

分配槽

執行以下命令:

redis-cli --cluster reshard 127.0.0.1:8000

 這裏會出現下圖效果,這裏會讓你選擇你想挪動多少槽,從1到16384,後續信息我在下方使用文字貼出,大家跟着去做!

 How many slots do you want to move (from 1 to 16384)? 2000
說明:需要多少個槽移動到新的節點上,自己設置,比如2000個槽
What is the receiving node ID? de7f62b1b649622bd18e8b4983864573ee6cc0e0
說明:把這2000個hash槽移動到哪個節點上去,需要指定節點id,我這裏寫的是8006的ID
Please enter all the source node IDs.
Type 'all' to use all the nodes as source nodes for the hash slots.
Type 'done' once you entered all the source nodes IDs.
Source node 1:all
注意:輸入all爲從所有主節點中分別抽取相應的槽數指定到新節點中,抽取的總槽數爲2000個;或者輸入原節點ID然後輸入done,意思將輸入的節點ID,抽取的總槽數爲2000個,我這裏輸入的是all。
Do you want to proceed with the proposed reshard plan (yes/no)? yes
注意:輸入yes確認開始執行分片任務

查看新的節點狀態

大家算一算這個是不是我們撒謊改變分配的有2000個槽,這2000個槽分別從8000、8001、8002分過來的,而8007並沒有分配槽,他是8006的從節點,接下來我們設置一下。

配置主從關係

哈哈,大家可還記得如何人分配主從?

redis-cli -p 8007 cluster replicate de7f62b1b649622bd18e8b4983864573ee6cc0e0

查看集羣狀態發現8007變成slave 

至此我們完成了節點擴容,從原本的3主3從,擴容成4主4從。我們這裏都是在同一臺節點上完成的,在實際生產過程中都是在不同節點上的,只需要修改ip和端口號即可,相信這對優秀的各位來說都是小意思!

集羣縮容

下線8007從節點

使用del-node ip:port nodeID

redis-cli --cluster del-node 127.0.0.1:8007 d4aa5b7ea13899beef910b93228fc27b48bf88f4

查看集羣狀態

你會發現8007節點已經下線了

下線8006主節點

這個稍微有點麻煩,因爲主節點上有數據槽,需要歸還槽,然後在執行下線操作,否則就有可能造成數據丟失,這也是裏邊的小細節需要大家牢記!

執行:redis-cli --cluster reshard 127.0.0.1:8006

分配槽

這裏一定要注意,我這裏怎麼變成4000了呢,我之前不是分配了2000個槽到8006嗎?因爲上邊操作錯誤了。所以這裏第一個ID是接收槽的節點的ID也就是8000的ID,第二個填寫源節點的ID也就是8006的ID。

查看集羣狀態 

我們發現8006已經沒有槽了,而8000多了10923-12255槽

 下線節點

redis-cli --cluster del-node 127.0.0.1:8006 de7f62b1b649622bd18e8b4983864573ee6cc0e0

查看集羣狀態

已經成功下線,我們進入集羣測試添加查詢數據都是沒有問題的。

重定向

moved重定向

我們先來看看下邊的命令出現的問題

  1. 上邊的兩個紅色框分別爲8000的槽和8001的槽
  2. 緊接着的是我們想集羣中set了一個數據key爲java,value爲javaweb
  3. 接下來的cluster keyslot java命令是計算java這個key應該分配到那個槽中,結果爲858,那麼858這個槽在8000節點上所以數據就存儲在了8000節點上
  4. 我們看最後一個紅框,計算了python的槽值爲7252,被8001節點維護,所以set值時大家發現多出一行提示重定向到8001上接下來我們的客戶端就被重定向到了8001端口可以看到最後一行已經由8000編程了8001
  5. 如果我們去獲取或者設置數據,如果直接在該節點維護那麼會直接完成操作,如果不在該節點,Redis會向客戶端回覆moved,客戶端會重定向到指定的節點上操作

ask重定向

moved和ask區別

  1.  兩者都是客戶端重定向
  2. moved確定槽已經遷移,不在當前節點
  3. ask是槽還在遷移中

大家會發現,如果我們遷移了槽或者槽正在遷移中我們的客戶端來訪問Redis Cluster中隨機一個節點時如果數據不在該節點上會去做moved或者ask操作也就是重定向到其他的節點上 ,這樣會對性能造成一定的影響。比如我們集羣中有100個節點那麼直接命中的概率就是1%。基於這個問題,我們面給大家說Stream客戶端來解決

smart客戶端

介紹

我們的集羣數據在不同的slot中,在不同的節點上,key不在該節點上那麼會發生moved重定向,去其他節點上操作,如果集羣正在伸縮在做槽的遷移那麼會發生ask重定向,會大大影響我們對Redis集羣操作的性能,我們可以使用smart客戶端完成高性能的操作Redis Cluster。我們通過JedisCluster對象操作Redis集羣。

原理

  1. 從集羣中選擇一個可以運行的節點,使用Cluster slots初始化槽和節點映射
  2. 將這種映射關係存儲到本地,爲每一個節點創建一個Jedis Pool
  3. 之後直接連接到Redis節點上去執行命令
  4. smart客戶端將key發送到指定的節點上,如果成功就會得到響應
  5. 如果出現連接出錯,隨機找個活躍節點,向其發送命令,大概率會得到 moved 異常,然後重新初始化 slot 和 node 的映射關係,再向目標節點發送命令
  6. 如果這樣的情況連續出現 5 次,報錯:Too many cluster redirection!

SpringBoot操作Redis Cluster

配置參考本渣《最新超詳細註釋解析SpringBoot2.X操作Redis5.X》,只需要修改配置文件中的連接即可,操作等等都一樣

application.yml文件

spring:
  redis:
    cluster:
      nodes: 192.168.11.101:8000,192.168.11.101:8001,192.168.11.101:8002,192.168.11.101:8003,192.168.11.101:8004,192.168.11.101:8005
    timeout: 5000ms

 

總結

  • Redis單機,主從複製,哨兵,集羣都可以成功搭建 
  • 各運行模式之間的關係,特點也都心中明朗
  • SpringBoot操作Redis單機,哨兵和集羣
  • 怎麼用好Redis,開發規範,出現的坑,相關面試題請大家關注Redis系列文章後續繼續推出

我是添添,用你勤勞的雙手點個贊吧,這將是我創作更多優質文章的動力,好不好嘛!

 

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