记近期生产环境Redis失联问题的排查
近期,新东家的达人营销系统突然出现无法访问的情况。测试老哥反馈:接口报错误码500,提示Redis无法连接:localhost:6379……
我第一时间排查了现场,确认user服务正常,pod内连接redis也正常。进一步排查,发现Kubernetes集群因为资源不足被自动重启过。 随后排查重点放在了容器内应用无法连接Redis傻姑娘。 下面是排查过程:
-
RedisConnectionFactory中有值、redis configYML中也有值;
-
使用
spring.redis.host
可以正确设置host。如果使用spring boot3 ,才需要使用spring.data.redis.host; -
Nacos中值未发生变化;
-
使用kubectl cp mega-user app.jar并比较uat和生产的差异,一模一样。
-
在application-prd.yml 中写明redis.host,依然不能让redis读取到值;
-
访问流程
- GET mega-user—> client/login-user-info
- AuthUtil.getUserId() —> getUser() —>getUser(HttpServletRequest) —> getClaims(HttpServletRequest) —> # if getState()==true
- JwtUtil.getAccessToken(…)
- JwtUtil::getRedisTemplate().opsForValue.get()…
-
JwtUtil 配置流程,在SaaS项目中:
-
JwtUtil中有setRedisTemplate()静态方法;
-
该方法被mega-starter-jwt/src/main/java/com/megaframework/core/jwt/config/JwtConfiguration.java 调用
-
JwtConfiguration 有如下注解:显示需要先加载JwtRedisConfiguration
@Configuration(proxyBeanMethods = false) @AllArgsConstructor @AutoConfigureAfter(JwtRedisConfiguration.class) @EnableConfigurationProperties({JwtProperties.class})
-
JwtRedisConfiguration 有注解,无实质内容,引入内容都是spring的,无法在人工干预:
@Order @EnableCaching@Configuration(proxyBeanMethods = false) @AutoConfigureAfter(RedisAutoConfiguration.class) public class JwtRedisConfiguration {....
-
经过深入的调查和分析,我们进一步确认了Redis加载过程中没有出现明显的异常。
随后,我们将注意力转向了容器服务的诊断。我们观察到各个无状态服务的启动速度都相当快。然而,作为注册配置中心的阿里巴巴Nacos表现得异常缓慢,并且内存占用也显著(高达1000MB)。有趣的是,在所有无状态应用都已成功启动之时,Nacos仍未完全就绪。这导致业务侧的无状态服务在尝试加载Redis配置时失败,并默认写入了localhost:6379作为配置地址。至此,问题得以解明。
为了进一步优化系统和增强健壮性,我们引入了initContainer,并添加了存活探针来对Redis进行心跳检测。这样做确保了一旦Redis服务出现问题,相关应用将会被重新部署,从而减少潜在的风险