문제 상황
아래 적힌 에러를 발생시키며 라이브 서버에서 계속 서버가 죽는 상황이 있었습니다
Caused by: org.springframework.data.redis.RedisSystemException: Error in execution; nested exception is io.lettuce.core.RedisCommandExecutionException: ERR unknown command 'CONFIG', with args beginning with: 'GET' 'notify-keyspace-events'
SpringDataRedis의 특징
SpringDataRedis에서는 CrudRepository에 있는 findBy*** 의 메서드를 지원하기 위한 방법으로 검색을 위한 데이터를 가지고 있는 Set을 가지고 있습니다
Redis에서는 secondary index를 활용하고, spring data redis에서는 내부적으로 key를 따로 관리합니다
저장했을 때, 내부적으로 데이터의 key 가 별도의 set에 저장되고, 데이터를 제거하면 대응되는 key 가 제거됩니다
redis와는 별개로 스프링 data redis가 효율적인 관리를 위해서 가지고 있는 특징인데요
참고
https://hyperconnect.github.io/2022/12/12/fix-increasing-memory-usage.html
이때문에 생겼던 상황이 있는데요
Redis의 Entity의 id는 Serializable을 구현해야 한다는 부분이 지켜지지 않은 상태로 저장을 시도했던 경험이 있습니다
그 결과로 실제 redis 에 저장은 실패했지만, data redis의 키에는 추가가 된 상황이 발생했습니다
로컬에서 테스트했을 때, redis 에 저장된 키는 0개였지만, springDataRedis에서 저장된 키는 저장을 시도했던 횟수만큼이라고 기록되어 있던 상황이 있었는데, 애플리케이션을 종료했다 다시 실행해도 동일하게 키가 남아있는 문제가 있었습니다
이를 해결하기 위한 방법으로
@EnableRedisRepositories(enableKeyspaceEvents = ON_STARTUP)
라는 부분을 추가할 수 있습니다
enableKeyspaceEvents = ON_STARTUP
이라는 부분이 핵심인데요
https://redis.io/docs/manual/keyspace-notifications/
redis 데이터 세트에 영향을 미치는 이벤트를 수신하는 방식을 정리한 것인데요
RedisKeyExpiredEvents
라는 이벤트를 받아오는 방식으로 진행하고 있습니다
애플리케이션이 실행될때마다, 자동적으로 키를 동기화시켜줘서 적어도 종료했다 키가 동기화되는 방식을 사용했었는데요
물론 이후에는 제대로 Serializable 을 구현해 사용할 필요가 없는 기능이긴 했습니다
ElasticCache의 문제
elastic cache 는 기본적으로 이벤트들이 전부 막혀있습니다
그래서 RedisKeyExpiredEvents 를 수신할 수 없어 ci/cd 과정은 통과했지만, 실제 vpc에 배포가 되었을 때, 접속할 수 없다는 에러를 발생시키며 서버가 죽는 현상이 반복되었습니다
이에 대한 해결책으로는 2가지가 있습니다.
1. enableKeyspaceEvents 제거
당연하지만 이벤트 수신이 필요 없으면 문제가 생기지 않습니다
2. ElasticCache 의 Parameter group 수정
수정하는 방식은 과거 자료긴 하지만 밑에 링크를 통해서 확인하시면 될 것 같습니다
https://jybaek.tistory.com/930
직접 해보니 안 되는 것을 확인했고
위의 링크에 있는 것과 같이, 빈 문자열을 넣어두면 된다고 합니다
'프로젝트' 카테고리의 다른 글
카페인팀 서버 아키텍처를 설명해드리겠습니다 (7) | 2023.07.14 |
---|---|
프로젝트 git branch 전략 어떤 것이 있을까? (2) | 2023.06.28 |
쿠키로 Jwt RefreshToken 관리하기! (내 쿠키는 어디갔지?) (2) | 2023.05.15 |
사이드 프로젝트 리팩터링에 관한 이야기 (1) | 2023.04.30 |
이펙티브 기술면접 서비스 회고 (2) | 2023.04.02 |