Redis集群删除后重建后报错:unrecoverable erro:corrupted cluster config file问题及解决
作者:莫叫石榴姐
现象
redis某节点出现宕机,删除后重新部署出现如下问题:
unrecoverable erro:corrupted cluster config file

原因分析
/var/lib/redis/nodes.conf,频繁重启虚机的过程中文件破坏,信息不完整或数据不一致造成。
解决方案
步骤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

总结
以上为个人经验,希望能给大家一个参考,也希望大家多多支持脚本之家。
