使用哨兵模式时,将redis集群全部重启后。怎么自动恢复。现在redis集群重启了,应用也必须重启,不然就一直报 SlaveConnectionPool no available Redis entries. Disconnected hosts [ ......] Hosts disconnected due to errors during failedSlaveCheckInterval
[redisson]集群的自动恢复问题
回答
出现该问题时通过哨兵查询各个节点的情况是怎样的结果?
场景是: 集群几乎完全重装,redis集群确定已经可用了。但是redisson里一直无法恢复。有没有可能是 ip发生了变化。redisson没有及时更新dns。
你说的Redis集群是指的哨兵管理的一主多从吧?
是的, 如果只是重启master。 在大概10秒左右会自动切换。 但是如果整个集群都重启或者完全重装。 就不行了。
整个集群重启以后,登录哨兵命令行查询了节点变化吗?结果是什么?
重启redis集群后 redis应该是正常的。
2019/1/2 上午5:20:45 1:X 01 Jan 21:20:45.043 # +monitor master iot-redis-cluster 10.42.3.190 6379 quorum 2
2019/1/2 上午5:20:45 1:X 01 Jan 21:20:45.046 * +slave slave 10.42.4.2:6379 10.42.4.2 6379 @ iot-redis-cluster 10.42.3.190 6379
2019/1/2 上午5:20:45 1:X 01 Jan 21:20:45.247 * +sentinel sentinel 56c62a989906e5949f37e580ec5a07a1d217dede 10.42.4.2 26379 @ iot-redis-cluster 10.42.3.190 6379
2019/1/2 上午5:20:45 1:X 01 Jan 21:20:45.257 # +new-epoch 3
2019/1/2 上午5:20:45 1:X 01 Jan 21:20:45.844 * +sentinel sentinel bca7ac885bf5d97cdc4e0e7b2167781c635a8343 10.42.3.190 26379 @ iot-redis-cluster 10.42.3.190 6379
2019/1/2 上午5:20:55 1:X 01 Jan 21:20:55.127 * +slave slave 10.42.6.211:6379 10.42.6.211 6379 @ iot-redis-cluster 10.42.3.190 6379
重点就是重启了应用就好了。所有没重启的应用全部报SlaveConnectionPool no available Redis entries. Disconnected hosts [ ......] Hosts disconnected due to errors during failedSlaveCheckInterval
。等了很久一直报错,最后只能重启服务。
麻烦你把情况详细介绍一下。最好按照模板来讲。
似乎找到了问题原因. 是dns没有更新. 因为redis集群跑在k8s上。重启了后ip会发生变化。 在单点redis也能复现.
redisson 版本: 3.7.0
- 设置: dns
192.168.31.84 redis-server
. (192.168.31.84当前服务器的ip) - 启动redis服务
- 启动java程序:
Config config = new Config(); config.useSingleServer() .setAddress("redis://redis-server:6379"); RedissonClient redissonClient = Redisson.create(config); RBucket<String> bucket = redissonClient.getBucket("test"); int index=0; while (true) { try { System.out.println(bucket.get()); Thread.sleep(1000); bucket.set(index+++""); } catch (Exception e) { e.printStackTrace(); } }
控制台正常输出.
- 停止redis服务
- java程序开始报错
- 重启reids服务
- java程序恢复正常
- 停止redis服务
- 切换网络,ip变更为: 192.168.1.4 (重点: 原ip[192.168.31.84]已无法访问)
- 修改dns
192.168.1.4 redis-server
- 重启redis服务
- java程序依旧报错,无法恢复正常
- 切换网络,ip变更为: 192.168.31.84
- java程序恢复正常
建议尝试一下最新版,因为3.8.x和3.9.x里面包含了几个与DNS有关的修复。
试了最新的3.10.0
,问题依旧. 看了netty源码。 如果是修改hosts文件的话,程序启动后,修改hosts是无效的。因为DefaultHostsFileEntriesResolver
是在初始化的时候读取hosts文件. dns服务还没有测试。应该是一样的效果。
Hosts文件被netty视为静态的方式,与采用DNS服务的情况是不一样的
感谢。测试了一下使用dns服务。使用3.10.0版本可以自动切换. 我更新后线上再验证一下.