[redisson]集群的自动恢复问题

2024-07-18 101 views
5

使用哨兵模式时,将redis集群全部重启后。怎么自动恢复。现在redis集群重启了,应用也必须重启,不然就一直报 SlaveConnectionPool no available Redis entries. Disconnected hosts [ ......] Hosts disconnected due to errors during failedSlaveCheckInterval

回答

6

出现该问题时通过哨兵查询各个节点的情况是怎样的结果?

1

场景是: 集群几乎完全重装,redis集群确定已经可用了。但是redisson里一直无法恢复。有没有可能是 ip发生了变化。redisson没有及时更新dns。

6

你说的Redis集群是指的哨兵管理的一主多从吧?

5

是的, 如果只是重启master。 在大概10秒左右会自动切换。 但是如果整个集群都重启或者完全重装。 就不行了。

5

整个集群重启以后,登录哨兵命令行查询了节点变化吗?结果是什么?

2

重启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。等了很久一直报错,最后只能重启服务。

5

麻烦你把情况详细介绍一下。最好按照模板来讲。

8

似乎找到了问题原因. 是dns没有更新. 因为redis集群跑在k8s上。重启了后ip会发生变化。 在单点redis也能复现.

redisson 版本: 3.7.0

复现步骤
  1. 设置: dns 192.168.31.84 redis-server. (192.168.31.84当前服务器的ip)
  2. 启动redis服务
  3. 启动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();
            }
        }

    控制台正常输出.

  4. 停止redis服务
  5. java程序开始报错
  6. 重启reids服务
  7. java程序恢复正常
  8. 停止redis服务
  9. 切换网络,ip变更为: 192.168.1.4 (重点: 原ip[192.168.31.84]已无法访问)
  10. 修改dns 192.168.1.4 redis-server
  11. 重启redis服务
  12. java程序依旧报错,无法恢复正常
  13. 切换网络,ip变更为: 192.168.31.84
  14. java程序恢复正常
9

建议尝试一下最新版,因为3.8.x和3.9.x里面包含了几个与DNS有关的修复。

3

试了最新的3.10.0,问题依旧. 看了netty源码。 如果是修改hosts文件的话,程序启动后,修改hosts是无效的。因为DefaultHostsFileEntriesResolver 是在初始化的时候读取hosts文件. dns服务还没有测试。应该是一样的效果。

3

Hosts文件被netty视为静态的方式,与采用DNS服务的情况是不一样的

4

感谢。测试了一下使用dns服务。使用3.10.0版本可以自动切换. 我更新后线上再验证一下.