DB 캐시 (로컬 캐싱, 글로벌 캐싱)

dohyoungK·2024년 4월 17일
1

면접 스크립트

목록 보기
23/25

DB 캐시 (로컬 캐싱, 글로벌 캐싱)


파레토 법칙

80%의 결과는 20%의 원인으로 인해 발생된다는 법칙으로 캐시가 나오게 된 배경에 이 법칙이 존재한다. 서비스에 필요한 20%를 캐싱함으로써 전체적인 효율을 끌어올릴 수 있다.

캐시

캐시란, 데이터의 원본보다 더 빠르고 효율적으로 액세스할 수 있는 임시 데이터 저장소이다.

자주 조회되며 데이터의 변경이 적은 데이터는 데이터 갱신으로 인해 DB와 불일치될 확률이 적기때문에 캐시를 적용하기 적합하다. 또한 데이터의 최신화가 실시간으로 이루어지지 않아도 괜찮은 데이터는 캐시와 DB사이 불일치가 길어도 괜찮기 때문에 적합하다.

캐시를 사용함으로써 서버간 불필요한 트래픽을 줄일 수 있으며, 부하가 감소된다.

로컬 캐싱

로컬 캐싱이란, 로컬 장비 내에서 사용되는 캐시 메모리를 이용하는 방식이다.

장점

  • 로컬에서 동작하기 때문에 속도가 빠르며, 네트워크 단절, 지연에 자유롭다.
  • 서버와 라이프 사이클을 같이하기 때문에 사용하기 편리하다.

단점

  • 서버가 다운되면 메모리도 휘발성이므로 사라지게 된다.
  • 여러 서버가 존재할 경우 서버간의 메모리 캐시 데이터의 불일치 문제가 생긴다.
  • 서버의 메모리가 부족해질 경우 서버 스펙을 향상시킬 필요가 있다.

글로벌 캐싱

글로벌 캐싱이란, 여러 서버에서 별도의 서버의 인메모리 DB(ex. Redis)에 저장된 캐시를 이용하는 방식이다.

장점

  • 여러 서버간 캐시를 공유하므로 서버 간 데이터 공유가 쉽다.
  • 새로운 서버 생성시 그 로컬 캐시를 새로 채울 필요가 없으므로 확장성이 좋다.

단점

  • 네트워크 트래픽으로 인해 속도가 로컬에 비해 상대적으로 느리다.
  • 별도의 캐시 서버를 두어야 하므로 별도의 인프라 관리 비용이 존재한다.

캐싱 전략

일반적으로 캐시는 DB보다 훨씬 빠르게 데이터를 응답할 수 있다.

하지만 캐시의 용량이 DB보다 적기 때문에, 데이터를 모두 캐시에 저장해버린다면 용량 부족 현상이 일어난다.

따라서 어떤 데이터를 캐시에 저장할지, 얼만큼 데이터를 캐시에 저장할지, 얼마나 오래된 데이터를 캐시에서 제거할지에 대한 전략이 중요하다.

  • cache hit : 캐시에 데이터가 있을 경우 바로 가져온다.
  • cache miss : 캐시에 데이터가 없을 경우 DB에서 가져온다.

캐시를 이용할 때 데이터 불일치 문제를 고려할 필요가 있다.

한 데이터가 캐시와 DB 두 곳에서 같은 데이터임에도 그 값이 다른 경우를 말한다.

따라서 적절한 캐시 읽기 전략과 쓰기 전략을 통해 데이터 불일치 문제를 극복해야 한다.

캐시 읽기 전략 (Read Cache Strategy)

Look Aside(Cache Aside) 패턴

Look Aside(Cache Aside) 패턴은 가장 기본적인 캐시 전략으로, 데이터를 찾을 때 우선 캐시에 저장된 데이터가 있는지 우선적으로 확인하고 데이터가 없다면 DB에서 조회한다.

  1. 캐시에서 데이터가 있는지 확인한다.
  2. 캐시에서 없을 경우 DB에서 데이터를 조회한다.
  3. DB에서 조회해온 데이터를 캐시에 업데이트한다.

이 방식은 초기 조회 시 무조건 DB에서 조회해야 하므로 단건 호출 빈도가 높은 서비스보다는 반복적으로 동일 쿼리를 수행하는 서비스에 적합하다. (초기에 DB에서 캐시로 data를 미리 넣어주는 Cache Warming을 통해 초기 성능 저하를 어느정도 방지할수도 있다.)

Read Through 패턴

Read Through 패턴은 캐시에서만 데이터를 읽어오는 전략으로, Look Aside와 비슷하지만 캐시에 데이터 동기화를 위임해, 캐시에 데이터를 업데이트하는 주체가 서버냐 DB냐에 차이가 있다. 그리고 Look Aside와 달리 항상 캐시와 DB간 데이터 동기화가 항상 이루어져 데이터 불일치 문제에서 벗어날 수 있다.

  1. 캐시에서 데이터가 있는지 확인한다.
  2. 캐시에서 없을 경우 캐시와 DB간 데이터를 자체 업데이트 한다.
  3. 캐시에서 데이터를 가져온다.

이 방식 또한 Cache Warming을 수행하는 것이 효율적이나 데이터를 조회하는 데 있어 상대적으로 속도가 느리다.

캐시 쓰기 전략 (Write Cache Strategy)

Write Back (Write Behind) 패턴

Write Back (Write Behind) 패턴은 캐시와 DB를 비동기로 하기 때문에 동기화 과정이 생략되며, 데이터를 저장할 때 DB에 바로 쿼리하지 않고, 캐시에 모아서 일정 주기로 DB에 반영한다.

  1. 모든 데이터를 캐시에 저장한다.
  2. 일정 시간 주기로 DB에 저장한다.

이 방식은 캐시에 데이터를 모았다 한번에 DB에 저장하기 때문에 DB 쓰기 비용과 부하를 줄일 수 있지만, DB에 데이터를 쓰기 전에 캐시에 장애가 발생하면 데이터 유실이 발생 가능하다.

Write Through 패턴

Write Through 패턴은 DB와 캐시에 동시에 데이터를 저장하는 전략으로, 데이터를 저장할 때 먼저 캐시에 저장하고 바로 DB에 저장한다. Read Through와 같이 DB 동기화 작업을 캐시에 위임한다.

  1. DB에 저장할 데이터가 존재하면 우선 캐시에 저장한다.
  2. 그 다음 바로 DB에 데이터를 저장한다.

이 방식은 DB와 캐시가 항상 동기화 되어있어, 데이터의 일관성을 유지할 수 있다. 하지만 저장에 2단계 과정을 거치므로 상대적으로 속도가 느리다.

Write Around 패턴

Write Around 패턴은 모든 데이터를 DB에 저장하는 전략으로 캐시를 갱신하지 않는다.

  1. 모든 데이터는 DB에 저장한다.

이 방식은 데이터를 DB에만 저장하므로 속도가 빠르지만, 캐시와 DB간 데이터 불일치 문제가 발생 가능하다.


캐시 읽기 + 쓰기 전략 조합

Look Aside + Write Around 조합

가장 일반적으로 자주 쓰이는 조합이다.

Read Through + Write Around 조합

항상 DB에 쓰고, 캐시에서 읽을 때 항상 DB에서 먼저 읽어오므로 데이터 불일치 문제에 대해 완벽한 안전 장치를 구성할 수 있다.

Read Through + Write Through 조합

데이터를 쓸 때 항상 캐시에 먼저 쓰므로, 읽어올 때 최신 캐시 데이터가 보장된다.

또한 데이터를 쓸 때 항상 캐시에서 DB에 보내므로 데이터의 정합성이 보장된다.

0개의 댓글