问题遇到的现象和发生背景
macbook air 2020
用windows和linux都是可以启动的没有问题,应该不是redis服务端的问题,猜测是macbook的问题。但苦于公司没有别人用macbook无法验证
项目之前用的单点redis,10次有9次连不上,也是报这个错。那为什么偶尔能启动呢?
现在换成集群模式(Sentinel+主备模型),10次有10次都连不上
发现了用redis客户端(Another Desktop Manager),只连主节点,也不是每次都能连上,大约有%50的可能性连接会出现超时的情况,并报错:Redis Client On Error: Error: connect ETIMEDOUT Config right?可能这就是连接池出现问题的原因,问题该怎么排查呢?为什么会有%50几率连接不上?
运行结果及报错内容
{"@timestamp":"2022-05-26T17:29:44.001+0800","level":"INFO","class":"org.springframework.context.support.PostProcessorRegistrationDelegate$BeanPostProcessorChecker.postProcessAfterInitialization(PostProcessorRegistrationDelegate.java:335)","Content":"Bean 'authorizationAttributeSourceAdvisor' of type [org.apache.shiro.spring.security.interceptor.AuthorizationAttributeSourceAdvisor] is not eligible for getting processed by all BeanPostProcessors (for example: not eligible for auto-proxying)"}
{"@timestamp":"2022-05-26T17:29:44.037+0800","level":"INFO","class":"org.springframework.context.support.PostProcessorRegistrationDelegate$BeanPostProcessorChecker.postProcessAfterInitialization(PostProcessorRegistrationDelegate.java:335)","Content":"Bean 'dsProcessor' of type [com.baomidou.dynamic.datasource.processor.DsHeaderProcessor] is not eligible for getting processed by all BeanPostProcessors (for example: not eligible for auto-proxying)"}
{"@timestamp":"2022-05-26T17:29:44.232+0800","level":"INFO","class":"org.springframework.boot.web.embedded.tomcat.TomcatWebServer.initialize(TomcatWebServer.java:108)","Content":"Tomcat initialized with port(s): 8383 (http)"}
{"@timestamp":"2022-05-26T17:29:44.238+0800","level":"INFO","class":"org.apache.juli.logging.DirectJDKLog.log(DirectJDKLog.java:173)","Content":"Initializing ProtocolHandler ["http-nio-8383"]"}
{"@timestamp":"2022-05-26T17:29:44.238+0800","level":"INFO","class":"org.apache.juli.logging.DirectJDKLog.log(DirectJDKLog.java:173)","Content":"Starting service [Tomcat]"}
{"@timestamp":"2022-05-26T17:29:44.238+0800","level":"INFO","class":"org.apache.juli.logging.DirectJDKLog.log(DirectJDKLog.java:173)","Content":"Starting Servlet engine: [Apache Tomcat/9.0.38]"}
{"@timestamp":"2022-05-26T17:29:44.314+0800","level":"INFO","class":"org.apache.juli.logging.DirectJDKLog.log(DirectJDKLog.java:173)","Content":"Initializing Spring embedded WebApplicationContext"}
{"@timestamp":"2022-05-26T17:29:44.314+0800","level":"INFO","class":"org.springframework.boot.web.servlet.context.ServletWebServerApplicationContext.prepareWebApplicationContext(ServletWebServerApplicationContext.java:285)","Content":"Root WebApplicationContext: initialization completed in 21696 ms"}
{"@timestamp":"2022-05-26T17:29:44.544+0800","level":"INFO","class":"org.redisson.Version.logVersion(Version.java:41)","Content":"Redisson 3.16.8"}
{"@timestamp":"2022-05-26T17:29:49.787+0800","level":"INFO","class":"org.redisson.connection.SentinelConnectionManager.<init>(SentinelConnectionManager.java:124)","Content":"master: redis://168.168.0.64:8007 added"}
{"@timestamp":"2022-05-26T17:29:49.803+0800","level":"INFO","class":"org.redisson.connection.SentinelConnectionManager.<init>(SentinelConnectionManager.java:141)","Content":"slave: redis://168.168.0.65:8009 added"}
{"@timestamp":"2022-05-26T17:29:49.803+0800","level":"INFO","class":"org.redisson.connection.SentinelConnectionManager.<init>(SentinelConnectionManager.java:141)","Content":"slave: redis://168.168.0.64:8008 added"}
{"@timestamp":"2022-05-26T17:29:49.848+0800","level":"INFO","class":"org.redisson.connection.SentinelConnectionManager.lambda$registerSentinel$30(SentinelConnectionManager.java:562)","Content":"sentinel: redis://168.168.0.65:9009 added"}
{"@timestamp":"2022-05-26T17:29:59.900+0800","level":"INFO","class":"org.redisson.connection.pool.ConnectionPool$1.lambda$run$0(ConnectionPool.java:161)","Content":"1 connections initialized for 168.168.0.64/168.168.0.64:8007"}
{"@timestamp":"2022-05-26T17:30:09.752+0800","level":"WARN","class":"org.springframework.context.support.AbstractApplicationContext.refresh(AbstractApplicationContext.java:559)","Content":"Exception encountered during context initialization - cancelling refresh attempt: org.springframework.beans.factory.BeanCreationException: Error creating bean with name 'wxMiniProgramConfig': Injection of resource dependencies failed; nested exception is org.springframework.beans.factory.BeanCreationException: Error creating bean with name 'redissonClient' defined in class path resource [com/syni/admin/mis/config/redis/RedisTemplateConfig.class]: Bean instantiation via factory method failed; nested exception is org.springframework.beans.BeanInstantiationException: Failed to instantiate [org.redisson.api.RedissonClient]: Factory method 'redissonClient' threw exception; nested exception is org.redisson.client.RedisConnectionException: Unable to init enough connections amount! Only 13 of 24 were initialized. Redis server: 168.168.0.64/168.168.0.64:8007"}
{"@timestamp":"2022-05-26T17:30:09.754+0800","level":"INFO","class":"com.baomidou.dynamic.datasource.DynamicRoutingDataSource.destroy(DynamicRoutingDataSource.java:217)","Content":"dynamic-datasource start closing ...."}
{"@timestamp":"2022-05-26T17:30:09.760+0800","level":"INFO","class":"com.alibaba.druid.pool.DruidDataSource.close(DruidDataSource.java:2003)","Content":"{dataSource-3} closing ..."}
{"@timestamp":"2022-05-26T17:30:09.760+0800","level":"INFO","class":"com.alibaba.druid.pool.DruidDataSource.close(DruidDataSource.java:2075)","Content":"{dataSource-3} closed"}
{"@timestamp":"2022-05-26T17:30:09.761+0800","level":"INFO","class":"com.alibaba.druid.pool.DruidDataSource.close(DruidDataSource.java:2003)","Content":"{dataSource-2} closing ..."}
{"@timestamp":"2022-05-26T17:30:09.761+0800","level":"INFO","class":"com.alibaba.druid.pool.DruidDataSource.close(DruidDataSource.java:2075)","Content":"{dataSource-2} closed"}
{"@timestamp":"2022-05-26T17:30:09.761+0800","level":"INFO","class":"com.alibaba.druid.pool.DruidDataSource.close(DruidDataSource.java:2003)","Content":"{dataSource-1} closing ..."}
{"@timestamp":"2022-05-26T17:30:09.762+0800","level":"INFO","class":"com.alibaba.druid.pool.DruidDataSource.close(DruidDataSource.java:2075)","Content":"{dataSource-1} closed"}
{"@timestamp":"2022-05-26T17:30:09.762+0800","level":"INFO","class":"com.baomidou.dynamic.datasource.DynamicRoutingDataSource.destroy(DynamicRoutingDataSource.java:221)","Content":"dynamic-datasource all closed success,bye"}
{"@timestamp":"2022-05-26T17:30:09.769+0800","level":"INFO","class":"org.apache.juli.logging.DirectJDKLog.log(DirectJDKLog.java:173)","Content":"Stopping service [Tomcat]"}
{"@timestamp":"2022-05-26T17:30:09.779+0800","level":"INFO","class":"org.springframework.boot.autoconfigure.logging.ConditionEvaluationReportLoggingListener.logMessage(ConditionEvaluationReportLoggingListener.java:136)","Content":"
Error starting ApplicationContext. To display the conditions report re-run your application with 'debug' enabled."}
{"@timestamp":"2022-05-26T17:30:09.786+0800","level":"ERROR","class":"org.springframework.boot.SpringApplication.reportFailure(SpringApplication.java:837)","Content":"Application run failed org.springframework.beans.factory.BeanCreationException: Error creating bean with name 'wxMiniProgramConfig': Injection of resource dependencies failed; nested exception is org.springframework.beans.factory.BeanCreationException: Error creating bean with name 'redissonClient' defined in class path resource [com/syni/admin/mis/config/redis/RedisTemplateConfig.class]: Bean instantiation via factory method failed; nested exception is org.springframework.beans.BeanInstantiationException: Failed to instantiate [org.redisson.api.RedissonClient]: Factory method 'redissonClient' threw exception; nested exception is org.redisson.client.RedisConnectionException: Unable to init enough connections amount! Only 13 of 24 were initialized. Redis server: 168.168.0.64/168.168.0.64:8007
at org.springframework.context.annotation.CommonAnnotationBeanPostProcessor.postProcessProperties(CommonAnnotationBeanPostProcessor.java:321)
at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.populateBean(AbstractAutowireCapableBeanFactory.java:1420)
at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.doCreateBean(AbstractAutowireCapableBeanFactory.java:593)
at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.createBean(AbstractAutowireCapableBeanFactory.java:516)
at org.springframework.beans.factory.support.AbstractBeanFactory.lambda$doGetBean$0(AbstractBeanFactory.java:324)
at org.springframework.beans.factory.support.DefaultSingletonBeanRegistry.getSingleton(DefaultSingletonBeanRegistry.java:234)
at org.springframework.beans.factory.support.AbstractBeanFactory.doGetBean(AbstractBeanFactory.java:322)
at org.springframework.beans.factory.support.AbstractBeanFactory.getBean(AbstractBeanFactory.java:202)
at org.springframework.beans.factory.support.DefaultListableBeanFactory.preInstantiateSingletons(DefaultListableBeanFactory.java:897)
at org.springframework.context.support.AbstractApplicationContext.finishBeanFactoryInitialization(AbstractApplicationContext.java:879)
at org.springframework.context.support.AbstractApplicationContext.refresh(AbstractApplicationContext.java:551)
at org.springframework.boot.web.servlet.context.ServletWebServerApplicationContext.refresh(ServletWebServerApplicationContext.java:143)
at org.springframework.boot.SpringApplication.refresh(SpringApplication.java:758)
at org.springframework.boot.SpringApplication.refresh(SpringApplication.java:750)
at org.springframework.boot.SpringApplication.refreshContext(SpringApplication.java:397)
at org.springframework.boot.SpringApplication.run(SpringApplication.java:315)
at org.springframework.boot.SpringApplication.run(SpringApplication.java:1237)
at org.springframework.boot.SpringApplication.run(SpringApplication.java:1226)
at com.syni.admin.mis.BackendApplication.main(BackendApplication.java:24)
Caused by: org.springframework.beans.factory.BeanCreationException: Error creating bean with name 'redissonClient' defined in class path resource [com/syni/admin/mis/config/redis/RedisTemplateConfig.class]: Bean instantiation via factory method failed; nested exception is org.springframework.beans.BeanInstantiationException: Failed to instantiate [org.redisson.api.RedissonClient]: Factory method 'redissonClient' threw exception; nested exception is org.redisson.client.RedisConnectionException: Unable to init enough connections amount! Only 13 of 24 were initialized. Redis server: 168.168.0.64/168.168.0.64:8007
at org.springframework.beans.factory.support.ConstructorResolver.instantiate(ConstructorResolver.java:655)
at org.springframework.beans.factory.support.ConstructorResolver.instantiateUsingFactoryMethod(ConstructorResolver.java:635)
at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.instantiateUsingFactoryMethod(AbstractAutowireCapableBeanFactory.java:1336)
at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.createBeanInstance(AbstractAutowireCapableBeanFactory.java:1176)
at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.doCreateBean(AbstractAutowireCapableBeanFactory.java:556)
at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.createBean(AbstractAutowireCapableBeanFactory.java:516)
at org.springframework.beans.factory.support.AbstractBeanFactory.lambda$doGetBean$0(AbstractBeanFactory.java:324)
at org.springframework.beans.factory.support.DefaultSingletonBeanRegistry.getSingleton(DefaultSingletonBeanRegistry.java:234)
at org.springframework.beans.factory.support.AbstractBeanFactory.doGetBean(AbstractBeanFactory.java:322)
at org.springframework.beans.factory.support.AbstractBeanFactory.getBean(AbstractBeanFactory.java:207)
at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.resolveBeanByName(AbstractAutowireCapableBeanFactory.java:453)
at org.springframework.context.annotation.CommonAnnotationBeanPostProcessor.autowireResource(CommonAnnotationBeanPostProcessor.java:527)
at org.springframework.context.annotation.CommonAnnotationBeanPostProcessor.getResource(CommonAnnotationBeanPostProcessor.java:497)
at org.springframework.context.annotation.CommonAnnotationBeanPostProcessor$ResourceElement.getResourceToInject(CommonAnnotationBeanPostProcessor.java:650)
at org.springframework.beans.factory.annotation.InjectionMetadata$InjectedElement.inject(InjectionMetadata.java:239)
at org.springframework.beans.factory.annotation.InjectionMetadata.inject(InjectionMetadata.java:130)
at org.springframework.context.annotation.CommonAnnotationBeanPostProcessor.postProcessProperties(CommonAnnotationBeanPostProcessor.java:318)
... 18 more
Caused by: org.springframework.beans.BeanInstantiationException: Failed to instantiate [org.redisson.api.RedissonClient]: Factory method 'redissonClient' threw exception; nested exception is org.redisson.client.RedisConnectionException: Unable to init enough connections amount! Only 13 of 24 were initialized. Redis server: 168.168.0.64/168.168.0.64:8007
at org.springframework.beans.factory.support.SimpleInstantiationStrategy.instantiate(SimpleInstantiationStrategy.java:185)
at org.springframework.beans.factory.support.ConstructorResolver.instantiate(ConstructorResolver.java:650)
... 34 more
Caused by: org.redisson.client.RedisConnectionException: Unable to init enough connections amount! Only 13 of 24 were initialized. Redis server: 168.168.0.64/168.168.0.64:8007
at org.redisson.connection.pool.ConnectionPool$1.lambda$run$0(ConnectionPool.java:153)
at java.util.concurrent.CompletableFuture.uniWhenComplete(CompletableFuture.java:774)
at java.util.concurrent.CompletableFuture$UniWhenComplete.tryFire(CompletableFuture.java:750)
at java.util.concurrent.CompletableFuture.postComplete(CompletableFuture.java:488)
at java.util.concurrent.CompletableFuture.completeExceptionally(CompletableFuture.java:1990)
at org.redisson.connection.pool.ConnectionPool.promiseFailure(ConnectionPool.java:310)
at org.redisson.connection.pool.ConnectionPool.lambda$createConnection$3(ConnectionPool.java:276)
at java.util.concurrent.CompletableFuture.uniWhenComplete(CompletableFuture.java:774)
at java.util.concurrent.CompletableFuture$UniWhenComplete.tryFire(CompletableFuture.java:750)
at java.util.concurrent.CompletableFuture.postComplete(CompletableFuture.java:488)
at java.util.concurrent.CompletableFuture.completeExceptionally(CompletableFuture.java:1990)
at org.redisson.client.RedisClient$1$2.run(RedisClient.java:235)
at io.netty.util.concurrent.AbstractEventExecutor.safeExecute$$$capture(AbstractEventExecutor.java:164)
at io.netty.util.concurrent.AbstractEventExecutor.safeExecute(AbstractEventExecutor.java)
at io.netty.util.concurrent.SingleThreadEventExecutor.runAllTasks(SingleThreadEventExecutor.java:472)
at io.netty.channel.nio.NioEventLoop.run(NioEventLoop.java:500)
at io.netty.util.concurrent.SingleThreadEventExecutor$4.run(SingleThreadEventExecutor.java:989)
at io.netty.util.internal.ThreadExecutorMap$2.run(ThreadExecutorMap.java:74)
at io.netty.util.concurrent.FastThreadLocalRunnable.run(FastThreadLocalRunnable.java:30)
at java.lang.Thread.run(Thread.java:750)
Caused by: java.util.concurrent.CompletionException: io.netty.channel.ConnectTimeoutException: connection timed out: 168.168.0.64/168.168.0.64:8007
at java.util.concurrent.CompletableFuture.encodeRelay(CompletableFuture.java:326)
at java.util.concurrent.CompletableFuture.completeRelay(CompletableFuture.java:338)
at java.util.concurrent.CompletableFuture.uniRelay(CompletableFuture.java:925)
at java.util.concurrent.CompletableFuture$UniRelay.tryFire(CompletableFuture.java:913)
... 11 more
Caused by: io.netty.channel.ConnectTimeoutException: connection timed out: 168.168.0.64/168.168.0.64:8007
at io.netty.channel.nio.AbstractNioChannel$AbstractNioUnsafe$1.run(AbstractNioChannel.java:261)
at io.netty.util.concurrent.PromiseTask.runTask(PromiseTask.java:98)
at io.netty.util.concurrent.ScheduledFutureTask.run(ScheduledFutureTask.java:170)
... 8 more
"}
Disconnected from the target VM, address: '127.0.0.1:62930', transport: 'socket'
打进断点最终报错是nio的连接超时
我的解答思路和尝试过的方法
- 试过调大redis的超时时间,不行
- 试过加以下代码,不行
config.useSingleServer().setConnectionMinimumIdleSize(10);
- 试过加以下配置,不行
spring.redis.timeout=5000 # 连接池最大连接数(使用负值表示没有限制) spring.redis.lettuce.pool.max-active=3 # 连接池中的最小空闲连接 spring.redis.lettuce.pool.min-idle=2 # 连接池中的最大空闲连接 spring.redis.lettuce.pool.max-idle=3 # 连接池最大阻塞等待时间(使用负值表示没有限制) spring.redis.lettuce.pool.max-wait=-1 #在关闭客户端连接之前等待任务处理完成的最长时间,在这之后,无论任务是否执行完成,都会被执行器关闭,默认100ms spring.redis.lettuce.shutdown-timeout=100 #是否缓存空值 spring.cache.redis.cache-null-values=false
- 试过调大macbook的TCP连接数,不行
https://www.yuanmomo.net/2019/07/26/mac-max-connections-config/ - 试过换IDEA版本,不行
- 直接java -jar jar包,不行
- 试过换JDK版本,不行
- protected-mode yes 改成 protected-mode no也别捣乱了,虽然没进配置看过,但其他电脑能连接说明没问题
- 有没有可能是redis服务限制了MacOSX系统?
- 有没有可能是macbook底层的tcp协议与其他平台有所不同?或者配置不对?
- 实测报错数量 of 24都在12左右,这说明了什么?
Only 13 of 24 were initialized
- 我的理解是24个连接只有部分连接成功,为什么部分成功部分失败?
- 看网上的回答都是怎么解决(虽然都不行),也没有人深究过问题产生的原因。难过
我想要达到的结果
最好是能彻底解决这个问题。
如果不能,有没有办法屏蔽掉启用redis线程池。起码能让我能在本地启动项目调试代码。