首页 > 数据库 >【Redis】redis集群的 MASTER 与 SLAVE

【Redis】redis集群的 MASTER 与 SLAVE

时间:2023-07-05 21:14:23浏览次数:62  
标签:netty SLAVE redis Redis 36 jar java 4.1 Final

这个问题,从一个坑说起:
部署了一个新环境,但发现服务一直在报错:

2023-07-05 20:42:54.186 ERROR  --- [   scheduling-1] o.s.s.s.TaskUtils$LoggingErrorHandler    : Unexpected error occurred in scheduled task

org.redisson.client.RedisException: Unexpected exception while processing command
        at org.redisson.command.CommandAsyncService.convertException(CommandAsyncService.java:276) ~[redisson-3.17.6.jar!/:3.17.6]
        at org.redisson.command.CommandAsyncService.get(CommandAsyncService.java:115) ~[redisson-3.17.6.jar!/:3.17.6]
        at org.redisson.RedissonObject.get(RedissonObject.java:82) ~[redisson-3.17.6.jar!/:3.17.6]
        at org.redisson.RedissonLock.unlock(RedissonLock.java:306) ~[redisson-3.17.6.jar!/:3.17.6]
        ......
        at jdk.internal.reflect.GeneratedMethodAccessor275.invoke(Unknown Source) ~[?:?]
        at jdk.internal.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43) ~[?:?]
        at java.lang.reflect.Method.invoke(Method.java:568) ~[?:?]
        at org.springframework.scheduling.support.ScheduledMethodRunnable.run(ScheduledMethodRunnable.java:84) ~[spring-context-6.0.4.jar!/:6.0.4]
        at org.springframework.scheduling.support.DelegatingErrorHandlingRunnable.run(DelegatingErrorHandlingRunnable.java:54) ~[spring-context-6.0.4.jar!/:6.0.4]
        at java.util.concurrent.Executors$RunnableAdapter.call(Executors.java:539) ~[?:?]
        at java.util.concurrent.FutureTask.runAndReset(FutureTask.java:305) ~[?:?]
        at java.util.concurrent.ScheduledThreadPoolExecutor$ScheduledFutureTask.run(ScheduledThreadPoolExecutor.java:305) ~[?:?]
        at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1136) ~[?:?]
        at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:635) ~[?:?]
        at java.lang.Thread.run(Thread.java:833) ~[?:?]
Caused by: java.util.concurrent.CompletionException: java.lang.IllegalStateException: None of slaves were synced
        at org.redisson.RedissonBaseLock.lambda$evalWriteAsync$0(RedissonBaseLock.java:225) ~[redisson-3.17.6.jar!/:3.17.6]
        at java.util.concurrent.CompletableFuture.uniHandle(CompletableFuture.java:934) ~[?:?]
        at java.util.concurrent.CompletableFuture$UniHandle.tryFire(CompletableFuture.java:911) ~[?:?]
        at java.util.concurrent.CompletableFuture.postComplete(CompletableFuture.java:510) ~[?:?]
        at java.util.concurrent.CompletableFuture.complete(CompletableFuture.java:2147) ~[?:?]
        at org.redisson.command.CommandBatchService.lambda$executeAsync$7(CommandBatchService.java:322) ~[redisson-3.17.6.jar!/:3.17.6]
        at java.util.concurrent.CompletableFuture.uniWhenComplete(CompletableFuture.java:863) ~[?:?]
        at java.util.concurrent.CompletableFuture$UniWhenComplete.tryFire(CompletableFuture.java:841) ~[?:?]
        at java.util.concurrent.CompletableFuture.postComplete(CompletableFuture.java:510) ~[?:?]
        at java.util.concurrent.CompletableFuture.complete(CompletableFuture.java:2147) ~[?:?]
        at org.redisson.command.RedisCommonBatchExecutor.handleResult(RedisCommonBatchExecutor.java:163) ~[redisson-3.17.6.jar!/:3.17.6]
        at org.redisson.command.RedisExecutor.checkAttemptPromise(RedisExecutor.java:524) ~[redisson-3.17.6.jar!/:3.17.6]
        at org.redisson.command.RedisExecutor.lambda$execute$4(RedisExecutor.java:176) ~[redisson-3.17.6.jar!/:3.17.6]
        at java.util.concurrent.CompletableFuture.uniWhenComplete(CompletableFuture.java:863) ~[?:?]
        at java.util.concurrent.CompletableFuture$UniWhenComplete.tryFire(CompletableFuture.java:841) ~[?:?]
        at java.util.concurrent.CompletableFuture.postComplete(CompletableFuture.java:510) ~[?:?]
        at java.util.concurrent.CompletableFuture.complete(CompletableFuture.java:2147) ~[?:?]
        at org.redisson.client.handler.CommandDecoder.decodeCommandBatch(CommandDecoder.java:318) ~[redisson-3.17.6.jar!/:3.17.6]
        at org.redisson.client.handler.CommandDecoder.decodeCommand(CommandDecoder.java:210) ~[redisson-3.17.6.jar!/:3.17.6]
        at org.redisson.client.handler.CommandDecoder.decode(CommandDecoder.java:137) ~[redisson-3.17.6.jar!/:3.17.6]
        at org.redisson.client.handler.CommandDecoder.decode(CommandDecoder.java:113) ~[redisson-3.17.6.jar!/:3.17.6]
        at io.netty.handler.codec.ByteToMessageDecoder.decodeRemovalReentryProtection(ByteToMessageDecoder.java:502) ~[netty-all-4.1.36.Final.jar!/:4.1.36.Final]
        at io.netty.handler.codec.ReplayingDecoder.callDecode(ReplayingDecoder.java:366) ~[netty-all-4.1.36.Final.jar!/:4.1.36.Final]
        at io.netty.handler.codec.ByteToMessageDecoder.channelRead(ByteToMessageDecoder.java:278) ~[netty-all-4.1.36.Final.jar!/:4.1.36.Final]
        at io.netty.channel.AbstractChannelHandlerContext.invokeChannelRead(AbstractChannelHandlerContext.java:374) ~[netty-all-4.1.36.Final.jar!/:4.1.36.Final]
        at io.netty.channel.AbstractChannelHandlerContext.invokeChannelRead(AbstractChannelHandlerContext.java:360) ~[netty-all-4.1.36.Final.jar!/:4.1.36.Final]
        at io.netty.channel.AbstractChannelHandlerContext.fireChannelRead(AbstractChannelHandlerContext.java:352) ~[netty-all-4.1.36.Final.jar!/:4.1.36.Final]
        at io.netty.channel.DefaultChannelPipeline$HeadContext.channelRead(DefaultChannelPipeline.java:1408) ~[netty-all-4.1.36.Final.jar!/:4.1.36.Final]
        at io.netty.channel.AbstractChannelHandlerContext.invokeChannelRead(AbstractChannelHandlerContext.java:374) ~[netty-all-4.1.36.Final.jar!/:4.1.36.Final]
        at io.netty.channel.AbstractChannelHandlerContext.invokeChannelRead(AbstractChannelHandlerContext.java:360) ~[netty-all-4.1.36.Final.jar!/:4.1.36.Final]
        at io.netty.channel.DefaultChannelPipeline.fireChannelRead(DefaultChannelPipeline.java:930) ~[netty-all-4.1.36.Final.jar!/:4.1.36.Final]
        at io.netty.channel.nio.AbstractNioByteChannel$NioByteUnsafe.read(AbstractNioByteChannel.java:163) ~[netty-all-4.1.36.Final.jar!/:4.1.36.Final]
        at io.netty.channel.nio.NioEventLoop.processSelectedKey(NioEventLoop.java:682) ~[netty-all-4.1.36.Final.jar!/:4.1.36.Final]
        at io.netty.channel.nio.NioEventLoop.processSelectedKeysOptimized(NioEventLoop.java:617) ~[netty-all-4.1.36.Final.jar!/:4.1.36.Final]
        at io.netty.channel.nio.NioEventLoop.processSelectedKeys(NioEventLoop.java:534) ~[netty-all-4.1.36.Final.jar!/:4.1.36.Final]
        at io.netty.channel.nio.NioEventLoop.run(NioEventLoop.java:496) ~[netty-all-4.1.36.Final.jar!/:4.1.36.Final]
        at io.netty.util.concurrent.SingleThreadEventExecutor$5.run(SingleThreadEventExecutor.java:906) ~[netty-all-4.1.36.Final.jar!/:4.1.36.Final]
        at io.netty.util.internal.ThreadExecutorMap$2.run(ThreadExecutorMap.java:74) ~[netty-all-4.1.36.Final.jar!/:4.1.36.Final]
        at io.netty.util.concurrent.FastThreadLocalRunnable.run(FastThreadLocalRunnable.java:30) ~[netty-all-4.1.36.Final.jar!/:4.1.36.Final]
        ... 1 more
Caused by: java.lang.IllegalStateException: None of slaves were synced
        at org.redisson.RedissonBaseLock.lambda$evalWriteAsync$0(RedissonBaseLock.java:225) ~[redisson-3.17.6.jar!/:3.17.6]
        at java.util.concurrent.CompletableFuture.uniHandle(CompletableFuture.java:934) ~[?:?]
        at java.util.concurrent.CompletableFuture$UniHandle.tryFire(CompletableFuture.java:911) ~[?:?]
        at java.util.concurrent.CompletableFuture.postComplete(CompletableFuture.java:510) ~[?:?]
        at java.util.concurrent.CompletableFuture.complete(CompletableFuture.java:2147) ~[?:?]
        at org.redisson.command.CommandBatchService.lambda$executeAsync$7(CommandBatchService.java:322) ~[redisson-3.17.6.jar!/:3.17.6]
        at java.util.concurrent.CompletableFuture.uniWhenComplete(CompletableFuture.java:863) ~[?:?]
        at java.util.concurrent.CompletableFuture$UniWhenComplete.tryFire(CompletableFuture.java:841) ~[?:?]
        at java.util.concurrent.CompletableFuture.postComplete(CompletableFuture.java:510) ~[?:?]
        at java.util.concurrent.CompletableFuture.complete(CompletableFuture.java:2147) ~[?:?]
        at org.redisson.command.RedisCommonBatchExecutor.handleResult(RedisCommonBatchExecutor.java:163) ~[redisson-3.17.6.jar!/:3.17.6]
        at org.redisson.command.RedisExecutor.checkAttemptPromise(RedisExecutor.java:524) ~[redisson-3.17.6.jar!/:3.17.6]
        at org.redisson.command.RedisExecutor.lambda$execute$4(RedisExecutor.java:176) ~[redisson-3.17.6.jar!/:3.17.6]
        at java.util.concurrent.CompletableFuture.uniWhenComplete(CompletableFuture.java:863) ~[?:?]
        at java.util.concurrent.CompletableFuture$UniWhenComplete.tryFire(CompletableFuture.java:841) ~[?:?]
        at java.util.concurrent.CompletableFuture.postComplete(CompletableFuture.java:510) ~[?:?]
        at java.util.concurrent.CompletableFuture.complete(CompletableFuture.java:2147) ~[?:?]
        at org.redisson.client.handler.CommandDecoder.decodeCommandBatch(CommandDecoder.java:318) ~[redisson-3.17.6.jar!/:3.17.6]
        at org.redisson.client.handler.CommandDecoder.decodeCommand(CommandDecoder.java:210) ~[redisson-3.17.6.jar!/:3.17.6]
        at org.redisson.client.handler.CommandDecoder.decode(CommandDecoder.java:137) ~[redisson-3.17.6.jar!/:3.17.6]
        at org.redisson.client.handler.CommandDecoder.decode(CommandDecoder.java:113) ~[redisson-3.17.6.jar!/:3.17.6]
        at io.netty.handler.codec.ByteToMessageDecoder.decodeRemovalReentryProtection(ByteToMessageDecoder.java:502) ~[netty-all-4.1.36.Final.jar!/:4.1.36.Final]
        at io.netty.handler.codec.ReplayingDecoder.callDecode(ReplayingDecoder.java:366) ~[netty-all-4.1.36.Final.jar!/:4.1.36.Final]
        at io.netty.handler.codec.ByteToMessageDecoder.channelRead(ByteToMessageDecoder.java:278) ~[netty-all-4.1.36.Final.jar!/:4.1.36.Final]
        at io.netty.channel.AbstractChannelHandlerContext.invokeChannelRead(AbstractChannelHandlerContext.java:374) ~[netty-all-4.1.36.Final.jar!/:4.1.36.Final]
        at io.netty.channel.AbstractChannelHandlerContext.invokeChannelRead(AbstractChannelHandlerContext.java:360) ~[netty-all-4.1.36.Final.jar!/:4.1.36.Final]
        at io.netty.channel.AbstractChannelHandlerContext.fireChannelRead(AbstractChannelHandlerContext.java:352) ~[netty-all-4.1.36.Final.jar!/:4.1.36.Final]
        at io.netty.channel.DefaultChannelPipeline$HeadContext.channelRead(DefaultChannelPipeline.java:1408) ~[netty-all-4.1.36.Final.jar!/:4.1.36.Final]
        at io.netty.channel.AbstractChannelHandlerContext.invokeChannelRead(AbstractChannelHandlerContext.java:374) ~[netty-all-4.1.36.Final.jar!/:4.1.36.Final]
        at io.netty.channel.AbstractChannelHandlerContext.invokeChannelRead(AbstractChannelHandlerContext.java:360) ~[netty-all-4.1.36.Final.jar!/:4.1.36.Final]
        at io.netty.channel.DefaultChannelPipeline.fireChannelRead(DefaultChannelPipeline.java:930) ~[netty-all-4.1.36.Final.jar!/:4.1.36.Final]
        at io.netty.channel.nio.AbstractNioByteChannel$NioByteUnsafe.read(AbstractNioByteChannel.java:163) ~[netty-all-4.1.36.Final.jar!/:4.1.36.Final]
        at io.netty.channel.nio.NioEventLoop.processSelectedKey(NioEventLoop.java:682) ~[netty-all-4.1.36.Final.jar!/:4.1.36.Final]
        at io.netty.channel.nio.NioEventLoop.processSelectedKeysOptimized(NioEventLoop.java:617) ~[netty-all-4.1.36.Final.jar!/:4.1.36.Final]
        at io.netty.channel.nio.NioEventLoop.processSelectedKeys(NioEventLoop.java:534) ~[netty-all-4.1.36.Final.jar!/:4.1.36.Final]
        at io.netty.channel.nio.NioEventLoop.run(NioEventLoop.java:496) ~[netty-all-4.1.36.Final.jar!/:4.1.36.Final]
        at io.netty.util.concurrent.SingleThreadEventExecutor$5.run(SingleThreadEventExecutor.java:906) ~[netty-all-4.1.36.Final.jar!/:4.1.36.Final]
        at io.netty.util.internal.ThreadExecutorMap$2.run(ThreadExecutorMap.java:74) ~[netty-all-4.1.36.Final.jar!/:4.1.36.Final]
        at io.netty.util.concurrent.FastThreadLocalRunnable.run(FastThreadLocalRunnable.java:30) ~[netty-all-4.1.36.Final.jar!/:4.1.36.Final]
        ... 1 more

并且在不断地刷,不断地刷。

根本不知道什么原因。
本人百度能力不行,看到的帖子感觉没有一个对得上的。


然后,只能从0开始想原因,
为什么偏偏这个环境有问题?(新部署的环境)
代码是同一套代码,按道理不会是代码层面的问题了。
那是环境的问题?
是redis 集群的问题吗?还是哪里的配置问题呢?

如果说是 redis 集群的问题,我拿不出证据,因为运维同学已经证明主从同步是没问题了的。
如果说是配置的问题,茫茫这么多配置,究竟是哪个配置引发的呢?


再换个思路:
如果换一个redis集群能不能好呢?
从一个正常的环境里面拉配置过来,用这边的服务,读取那边的redis集群,会不会找到原因呢?

emmm, 如果一开始就这样干,早就发现问题了。

通过一对比,发现了一个事情:
application-redis.yml 的配置项里面,
有一个配置项:

    readMode: "SLAVE"
    subscriptionMode: "SLAVE"

但另外的环境配置的可都是:

    readMode: "MASTER"
    subscriptionMode: "MASTER"

诶?
会不会是这个原因呢?

再结合团队的大神给过的一个方向: redis 主从集群,3主3从的话,在干活的其实只有主节点,其实从节点连读取数据都不会提供服务,意思就是从节点只有在 master挂掉之后,它才顶上,它并不支持读写分离什么的。如果要满足读写分离,需要:先发一个readOnly的指令过来,从节点才能读。呃。。。。
还有开启密钥。。。

终于找到原因,就是这么一个坑,真的搞了好几天,一开始根本没往这个方面去想。(主要是真的对这个玩意不熟悉。)

记录一下。。。。

标签:netty,SLAVE,redis,Redis,36,jar,java,4.1,Final
From: https://www.cnblogs.com/aaacarrot/p/17529782.html

相关文章

  • Redis 高可用 —— 哨兵
    参考码哥字节:https://xie.infoq.cn/article/1c714709d00b2b55e8416fb99小林coding: https://xiaolincoding.com/redis/cluster/sentinel.html锦鱼不忘旧时晨:https://blog.csdn.net/weixin_44324174/article/details/108939199?spm=1001.2101.3001.6650.6&utm_medium=distribut......
  • php中执行redis的布隆过滤器的代码
    <?php//测试redis布隆过滤器$redis=newRedis();$redis->connect('127.0.0.1',6379);//创建一个容量是1千万,布隆过滤器://$redis->rawCommand('BF.RESERVE','nzc:redisbloom3','0.0001','10000000');//向布隆过滤器中添加元素:/......
  • redis用docker 部署主从
    dockerpullrediscd/home/softmkdir-predis/configmkdir-predis/data/data6379redis/data/data6380redis/data/data6381cd/home/soft/redis/configviredis6379.conf:port6379viredis6380.conf:#节点容器端口port6380#宿主机ip、master端口replicaof192.168.1......
  • Redis集群、部署Redis集群
    Redis集群集群概述所谓集群,就是通过添加服务器的数量,提供相同的服务,从而让服务器达到一个稳定、高效的状态单个redis存在不稳定性。当redis服务宕机了,就没有可用的服务了单个redis的读写能力是有限的Redis集群是为了强化redis的读写能力redis集群中,每一个redis称之为一个......
  • Redis 6.0 新特性-多线程连环13问!
    导读:支持多线程的Redis6.0版本于2020-05-02终于发布了,为什么Redis忽然要支持多线程?如何开启多线程?开启后性能提升效果如何?线程数量该如何设置?开启多线程后会不会有线程安全问题?多线程的实现原理是怎样的?带着这些疑问,我们来开启Redis新特性-多线程连环13问。 imageRedis......
  • 基于Redis分布式缓存
    1.安装包使用Redis分布式缓存需要安装Redis的支持包,可以通过nuget命令安装,如下:install-packageMicrosoft.Extensions.Caching.StackExchangeRedis 2.在Program.cs文件中注册builder.Services.AddStackExchangeRedisCache(option=>{option.Configuration......
  • linux安装redis3.0
    linux安装redis3.01.把下载好的redis压缩包上传至app 解压完成之后,修改成redis文件夹 2.进入redis文件夹进行编译和安装cd /usr/local/redismakemakePREFIX=/usr/local/redisinstall/usr/local/redis目录下出现bin目录就是安装成功 3.修改配置文件可以修改端口......
  • java限流-基于redis+lua
    redis是线程安全的,天然具有线程安全的特性,支持原子性操作,限流服务不仅需要承接超高QPS,还要保证限流逻辑的执行层面具备线程安全的特性,利用Redis这些特性做限流,既能保证线程安全,也能保证性能。结合上面的流程图,这里梳理出一个整体的实现思路:编写lua脚本,指定入参的限流规则,比如对......
  • redis实现延迟任务
    实现思路:发布时间:立即发布、未来要发布list存立即发布,redis中的list是双向链表,方便添加查找性能较高。zset可以去重、排序,存储未来要发布的。 为什么要把任务存储到数据库中?延迟任务是一个通用的服务,任何有延迟需求的任务都可以调用该服务,内存数据库的存储是有限的,需要考虑......
  • Redis实现短信登录设计
    项目搭建前期准备导入SQLCREATETABLE`tb_user`(`id`bigintunsignedNOTNULLAUTO_INCREMENTCOMMENT'主键',`phone`varchar(11)CHARACTERSETutf8mb4COLLATEutf8mb4_general_ciNOTNULLCOMMENT'手机号码',`password`varchar(128)CHARACTERS......