REDIS故障排查工具
轉載 https://www.cnblogs.com/zhoujinyi/p/11606935.html
附加:解決創建集群超時問題,檢查防火墻
firewall-cmd --zone=public --add-port=16379/tcp --permanent
firewall-cmd --zone=public --add-port=16389/tcp --permanent
firewall-cmd --zone=public --add-port=26379/tcp --permanent
firewall-cmd --zone=public --add-port=26389/tcp --permanent
#重新加載防火墻
firewall-cmd --reload
#查詢放行的端口
firewall-cmd --list-all
進入命令行:
./redis-cli -h ip -p port
查看集群節點
cluster nodes
查看key對應的slot
cluster keyslot key
查看slot和節點的對應關系
cluster slots
背景:
Redis Cluster 在5.0之后取消了ruby腳本 redis-trib.rb的支持(手動命令行添加集群的方式不變),集合到redis-cli里,避免了再安裝ruby的相關環境。直接使用redis-clit的參數–cluster 來取代。為方便自己后面查詢就說明下如何使用該命令進行Cluster的創建和管理,關于Cluster的相關說明可以查看官網或則Redis Cluster部署、管理和測試。
環境:
系統版本:Ubuntu 14.04
Redis版本:5.0.5
機器IP:192.168.163.132
說明:redis-cli --cluster help
復制代碼
redis-cli --cluster help
Cluster Manager Commands:
create host1:port1 … hostN:portN #創建集群
–cluster-replicas #從節點個數
check host:port #檢查集群
–cluster-search-multiple-owners #檢查是否有槽同時被分配給了多個節點
info host:port #查看集群狀態
fix host:port #修復集群
–cluster-search-multiple-owners #修復槽的重復分配問題
reshard host:port #指定集群的任意一節點進行遷移slot,重新分slots
–cluster-from #需要從哪些源節點上遷移slot,可從多個源節點完成遷移,以逗號隔開,傳遞的是節點的node id,還可以直接傳遞–from all,這樣源節點就是集群的所有節點,不傳遞該參數的話,則會在遷移過程中提示用戶輸入
–cluster-to #slot需要遷移的目的節點的node id,目的節點只能填寫一個,不傳遞該參數的話,則會在遷移過程中提示用戶輸入
–cluster-slots #需要遷移的slot數量,不傳遞該參數的話,則會在遷移過程中提示用戶輸入。
–cluster-yes #指定遷移時的確認輸入
–cluster-timeout #設置migrate命令的超時時間
–cluster-pipeline #定義cluster getkeysinslot命令一次取出的key數量,不傳的話使用默認值為10
–cluster-replace #是否直接replace到目標節點
rebalance host:port #指定集群的任意一節點進行平衡集群節點slot數量
–cluster-weight <node1=w1…nodeN=wN> #指定集群節點的權重
–cluster-use-empty-masters #設置可以讓沒有分配slot的主節點參與,默認不允許
–cluster-timeout #設置migrate命令的超時時間
–cluster-simulate #模擬rebalance操作,不會真正執行遷移操作
–cluster-pipeline #定義cluster getkeysinslot命令一次取出的key數量,默認值為10
–cluster-threshold #遷移的slot閾值超過threshold,執行rebalance操作
–cluster-replace #是否直接replace到目標節點
add-node new_host:new_port existing_host:existing_port #添加節點,把新節點加入到指定的集群,默認添加主節點
–cluster-slave #新節點作為從節點,默認隨機一個主節點
–cluster-master-id #給新節點指定主節點
del-node host:port node_id #刪除給定的一個節點,成功后關閉該節點服務
call host:port command arg arg … arg #在集群的所有節點執行相關命令
set-timeout host:port milliseconds #設置cluster-node-timeout
import host:port #將外部redis數據導入集群
–cluster-from #將指定實例的數據導入到集群
–cluster-copy #migrate時指定copy
–cluster-replace #migrate時指定replace
help
For check, fix, reshard, del-node, set-timeout you can specify the host and port of any working node in the cluster.
復制代碼
注意:Redis Cluster最低要求是3個主節點,如果需要集群需要認證,則在最后加入 -a xx 即可。
① 創建集群主節點
redis-cli --cluster create 192.168.163.132:6379 192.168.163.132:6380 192.168.163.132:6381
View Code
② 創建集群主從節點
/redis-cli --cluster create 192.168.163.132:6379 192.168.163.132:6380 192.168.163.132:6381 192.168.163.132:6382 192.168.163.132:6383 192.168.163.132:6384 --cluster-replicas 1
說明:–cluster-replicas 參數為數字,1表示每個主節點需要1個從節點。
View Code
通過該方式創建的帶有從節點的機器不能夠自己手動指定主節點,所以如果需要指定的話,需要自己手動指定,先使用①或③創建好主節點后,再通過④來處理。
③ 添加集群主節點
redis-cli --cluster add-node 192.168.163.132:6382 192.168.163.132:6379
說明:為一個指定集群添加節點,需要先連到該集群的任意一個節點IP(192.168.163.132:6379),再把新節點加入。該2個參數的順序有要求:新加入的節點放前
View Code
④ 添加集群從節點
redis-cli --cluster add-node 192.168.163.132:6382 192.168.163.132:6379 --cluster-slave --cluster-master-id 117457eab5071954faab5e81c3170600d5192270
說明:把6382節點加入到6379節點的集群中,并且當做node_id為 117457eab5071954faab5e81c3170600d5192270 的從節點。如果不指定 --cluster-master-id 會隨機分配到任意一個主節點。
View Code
⑤ 刪除節點
redis-cli --cluster del-node 192.168.163.132:6384 f6a6957421b80409106cb36be3c7ba41f3b603ff
說明:指定IP、端口和node_id 來刪除一個節點,從節點可以直接刪除,有slot分配的主節點不能直接刪除。刪除之后,該節點會被shutdown。
View Code
注意:當被刪除掉的節點重新起來之后不能自動加入集群,但其和主的復制還是正常的,也可以通過該節點看到集群信息(通過其他正常節點已經看不到該被del-node節點的信息)。
如果想要再次加入集群,則需要先在該節點執行cluster reset,再用add-node進行添加,進行增量同步復制。
到此,目前整個集群的狀態如下:
復制代碼
192.168.163.132:6379> cluster nodes
815da8448f5d5a304df0353ca10d8f9b77016b28 192.168.163.132:6380@16380 master - 0 1569748297177 2 connected 5461-10922
0c21b6cee354594a23f4d5abf0d01b48bdc96d55 192.168.163.132:6383@16383 slave 56005b9413cbf225783906307a2631109e753f8f 0 1569748295000 4 connected
3a1d04983ab6c4ae853f9602dd922d4ebadc4dbf 192.168.163.132:6382@16382 slave 815da8448f5d5a304df0353ca10d8f9b77016b28 0 1569748295000 5 connected
117457eab5071954faab5e81c3170600d5192270 192.168.163.132:6379@16379 myself,master - 0 1569748297000 1 connected 0-5460
56005b9413cbf225783906307a2631109e753f8f 192.168.163.132:6381@16381 master - 0 1569748295000 3 connected 10923-16383
f6a6957421b80409106cb36be3c7ba41f3b603ff 192.168.163.132:6384@16384 slave 117457eab5071954faab5e81c3170600d5192270 0 1569748298185 6 connected
復制代碼
⑥ 檢查集群
redis-cli --cluster check 192.168.163.132:6384 --cluster-search-multiple-owners
說明:任意連接一個集群節點,進行集群狀態檢查
View Code
⑦ 集群信息查看
redis-cli --cluster info 192.168.163.132:6384
說明:檢查key、slots、從節點個數的分配情況
/redis-cli --cluster info 192.168.163.132:6384
192.168.163.132:6380 (815da844…) -> 0 keys | 5462 slots | 1 slaves.
192.168.163.132:6381 (56005b94…) -> 0 keys | 5461 slots | 1 slaves.
192.168.163.132:6379 (117457ea…) -> 2 keys | 5461 slots | 1 slaves.
[OK] 2 keys in 3 masters.
0.00 keys per slot on average.
⑧ 修復集群
redis-cli --cluster fix 192.168.163.132:6384 --cluster-search-multiple-owners
說明:修復集群和槽的重復分配問題
View Code
⑨ 設置集群的超時時間
redis-cli --cluster set-timeout 192.168.163.132:6382 10000
說明:連接到集群的任意一節點來設置集群的超時時間參數cluster-node-timeout
復制代碼
redis-cli --cluster set-timeout 192.168.163.132:6382 10000
Reconfiguring node timeout in every cluster node…
*** New timeout set for 192.168.163.132:6382
*** New timeout set for 192.168.163.132:6384
*** New timeout set for 192.168.163.132:6383
*** New timeout set for 192.168.163.132:6379
*** New timeout set for 192.168.163.132:6381
*** New timeout set for 192.168.163.132:6380
New node timeout set. 6 OK, 0 ERR.
復制代碼
⑩ 集群中執行相關命令
redis-cli --cluster call 192.168.163.132:6381 config set requirepass cc
redis-cli -a cc --cluster call 192.168.163.132:6381 config set masterauth cc
redis-cli -a cc --cluster call 192.168.163.132:6381 config rewrite
說明:連接到集群的任意一節點來對整個集群的所有節點進行設置。
復制代碼
redis-cli --cluster call 192.168.163.132:6381 config set cluster-node-timeout 12000
Calling config set cluster-node-timeout 12000
192.168.163.132:6381: OK
192.168.163.132:6383: OK
192.168.163.132:6379: OK
192.168.163.132:6384: OK
192.168.163.132:6382: OK
192.168.163.132:6380: OK
…
…
復制代碼
到此,相關集群的基本操作已經介紹完,現在說明集群遷移的相關操作。
Redis 6.0 新增了幾個命令:
1,fix 的子命令:–cluster-fix-with-unreachable-masters
2,call的子命令:–cluster-only-masters、–cluster-only-replicas
3,集群節點備份:backup
View Code
遷移相關
① 在線遷移slot :在線把集群的一些slot從集群原來slot節點遷移到新的節點,即可以完成集群的在線橫向擴容和縮容。有2種方式進行遷移
一是根據提示來進行操作:
直接連接到集群的任意一節點
redis-cli -a cc --cluster reshard 192.168.163.132:6379
信息如下:
View Code
二是根據參數進行操作:
redis-cli -a cc --cluster reshard 192.168.163.132:6379 --cluster-from 117457eab5071954faab5e81c3170600d5192270 --cluster-to 815da8448f5d5a304df0353ca10d8f9b77016b28 --cluster-slots 10 --cluster-yes --cluster-timeout 5000 --cluster-pipeline 10 --cluster-replace
說明:連接到集群的任意一節點來對指定節點指定數量的slot進行遷移到指定的節點。
View Code
② 平衡(rebalance)slot :
1)平衡集群中各個節點的slot數量
redis-cli -a cc --cluster rebalance 192.168.163.132:6379
View Code
2)根據集群中各個節點設置的權重等平衡slot數量(不執行,只模擬)
redis-cli -a cc --cluster rebalance --cluster-weight 117457eab5071954faab5e81c3170600d5192270=5 815da8448f5d5a304df0353ca10d8f9b77016b28=4 56005b9413cbf225783906307a2631109e753f8f=3 --cluster-simulate 192.168.163.132:6379
③ 導入集群
redis-cli --cluster import 192.168.163.132:6379 --cluster-from 192.168.163.132:9021 --cluster-replace
說明:外部Redis實例(9021)導入到集群中的任意一節點。
View Code
注意:測試下來發現參數–cluster-replace沒有用,如果集群中已經包含了某個key,在導入的時候會失敗,不會覆蓋,只有清空集群key才能導入。
*** Importing 97847 keys from DB 0
Migrating 9223372011174675807 to 192.168.163.132:6381: Source 192.168.163.132:9021 replied with error:
ERR Target instance replied with error: BUSYKEY Target key name already exists
并且發現如果集群設置了密碼,也會導入失敗,需要設置集群密碼為空才能進行導入(call)。通過monitor(9021)的時候發現,在migrate的時候需要密碼進行auth認證。
總結:
Redis Cluster 通過redis-cli --cluster來創建和管理集群的方式和 redis-trib.rb腳本絕大部分都是一樣的,所以對于比較熟悉 redis-trib.rb 腳本的,使用–cluster也非常順手。
總結
以上是生活随笔為你收集整理的REDIS故障排查工具的全部內容,希望文章能夠幫你解決所遇到的問題。