서비스에 대량의 트래픽이 몰릴 때 데이터베이스에 집중되지 않게 하는 방법 중 하나인 캐시가 있습니다.
캐시로 인해 발생할 수 있는 장애 유형을 정리한 글을 공유합니다.
캐시 문제 해결 가이드 - DB 과부하 방지 실전 팁
대용량 트래픽 환경에서 캐시를 사용할 때 주의해야할 위험 상황과 예방법을 소개합니다.
toss.tech
문제1. 캐시 쇄도 (Cache Stampede)
- 캐시가 전부 같은 시간에 만료되도록 하면 발생하는 이슈
- 해결방법: 지터(jitter)
- 캐시 만료 시간에 0~10초 사이의 무작위 지연 시간을 추가하여 설정한다.
문제2. 캐시 관통 (Cache Pentration)
- 보통 DB에 값이 없을 때 null을 받아오면 캐시를 채우지 않도록 구현하는데, '값이 없다' 라는 정보를 캐싱하지 않으면 계속 불필요한 요청을 하게된다.
- 해결방법: 널 오브젝트 패턴 (Null Object Pattern)
- 이 객체를 대체할 특정 값을 지정해야 한다.
- 예를 들어 양수만 존재하는 정수 타입의 데이터를 캐시해야하는 경우, 음수의 정수인 최소값으로 '값이 없음'을 나타내기로 애플리케이션에서 약속할 수 있다.
문제3. 캐시 시스템 장애
- 트래픽이 큰 상황에서 캐시 시스템이 장애가 날 경우 복구 되기 전까지 DB에 과부하가 걸릴 수 있다.
- 해결방법: 대체 작동 (Failover)
- 현실적으로 반드시 동작해야하는 핵심 기능을 제외하고 부가 기능은 운영을 중단하는게 옳다.
문제4. 핫키(hotkey) 만료
- 핫키: 많은 요청이 집중되는키
- 핫키가 만료되는 순간 여러 요청이 동시에 DB를 조회하게 된다. 캐시 만료기한을 없애거나 주기적으로 새값을 적용해서 만료되지 않도록 하는 것이 좋다. 하지만 핫키가 아닌 데이터로 인해 캐시 저장소가 낭비될 수 있다.
- 해결 방법: 분산락(Distributed Lock)
- 멀티 스레드 프로그래밍에서 공유 자원을 다룰 때 락을 사용하는 것과 비슷한 원리.
- 캐시 미스가 발생했을 때 락을 설정하고 캐싱한 후에 락을 해제함으로써 단 한번의 쓰기 작업만 허용할 수 있다.
- Redis 를 사용한다면 적용하기 쉽다. (레드락 알고리즘)
728x90
반응형
'DATA > Redis' 카테고리의 다른 글
Redis 란? (0) | 2024.10.26 |
---|---|
[NHN FORWARD 2021] Redis 야무지게 사용하기 보고 정리 (0) | 2023.08.26 |
Redis vm 생성, AWS EC2 설치 (0) | 2023.08.06 |
Memcache 와 Redis 비교 (0) | 2023.08.04 |
[공유] (번역) 캐시 시스템 설계할 때 기억해야 할 6가지 캐싱 전략 (0) | 2023.06.18 |
댓글