[아키텍처 가이드] CDN과 로드밸런서를 활용한 부하 분산
안녕하세요 네이버 클라우드 플랫폼입니다.
앞으로 저희 블로그에서는
네이버 클라우드 플랫폼이 제공하는 서비스의 레퍼런스 아키텍처에 대해
사용자분들이 보다 쉽게 이해할 수 있도록 각 주제별로 이야기해 나갈 예정입니다.
※ 공식 홈페이지에서 더욱 많은 [레퍼런스 아키텍처]를 알아보세요! ※
https://www.ncloud.com/intro/architecture
이번 포스팅에서는 ‘CDN과 로드밸런서를 활용한 부하 분산’ 을 주제로
레퍼런스 아키텍처를 활용하는 방법에 대해 알아보려 합니다.
CDN과 로드밸런서를 활용한 부하 분산
소규모 인터넷 커뮤니티 웹 사이트를 운영 중이던 ‘Myservice.com’이 아키텍처를 CDN과 로드밸런서를 통해 어떻게 개선하였는지 살펴보도록 하겠습니다.
‘Myservice.com’은 PC 및 모바일 게임을 주제로 하는 웹 사이트를 운영하고 있으며 게임 관련 이미지, 동영상을 업로드, 다운로드하고 주제별로 글을 게시할 수 있는 소규모의 Site였으며, 아래와 같은 아키텍처 구조를 유지하고 있었습니다.
[기존 Myservice.com 아키텍처]
Myservice.com은 접속자 수가 초기 대비 3배로 증가하고, 사용자의 콘텐츠 업로드가 늘어나면서 대용량 파일에 대한 처리 횟수가 증가하였습니다. 또한 규모가 커짐에 따라 이벤트 기간에 사용자의 몰림 현상이 심해져 웹 사이트 접속 불가 및 파일 다운로드 속도가 느려지면서 고객 불만이 늘어나고 있었습니다. Myservice.com이 가지고 있던 문제점을 정리하면 아래와 같습니다.
- 서버(web, app server) 부하로 장애 발생
: 네트워크 트래픽이 특정 서버로 집중되어 트래픽 분산이 필요
- 느린 페이지 로딩 속도로 인한 고객 이탈
: 첫 페이지 내에 로딩해야 하는 고용량 이미지 파일이 많아 웹 페이지 로딩 속도가 느려 개선 필요
- 대용량 파일 다운로드, 스트리밍을 시 느린 속도로 인한 이용자의 불만 제기
: 동시에 많은 사용자가 동일한 콘텐츠에 접근하여 서버 부하로 인한 속도 저하 현상 발생
Myservice.com 운영을 담당하는 백 대리는 ‘웹 사이트에 대한 부하 분산’을 주제로 한 네이버 클라우드 플랫폼이 제공하는 레퍼런스 아키텍처를 발견하게 되었습니다. (https://www.ncloud.com/intro/architecture/4)
레퍼런스 아키텍처 중 CDN과 Load Balancer를 활용한 아키텍처에서도 ‘CDN 서비스를 통한 부하 분산’에 대해 눈여겨보게 되었는데요, 그 아키텍처는 아래와 같습니다.
<레퍼런스 아키텍처 — CDN과 Load Balancer를 활용한 부하 분산>
백 대리는 해당 아키텍처를 살펴보던 중 Myservice.com이 운영 중인 Web Server와 Application Server, DB 서버로 분리되어 있는 3tier 구조로 동일하게 되어 있으나 로드밸런서, CDN이라는 2가지의 차이를 발견했습니다.
1. 로드밸런서 도입
우선 발견한 점은 Web Server와 App Server 사이에 위치한 로드밸런서를 통해 서버 부하를 분산하도록 설계되어 있는 점이었습니다. Web Server 3대, App Server 2대로 인입되는 트래픽을 로드밸런서를 도입하게 되면, 사전에 설정한 로드밸런서가 분기하는 방식(Round Robin, Least Connection, Source IP Hash)에 따라 분산 처리가 가능합니다.
백 대리는 현재 운영 중인 Web Server와 App Server의 성능 및 Spec이 동일하게 구성되어 있어 Least Connection 방식의 분산 방식을 선택하여 운영하기로 하였습니다. 로드밸런서가 분기하는 방식에 대한 내용은 아래와 같습니다.
즉, 로드밸런서에 연결된 서버 중 특정 서버에 장애 발생 시, 자동으로 다른 서버로 부하를 분산하도록 하여 높은 안정성을 보장하게 됩니다.
아래 그림에서 보시는 것처럼 총 3대의 웹 서버가 로드밸런서를 통해 트래픽을 처리하던 중, 3번째 서버가 장애 발생 시, 로드밸런서는 나머지 정상적인 2대의 서버로 트래픽을 처리하도록 하여 장애 없는 서비스 구현이 가능하게 됩니다.
[장애 발생 시 로드밸런서 서비스 분기]
로드밸런서의 주요 기능은 아래와 같습니다.
1) SSL 인증 설정
- CA에서 발급받은 SSL 인증서를 Certificate Manager에 등록 후 적용 가능
2) LoadBalancer 모니터링
- Concurrent Connection, Connection Per Second, Traffic 등의 모니터링 항목 제공
3) 세션 관리
- Connection idle timeout, HTTP Keep-alive 설정 가능
4) 다양한 서버 부하 분산 방식 제공
- Round Robin, Least Connection, Source IP Hash 방식으로 분산 기능 제공
이제 백 대리는 로드밸런서를 통해 특정 Web Server, App Server의 장애 시에도 정상 Server로 서비스를 정상 처리하여 안정적으로 시스템을 운영할 수 있습니다!
2. CDN 도입을 통한 부하 분산
백대리는 로드밸런서 도입과 함께 CDN에 대한 도입에 대해서도 도입 시 어떤 효과가 있을지, 왜 도입이 필요한지에 대한 의문이 있었습니다. 여기서 간략하게 CDN이 왜 필요한지 짚고 넘어가고자 합니다.
1) CDN이 필요한 이유
CDN도입 전에는 사용자가 브라우저를 통해 Http(https) 프로토콜로, 사용자의 모든 요청 중 Static Contents에 대해 Web Server를 통해 결과를 리턴하게 됩니다. 요청에 대한 응답은 HTML 파일이라는 텍스트 데이터나 이미지, 동영상 등의 바이너리 데이터로 구성됩니다. 일반적인 3 tier 구조의 아키텍처에서 Static Contents의 경우 데이터 갱신 빈도가 낮으므로 WAS나 DB를 거치지 않고 Web Server가 리턴하도록 동작합니다.
하지만 사용자의 요청이 증가하고 트래픽이 갑자기 증가하거나 Contents 양이 증가하는 경우 Web Server의 부하가 집중되어 서비스 안정성이 저해되고 장애가 발생할 가능성이 있습니다. 이때 CDN 도입을 통해 Web Server의 부하를 줄일 수 있습니다.
[하나의 웹 서버에 다수의 클라이언트가 동시 접속]
CDN 이란 (Content Delivery Network, CDN)로 콘텐츠의 빠르고 효율적인 전송을 돕는 ‘콘텐츠 전송 네트워크’를 뜻합니다. 분산되어 있는 캐시 서버에 콘텐츠를 옮겨 두었다가 사용자의 요청이 있을 때 사용자에게서 가장 가까운 서버에서 해당 콘텐츠를 전달하는 용도로 사용합니다.
[Cached Contents에 대해 사용자에게 전달]
백대리가 운영 중인 myservice.com의 경우 게임 관련 이미지, 동영상 등 콘텐츠 업로드되어 웹 사이트 내에 보관 중인 Static Contents가 점점 증가하고 있는 상황입니다. 이러한 Static Contents의 경우 잦은 조회, 다운로드, 업로드에 대한 요청이 증가하는 경우 Web Server에 부하를 가져오게 됩니다.
CDN 도입 시 빠른 콘텐츠 제공 속도는 매우 중요합니다. Static Contents에 대해 Web Server가 아닌 CDN을 통해 사용자의 위치와 가까운 곳에 있는 CDN Cache Server에서 데이터를 리턴합니다. 예를 들면 서울에 있는 사용자는 서울에 있는 Edge 서버에서, 부산 사용자는 부산 Edge서버에서 이용하여 사용자가 분산된 서버를 통해 이용하는 효과가 있습니다.
아래는 CDN 사용 시의 속도 비교를 위해 CDN을 통해서 이미지 파일을 접근했을 때와, 원본 서버(Object Storage 사용)에 직접 접근했을 때의 속도를 비교한 데이터입니다. Naver Cloud Platform Global CDN으로 15MB 파일에 대한 3회 접근 시의 평균 값입니다. CDN 사용 시 원본 서버로 직접 접근 시 보다 소요 시간이 1/6로 줄어드는 것을 볼 수 있습니다. (사용자의 네트워크 접속 환경이나 통신사 사정에 따라 결과는 다르게 나올 수 있는 점 참고 부탁드립니다.)
[CDN 사용 시 속도 비교 : 15MB 파일]
이처럼 Web site 운영자의 입장에서는 Web Server에만 집중되던 Static Contents에 대한 부하를 분산하고 안정적인 시스템을 유지할 수 있습니다. 또한 Web Site 방문자의 입장에서는 Static Contents에 대한 다운로드에 대해 가까운 Edge Server를 통해 서비스되므로 보다 빠른 속도로 이용이 가능합니다. 예를 들어, 첫 번째 사용자의 경우, 아직 Caching 된 내역이 Edge Server에 없어 Origin인 Object Storage를 통하게 되어 총 100ms의 속도가 걸렸다면(Cache Miss), 두 번째 사용자부터는 CDN에 Cache된 내역을 통해 Contents 이용이 가능하여 90ms를 절감한 10ms의 속도로 서비스 이용이 가능합니다.(Cache hit)
[Cache Miss, Cache Hit]
CDN은 HTML, CSS, JavaScript, 이미지, 영상, 게임 설치 파일, 매뉴얼과 같은 Static Contents에 대한 웹 캐싱과 다운로드 서비스를 제공합니다. 또한 미디어 콘텐츠의 끊김 없는 스트리밍 서비스 등 많은 분야에서 활용합니다.
[Myservice.com 홈페이지 화면 구성 요소]
Myservice.com의 경우 홈페이지 구성 요소에 대해 살펴 본 결과 Image가 약 67%를 차지하고 있어 이미지에 대한 빠른 로딩이 필요한 상황이었기 때문에, 페이지 내에서 사용되는 고용량 이미지에 대해 CDN을 이용하여 페이지 로딩 속도를 개선하여 느린 웹 페이지 접속에 따른 사용자의 이탈을 막을 수 있었습니다.
본 레퍼런스 아키텍처에서는 Object Storage를 Origin으로 구성하였으며, 버킷 및 파일 단위로 권한 관리가 가능하여 지정한 사람에게 버킷 또는 파일을 공유할 수 있습니다.
Object Storage는 비용 효율이 좋으며 사용량을 예측하기 어려운 경우 저장 공간을 GB~PB 단위로 사업 규모에 따라 확장할 수 있으므로 확장성이 좋습니다. 이처럼 무한대의 저장 공간과 높은 가용성을 가진 스토리지를 이용해서 서비스를 제공하게 되면 높은 안정성을 가진 서비스를 제공할 수 있으며, 원본으로 Object Storage 활용 시 CDN+ <-> Object Storage 간에 발생하는 네트워크 전송 요금은 무과금 처리됩니다.
또한 별도로 Origin 서버를 관리하고 있는 경우 Custom Origin 지정이 가능하며 도메인 단위로 지정하는 것이 좋습니다.
2) 네이버 클라우드 플랫폼의 CDN
■웹 사이트 콘텐츠가 가장 가까운 데이터 센터에서 제공되므로 페이지 로드 속도가 향상됨
국내 모든 통신사 망 기반으로 CDN Edge 서버가 구축되어 있어, 특정 회선 문제 발생 시 우회가 가능한 안정적인 서비스입니다.
■대용량 트래픽에 대하여 고객에게 안정적이고 빠른 전달 가능
트래픽에 대한 제한이 없으며, 100GPS 이상 사용 시에 사전에 고객센터를 통해 예상되는 트래픽 양에 대해 사전 요청을 주시면 대용량 트래픽을 수용할 수 있도록 사전에 증설을 진행하며, 모니터링을 통해 안정적인 트래픽을 빠르게 전달할 수 있도록 지원합니다.
■분산된 CDN 서버 사용을 통해 단일 중앙 서버에 집중될 수 있는 대역폭 분산
Static Contents 요청에 대하여 CDN으로 분기하여 웹 서버의 부하를 분산합니다.
■콘텐츠 글로벌 가용성 향상
웹 서비스의 글로벌 확장 시 GCDN 상품을 활용하시면 전 세계에 분산된 글로벌 Edge 서버에서 해외 사용자에게 빠르게 콘텐츠 전달합니다.
■콘텐츠 보안 기능 (HTTPS 전송 및 SSL 인증서 설정, Secure-Token 기반 보안 URL 사용)
HTTPS 전송을 위해 SSL 인증서를 등록하면 원본 서버와도 HTTPS로 통신하여 콘텐츠 전송 경로에서 보안이 강화됩니다. 또한 Secure-Token을 통해 인가된 접근에만 콘텐츠를 전달하도록 설정이 가능합니다.
■대시 보드를 통한 사이트 트래픽, 대역폭 사용량 등에 대한 자세한 사용량 분석
대시 보드를 통해 CDN 운영 및 모니터링에 필요한 여러 지표(사이트 트래픽, 대역폭 사용량, 요청 수, 요청 대비 Cache hit, 응답 코드 (2xx, 3xx, 4xx, 5xx) 별 건수, 원본 서버 트래픽, 원본 서버 응답 코드 (2xx, 3xx, 4xx, 5xx) 별 건수에 대해 확인하여 CDN 활용률을 높일 수 있습니다.
3. CDN 효율 향상 기능
1) Ignore Query String
원본 서버에서 Query String에 관계없이 동일한 콘텐츠를 응답할 경우 ‘사용’으로 선택하여 URL에 포함된 Get 파라미터를 제거하여 캐싱 효율을 높이고 원본 요청과 부하를 줄일 수 있습니다. Get 파라미터별로 다른 응답을 하는 경우에는 ‘사용 안 함’으로 선택이 필요합니다.
참고로 네이버 클라우드 플랫폼의 CDN+에서는 기본으로 사용 안 함으로 세팅되어 있습니다.
예를 들어 cdn.example.ntruss.com/file.png?query=12345 에서 파일 명 뒤에 위치하는 ?query=12345에 대해 관계 없이 동일한 콘텐츠를 응답할 경우에 ‘사용’으로 선택하시면 됩니다.
2) Secure Token
인가되지 않은 접근에 대해서는 콘텐츠를 전달하지 않도록 설정할 수 있는 기능으로 불필요한 접근에 대해서는 접근통제를 할 수 있습니다. Secure Token은 Java/Python 등의 각 언어 별 폴더에서 사용 언어 코드에 따라 선택하여 생성할 수 있습니다. 또한 Token 유효 시작, 만료 시간, 경로 조건에 따라 활용하여 생성할 수 있어 기간 별 접근 관리가 가능합니다.
3) Referrer Domain
콘텐츠가 지정된 도메인에만 제공되게 하여 다른 사이트에서 참조되는 것을 방지하는 기능입니다. 레퍼러가 없는 요청에 대해 접근 제어를 설정할 수 있는 기능으로, 등록된 레퍼러에만 허용하도록 ‘허용 안 함’으로 선택하여 불필요한 접근을 통제할 수 있습니다.
4) Gzip Compression
Gzip 파일 압축은 파일이 서버에서 전송되기 전에 파일 크기를 줄여서 파일 전송 속도를 개선하고 페이지 로드 성능을 높이는 간단하고 효과적인 방법입니다. 파일 압축을 통해 대역폭 비용을 절감하고 응답 속도를 개선하여 사용자에게 반응이 빠른 환경을 제공할 수 있습니다.
글을 마무리하며…
클라우드 환경에서 소규모로 구축했던 웹 서비스가 접속자 수가 늘어나고, 트래픽 양이 증가함에 따라 점점 웹 서버에 부하가 가중되어 이를 어떻게 개선해야 할지 고민하게 됩니다. Myservice.com을 운영하는 백대리는 안정적인 서비스를 유지하고 트래픽을 원활하게 처리하기 위해 아래의 2가지를 통해 개선하여 웹 서비스의 품질도 개선하고 사용자 만족도도 올릴 수 있었습니다.
1) 로드 밸런서를 통한 웹 서버의 부하 분산
2) 정적인 Resources를 CDN 서비스를 통해 빠른 콘텐츠 속도 제공 및 Web 서비스가 받는 부하 분산
Myservice.com을 운영하는 백대리가 레퍼런스 아키텍처를 통해 시스템을 개선한 것처럼,
네이버 클라우드 플랫폼의 다양한 상품을 활용하여 효율적인 인프라 구성을 해 볼 수 있습니다!
지금까지 긴 글 읽어주셔서 감사합니다.
[참고 자료]
■ 로드밸런서 사용자 설명서
■ CDN+ 사용자 설명서