redisson java 客户端能否检测到集群拓扑中失败的主副本对的重启?
Can redisson java client detect a restart of a failed master-replica pair in a cluster topology?
我的 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 个副本)。
我停止了包含相同槽(主副本对)的 2 个节点。然后,当我的应用程序尝试从这些插槽中读取密钥时,正如预期的那样,我得到了这个异常:
org.redisson.client.RedisConnectionException:
MasterConnectionPool no available Redis entries.
Disconnected hosts: [/${CLUSTER_HOST}:6379]
我想这是正确的,因为在使用 CLUSTER NODES 命令检查我的 redis 节点后,我可以看到这 2 个节点已关闭并且它们的插槽从集群中丢失。
事实是,当我再次启动节点时,我使用 CLUSTER INFO & CLUSTER NODES 检查集群是否已恢复。
然而,当我的应用程序试图再次从集群中读取时,我得到了这个 redisson 异常:
io.netty.util.concurrent.DefaultPromise: 151 - An
exception was thrown by org.redisson.command.CommandAsyncService.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.access0(CommandAsyncService.java:80)
at org.redisson.command.CommandAsyncService.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 ...
每次我的应用程序尝试读取或写入 from/to 那些特定的插槽(意味着特定的主副本对)时,我总是得到这个,尽管 redis 集群没问题。
Redisson 似乎无法检索特定主副本对的正确状态。
这可能是配置问题,还是默认行为?
此问题已在 3.5.4 版本中修复。
我的 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 个副本)。
我停止了包含相同槽(主副本对)的 2 个节点。然后,当我的应用程序尝试从这些插槽中读取密钥时,正如预期的那样,我得到了这个异常:
org.redisson.client.RedisConnectionException:
MasterConnectionPool no available Redis entries.
Disconnected hosts: [/${CLUSTER_HOST}:6379]
我想这是正确的,因为在使用 CLUSTER NODES 命令检查我的 redis 节点后,我可以看到这 2 个节点已关闭并且它们的插槽从集群中丢失。
事实是,当我再次启动节点时,我使用 CLUSTER INFO & CLUSTER NODES 检查集群是否已恢复。 然而,当我的应用程序试图再次从集群中读取时,我得到了这个 redisson 异常:
io.netty.util.concurrent.DefaultPromise: 151 - An
exception was thrown by org.redisson.command.CommandAsyncService.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.access0(CommandAsyncService.java:80)
at org.redisson.command.CommandAsyncService.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 ...
每次我的应用程序尝试读取或写入 from/to 那些特定的插槽(意味着特定的主副本对)时,我总是得到这个,尽管 redis 集群没问题。
Redisson 似乎无法检索特定主副本对的正确状态。
这可能是配置问题,还是默认行为?
此问题已在 3.5.4 版本中修复。