cs/ODOQ

[ODOQ] 캐시 스탬피드(Cache Stampede)

icodesiuuuu 2025. 1. 23. 19:29

[One Day One Question]

캐시 스탬피드(Cache Stampede)에 대해서 설명해 주세요.


 

 캐시 스탬피드(Cache Stampede)는 다수의 요청이 동시에 캐시 갱신을 유발하여 서버 부하가 급격히 증가하는 현상을 말합니다. 캐시 만료 시점에 다수의 클라이언트가 동일한 데이터를 동시에 요청하면, 모든 요청이 캐시를 우회하여 데이터베이스(DB) 또는 백엔드 서버로 몰리게 됩니다. 이는 서버 과부하로 이어져 성능 저하, 서비스 지연, 심지어 서버 다운으로 연결될 수 있습니다.

캐시 스탬피드 발생 과정

  1. 캐시가 만료되어 클라이언트가 캐시에서 데이터를 가져오지 못함.
  2. 동일한 데이터에 대한 요청이 다수의 클라이언트로부터 동시에 발생.
  3. 모든 요청이 데이터베이스나 원본 서버로 전달되며 부하가 급증.
  4. 서버 응답 속도 저하 또는 서버 장애 발생.

 

캐시 스탬피드 해결 방법

1. 캐시 갱신 분산

  • 랜덤 만료 시간(Random Expiration):
    • 캐시 항목의 만료 시간을 랜덤하게 설정하여 동일한 시점에 캐시가 만료되지 않도록 분산.
    • 예: 60초로 설정된 만료 시간을 ±10초 랜덤하게 조정.
  • TTL(TTL: Time-To-Live) 조정:
    • 요청 빈도가 높은 항목의 TTL을 길게 설정해 만료를 줄임.

2. Write-Through/Write-Around 캐싱

  • Write-Through:
    • 데이터가 업데이트될 때 캐시에 즉시 반영.
    • 캐시 만료로 인한 백엔드 요청 폭증을 방지.
  • Write-Around:
    • 캐시에 영향을 주지 않고 원본 데이터만 갱신하며, 캐시는 만료 시 갱신.

3. Mutex(뮤텍스) 락 사용

  • 캐시 갱신 중 하나의 클라이언트만 갱신 작업을 수행하도록 제한.
  • 다른 클라이언트는 갱신이 완료될 때까지 대기하거나 기존 캐시 데이터를 사용.
  • 예: Redis의 분산 락 사용.

4. 캐시 프리로딩(Cache Preloading)

  • 캐시 만료 전에 주기적으로 데이터를 미리 갱신.
  • 트래픽이 몰리기 전 필요한 데이터를 준비.

5. 캐시 백오프(Cache Backoff)

  • 동일 데이터 요청에 대한 캐시 갱신 시도를 지연시켜 트래픽 분산.
  • 실패한 요청이 즉시 반복되지 않도록 지연 메커니즘을 적용.

6. Lazy-Loading 캐시 갱신

  • 기존 캐시 데이터를 사용하면서 갱신을 백그라운드에서 수행.
  • 클라이언트가 항상 최신 데이터를 요구하지 않는 경우에 적합.