개발/AWS

AWS ElastiCache Evictions로 인한 데이터 삭제

대구촌놈 2023. 2. 2. 16:19

[상황]


서버 배포 시점에 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 사용량 증가를 발생 시킬 수 있다고 합니다.

 

 

[대응]


  1.  ElastiCache의 Read / Wriite 요청을 처리하는 node 분리
    1. primary node - write요청
    2. read replica - read 요청
  2. 문제가 됐던 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도 예방하는 로직을 추가할 예정입니다.