[상황]
서버 배포 시점에 ElastiCache Evictions 지표가 급증하는걸 확인하였으며,
Expire가 설정된 Key들이 원치 않게 삭제되는 현상이 발생하였습니다.
[원인]
1. maxmemory를 초과하는 memory 사용이 발생.
ElastiCache memory 정보를 확인해보니 아래 두 지표를 확인할 수 있었습니다.
- maxmemory_human : 9.8G - 최대 사용 가능한 memory
- used_memory_peak_human : 13.55G - 최대 memory 사용량
현재 설정되어 있는 maxmemory를 초과하는 memory 사용이 발생하였습니다.
현재 ElastiCache에 적용되어 있는 Eviction Policy는 volatile-lru 입니다.
< Eviction Policy >
Redis가 사용하려는 메모리가 maxmemory를 초과하면
사용자가 지정한 Eviction정책에 따라 저장되어 있는 데이터를 제거한 후, 새로운 데이터를 저장하게 됩니다.
< volatile-lru 정책 >
EXPIRE가 적용된 데이터 중에 사용한지 가장 오래된 데이터부터 삭제합니다.
해당 정책으로 인해서 Expire가 적용되어 있는 데이터 중 오래된 데이터부터 삭제가 발생하였으며,
Expire가 적용된 데이터 수가 많지 않아 당일 데이터까지 삭제가 되는 문제가 발생했습니다.
정확한 원인 파악을 위해 ElastiCache에서 memory를 많이 차지하는 key를 조회하였습니다.
redis-cli --bigkeys
그리고, Evictions가 발생한 시점(서버 배포시점)에 어떤 명령어들이 많이 호출됐는지 확인한 결과
메모리를 많이 차지하는 key 중 하나가 대량으로 호출되는 것을 확인했습니다.
문제가 됐던 key는 cluster.fork()에 의해 새로운 프로세서가 생성될 때 한번 호출되는데,
서버 배포 시 rollingUpdate로 인해 새로운 인스턴스들이 대량으로 생성되었고,
각 인스턴스 별로 프로세스가 fork 되면서 17번씩 호출하고 있었습니다.
AWS 공식문서에 나오는 내용 중 가장 아래에 있는 "큰 키"에 해당되는 케이스라고 판단하였습니다.
2. New Connections 급증
new connections 지표를 확인해보니, 서버를 배포하는 시점에 급증하는걸 발견했습니다.
AWS 공식문서에서는 많은 새 연결도 memory 사용량 증가를 발생 시킬 수 있다고 합니다.
[대응]
- ElastiCache의 Read / Wriite 요청을 처리하는 node 분리
- primary node - write요청
- read replica - read 요청
- 문제가 됐던 key 구조를 변경해 memory 감소 및 key 호출 구조 개선
1. ElastiCache의 Read / Wriite 요청을 처리하는 node 분리
기존에도 ElastiCache replica node가 있었지만, fail-over용으로만 사용하고 있었습니다.
서버에서 ElastiCache로 요청을 보낼 때
write 명령어는 primary node로, read 명령어는 replica node로 요청할 수 있게 ElastiCache 인스턴스를 분리하여 사용함으로써
데이터베이서 메모리 사용률을 분산했습니다.
2. 문제가 됐던 key 구조를 변경해 memory 감소
key 저장되는 데이터를 여러개의 key로 쪼개어서 저장하여 memory를 감소시켰으며,
추후 cache stampade도 예방하는 로직을 추가할 예정입니다.
'개발 > AWS' 카테고리의 다른 글
AWS ElastiCache 네티워크 대역폭 초과로 인한 서비스 장애 (0) | 2023.03.14 |
---|---|
AWS EC2Local port 고갈 인한 서비스 장애 (0) | 2023.03.13 |
AWS ElastiCache 엔진 마이너 버전 업데이트로 인한 다운타임 (0) | 2023.01.31 |
AWS RDS Too many max_connections 장애 (0) | 2023.01.31 |
AWS RDS 워크로드 불균형으로 인한 로드밸런싱 장애 (0) | 2023.01.31 |