0. 現象
redis某節點出現宕機,刪除後重新部署出現如下問題:
unrecoverable erro:corrupted cluster config file
2.原因分析
/var/lib/redis/nodes.conf,頻繁重啓虛機的過程中文件破壞,信息不完整或數據不一致造成。
3. 解決方案
步驟1:數據平臺中停止Redis服務
步驟2:刪除Redis。
步驟3:刪除每個節點上的dump.rdb文件和nodes.conf文件
刪除方法:
利用xcall.sh腳本刪掉 /var/lib/redis/下的 nodes.conf及dump.rdb文件。(xcall.sh已編寫放在了系統/usr/local/bin下)
xcall.sh 'rm -rf /var/lib/redis/nodes.conf'
xcall.sh 'rm -rf /var/lib/redis/dump.rdb'
xcall.sh 腳本如下:
#!/bin/bash
# for循環
for((i=1; i<=7; i++)) ; do
# 更改文本顏色
tput setaf 2
# 輸出以下文本
echo ==================== bg-$i $@ ===================
# 更改文本顏色
tput setaf 9
# ssh 遠程登陸主機 bg-$i ,執行輸入的參數的命令
ssh bg-$i $@
done
步驟4:平臺管理組件庫和版本中找到Redis添加redis服務。(或重新部署redis服務)
步驟5:重啓Redis,查看Redis節點中是否有掛掉的節點。如果啓動過程中有某個節點啓動失敗,執行步驟8.
如下圖所示:
步驟6:通過命令創建Redis集羣
/usr/idp/current/redis-server/bin/redis-trib.rb create --replicas 1 10.1.3.13:6379 10.1.3.14:6379 10.1.3.15:6379 10.1.3.16:6379 10.1.3.17:6379 10.1.3.18:6379。
執行結果樣例如下:
步驟7:驗證集羣是否安裝成功
cd /usr/idp/current/redis-server/bin
./redis-cli -c -h bigdata-1 -p 6379
輸入:cluster nodes
bigdata-1:6379> cluster nodes
執行結果樣例如下:
都是connected說明集羣中redis機器連接沒有問題。
測試命令:
bigdata-1:6379> set hello world
ssh bigdata-2
cd /usr/idp/current/redis-server/bin
./redis-cli -c -h bigdata-2 -p 6379
bigdata-2:6379> get hello
樣例結果如下:
如果命令出現ERROR情況則,使用redis-trib命令來檢查集羣
redis-trib.rb check ip:port
如:
./redis-trib.rb check 10.92.11.11:6379
如果報錯:[ERR] Not all 16384 slots are covered by nodes.請執行:步驟9
如果報錯:[ERR] Nodes don't agree about configuration!請執行:步驟10
步驟8:
redis節點啓動失敗
現象:
metrics_pid = int(sudo.read_file(redis_metrics_pid_file))
ValueError: invalid literal for int() with base 10: '8654\n11593\n19745\n8626\n15793\n24954\n30154\n'
解決:
比如bigdata-6節點損壞了,登錄到bigdata-6節點上:
cd /var/run/redis
[root@ bigdata-6 redis]# cat redis_metrics.pid
只保留第一行的pid
kill -9 11593 19745 8626 15793 24954 30154
vi redis_metrics.pid
刪除多餘的pid信息。如:11593 19745 8626 15793 24954 30154
保存退出。
步驟9:
原因:這個往往是由於主node移除了,但是並沒有移除node上面的slot,從而導致了slot總數沒有達到16384,其實也就是slots分佈不正確。所以在刪除節點的時候一定要注意刪除的是否是Master主節點。
解決方案樣例如下:
1)、官方是推薦使用redis-trib.rb fix 來修復集羣…. …. 通過cluster nodes看到7001這個節點被幹掉了… 那麼
[root@node01 src]# ./redis-trib.rb fix 172.168.63.201:7001
修復完成後再用check命令檢查下是否正確
[root@node01 src]# ./redis-trib.rb check 172.168.63.202:7000
只要輸入任意集羣中節點即可,會自動檢查所有相關節點。可以查看相應的輸出看下是否是每個Master都有了slots,如果分佈不均勻那可以使用下面的方式重新分配slot:
[root@node01 src]# ./redis-trib.rb reshard 172.168.63.201:7001
步驟10:
其他節點之前執行過cluster reset,重新握手一次
bg-1:6379> cluster meet 10.92.11.12 6379
bg-1:6379> cluster meet 10.92.11.13 6379
bg-1:6379> cluster meet 10.92.11.14 6379
bg-1:6379> cluster meet 10.92.11.15 6379
bg-1:6379> cluster meet 10.92.11.16 6379
再次檢查一下損壞節點的信息
/usr/idp/current/redis-server/bin/ redis-trib.rb check 10.92.11.11:6379