Redis를 도입하고 나서 간헐적으로 타임아웃이 발생했다. 당연히 Redis가 느린 줄 알았는데, slow log를 확인해보니 비어있었다. Redis는 빠르게 응답하고 있었다. 그럼 뭐가 문제였을까?
Redis 도입 후 APP에서 간헐적으로 타임아웃 에러가 발생했다.
증상:
- APP에서 Redis 요청 타임아웃
- 특정 API에서만 발생
- Redis slow log는 비어있음
Redis가 느리면 slow log에 기록이 남아야 한다. 근데 비어있다? Redis는 정상이라는 뜻이다.
Connection Pool은 연결을 재사용해서 성능을 올려주지만, 풀 안의 연결이 죽었는지 살았는지는 별개 문제다.
EKS 업그레이드 중 Redis pod가 재시작되면서 Pool 안의 연결이 전부 끊겼는데, Pool이 유효성 검증 없이 끊긴 연결을 그대로 반환했다. Lettuce에 auto-reconnect이 있는데도 복구가 안 된 이유와, testOnBorrow/testWhileIdle 설정의 차이를 정리한다.
| 항목 |
내용 |
| 증상 |
RedisSystemException, pod restart 전까지 복구 불가 |
| 원인 |
Connection Pool의 testOnBorrow 미설정 |
| 스택 |
Spring Boot 3.5.0 + Lettuce 6.5.5 + Commons Pool2 |
| 해결 |
testOnBorrow=true 또는 testWhileIdle=true 추가 |
| 재발 조건 |
Redis pod와 앱 pod가 동시에 재생성되는 경우 |
order-api는 Redis 연결을 Lettuce + Commons Pool2 기반 Connection Pool로 관리하고 있었다.