Redis集羣刪除後重建後報:unrecoverable erro:corrupted cluster config file)錯誤解決方案

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

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