Redis 신규 연결 증가 원인 분석 및 해결방법
- 공유 링크 만들기
- X
- 이메일
- 기타 앱
이번 글에서는 Redis 신규 연결 증가 문제와 그 해결 과정을 공유합니다. Redis의 성능 최적화를 위해 Lettuce와 ElastiCache를 사용하던 중, 예상하지 못한 커넥션 증가 현상을 발견하게 되었고, 이를 분석하는 과정에서 여러 가지 중요한 사항들을 인지하게 되었습니다. Redis 신규 연결 문제를 이해하고 해결하기 위한 구체적인 원인과 방법을 자세히 살펴보겠습니다.
Redis 신규 연결 생성 원인 분석
Redis 신규 연결 수가 지속적으로 증가한 이유는 여러 요소에 기인합니다. 우선, Lettuce를 이용한 파이프라이닝 기능을 사용하고 있었는데, 이 경우 파이프라이닝을 위한 전용 커넥션이 할당되는 것입니다. RedisTemplate의 executePipelined 메서드를 활용하면, 여러 명령어를 처리하기 위해 새로운 커넥션이 생성 되죠. 이는 기본적으로 커넥션 풀를 사용하더라도, 파이프라이닝의 특성상 별도의 커넥션이 필요하기 때문에 새롭게 커넥션을 할당받게 되는 원인이 됩니다. 특히, 사용자 콘텐츠에 대한 요청이 많은 시간대인 자정에도 신규 커넥션 수가 증가한 것은 이런 파이프라이닝 방식이 한몫했을 가능성이 큽니다.
또한, 커넥션 풀의 LIFO(Last In First Out) 전략도 문제를 일으킬 수 있습니다. LIFO 방식으로 커넥션을 사용할 경우, 최근에 사용한 커넥션 중심으로 재사용하게 되므로, 사용하지 않는 커넥션은 IDLE 상태로 남겨질 수 있습니다. 이로 인해, 트래픽이 밀려올 경우 커넥션 수가 급속히 늘어날 위험이 있습니다. 결국, 커넥션 풀이 유지 관리되는 동안에 커넥션이 IDLE 상태에 있다면, Redis 서버에 의해 이러한 고객 연결이 자동으로 제거될 수 있습니다. AWS ElastiCache에서는 기본적으로 100초 이상의 IDLE 커넥션을 제거하도록 설정되어 있어, 커넥션의 재연결이 빈번하게 발생하게 됩니다.
이렇듯, 커넥션 끊김 및 재연결 현상이 계속되며, 새로운 커넥션 수가 급증하게 되는 원인으로 작용하고 있던 것입니다. 이를 통해 Redis 관련 지표를 감시하고 더 나은 설정을 지속해야 하는 필요성이 점차 커지게 되었습니다.
Redis 신규 연결 문제 해결 방법
Redis 신규 연결 문제를 해결하기 위해 두 가지 방법을 고려해 보았습니다. 첫 번째 방법은 커넥션 풀의 전략을 LIFO에서 FIFO(First In First Out)로 변경하는 것입니다. FIFO 방식으로 설정을 조정하면, 이전에 반납된 커넥션들이 우선적으로 다시 사용되도록 구성할 수 있습니다. 이를 통해 커넥션이 IDLE 상태로 긴 시간 남아있지 않도록 하고, 트래픽이 쏠리는 시간대에 재사용되는 빈도를 늘릴 수 있습니다. 따라서 커넥션이 끊기는 현상을 줄이며, 신규 연결 수를 줄이는 효과를 기대할 수 있습니다.
애플리케이션 설정에서 공통 풀 라이브러리인 commons-pool2를 사용하여 커넥션 풀을 정의하며, poolConfig.lifo 값을 false로 설정하면 FIFO로 동작하게 됩니다. 이는 실질적으로 커넥션이 자주 폐기되지 않고 긴 시간 동안 재사용될 수 있게 만들어 신규 커넥션 생성에 대한 부담을 경감시키는 효과가 있습니다.
두 번째 방법은 IDLE 커넥션을 정리하기 위한 설정을 추가하는 것입니다. 커넥션 풀의 최소 소멸 시간과 정리 주기를 설정하여, 설정된 시간 동안 아무 작업을 하지 않는 IDLE 커넥션은 자동으로 제거하도록 할 수 있습니다. 예를 들어, minEvictableIdleDuration과 timeBetweenEvictionRuns 값을 각각 30초로 지정하면, 30초 이상 IDLE 상태의 커넥션은 정리 대상으로 간주하고 처리할 수 있습니다. 이를 통해 불필요한 커넥션이 커넥션 풀에 쌓이지 않도록 하여 Redis의 성능과 자원을 보다 효율적으로 활용할 수 있게 됩니다.
이러한 두 가지 방법은 Redis 신규 연결 증가 문제를 해결하는 데 있어 실질적이고 효과적인 접근법으로 작용하였습니다.
Redis 신규 연결 문제 해결의 성과
위에서 설명한 해결 방안을 적용한 결과, 신규 커넥션 수가 눈에 띄게 감소하였습니다. 더 이상 피크 시간 이후에도 신규 연결 지표가 증가하는 현상을 관찰할 수 없었습니다. 이는 설정이 변경된 후 서버에서 효율적으로 커넥션을 관리하며, 자원 낭비를 줄이는 효과를 가져왔다고 볼 수 있습니다.
또한, Redis의 설정을 면밀히 검토한 결과, Spring Data Redis와 ElastiCache의 조정 모델 간의 연관성과 그 최적화를 고민하게 되었습니다. 이러한 경험은 향후 Redis 기반 서비스의 안정성을 높이는 데 크게 기여할 것입니다.
앞으로도 Redis 환경을 최적화하고 가용성을 높이기 위해 지속적인 모니터링과 세부 설정 조정을 할 예정이며, 차후에 발생할 수 있는 문제를 미연에 방지하기 위해 노력할 것입니다. 이 경험을 바탕으로, 다른 개발자분들도 비슷한 문제를 쉽게 해결할 수 있도록 하길 바랍니다.
- 공유 링크 만들기
- X
- 이메일
- 기타 앱