本文记录一次Redis服务宕机后,Redis集群出现拒绝访问的情况的解决过程。
背景:各项服务在服务器中运行正常,某一天,突然服务器断电,重新拉起各个服务,发现有部分服务无法使用,日志提示Redis拒绝访问。
解决思路:
1、首先定位问题为Redis,出现拒绝访问情况,检查各个系统系统之间的防火墙有没有关闭 iptables -F
2、防火墙确认关闭后,检查各个服务是否启动正常?有无报错。
3、定位出现拒绝访问的Redis集群(可能存在多个),并使用命令行redis-cli确认是否能访问。
4、如果redis能访问,但仍旧出现该情况,尝试修复redis集群。
修复办法:
在redis集群主节点src的目录下,redis-trib fix ip:port,redis-trib.rb create --replicas 1 ip:port逐个进行修复。
理论上,修复后,就可以了。但是在create时,可能出现如下问题:
/usr/local/rvm/gems/ruby-2.4.5/gems/redis-4.1.0/lib/redis/client.rb:124:in `call': ERR Slot 0 is already busy (Redis::CommandError)
from /usr/local/rvm/gems/ruby-2.4.5/gems/redis-4.1.0/lib/redis.rb:3282:in `block in cluster'
from /usr/local/rvm/gems/ruby-2.4.5/gems/redis-4.1.0/lib/redis.rb:50:in `block in synchronize'
from /usr/local/rvm/rubies/ruby-2.4.5/lib/ruby/2.4.0/monitor.rb:214:in `mon_synchronize'
from /usr/local/rvm/gems/ruby-2.4.5/gems/redis-4.1.0/lib/redis.rb:50:in `synchronize'
from /usr/local/rvm/gems/ruby-2.4.5/gems/redis-4.1.0/lib/redis.rb:3281:in `cluster'
from ./redis-trib.rb:212:in `flush_node_config'
from ./redis-trib.rb:906:in `block in flush_nodes_config'
from ./redis-trib.rb:905:in `each'
from ./redis-trib.rb:905:in `flush_nodes_config'
from ./redis-trib.rb:1426:in `create_cluster_cmd'
from ./redis-trib.rb:1830:in `<main>'
出现该问题,进行如下操作:
进入每一个redis中,执行
-
flushall
-
cluster reset
之后,就可以重新create