建设电商网站的总结报告,wordpress 不发邮件,中山半江红网站建设,网站设计建设制作一、背景
在今天上午的时候#xff0c;突然收到大量的sentry报错#xff0c;都是关于redis连接超时的警告。
首先想到的是去查看redis的监控#xff0c;发现那个时间段#xff0c;redis的请求数剧增#xff0c;cpu使用率和带宽都陡增双倍。 下面的是redis监控的cpu情况 …一、背景
在今天上午的时候突然收到大量的sentry报错都是关于redis连接超时的警告。
首先想到的是去查看redis的监控发现那个时间段redis的请求数剧增cpu使用率和带宽都陡增双倍。 下面的是redis监控的cpu情况 最后贴一张redis的流量
到目前为止可以看到redis的压力确实上来了。
随之阿里云也给我们发来告警说redis连接超时导致主从切换。
于是我们推测是程序的访问量剧增接口中都又依赖redis导致访问redis的请求等陡增。
当然至于为什么会发生是不是就是redis出问题了呢最后又应该怎么调整
是调整程序还是加大redis的配置
二、监控
从监控大盘能看到的信息有httpq qps高达17k~18kjvm节点的内存和gc等没有任何异常毫无压力。但是redis访问却超时。程序设置连接redis的超时时间为3秒
1、http qps 2、arms 3、cloudDBA
缺少对redis客户端的连接监控依赖cloudDBA的实例会话。 而一般情况下redis客户端有多少呢1或2个见下 4、sentry QueryTimeoutException
Redis command timed out; nested exception is io.lettuce.core.RedisCommandTimeoutException:
Command timed out after 3 second(s)三、redis连接数
1、lettuce 源码见类LettuceConnectionFactory 其中的构建函数中可以看到默认this.shareNativeConnection true; 表示共享本地线程。 下面看看关于连接池的配置项
详见类org.springframework.boot.autoconfigure.data.redis.RedisProperties其中Pool类是跟线程池相关的配置。 那么是在哪个地方用到的呢 org.springframework.boot.autoconfigure.data.redis.LettuceConnectionConfiguration.PoolBuilderFactory
把RedisProperties.Pool赋值给GenericObjectPoolConfig详见下 如果需要池化技术你需要额外引入线程池框架。(因为我这项目里没有引入所以看到是标红的编译不通过)
dependencygroupIdorg.apache.commons/groupIdartifactIdcommons-pool2/artifactIdversion2.7.0/version
/dependency总结lettuce连接redis只会创建一个连接。
具体推荐一篇文章https://www.cnblogs.com/throwable/p/11601538.html#%E8%BF%9E%E6%8E%A5redis
2、jedis
由于我们没有使用jedis了相信很多人也不会弃用lettuce而用它。 所以这里不打算对其连接进行很细的描述。
当我们使用springboot框架的时候你只要看spring-boot-autoconfigure.jar的实现。
org.springframework.boot.autoconfigure.data.redis.JedisConnectionConfiguration private void applyPooling(RedisProperties.Pool pool,JedisClientConfiguration.JedisClientConfigurationBuilder builder) {builder.usePooling().poolConfig(jedisPoolConfig(pool));}配置RedisProperties.Pool赋值给JedisPoolConfig。 3、redisson
Config config new Config();
config.useSingleServer().setAddress(redis://127.0.0.1:6379);RedissonClient redisson Redisson.create(config);顺着代码往后看
public SingleServerConfig useSingleServer() {return this.useSingleServer(new SingleServerConfig());}所以只需要看类org.redisson.config.SingleServerConfig的成员变量以及构造函数。 private int connectionMinimumIdleSize 24;private int connectionPoolSize 64;所以需要将最前的代码稍加修改如下
Config config new Config();
config.useSingleServer().setAddress(redis://127.0.0.1:6379).setConnectionMinimumIdleSize(5).setConnectionPoolSize(10).setThreads(10).setNettyThreads(2);RedissonClient redisson Redisson.create(config);
setConnectionMinimumIdleSize(5) 设置了连接池的最小空闲连接数为 5setConnectionPoolSize(10) 设置了连接池的最大连接数为 10setThreads(10) 设置了 Redission 使用的线程数setNettyThreads(2) 设置了 Netty 使用的线程数
Redission 使用线程池来处理异步操作其中的线程数由 threads 配置项控制。较多的线程可能导致较多的连接。
总结由于我们在使用redission的时候采用的是默认值所以连接池的最小连接数为24这也趋近前文redis的客户端实例监控的数量27。
也可以说之所以和其他服务相比占用更多的连接就是redission配置项使用的默认值所导致。
四、总结
jvm程序的内存和gc没有变化在接口访问量陡增的情况下我们根据目前得到的信息决定修改程序代码redission的配置。
也就是说减少程序对redis服务器的并发请求至少不会让redis服务器的压力陡增。
一味地增加redis配置当然不可取因为我们的redis配置已经是很高了。 另外我很怀疑阿里云在今天的表现说实话业务在没有变化非常大的情况下不应该使得redis一下子就卡机了。
服务只是让redis的压力上升了并不是会让得redis连接超时且切换了主从。
再说下去就是阴谋论了水平有限从目前获取到的信息看只能把程序本来存在的旧问题给修复好后期再看监控对比吧。