본문 바로가기
DATA/Redis

[공유] 캐시 문제 해결 가이드 - DB 과부하 방지 실전 팁

by bzerome240 2024. 6. 2.

서비스에 대량의 트래픽이 몰릴 때 데이터베이스에 집중되지 않게 하는 방법 중 하나인 캐시가 있습니다.

캐시로 인해 발생할 수 있는 장애 유형을 정리한 글을 공유합니다.

 

 

캐시 문제 해결 가이드 - DB 과부하 방지 실전 팁

대용량 트래픽 환경에서 캐시를 사용할 때 주의해야할 위험 상황과 예방법을 소개합니다.

toss.tech

 

 


 

문제1. 캐시 쇄도 (Cache Stampede)

  • 캐시가 전부 같은 시간에 만료되도록 하면 발생하는 이슈
  • 해결방법: 지터(jitter)
    • 캐시 만료 시간에 0~10초 사이의 무작위 지연 시간을 추가하여 설정한다.

 

문제2. 캐시 관통 (Cache Pentration)

  • 보통 DB에 값이 없을 때 null을 받아오면 캐시를 채우지 않도록 구현하는데, '값이 없다' 라는 정보를 캐싱하지 않으면 계속 불필요한 요청을 하게된다.
  • 해결방법: 널 오브젝트 패턴 (Null Object Pattern)
    • 이 객체를 대체할 특정 값을 지정해야 한다.
    • 예를 들어 양수만 존재하는 정수 타입의 데이터를 캐시해야하는 경우, 음수의 정수인 최소값으로 '값이 없음'을 나타내기로 애플리케이션에서 약속할 수 있다.

 

https://faun.pub/caching-system-stability-766bf5fff69f

 

문제3. 캐시 시스템 장애

  • 트래픽이 큰 상황에서 캐시 시스템이 장애가 날 경우 복구 되기 전까지 DB에 과부하가 걸릴 수 있다.
  • 해결방법: 대체 작동 (Failover)
    • 현실적으로 반드시 동작해야하는 핵심 기능을 제외하고 부가 기능은 운영을 중단하는게 옳다.

 

문제4. 핫키(hotkey) 만료

  • 핫키: 많은 요청이 집중되는키 
  • 핫키가 만료되는 순간 여러 요청이 동시에 DB를 조회하게 된다. 캐시 만료기한을 없애거나 주기적으로 새값을 적용해서 만료되지 않도록 하는 것이 좋다. 하지만 핫키가 아닌 데이터로 인해 캐시 저장소가 낭비될 수 있다.
  • 해결 방법: 분산락(Distributed Lock)
    • 멀티 스레드 프로그래밍에서 공유 자원을 다룰 때 락을 사용하는 것과 비슷한 원리.
    • 캐시 미스가 발생했을 때 락을 설정하고 캐싱한 후에 락을 해제함으로써 단 한번의 쓰기 작업만 허용할 수 있다.
    • Redis 를 사용한다면 적용하기 쉽다. (레드락 알고리즘)

 

 

 

 

 

 

728x90
반응형

댓글