본문 바로가기

Project

[Google Cloud] 대용량 콘텐츠를 효율적으로 전달하는 CDN 활용

반응형

시나리오

기업은 대용량의 웹 콘텐츠(예: 동영상, 이미지, 웹 페이지)를 인터넷을 통해 수많은 사용자에게 제공해야 합니다. 그러나 이 콘텐츠를 단일 서버로 전송하면 대량의 트래픽이 집중되어 서버 부하가 높고 사용자 경험이 좋지 않습니다.

기업은 CDN 서비스를 도입하기로 결정합니다. CDN 제공업체와 협력하여 CDN 노드를 활용할 수 있는 계약을 체결합니다.

대용량 콘텐츠는 CDN 의 엣지서버에 저장됩니다. 이 콘텐츠는 여러 지역에 분산되어 있어 사용자들이 빠르게 접근할 수 있도록 합니다.

 

동작원리

CDN의 동작원리에 대해 설명하겠습니다.

1. 요청의 발생 : 사용자가 웹 브라우저 또는 애플리케이션을 통해 특정 콘텐츠(예: 동영상, 이미지, 웹페이지)에 대한 요청을 생성합니다.

2. 가장 가까운 Edge 서버 선택 : CDN은 전 세계에 여러 노드 또는 서버로 구성되어 있습니다. 사용자의 요청을 처리하기 위해 CDN은 사용자와 물리적으로 가장 가까운 CDN 서버를 선택합니다. 이로 인해 지연 시간이 최소화되고 빠른 응답이 가능해집니다.

3. 캐싱된 콘텐츠 검색 : CDN 서버는 요청된 콘텐츠의 사본(캐싱된 콘텐츠)를 검색합니다. 이 캐시는 이전에 해당 콘텐츠를 요청한 다른 사용자들로부터 생성되며, 캐시된 콘텐츠가 CDN 서버에 존재하면, CDN 서버는 해당 콘텐츠를 상요자에게 바로 제공합니다.

4. 캐싱된 데이터 전달 : CDN 서버가 캐시에서 콘텐츠를 찾으면, 이 콘텐츠를 사용자에게 전송합니다. 

5. 캐싱 실패 또는 오래된 콘텐츠 : CDN 서버가 캐시에서 요청된 콘텐츠를 찾을 수 없거나 콘텐츠가 오래되어 업데이트가 필요한 경우, CDN 서버는 원본 서버 (Origin Server) 로 부터 콘텐츠를 조회합니다.

 

 

 

CDN 캐싱 방식의 종류

Static Caching (정적 캐싱)

  • Origin Server 에 있는 콘텐츠를 사용자 요청이 발생하기 이전에 미리 Cache 서버에 복사하여 저장
  • 사용자가 해당 콘텐츠를 요청하면 Cache 서버에서 바로 제공, 원본 서버에 다시 접근하지 않으므로 응답 속도가 매우 빠름
  • 정적인 콘텐츠(예: 이미지, 스타일 시트, JavaScript 파일)에 대해 효과적으로 동작, 콘텐츠가 자주 변경되지 않을때 적합

Dynamic Caching (동적 캐싱)

  • 초기에는 Cache 서버에 해당 콘텐츠가 없으며, 사용자가 콘텐츠를 요청할 때마다 Cache 서버에서 해당 콘텐츠의 존재 여부를 확인합니다.
  • Cache miss : 캐시 서버에 콘텐츠가 없는 경우, 원본 서버에서 콘텐츠를 가져와 Cache 서버에 저장하고 사용자에게 전달
  • Cache Hit : 이미 Cache 서버에 해당 콘텐츠가 캐싱되어 있다면, 콘텐츠를 바로 사용자에게 전달
  • 웹 페이지의 동적 컨텐츠, 사용자 지정 데이터에 대한 캐싱에 유요하며, 콘텐츠가 자주 업데이트되거나 변경될 때 적합

캐시의 생명 주기

HTTP에서 리소스(Resource)란 웹 브라우저가 HTTP 요청으로 가져올 수 있는 모든 종류의 파일을 말합니다. 대표적으로 HTML, CSS, JS, 이미지, 비디오 파일 등이 리소스에 해당합니다.

 

웹 브라우저가 서버에서 지금까지 요청한 적이 없는 리소스를 가져오려고 할 때, 서버와 브라우저는 완전한 HTTP 요청/응답을 주고받습니다. HTTP 요청도 완전하고, 응답도 완전합니다. 이후 HTTP 응답에 포함된 Cache-Control 헤더에 따라 받은 리소스의 생명 주기가 결정됩니다.

 

캐시의 유효기간 : max-age

예를들어, 서버에서 HTTP 응답을 보낼 때 다음과 같은 Cache-Control 헤더를 사용할 수 있습니다.

Cache-Control: max-age=3600

 

위의 예제에서 "max-age"는 3600초(1시간)로 설정되어 있으므로, 이 리소스는 브라우저의 캐시에서 1시간 동안 유효합니다. 이 기간 동안 동일한 리소스에 대한 추가 요청이 있을 경우, 브라우저는 서버로부터 다시 다운로드 하지 않고 이전에 캐시된 버전을 사용합니다.

 

캐시의 유효기간이 지나기 전

한 번 받아온 리소스의 유효 기간이 지나기 전이라면, 브라우저는 서버에 요청을 보내지 않고 디스크 또는 메모리에서만 캐시를 읽어와 계속 사용합니다.

 

위는 개발자 코드에서 캡쳐해온 요청값의 예시입니다.

위의 예시를 보면 max-age=31536000 이기 때문에, 이 리소스는 1년동안 캐시할 수 있습니다.

스크린 샷에서는 유효한 캐시가 메모리에 남아있기 때문에 from memory cache 라고 Status 코드가 표시된 것을 확인 할 수 있습니다.

 

"서버에 요청을 보내지 않고"라고 하는 말에 주의해봅시다. 한번 브라우저에 캐시가 저장되면 만료될때까지 캐시는 계속 브라우저에 남아있게 됩니다. 때문에 CDN Invalidation을 포함한 서버의 어떤 작업이 있어도 브라우저의 유효한 캐시를 지우기는 어렵습니다.

 

이제 요청을 받고, 캐시서버가 요청값에 응답하는 이 CDN의 시나리오를 이해했다면 실제 클라우드 서비스의 CDN 을 살펴보려 합니다.

 

 

GCP 의 Cloud CDN 작동 방식

 

Cloud CDN 을 통해 원본 서버에서 클라이언트로 응답이 전달

 

 

 

Cloud CDN 작동 방식

초기 응답은 원본 서버에서 제공되고 후속 응답은 GFE(Google Front End)에 의해 캐시에서 제공됩니다.

 

 

Cloud CDN 구성 - Cloud Storage 백엔드 버킷

Cloud Storage 버킷 만들기

- 여러 리전에 자동으로 객체를 복제하는 멀티리전 버킷 권장

 

 

 

Cloud Storage 버킷을 공개로 설정

저장소 개체 뷰어(Cloud Storage - 권한) 사용하면 인터넷의 모든 사용자가 객체와 메타데이터를 볼 수 있습니다.

 

외부 IP 주소 예약

이제 Cloud Storage 버킷이 준비되어 실행 중 이므로 고객이 부하 분산기에 도달하기 위해 사용하는 전역 고정 외부 IP 주소를 설정합니다.

 

gcloud compute addresses create cdn-ip-merin --project=ptty-231128 --global

 

외부 HTTP(S) 부하 분산기 만들기

백엔드 구성 및 Cloud CDN 사용 설정

 

다음으로 부하분산기에 백엔드 서비스를 추가해야 합니다. 백엔드 서비스는 요청을 받아 원본 서버로 전달하는 역할을 합니다.

백엔드 서비스를 생성합니다. 생성후 백엔드 서비스 설정 페이지에서 Cloud CDN 을 활성화합니다.

백엔드서비스를 생성합니다. 생성후 백엔드 버킷 만들어주고, Cloud 백엔드 서비스 설정 페이지에서 Cloud CDN 을 활성화합니다.

 

캐시모드

  • 정적 콘텐츠
    캐시 불가능이 될 수 없는 정적 콘텐츠가 있는 성공적인 응답을 자동으로 캐시합니다. 즉, 정적 콘텐츠는 항상 캐시되며 유효한 캐시 지시문을 설정하는 원본 응답도 캐시됩니다. 이는 웹 사이트의 정적 콘텐츠 (이미지, 스타일 시트, JavaScript파일) 을 효율적으로 캐싱하는데 사용됩니다.
  • Cache-Control 해더를 기준으로 출처 설정 사용
    원본 서버가 유효한 캐시 지시어 및 캐싱 헤더를 포함하는 응답을 요구합니다. ('Cache-Control: public, max_age=3600')와 같은 캐시 지시어 및 헤더가 설정된 경우, 해당 응답은 캐시됩니다. 그러나 캐시 지시어가 없는 경우, 응답은 원본에서 직접 전달됩니다.
  • 모든 콘텐츠 강제 캐시
    원본으로 설정된 캐시 지시문을 무효화하고 성공적인 응답을 무조건적으로 캐시합니다. 이 모드는 동적 HTML 페이지나 사용자별로 다른 내용을 제공하는 API 응답과 같은 경우에는 적합하지 않습니다.

 

다음으로 프런트엔드 구성입니다.

 

위에서 설정한 외부 IP주소(cdn-ip-merin)를 선택해야 합니다.

 

백엔드 버킷으로 트래픽 전송 (CDN 사용하기)

$gcloud compute addresses describe cdn-ip-merin --format="get(address)" --global
175.45.203.42

 

  • 브라우저에서 설정한 CDN 주소로 접속합니다. ( http://175.45.203.42/

Cloud CDN 작동 확인

Cloud CDN 작동 확인 중 로그 메시지를 보겠습니다,.

  • 캐시 부적중 (No CACHE)
    'jsonPayload.statusDetails="response_sent_by_backend" 로 표시되는 경우 CDN 에서 캐시된 응답이 아닌 원본 백엔드 서버에서 직접 응답이 제공된 경우입니다. 이는 클라이언트 요청에 대한 캐시가 없거나 캐시가 만료되었을 때 발생할 수 있습니다.
  • 캐시 적중 (CACHE)
    'httpRequest.cacheHit=true' 및 'jsonPayload.statusDetails="response_from_cache"로 표시되는 경우 , CDN에서 캐시된 응답이 클라이언트에 제공된 경우입니다. 
  • 캐시 응답 (cacheld)
    'cacheId'는 캐시 인스턴스의 식별자입니다. 이 값은 CDN의 위치와 개별 캐시 인스턴스를 식별하는 불투명한 식별자입니다. Cloud CDN 위치에는 여러 개의 개별 캐시가 있을 수 있으므로 캐시 인스턴스를 식별하는 데 사용됩니다.

 

Cloud CDN 효과적으로 사용하는 방법

  1. 서비스 파악
    먼저 어떤 종류의 서비스를 제공하는지 파악해야합니다. 웹 사이트, 애플리케이션, 미디어 스트리밍 등 다양한 서비스에 Cloud CDN을 적용할 수 있습니다.
  2. 서비스 지역 및 내부 서비스
    서비스의 지역 및 내부 서비스에 따라 CDN 설정을 조정해야 할 수 있습니다. 지역에 따라 CDN 엣지 노드를 사용하여 가용성 및 성능을 최적화 할 수 있습니다.
  3. 캐시 적중률 향상
    가이드 문서를 참조하여 캐시 적중률을 최적화하는 방법을 학습하면 좋습니다. Custom Cache key 를 사용하여 캐시 적중률을 향상 시킬 수 있습니다. 기본적으로 전체 URL이 캐시 키로 사용되지만 Custom Cache key 를 사용하여 캐싱 로직을 조정할 수 있습니다.

 

 


 

링크

https://cloud.google.com/cdn/docs/best-practices?hl=ko#cache-hit-ratio