连接Redis不支持集群错误,ERR This instance has cluster support disabled,解决方案

本文主要是介绍连接Redis不支持集群错误,ERR This instance has cluster support disabled,解决方案,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

1. 问题背景

调整redis的配置后,启动程序时, 会报如下错误:

[redis://172.16.0.8@xxx]: ERR This instance has cluster support disabledSuppressed: io.lettuce.core.RedisCommandExecutionException: ERR This instance has cluster support disabledat io.lettuce.core.internal.ExceptionFactory.createExecutionException(ExceptionFactory.java:147)at io.lettuce.core.internal.Exceptions.bubble(Exceptions.java:72)at io.lettuce.core.cluster.topology.DefaultClusterTopologyRefresh.getException(DefaultClusterTopologyRefresh.java:402)at io.lettuce.core.cluster.topology.DefaultClusterTopologyRefresh.tryFail(DefaultClusterTopologyRefresh.java:173)at io.lettuce.core.cluster.topology.DefaultClusterTopologyRefresh.lambda$null$9(DefaultClusterTopologyRefresh.java:150)at java.base/java.util.concurrent.CompletableFuture$UniCompose.tryFire(CompletableFuture.java:1150)at java.base/java.util.concurrent.CompletableFuture.postComplete(CompletableFuture.java:510)at java.base/java.util.concurrent.CompletableFuture.complete(CompletableFuture.java:2147)at io.lettuce.core.RedisChannelHandler.lambda$closeAsync$0(RedisChannelHandler.java:189)at java.base/java.util.concurrent.CompletableFuture.uniWhenComplete(CompletableFuture.java:863)at java.base/java.util.concurrent.CompletableFuture$UniWhenComplete.tryFire(CompletableFuture.java:841)at java.base/java.util.concurrent.CompletableFuture.postComplete(CompletableFuture.java:510)at java.base/java.util.concurrent.CompletableFuture.complete(CompletableFuture.java:2147)at io.lettuce.core.internal.Futures.lambda$adapt$1(Futures.java:120)at io.netty.util.concurrent.DefaultPromise.notifyListener0(DefaultPromise.java:590)at io.netty.util.concurrent.DefaultPromise.notifyListenersNow(DefaultPromise.java:557)at io.netty.util.concurrent.DefaultPromise.notifyListeners(DefaultPromise.java:492)at io.netty.util.concurrent.DefaultPromise.setValue0(DefaultPromise.java:636)at io.netty.util.concurrent.DefaultPromise.setSuccess0(DefaultPromise.java:625)at io.netty.util.concurrent.DefaultPromise.trySuccess(DefaultPromise.java:105)at io.netty.channel.DefaultChannelPromise.trySuccess(DefaultChannelPromise.java:84)at io.netty.channel.AbstractChannel$AbstractUnsafe.safeSetSuccess(AbstractChannel.java:990)at io.netty.channel.AbstractChannel$AbstractUnsafe.doClose0(AbstractChannel.java:756)at io.netty.channel.AbstractChannel$AbstractUnsafe.close(AbstractChannel.java:731)at io.netty.channel.AbstractChannel$AbstractUnsafe.close(AbstractChannel.java:620)at io.netty.channel.DefaultChannelPipeline$HeadContext.close(DefaultChannelPipeline.java:1352)at io.netty.channel.AbstractChannelHandlerContext.invokeClose(AbstractChannelHandlerContext.java:749)at io.netty.channel.AbstractChannelHandlerContext.access$1200(AbstractChannelHandlerContext.java:61)at io.netty.channel.AbstractChannelHandlerContext$11.run(AbstractChannelHandlerContext.java:732)at io.netty.util.concurrent.AbstractEventExecutor.runTask(AbstractEventExecutor.java:174)at io.netty.util.concurrent.AbstractEventExecutor.safeExecute(AbstractEventExecutor.java:167)at io.netty.util.concurrent.SingleThreadEventExecutor.runAllTasks(SingleThreadEventExecutor.java:470)at io.netty.channel.nio.NioEventLoop.run(NioEventLoop.java:569)at io.netty.util.concurrent.SingleThreadEventExecutor$4.run(SingleThreadEventExecutor.java:997)at io.netty.util.internal.ThreadExecutorMap$2.run(ThreadExecutorMap.java:74)at io.netty.util.concurrent.FastThreadLocalRunnable.run(FastThreadLocalRunnable.java:30)at java.base/java.lang.Thread.run(Thread.java:833)Caused by: io.lettuce.core.RedisCommandExecutionException: ERR This instance has cluster support disabledat io.lettuce.core.internal.ExceptionFactory.createExecutionException(ExceptionFactory.java:147)at io.lettuce.core.internal.ExceptionFactory.createExecutionException(ExceptionFactory.java:116)at io.lettuce.core.protocol.AsyncCommand.completeResult(AsyncCommand.java:120)at io.lettuce.core.protocol.AsyncCommand.complete(AsyncCommand.java:111)at io.lettuce.core.cluster.topology.TimedAsyncCommand.complete(TimedAsyncCommand.java:52)at io.lettuce.core.protocol.CommandHandler.complete(CommandHandler.java:747)at io.lettuce.core.protocol.CommandHandler.decode(CommandHandler.java:682)at io.lettuce.core.protocol.CommandHandler.channelRead(CommandHandler.java:599)at io.netty.channel.AbstractChannelHandlerContext.invokeChannelRead(AbstractChannelHandlerContext.java:442)at io.netty.channel.AbstractChannelHandlerContext.invokeChannelRead(AbstractChannelHandlerContext.java:420)at io.netty.channel.AbstractChannelHandlerContext.fireChannelRead(AbstractChannelHandlerContext.java:412)at io.netty.channel.DefaultChannelPipeline$HeadContext.channelRead(DefaultChannelPipeline.java:1410)at io.netty.channel.AbstractChannelHandlerContext.invokeChannelRead(AbstractChannelHandlerContext.java:440)at io.netty.channel.AbstractChannelHandlerContext.invokeChannelRead(AbstractChannelHandlerContext.java:420)at io.netty.channel.DefaultChannelPipeline.fireChannelRead(DefaultChannelPipeline.java:919)at io.netty.channel.nio.AbstractNioByteChannel$NioByteUnsafe.read(AbstractNioByteChannel.java:166)at io.netty.channel.nio.NioEventLoop.processSelectedKey(NioEventLoop.java:788)at io.netty.channel.nio.NioEventLoop.processSelectedKeysOptimized(NioEventLoop.java:724)at io.netty.channel.nio.NioEventLoop.processSelectedKeys(NioEventLoop.java:650)at io.netty.channel.nio.NioEventLoop.run(NioEventLoop.java:562)

3. 问题原因

这是由于redis的实例不支持集群模式,但是在redisson的配置文件里,使用的是集群模式的方法。因此会产生如下报错。
那么redis的具体有几种模式呢,主要有4种,这个需要根据项目的实际情况进行配置。

4. redis的四种模式

redis的模式主要有4种,分别是单机模式、主从模式、哨兵模式、集群模式。

3.1 单机模式

单机模式就是在一台服务器上安装redis,然后启动,所有业务都调用这一台redis服务器。
优点:部署简单,只需要在一台服务器上安装并启动redis就行。
成本低,没有备用节点,不需要其他的开支。
高性能,单机不需要同步数据,数据天然一致性。
缺点:可靠性较弱,一旦服务器宕机,所有业务都无法使用redis服务。单机模式redis性能受限于CPU的处理能力。
在这里插入图片描述

3.2 主从模式

主从模式是指有多台redis服务器,其中一台专门用来负责写入客户端请求数据,称为主节点(master),
其他服务专门负责处理客户端的读取数据的请求不负责写入数据,称为从节点。
主节点写入的数据会复制的各个从节点上,并且数据复制的方向是单向的,只能从主节点复制到从节点。
优点

  1. 读写分离:master写,slave读,同时可以根据访问需求⼤⼩来添加slave节点数量。
  2. 负载均衡:通过读写分离的⽅式来分但服务器负载,主节点负责写⼊数据,多个从节点负责读取数据,缓解单个服务器访问的压⼒,提⾼读的吞吐量。
  3. 数据冗余:主从复制实现了数据的热备份,是持久化之外的⼀种数据冗余⽅式。
  4. ⾼可⽤性:提⾼了服务的可⽤性,多个节点同时提供服务,当前其中⼀台节点宕机后,其他节点仍然可以提供服务。
  5. 故障恢复:master宕机后,快速升级slave为master。
    缺点
  6. master宕机后,slave节点升级成新的master节点后,需要⼿动切换主机,同时会有部分数据不能及时同步从服务器,造成数据不⼀致。
  7. slave宕机后,多个slave恢复后,⼤量的SYNC同步会造成master IO压⼒倍增。
  8. 主从模式只要⼀个maste节点,所以master节点的写数据的能⼒会受到单机的限制。
    在这里插入图片描述

3.3 哨兵模式

哨兵模式主要是在主从复制模式基础上,增加了⾃动化的故障恢复功能。
因为主从复制模式下,当master节点宕机后,虽然slave节点会升级成新的master节点,但是升级后的slave节点的ip顺其⾃然的就称为了新的master节点ip,原先其他的slave节点配置的master节点的ip也是需要变更的,在主从复制模式下,这种变更是需要⼈⼯⼿动去修改配置⽂件的。⽽哨兵模式则完美的解决了这⼀缺陷,实现了快速的⾃动恢复,不再需要⼈⼯修改。
主要功能

  1. 集群监控:负责监控 master 和 slave 进程是否正常⼯作。
  2. 消息通知:如果某个 Redis 实例宕机,那么哨兵负责向(哨兵间,客户端)发送消息。
  3. ⾃动故障转移:当master宕机后,由哨兵负责重新在slave节点中选举出新的master节点,并将其他slave连接到新的master,以及告知客户端新的服务器地址。更好的为客户端提供⾼可⽤服务。
    缺点
    哨兵的部署会占⽤额外的服务器资源,且不提供数据的读取服务。哨兵模式除了解决了主从模式⼿动切换主从节点的问题外,其他主从模式存在的问题,哨兵模式基本也都存在。

在这里插入图片描述

3.4 集群模式

主从模式实现了数据的热备份,哨兵模式实现了redis的⾼可⽤。但是这两种模式存在两个问题:
(1)写并发:这两种都只能有⼀个master节点负责写操作,在⾼并发的写操作场景,master节点就会成为性能瓶颈。⽽redis集群则可以实现多个节点同时提供写操作,redis集群模式采⽤⽆中⼼结构,每个节点都可以看做是⼀个主从模式,节点之间互相连接从⽽知道整个集群状态。
(2)海量数据的存储压⼒:⽆论是哨兵模式还是主从模式,每台机器上存储的数据都是⼀样的,都是从主节点上复制过去的,本质上只有⼀台Master作为存储。所以⽆论增加多少slave节点都⽆法解决单台机器存储的上限问题。但是集群模式就解决了这以问题,因为Redis Cluster是⼀种服务器 Sharding 技术,采⽤数据分⽚的⽅式,将不同的数据存储在不同的master节点上⾯,因为我们可以通过不断的增加集群中的节点,从⽽达到存储海量数据。

redis集群的实现原理
Redis集群采⽤去中⼼化的思想,没有中⼼节点的说法,对于客户端来说,整个集群可以看成⼀个整体,可以连接任意⼀个节点进⾏操作,就像操作单⼀Redis实例⼀样,不需要任何代理中间件,当客户端操作的key没有分配到该node上时,Redis会返回转向指令,指向正确的node。Redis也内置了⾼可⽤机制,⽀持N个master节点,每个master节点都可以挂载多个slave节点,当master节点挂掉时,集群会提升它的某个slave节点作为新的master节点。Redis集群可以看成多个主从架构组合起来的,每⼀个主从架构可以看成⼀个节点(其中,只有master节点具有处理请求的能⼒,slave节点主要是⽤于节点的⾼可⽤)。

集群的扩容与收缩
集群主要是采⽤hash slot 算法进⾏寻址的,由于集群hash槽的数⽬是固定的,所以随着集群中节点数⽬的增减,每个节点所负责的hash槽的数⽬也会随之发⽣变化,因此对应槽和数据都会在节点之间移动。
1.扩容步骤:
(1)启动新节点;
(2)刚启动的新节点是没有和其他节点进⾏通讯的,因此需要在集群中任意节点执⾏ clustermeet 命令让新节点加⼊到集群中;
(3)新的节点加⼊到集群后,迁移槽和数据,将⼀些槽和数据从旧节点迁移到新节点;
(4)槽和数据迁移到新加⼊的节点后,新的节点会向集群中的各个主节点⼴播通知迁移过来的槽,并更新⾃身的槽节点对应表。
2. 收缩步骤:
(1)迁移槽,⾸先判断要下线的节点是否有负责的槽,如果有,则先将该节点下的槽全部迁移到其他节点,否则直接删除该节点。
(2)通知集群的各个节点忘记⾃⼰。
在这里插入图片描述

5 修改RedisServer配置解决

提示语ERR This instance has cluster support disabled说明RedisServer不支持集群。
修改配置文件redis.conf中的cluster-enabled参数的值为yes并把参数前#去除,重启Redis服务器。
注意:不能通过命令config set cluster-enable yes来解决,因为config命令里面没有cluster-enable配置项。

6 修改RedisClient配置解决

如果无法修改RedisServer权限,并且RedisServer不是集群部署,而是单机模式,那就只能从代码配置上修改一下了,Configuration从Cluster变成Standalone即可。以下代码兼容不同配置的redis集群:

@Configuration
public class RedisConfiguration{//加载配置@AutowiredRedisProperty redisProperty@Bean("myRedisConfig")public Config myRedisConfig(){Conifg config = new Config();if("single".equalsIgnoreCase(RedisProperty.getRedisMode)){// 单机模式conifg.userSingleServer().........}else if("cluster".equalsIgnoreCase(RedisProperty.getRedisMode)){// 集群模式conifg.userClusterServer().........}return config;}
}@Configuration
@ConfigurationProperties(prefix="my.redis")
public class RedisProperty{...redisMode="";...
}//配置.property文件
# 单机模式,可以根据实际情况进行配置
# my.redis.single
# 集群模式
my.redis.cluster

参考:
https://www.cnblogs.com/laityguanguan/p/17473862.html

这篇关于连接Redis不支持集群错误,ERR This instance has cluster support disabled,解决方案的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/862696

相关文章

Redis连接失败:客户端IP不在白名单中的问题分析与解决方案

《Redis连接失败:客户端IP不在白名单中的问题分析与解决方案》在现代分布式系统中,Redis作为一种高性能的内存数据库,被广泛应用于缓存、消息队列、会话存储等场景,然而,在实际使用过程中,我们可能... 目录一、问题背景二、错误分析1. 错误信息解读2. 根本原因三、解决方案1. 将客户端IP添加到Re

centos7基于keepalived+nginx部署k8s1.26.0高可用集群

《centos7基于keepalived+nginx部署k8s1.26.0高可用集群》Kubernetes是一个开源的容器编排平台,用于自动化地部署、扩展和管理容器化应用程序,在生产环境中,为了确保集... 目录一、初始化(所有节点都执行)二、安装containerd(所有节点都执行)三、安装docker-

详谈redis跟数据库的数据同步问题

《详谈redis跟数据库的数据同步问题》文章讨论了在Redis和数据库数据一致性问题上的解决方案,主要比较了先更新Redis缓存再更新数据库和先更新数据库再更新Redis缓存两种方案,文章指出,删除R... 目录一、Redis 数据库数据一致性的解决方案1.1、更新Redis缓存、删除Redis缓存的区别二

Redis与缓存解读

《Redis与缓存解读》文章介绍了Redis作为缓存层的优势和缺点,并分析了六种缓存更新策略,包括超时剔除、先删缓存再更新数据库、旁路缓存、先更新数据库再删缓存、先更新数据库再更新缓存、读写穿透和异步... 目录缓存缓存优缺点缓存更新策略超时剔除先删缓存再更新数据库旁路缓存(先更新数据库,再删缓存)先更新数

Redis事务与数据持久化方式

《Redis事务与数据持久化方式》该文档主要介绍了Redis事务和持久化机制,事务通过将多个命令打包执行,而持久化则通过快照(RDB)和追加式文件(AOF)两种方式将内存数据保存到磁盘,以防止数据丢失... 目录一、Redis 事务1.1 事务本质1.2 数据库事务与redis事务1.2.1 数据库事务1.

mac安装redis全过程

《mac安装redis全过程》文章内容主要介绍了如何从官网下载指定版本的Redis,以及如何在自定义目录下安装和启动Redis,还提到了如何修改Redis的密码和配置文件,以及使用RedisInsig... 目录MAC安装Redis安装启动redis 配置redis 常用命令总结mac安装redis官网下

python 字典d[k]中key不存在的解决方案

《python字典d[k]中key不存在的解决方案》本文主要介绍了在Python中处理字典键不存在时获取默认值的两种方法,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,... 目录defaultdict:处理找不到的键的一个选择特殊方法__missing__有时候为了方便起见,

Mysql 中的多表连接和连接类型详解

《Mysql中的多表连接和连接类型详解》这篇文章详细介绍了MySQL中的多表连接及其各种类型,包括内连接、左连接、右连接、全外连接、自连接和交叉连接,通过这些连接方式,可以将分散在不同表中的相关数据... 目录什么是多表连接?1. 内连接(INNER JOIN)2. 左连接(LEFT JOIN 或 LEFT

解决mybatis-plus-boot-starter与mybatis-spring-boot-starter的错误问题

《解决mybatis-plus-boot-starter与mybatis-spring-boot-starter的错误问题》本文主要讲述了在使用MyBatis和MyBatis-Plus时遇到的绑定异常... 目录myBATis-plus-boot-starpythonter与mybatis-spring-b

Redis主从复制实现原理分析

《Redis主从复制实现原理分析》Redis主从复制通过Sync和CommandPropagate阶段实现数据同步,2.8版本后引入Psync指令,根据复制偏移量进行全量或部分同步,优化了数据传输效率... 目录Redis主DodMIK从复制实现原理实现原理Psync: 2.8版本后总结Redis主从复制实