1장. 사용자 수에 따른 규모 확장성 (2)

parkrootseok·2025년 5월 1일

시스템디자인

목록 보기
2/6
post-thumbnail

캐시

캐시는 값비싼 연산 결과 또는 자주 참조되는 데이터를 메모리 안에 두고, 뒤이은 요청이 보다 빨리 처리될 수 있도록 하는 저장소입니다. 애플리케이션의 성능은 데이터베이스를 얼마나 자주 호출하느냐에 크게 좌우되는데, 캐시는 그런 문제를 완화할 수 있는 방법입니다.

캐시 계층

캐시 계층은 데이터가 잠시 보관되는 곳으로 데이터베이스보다 훨씬 빠릅니다. 별도의 캐시 계층을 두면 성능이 개선될 뿐 아니라 데이터베이스의 부하를 줄일 수 있습니다. 또한, 캐시 계층의 규모를 독립적으로 확장시키는 것도 가능합니다. 캐시 서버를 두게되면 다음과 같이 동작하게 됩니다.

위와 같은 캐시 전략을 읽기 주도형 캐시 전략이라고 부릅니다. 이외에도 다양한 캐시 전략이 있는데, 데이터 종류/크기/액세스 패턴 등을 고려하여 전략을 결정합니다.

캐시 사용 시 유의할 점

캐시를 사용할 때는 다음 사항들을 고려한 후 사용하는 것이 좋습니다.

  • 캐시는 어떤 상황에서 사용해야 할까?
    • 데이터 갱신은 자주 일어나지 않지만, 참조는 빈번한 경우
  • 어떤 데이터를 캐시에 사용해야 할까?
    • 캐시는 휘발성 메모리에 보관하므로, 영속성이 필요한 데이터는 제외
  • 캐시에 보관된 데이터는 어떻게 만료 되는가?
    • 만료 정책이 없을 경우, 데이터는 캐시에 영구 보관
      • 너무 짧으면, 데이터베이스 조회 빈도 증가
      • 너무 길면, 원본 데이터와 일관성 문제 발생
  • 일관성(캐시 내의 사본과 데이터베이스 내의 원본의 동일성)은 어떻게 유지되는가?
    • 갱신 연산과 캐시를 갱신하는 연산이 단일 트랜잭션으로 처리되지 않는 경우 일관성 문제 발생
    • 참고 자료: Scaling Memcache at Facebook
  • 장애에는 어떻게 대처할 것인가?
    • 캐시 서버를 한 대만 두는 경우 해당 서버는 단일 장애 지점이 되어버릴 가능성이 존재
  • 캐시 메모리는 얼마나 크게 잡을 것인가?
    • 너무 작으면 액세스 패턴에 따라서는 데이터 방출 주기가 잦아 성능 저하 발생
  • 데이터 방출 정책은 무엇인가?
    • 캐시가 꽉 차버리면 기존 데이터 방출 필요
    • 이 상황에서 LRU, LFU, FIFO 등의 정책 중 무엇을 사용할 것 인지

CDN

CDN은 정적 콘텐츠를 전송하는 데 쓰이는 지리적으로 분산된 서버의 네트워크입니다. 이미지, 비디오, CSS, JavaScript와 같은 파일 등을 캐시할 수 있습니다.

위 그림과 같이 어떤 사용자가 웹사이트를 방문하면, 사용자와 지리적으로 가까운 CDN 서버가 정정 콘텐츠를 전달하게 됩니다. 직관적으로도 당연하겠지만, 사용자가 CDN 서버로부터 멀면 멀수록 웹사이트는 천천히 로드됩니다. 예를 들어, CDN 서버가 서울에 있다면 부산에 있는 사용자는 유럽에 있는 사용자보다 더 빠른 응답을 받을 수 있습니다.

CDN 동작 방식

사용자 A가 이미지 URL을 이용해 image.png에 접근

CDN 서버의 캐시에 해당 이미지가 없을 경우, 원본 서버로 요청

원본 서버는 파일을 CDN 서버로 반환

응답 HTTP 헤더에 파일의 캐시 만료 기간인 TTL을 포함하여 전달

CDN 서버는 받은 파일을 캐싱하고 반환

파일은 HTTP 헤더의 TTL에 명시된 시간이 끝날 때까지 존재

사용자 B가 같은 이미지 요청을 전송하면, 캐싱된 이미지를 반환

다른 사용자가 동일한 이미지를 요청했을 때 캐시가 남아있을 경우, 남아있지 않다면 이전 작업 재수행

CDN 사용 시 고려해야 할 사항

비용

CDN은 보통 서드-파티 제공자에 의해 운영되어 CDN을 들어가고 나가는 데이터 전송 양에 따라 요금이 부과됩니다. 자주 사용되지 않는 콘텐츠를 캐싱하는 것은 효율이 좋지 않으므로, CDN에서 제외시켜야 합니다.

적절한 만료 기간 설정

실시간성이 중요한 콘텐츠의 경우 만료 시점을 잘 정해야 합니다. 너무 길지도 짧지도 않아야 하는데, 너무 길면 콘텐츠의 신선도는 떨어질 것이고, 너무 짧으면 원본 서버에 빈번히 접속하게 됩니다.

장애에 대한 대처 방안

CDN 자체가 죽었을 경우 웹사이트/애플리케이션이 어떻게 동작해야 하는지 고려해야 합니다. 일시적으로 CDN이 응답하지 않을 경우, 해당 문제를 감지하여 원본 서버로부터 직접 콘텐츠를 가져오도록 구성하는 것이 필요할 수 있습니다.

콘텐츠 무효화 방법

아직 만료되지 않은 콘텐츠라 하더라도 아래 방법 가운데 하나를 쓰면 CDN에서 제거 가능합니다.

  • CDN 서비스 사업자가 제공하는 API를 사용하는 방법
  • 콘텐츠의 다른 버전을 서비스하도록 오브젝트 버저닝을 활용하는 방법
    • URL 마지막에 버전 번호를 인자로 보내 콘텐츠의 새로운 버전을 지정하는 방법으로
    • 예를 들어, image.png?v=2 와 같은 식

캐시와 CDN을 추가한 설계

캐시 계층과 CDN 계층이 도입된 설계는 다음과 같습니다.

두 계층의 도입으로 생긴 변화는 다음과 같습니다.

  1. 정적 콘텐츠(JS, CSS, 이미지 등)는 더 이상 웹 서버를 통해 서비스하지 않으며, CDN을 통해 제공하여 더 나은 응답 속도를 보장합니다.
  2. 데이터를 캐시에서 제공함으로써 데이터베이스 부하가 감소합니다.
profile
동료들의 시간과 노력을 더욱 빛내줄 수 있는 개발자가 되고자 노력합니다.

0개의 댓글