Redisson Java Client是否可以在群集拓扑中检测到故障主副本对的重启?

时间:2018-12-10 10:43:00

标签: java spring-boot redis redis-cluster redisson

我的Spring引导应用程序使用redisson 3.3.0通过以下YML配置来访问redis集群拓扑:

redis:
   cluster:
       nodes: ${CLUSTER_HOST}:6379
       read-mode: 'MASTER'
   connections: 125
   max_wait_millis: 10000
   cluster-scan-interval: 1000

redis群集设置为默认值(3个节点,每个节点1个副本)。

我停止了两个包含相同插槽(主副本对)的节点。然后,当我的应用程序尝试读取这些插槽中的键时,如我所料,我得到了这个异常:

org.redisson.client.RedisConnectionException: 
MasterConnectionPool no available Redis entries.  
Disconnected hosts: [/${CLUSTER_HOST}:6379] 

我认为这是正确的,因为在使用CLUSTER NODES命令检查了我的Redis节点之后,我可以看到两个节点都已关闭,并且集群中的插槽丢失了。

问题是,当我再次启动节点时,我使用CLUSTER INFO和CLUSTER NODES检查集群是否已恢复。 但是,当我的应用程序尝试再次从集群中读取时,出现了这个redisson异常:

    io.netty.util.concurrent.DefaultPromise: 151 - An 
    exception was thrown by org.redisson.command.CommandAsyncService$9.operationComplete()
java.lang.NullPointerException: null
    at org.redisson.connection.MasterSlaveConnectionManager.connectionReadOp(MasterSlaveConnectionManager.java:731)
    at org.redisson.command.CommandAsyncService.async(CommandAsyncService.java:501)
    at org.redisson.command.CommandAsyncService.checkAttemptFuture(CommandAsyncService.java:751)
    at org.redisson.command.CommandAsyncService.access$300(CommandAsyncService.java:80)
    at org.redisson.command.CommandAsyncService$9.operationComplete(CommandAsyncService.java:610)
    at io.netty.util.concurrent.DefaultPromise.notifyListener0(DefaultPromise.java:512)
    at io.netty.util.concurrent.DefaultPromise.notifyListeners0(DefaultPromise.java:505)
    at io.netty.util.concurrent.DefaultPromise.notifyListenersNow(DefaultPromise.java:484)
    at io.netty.util.concurrent.DefaultPromise.notifyListeners(DefaultPromise.java:425)
    at io.netty.util.concurrent.DefaultPromise.tryFailure(DefaultPromise.java:122)
    at org.redisson.misc.RedissonPromise.tryFailure(RedissonPromise.java:98)
    at org.redisson.client.protocol.CommandData.tryFailure(CommandData.java:78)
    at org.redisson.client.handler.CommandDecoder.decode(CommandDecoder.java:247)
    at ...

尽管redis集群还可以,但我的应用程序每次尝试从这些特定插槽(即特定的主副本副本)读取或写入数据时,都会不断得到提示。

Redisson似乎无法检索特定主副本对的正确状态。

这可能是配置问题,还是默认行为?

1 个答案:

答案 0 :(得分:0)

此问题已在3.5.4版本中修复。