90?redis集群分片之集群擴容
三主三從不夠用了,進行擴容變為4主4從
問題:1.新建兩個redis實例,怎么加入原有集群?2.原有的槽位分3段,又加進來一個槽位怎么算?
新建6387、6388兩個服務實例配置文件+新建后啟動
首先新建redisCluser6387.conf、redisCluser6388.conf文件:以redisCluser6387.conf為例
bind 0.0.0.0
daemonize yes
protected-mode no
port 6387
logfile "/myredis/cluster/cluster6387. log"
pidfile /myredis/cluster6387. pid
dir /myredis/cluster
dbfilename dump6387.rdb
appendonly yes
appendfilename "appendonly6387.aof"
requirepass 111111
masterauth 111111cluster-enabled yes
cluster-config-file nodes-6387. conf
cluster-node-timeout 5000
啟動87/88兩個新的節點實例
此時他們自己都是獨立的master
將新增的6387節點(空槽號)作為master節點加入原集群
將新增的6387作為master節點加入原有集群
redis-cli -a 密碼 -- cluster add-node 市己實際IP地址:6387 自己實際IP地址:6381
6387 就是將要作為master新增節點
6381 就是原來集群節點里面的領路人,相當于6387拜拜6381的碼頭從而找到組織加入集群
redis-cli -a 111111 -- cluster add-node 192.168.111.174:6387 192.168.111.175:6381
檢查集群情況第1次
使用 redis-cli
對 Redis 集群節點進行健康檢查(cluster check)
部分 | 含義 |
---|---|
redis-cli | Redis 的命令行客戶端工具 |
-a 111111 | 使用密碼 111111 連接(如果 Redis 開啟了密碼驗證) |
--cluster check | 檢查集群狀態 |
192.168.111.185:6381 | 指定集群中任意一個節點(IP 和端口)作為入口 |
重新分派槽號(reshard)
命令:redis-cli -a 密碼 -- cluster reshard IP地址:端口號
redis-cli -a 密碼 -- cluster reshard 192.168.111.175:6381
部分 | 含義 |
---|---|
redis-cli | Redis 客戶端 |
-a 密碼 | 指定連接密碼 |
--cluster reshard | 表示要對集群執行“重新分片”操作(即遷移 slot) |
192.168.111.175:6381 | 集群中任意一個節點(作為入口) |
作用是:對 Redis 集群進行手動分片(reshard)操作,讓某些槽(slots)從一個節點遷移到另一個節點。執行該命令后,它不會立刻遷移,而是進入交互模式,你需要輸入更多信息。
執行流程(進入交互模式)后會問你:
-
要遷移多少個 slot?(如 1000)
How many slots do you want to move (from 1 to 16384)?由于16384/4=4096 因此這里填4096
-
目標節點的 ID?
誰來接收這些新分出來的槽位?找到6387的槽位ID進行輸入
What is the receiving node ID?
-
是否自動選擇源節點?
Please enter all the source node IDs. Type 'all' to use all the nodes as source nodes.
輸入all -
確認遷移(yes/no)
? ? ? ? ? 輸入yes
檢查集群情況第2次
4主3從
槽號如何分派?
6387的槽號是3段,0-1364,5461-6826,10923-12287
為什么6387是3個新的區間,以前的master卻還是連續的?
重新分配成本太高,所以前3家各自勻出來一部分,從6381/6382/6383三個舊節點分別勻出1364個坑位給新節點6387
為主節點6387分配從節點6388
命令:redis-cli -a 密碼 -- cluster add-node ip:新slave端口 ip:新master端口 -- cluster-slave -- cluster-master-id 新主機節點ID
redis-cli -a 111111 -- cluster add-node 192.168.111.174:6388 192.168.111.174:6387 -- cluster-slave
-- cluster-master-id 4feb6a7ee0ed2b39ff86474cf4189ab2a554a40f ------- 這個是6387的編號,按照自己實際情況?
檢查集群情況第3次
91?redis集群分片之集群縮容
1先清除從節點6388
2清出來的槽號重新分配給6381
3再刪除6387
4 恢復成3主3從
目的:6387和6388下線
檢查集群情況第一次,先獲得從節點6388的節點ID
redis-cli -a 密碼 -- cluster check 192.168.111.174:6388
從集群中將4號從節點6388刪除
命令:redis-cli -a 密碼 -- cluster del-node ip:從機端口 從機6388節點ID
redis-cli -a 111111 -- cluster del-node 192.168.111.174:6388 218e7b8b4f81be54ff173e4776b4f4faaf7c13da
將6387的槽號清空,重新分配,本例將清出來的槽號都給6381
redis-cli -a 111111 -- cluster reshard 192.168.111.175:6381
使用密碼 111111
登錄到 Redis 集群中的節點 192.168.111.175:6381
,并對該 Redis 集群執行 手動分片遷移(reshard)操作。
# 啟動 reshard 工具
redis-cli -a 111111 --cluster reshard 192.168.111.175:6381# 提示輸入要遷移多少個槽(例如 1000)
How many slots do you want to move (from 1 to 16384)? 4096# 提示輸入目標節點的 Node ID(槽位遷移到哪個節點上)
What is the receiving node ID??6381結點id,由它接受空出來的槽位# 提示輸入源節點 ID(要從哪些節點遷移槽位,可輸入 all)
Please enter all the source node IDs.???????? 6387結點id,告知刪除6387
Type 'all' to use all the nodes as source nodes. allSource node #1:4feb6a7ee0ed2b39ff86474cf4189ab2a554a40f
Source node #2:done# 最后確認是否執行
Do you want to proceed with the proposed reshard plan (yes/no)? yes
?
檢查集群情況第二次
redis-cli -a 111111 -- cluster check 192.168.111.175:6381
4096個槽位都指給6381,它變成了8192個槽位,相當于全部都給6381了,不然要輸入3次,一鍋端
6387變成了6381的從機
將6387刪除
命令:redis-cli-a密碼 -- cluster del-node ip:端口 6387節點ID
redis-cli -a 111111 -- cluster del-node 192.168.111.174:6387 4feb6a7ee0ed2b39ff86474cf4189ab2a554a40f
檢查集群情況第三次,6387/6388被徹底祛除
redis-cli -a 111111 -- cluster check 192.168.111.175:6381
92 redis集群分片之小總結
集群常用操作命令和CRC16算法分析
不在同一個slot槽位下的多鍵操作支持不好,通識占位符登場
mget k1 k2 k3? //在集群環境下報錯
不在同一個slot槽位下的鍵值無法使用mset,mget等多建操作
可以通過{}來定義同一組的概念,使Key中{}內相同內容的鍵值對放到一個slot槽位去。
將3個k整體打包到同一個組z存放到8157這一個槽位上。此時可以讀取:
Redis集群有16384個哈希槽,每個key通過CRC16校驗后對16384取模來決定放置哪個槽。集群的每個節點負責一部分hash槽
CRC16是由C語言源碼編輯的
常用命令
集群是否完整才能對外提供服務的操作設置
????????cluster-require-full-coverage
默認YES,現在集群架構是3主3從的redis cluster由3個master平分16384個slot,每個master的小集群負責1/3的slot,對應一部分數據。cluster-require-full-coverage: 默認值yes,即需要集群完整性。方可對外提供服務 通常情況,如果這3個小集群中,任何一個(1主1從)掛了,你這個集群對外可提供的數據只有2/3了,整個集群是不完整的,redis默認在這種情況下,是不會對外提供服務的。
如果你的訴求是,集群不完整的話也需要對外提供服務,需要將該參數設置為no,這樣的話你掛了的那個小集群是不行了,但是其他的小集群仍然可以對外提供服務。
CLUSTER COUNTKEYSINSLOT 槽位數字編號
查看該槽位是占位還是空閑 1被占用 0沒被占用
?
CLUSTER KEYSLOT 鍵名稱
查看key應該存在哪個槽位上