본문으로 바로가기

12

CDN

같은 파일을 100만 명에게 100만 번 보낼 필요는 없다

먼저 보면 좋은 강의: 웹 요청의 해부, 지연 시간과 처리량

단계별로 보기

스페이스바로 재생/정지, 좌우 화살표로 단계 이동, R로 처음으로 돌아갑니다.

대기 중1 / 4 단계 — 본사가 전부 감당할 때

초당 300건이 모두 원본 서버로 갑니다. 원본은 초당 100건이 한계입니다. 나머지 200건은 줄을 서다가 버려집니다. 그런데 이 300건 중 대부분은 로고와 상품 사진 같은, 모든 사용자에게 똑같은 파일입니다. 같은 파일을 300번 다시 만들어 보내고 있는 셈입니다.

유입 요청초당 300건
처리 완료초당 100건

이 강의를 마치면

  • 요청을 '사람마다 다른 것'과 '모두에게 똑같은 것'으로 나눌 수 있음을 설명한다.
  • 똑같은 것을 사용자 가까이에 복사해 두면 원본 서버의 부하가 어떻게 줄어드는지 관찰한다.
  • CDN의 적중률이 원본 부하를 몇 분의 일로 줄이는지 계산한다.
  • CDN이 해결하지 못하는 요청(개인화·쓰기)이 무엇인지 구분한다.

요청은 두 종류다

화면 하나를 열 때 브라우저는 보통 요청을 수십 개 보냅니다. 그 요청들을 나눠 봅시다.

종류사람마다 다른가
정적로고 이미지, 글꼴, 스크립트, 상품 사진아니오. 전원에게 똑같다
동적내 장바구니, 내 알림, 내 잔액예. 사람마다 다르다

숫자로 보면 놀랍습니다. 전형적인 서비스에서 요청 수와 데이터 양의 80~95%가 정적입니다. 로고 이미지 하나를 100만 명이 봤다면, 본사 서버는 같은 파일을 100만 번 보낸 셈입니다.

그래서 복사해 둔다

이 지점에서 아이디어는 아주 단순해집니다.

어차피 똑같은 파일이면, 사용자 가까이에 미리 복사해 두고 거기서 주면 되지 않나?

이것이 CDN(콘텐츠 전송 네트워크)입니다. 전 세계 수백 곳에 창고를 두고, 자주 나가는 파일의 복사본을 그 창고들에 뿌려 둡니다. 사용자는 자기 나라의, 때로는 자기 도시의 창고에서 파일을 받습니다.

본사 대리점 비유가 정확합니다. 전국의 손님이 서울 본사로 물건을 받으러 오면 본사가 마비됩니다. 각 지역에 대리점을 두고 잘 나가는 물건을 미리 채워 두면, 손님은 동네에서 받고 본사는 대리점에 재고를 보낼 때만 일합니다.

부하가 어떻게 줄어드는가

이 강의에서 가장 중요한 계산입니다. 적중률은 CDN 창고가 원본에 묻지 않고 바로 답한 비율입니다.

들어오는 요청           초당 300건
CDN 적중률              85%
────────────────────────────────
CDN이 처리              초당 255건
원본까지 가는 요청       초당  45건

원본 서버는 300이 아니라 45만 감당하면 됩니다. 거의 7분의 1입니다. 적중률이 95%가 되면 15건, 20분의 1이 됩니다.

적중률이 조금만 올라도 원본 부하가 크게 떨어진다는 점에 주목하세요. 85%에서 95%로 올리면 적중률은 10%p 올랐을 뿐인데, 원본 부하는 3분의 1이 됩니다. 적중률에서 중요한 건 남은 미스의 크기(15% → 5%)이지 적중 쪽 숫자가 아닙니다.

CDN이 주는 두 번째 선물

부하만이 아닙니다. 거리도 줄어듭니다. 서울 사용자가 버지니아 서버에서 이미지를 받으면 왕복만 200밀리초가 넘습니다. 서울 창고에서 받으면 몇 밀리초입니다. 파일 수십 개를 받아야 하는 페이지에서는 이 차이가 그대로 체감 속도가 됩니다.

거리 이야기는 다음 강의에서 본격적으로 다룹니다.

CDN이 못 하는 것

CDN은 모두에게 똑같은 것만 대신할 수 있습니다.

  • 내 장바구니는 나만의 것이므로 창고에 둘 수 없습니다.
  • 주문하기, 결제하기 같은 쓰기는 반드시 원본까지 가야 합니다.
  • 방금 바뀐 가격을 창고가 아직 옛날 값으로 들고 있을 수 있습니다.

이 문제(무효화)는 캐싱 단원에서 정면으로 다룹니다.

그러니 CDN을 붙였다고 원본이 필요 없어지는 게 아닙니다. 원본은 여전히 필요하고, 다만 훨씬 작아도 됩니다.

결정권자가 알아야 할 것

CDN은 시스템 설계에서 비용 대비 효과가 가장 확실한 축에 드는 조치입니다. 코드를 거의 고치지 않고, 부하의 대부분을 걷어내고, 속도까지 올립니다. "우리 서비스가 느리고 서버비가 많이 나옵니다"라는 보고를 받았을 때 가장 먼저 확인할 것 중 하나가 "정적 파일이 CDN을 타고 있는가"입니다.

직접 해보세요

아래 과제에서 원본 서버는 초당 100건밖에 못 버티는데 초당 300건이 들어옵니다. 서버를 세 배로 늘리는 대신, 앞에 창고를 하나 두고 어떻게 되는지 보세요.

이 강의가 단순화한 것

교육용 모형은 언제나 무언가를 생략합니다. 무엇을 생략했는지 아는 것도 학습의 일부입니다.

전제한 것

  • CDN 적중률을 85%로 고정해서 준다. 실제로는 파일 종류·유효 시간·트래픽 분포에 따라 결과로 정해진다.
  • 전 세계에 흩어진 수백 개 지점을 노드 하나로 뭉쳐서 표현한다. 실제 CDN은 지역별로 적중률이 다르다.
  • 창고에 복사본을 채우는 초기 비용(cold start)과 원본과의 동기화는 모델링하지 않는다.
  • 이 과제의 트래픽은 전부 읽기다. 쓰기는 CDN이 대신할 수 없다.

다루지 않은 것

  • Cache-Control·ETag 등 HTTP 캐시 헤더의 동작
  • Anycast 라우팅과 지역 지점 선택
  • CDN 무효화(purge)의 전파 지연
  • 이미지 최적화·압축 등 엣지에서 하는 변환

더 읽을거리: RFC 9111 — HTTP Caching

이제 직접 만들어 보세요

읽어서 아는 것과 만들어서 아는 것은 다릅니다. 컴포넌트를 배치하고 트래픽을 흘려서 실제로 동작하는지 확인해 보세요.

실습 과제 열기

이 강의에 물어보기

하루 5번

이 강의 본문만 근거로 답합니다. 강의에 없는 내용은 지어내지 않습니다.