Redis集羣擴容與收縮和羣集數據遷移

前言

這一篇是承接上一篇博客的,是在redis自動構建完成以後的操作
可參考:https://blog.csdn.net/weixin_43815140/article/details/106163920

redis節點擴容

redis節點擴容步驟類似於我們前面的手動搭建redis高可用集羣,不同的是我們得手動去給新節點劃分槽;

Redis集羣的擴容操作可分爲以下幾個步驟:

  • 準備新節點
  • 加入集羣
  • 遷移槽和數據

在redis1,上準備新節點

[root@redis1 ~]# mkdir -p /opt/redis_cluster/redis_{6390,6391}/{conf,logs,pid}
[root@redis1 ~]# mkdir -p /data/redis_cluster/redis_{6390,6391}
[root@redis1 ~]# cd /opt/redis_cluster/
[root@redis1 redis_cluster]# ls
redis  redis-5.0.6  redis_6380  redis_6381  redis_6390  redis_6391
[root@redis1 redis_cluster]# cp redis_6380/conf/redis_6380.conf ./redis_6390/conf/redis_6390.conf
[root@redis1 redis_cluster]# cp redis_6380/conf/redis_6380.conf ./redis_6391/conf/redis_6391.conf
[root@redis1 redis_cluster]# sed -i 's#6380#6390#g' redis_6390/conf/redis_6390.conf
[root@redis1 redis_cluster]# sed -i 's#6380#6391#g' redis_6391/conf/redis_6391.conf
[root@redis1 redis_cluster]# 

啓動新節點

[root@redis1 redis_cluster]# cd
[root@redis1 ~]# 
[root@redis1 ~]# sh redis_shell.sh start 6390
root      50096      1  0 19:35 ?        00:00:06 redis-server 192.168.10.3:6380 [cluster]
root      50110      1  0 19:35 ?        00:00:06 redis-server 192.168.10.3:6381 [cluster]
root      51038   2640  0 21:03 pts/0    00:00:00 sh redis_shell.sh start 6390
root      51046      1  0 21:03 ?        00:00:00 redis-server 192.168.10.3:6390 [cluster]
root      51048  51038  0 21:03 pts/0    00:00:00 grep redis
[root@redis1 ~]# sh redis_shell.sh start 6391
root      50096      1  0 19:35 ?        00:00:06 redis-server 192.168.10.3:6380 [cluster]
root      50110      1  0 19:35 ?        00:00:06 redis-server 192.168.10.3:6381 [cluster]
root      51046      1  0 21:03 ?        00:00:00 redis-server 192.168.10.3:6390 [cluster]
root      51052   2640  0 21:03 pts/0    00:00:00 sh redis_shell.sh start 6391
root      51060      1  0 21:03 ?        00:00:00 redis-server /opt/redis_cluster/redis_6391/conf/redis_6391.conf
root      51062  51052  0 21:03 pts/0    00:00:00 grep redis
[root@redis1 ~]# 

配置使新節點加入羣集

[root@redis1 ~]# redis-cli -c -h 192.168.10.3 -p 6380 cluster meet 192.168.10.3 6390 
OK
[root@redis1 ~]# redis-cli -c -h 192.168.10.3 -p 6380 cluster meet 192.168.10.3 6391
OK
[root@redis1 ~]# 

還沒有完,看了上一篇的也知道,這是他倆都是master且還沒有槽存儲數據

在其他的master上分配槽

因爲前三個master已經把16384個槽全部分配完了,所以新的節點需要從他們那裏要一些過來

[root@redis1 ~]# redis-cli --cluster reshard 192.168.10.3 6380
#打印出進羣每個節點信息後,reshard命令需要確認遷移的槽數量,這裏我們輸入2048個:
How many slots do you want to move (from 1 to 16384)? 2048
#輸入6390的節點ID作爲目標節點,也就是要擴容的節點,目標節點只能指定一個
What is the receiving node ID? 6390的ID號
#之後輸入源節點的ID,這裏分別輸入每個主節點的6380的ID最後輸入done,或者直接輸入all
Source node #1:all

分配完後,6390和6391都是master,且6391master沒有分配槽,所以,需要把6391做成從節點,這裏只是測試,再次強調,在線上一定不要把master和slave放在一臺主機,要交叉分佈,我這裏是沒有辦法了,就只有6390可分配

[root@redis1 ~]# redis-cli -h 192.168.10.3 -p 6391 cluster replicate 093beec91d9568e56e840b32a3537c6ba2d8d24f
OK
[root@redis1 ~]# 

在這裏插入圖片描述
現在,新的節點已經添加完成
這就和其他的節點一模一樣啦,
完成後還可以使用redis-cli --cluster rebalance 192.168.10.3:6380來完成重新平衡集羣狀態,使每個節點分到的槽數一樣多,這樣你之前劃分給了6390多少,都會中和掉,所以原來給的2048明顯低於平均數,16384/4=4096 4096-2048=2048 2048/3=682
所以,其他的3個master還得每個master在分出682個槽
如下:

[root@redis1 ~]# redis-cli --cluster rebalance 192.168.10.3:6380
>>> Performing Cluster Check (using node 192.168.10.3:6380)
[OK] All nodes agree about slots configuration.
>>> Check for open slots...
>>> Check slots coverage...
[OK] All 16384 slots covered.
>>> Rebalancing across 4 nodes. Total weight = 4.00
Moving 682 slots from 192.168.10.8:6380 to 192.168.10.3:6390
####################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################
Moving 683 slots from 192.168.10.4:6380 to 192.168.10.3:6390
####################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################
Moving 683 slots from 192.168.10.3:6380 to 192.168.10.3:6390
####################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################
[root@redis1 ~]# 

redis節點收縮

流程說明:
1).首先需要確定下線節點是否有負責的槽,
如果是,需要把槽遷移到其他節點,保證節點下線後整個集羣槽節點映射的完整性.
2).當下線節點不再負責槽或者本身是從節點時,
就可以通知集羣內其他節點忘記該下線節點,當所有的節點忘記該節點後可以正常關閉.

具體操作:
這裏我們準備將剛纔新添加的節點下線,也就是6390和6391
收縮和擴容遷移的方向相反,6390變爲源節點,其他節點變爲目標節點,源節點把自己負責的4096個槽均勻的遷移到其他節點上,因爲redis-cli命令只能有一個目標節點,因此需要執行3次reshard命令,分別遷移1365,1365,1366個槽給其他3個master;
也可以把4096個槽全部給某一個,再把6390,6391移除羣集
使用redis-cli --cluster rebalance 192.168.10.3:6380 來平衡羣集
命令格式如下:

[root@redis1 ~]# redis-cli --cluster reshard 192.168.10.3:6380  
How many slots do you want to move (from 1 to 16384)? 1365  #分配多少個槽
輸入6380的id                    #分配給誰(目標節點)
輸入6390的id                    #從哪裏分配(源節點)
done                           #只有一個源節點,回車後done完成

在這裏插入圖片描述

忘記節點(下線)

由於我們的集羣是做了高可用的,所以當主節點下線的時候從節點也會頂上,所以最好我們先下線從節點,然後再下線主節點
命令:

redis-cli --cluster del-node 192.168.10.3:6391 ID
redis-cli --cluster del-node 192.168.10.3:6390 ID
[root@redis1 ~]# redis-cli --cluster del-node 192.168.10.3:6391 16be087fd0a4312d5631f9aafd02058057082a6a
>>> Removing node 16be087fd0a4312d5631f9aafd02058057082a6a from cluster 192.168.10.3:6391
>>> Sending CLUSTER FORGET messages to the cluster...
>>> SHUTDOWN the node.
[root@redis1 ~]# redis-cli --cluster del-node 192.168.10.3:6390 093beec91d9568e56e840b32a3537c6ba2d8d24f
>>> Removing node 093beec91d9568e56e840b32a3537c6ba2d8d24f from cluster 192.168.10.3:6390
>>> Sending CLUSTER FORGET messages to the cluster...
>>> SHUTDOWN the node.
[root@redis1 ~]# 

移除後驗證是否成功

在這裏插入圖片描述

redis 數據導入導出(遷移)

需求背景

剛切換到redis集羣的時候肯定會面臨數據導入的問題,所以這裏推薦使用redis-migrate-tool工具來導入單節點數據到集羣裏或別的集羣遷移到本地現在的集羣;

redis-migrate-tool 是維品會開源的一款redis數據遷移工具,基於redis複製,快速,穩定,劃重點 實時遷移 遷移過程中,源集羣不影響對外提供服務
下載地址:https://github.com/vipshop/redis-migrate-tool

redis-migrate-tool安裝

無意間發現有一篇redis-migrate-tool的詳解
redis-migrate-tool

#安裝依賴
yum -y install automake libtool autoconf bzip2 git 
#構建安裝
cd /opt/redis_cluster/
git clone https://github.com/vipshop/redis-migrate-tool.git
cd redis-migrate-tool/
autoreconf -fvi
./configure
make && make install 

創建配置文件

[root@redis1 ~]# cat /opt/redis_cluster/redis-migrate-tool/rmt.conf
[source]
type: single
servers:
- 192.168.10.3:6379
 
[target]
type: redis cluster
servers:
- 192.168.10.3:6380 
 
[common]
listen: 0.0.0.0:8888
source_safe: true

生成測試數據

#!/bin/bash
for i in {1..1000}
do
	redis-cli -c -h 192.168.10.3 -p 6379 set k$i v$i
done

執行導入命令

[root@redis1 ~]# redis-migrate-tool -c rmt.conf

部分指令解析:

-h, --help:幫助
-V, --version:顯示版本
-d, --daemonize:後臺進程運行
-I, --information:打印一些有用的信息,包括可以解析的指令(126個),不支持的指令(14個)等等
-v, --verbosity=N:設置日誌等級。(默認: 5, 最低: 0, 最高: 11)
-o, --output=S:設置輸出的日誌文件
-c, --conf-file=S:設置配置文件。(默認: rmt.conf)
-C, --command=S:設置運行的指令(默認: redis_migrate ,遷移)。redis_check 比較源和目的,默認1000個樣本key。redis_testinsert測試插入Keys,默認所有類型總共1000個。
-T, --thread=N:設置多少個線程用來運行工具。(默認: 4)

數據校驗,抽樣檢查

[root@redis1 ~]# redis-migrate-tool -c rmt.conf -C redis_check

如果想查更多,redis_check 後自己定義

redis-migrate-tool -c rmt.conf -C "redis_check 200000"

[root@redis1 ~]# redis-migrate-tool -c rmt.conf -C redis_check
Check job is running...

Checked keys: 1000
Inconsistent value keys: 0
Inconsistent expire keys : 0
Other check error keys: 0
Checked OK keys: 1000

All keys checked OK!
Check job finished, used 1.041s

注意:
redis-migrate-tool目前不支持redis 4.x 及 以上,
因此實驗最好使用redis 3.2.3版本。

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