티스토리 뷰
서버 트래픽이란?
인터넷상에서 서버와 클라이언트 간에 데이터가 교환되는 과정에서 발생하는 통신량을 의미한다. 이 통신량은 웹 페이지 요청, 파일 전송, 데이터베이스 조회 등 다양한 형태로 나타난다. 서버 트래픽은 웹 사이트나 애플리케이션의 인기도, 사용자 수, 콘텐츠 크기 등에 영향을 받는다.
*서버 트래픽 과부하란?
-서버가 동시에 처리해야 할 요청이나 데이터 전송량이 과도하게 증가하여 서버의 처리 능력을 초과하는 상황을 의미한다. 서버 트래픽은 파일 크기, 페이지 요청 수, 동시 접속자 수 등 다양한 요소에 영향을 받는다. 일반적으로 웹 사이트나 어플리케이션의 인기도가 높아서 사용자가 많아짐에 따라 서버 트래픽이 증가하게 된다. 서버 트래픽 과부하가 발생하면, 서버의 응답 속도가 느려지거나 서비스 중단과 같은 문제가 생길 수 있기 때문에 과부하 상황에 대해 효과적으로 관리하고 대응을 할 필요성이 있다.
서버 트래픽 과부하에 대한 예방과 대처 방법
- 캐싱: 정적 콘텐츠 및 동적 콘텐츠에 대한 캐싱 전략을 사용하여 서버의 부하를 줄인다.
- 로드 밸런싱(load balancing): 로드 밸런서를 사용하여 여러 서버에 트래픽을 분산시키고, 서버의 부하를 줄인다.
- Auto-scaling: 클라우드 기반의 자동 확장 기능을 사용하여 서버의 리소스를 동적으로 조절하고 부하를 관리한다.
- 성능 최적화: 웹 사이트의 성능을 개선하여 빠른 응답 시간을 제공하고, 서버 부하를 줄인다. 예를 들어, 이미지 최적화, 스크립트 및 스타일시트의 최소화 등이 있다.
- 분산 시스템 사용: 서버를 여러 지역에 분산 배치하여 고객의 요청을 가까운 서버로 전달하고 서버 부하를 줄인다.
- 트래픽 모니터링 및 분석: 서버 트래픽을 실시간으로 모니터링하고 분석하여 트래픽의 추이와 예상 부하를 파악한다.
- 용량 확장(Scaling Up): 서버의 리소스를 증가시켜 처리능력을 향상시킨다. 예를 들어, CPU, 메모리, 디스크 공간 등을 업그레이드한다.
- 수평 확장(Scaling Out): 서버의 수를 늘려 처리능력을 향상시키고, 로드 밸런서를 사용하여 트래픽을 분산시킨다.
- 백업 서버 활성화: 과부하 상황에서 백업 서버를 활성화하여 요청을 처리한다.
- DDos 공격 대응: 공격 대응 솔루션을 사용하여 악의적인 트래픽을 차단하고, 서버 부하를 줄인다.
- 트래픽 제한: 과도한 요청을 제한하여 서버 부하를 줄인다. 예를 들어, 사용자 별 요청 속도 제한, IP 차단, API 요청 제한 등이 있다.
- 장애 조치(Failover) 전략: 서버에 문제가 발생할 경우를 대비해 다른 서버로 자동 전환되도록 장애 조치 전략을 구축한다. 이를 통해 서비스 중단 시간을 최소화하고 트래픽을 안정적으로 처리할 수 있다.
이 외에도, 트래픽 과부하를 효과적으로 대응하기 위해서는 시스템의 성능과 안정성을 지속적으로 모니터링하고 관리해야 한다. 이를 위해 서버 모니터링 도구를 사용하여 서버 상태를 실시간으로 확인하고, 문제가 발생할 경우 즉시 대응할 수 있도록 준비해야 한다.
*위에서 언급된 '성능 최적화'를 할 수 있는 방법들에 대해서 알아보자.
- 미니파이(minify) 및 압축: JavaScript, CSS, HTML 파일을 미니파이하고 압축하여 파일 크기를 줄인다.
(압축의 경우, 대표적으로 GZIP 압축 방식이 있다.) - 캐싱 활용: 브라우저 캐싱, 서버 캐싱, CDN을 사용하여 자주 사용되는 리소스를 효율적으로 전달한다.
- 코드 최적화: 코드를 정리하고, 중복 코드를 제거하며, 비효율적인 로직을 개선한다.
- HTTP 요청 최소화: CSS 스프라이트 사용, 인라인 스타일 및 스크립트 사용을 최소화하고, 여러 파일을 병합하여 HTTP 요청 수를 줄인다.
- 비동기 로딩 사용: JavaScript 및 CSS 파일을 비동기로 로드함으로써 페이지 렌더링을 차단하지 않는다.
- 웹 폰트 최적화: 필요한 글꼴 스타일 및 가중치만 로드하고, 글꼴 파일을 압축하여 전송한다.
- 서버 응답 시간 개선: 서버 성능을 최적화하고, 데이터베이스 쿼리를 개선하며, 필요하다면 로드 밸런서를 사용한다.
- 이미지 최적화: 이미지를 압축하고 적절한 해상도와 포맷을 사용하여 페이지 로딩 시간을 줄인다.
- 지연 로딩(Lazy Loading) 적용: 페이지의 모든 컨텐츠가 아닌 사용자가 현재 볼 수 있는 부분만 로드하도록 구현한다. 이를 통해 초기 로딩 시간을 줄일 수 있다.
- HTTP/2 프로토콜 사용: HTTP/2는 HTTP/1.1에 비해 향상된 성능과 효율성을 제공한다. 병렬 다중 요청을 지원하며, 헤더 압축과 서버 푸시 기능을 제공한다.
부연 설명
*로드 밸런싱이란?
-여러 대의 서버에 들어오는 네트워크 트래픽이나 처리 요청을 각 서버에 골고루 분산시키는 과정이다.
로드 밸런싱을 사용하면 서버에 부하를 줄이고, 리소스를 효율적으로 사용하며, 응답 시간을 개선할 수 있다. 이를 통해 전체 시스템의 성능과 안정성을 향상시킬 수 있다.
-로드 밸런싱은 '하드웨어' 또는 '소프트웨어' 기반의 로드 밸런서를 사용하여 구현된다. 즉, 종류가 하드웨어 또는 소프트웨어 두가지가 있다는 것이다.
(상황에 맞춰서 적합한 방법을 선택하여 사용하면 된다. 실제로는 '소프트웨어' 기반의 로드 밸런서를 많이 사용한다.)
-소프트웨어 기반의 로드 밸런서로는 대표적으로 '리버스 프록시 서버', '클라우드 기반 로드 밸런서'가 있다.
리버스 프록시 서버는 대표적으로 Nginx가 있다. 리버스 프록시 서버는 서버 앞에 위치하여 들어오는 여러 요청을 분산시키는 역할을 한다. 어떤 프로그래밍 언어든 상관없이 사용할 수 있다는 장점이 있다.
클라우드 기반 로드 밸런서는 대표적으로 AWS ELB, Google Cloud Load Balancing이 있다. 이 방법은 특히 클라우드 환경에서 서버를 운영할 때 더욱 편리하게 이용할 수 있다. 그리고 이 또한 프로그래밍 언어든 상관없이 사용할 수 있다는 장점이 있다. 이를 제공하는 업체마다 소프트웨어를 기반 또는 하드웨어 기반으로 다양하게 제공하기 때문에 사용 목적에 따라 알맞게 사용하면 된다.
-Node.js의 경우 로드 밸런서를 지원하는 모듈이 있다. '클러스터' 모듈인데, 이는 '프로세스'를 여러개 생성함으로써 '멀티 프로세스' 환경을 만들어 준다. Node.js의 싱글 스레드 제약을 극복하고 서버의 처리 능력을 향상시킬 수 있다. 그리고 이 클러스터 코듈은 '소프트웨어 기반'의 로드 밸런서이다.
(이 클러스터 라는 모듈은 Node.js에서만 지원하는 기능이지만, 프로그래밍 언어마다 비슷한 기능을 하는 라이브러리들이 존재한다.)
-로드 밸런싱은 다양한 알고리즘에 의해 구현된다. 그 중 대표적인 알고리즘 방식은 '라운드 로빈' 방식이다.
*참고로 라운드 로빈(Round Robin)은 CPU 스케줄링에서도 사용되는 알고리즘이다. 로드 밸런싱과 CPU 스케줄링에서 사용되는 라운드 로빈 알고리즘의 기본 원리는 동일하다.
로드 밸런싱에서 사용되는 라운드 로빈은 클라이언트의 요청을 여러 서버에 순처적으로 분배하여 모든 서버에 '고르게' 요청을 분산시키도록 해준다.
CPU 스케줄링에서의 라운드 로빈도 이와 비슷하다. 모든 프로세스들에게 CPU를 사용할 수 있는 시간을 '고르게' 분배하여 모든 프로세스들에게 공정한 기회를 제공한다.
*참고로 Node.js를 사용하여 서버를 구현한 경우에는 worker_thread 모듈을 사용하여 서버 성능을 개선할 수 있다. 본래 Node.js는 single thread의 특징을 가지고 있기 때문에 그에 따른 장점도 있지만, 복잡하거나 방대한 데이터를 처리하는 서버의 역할에 적합하지는 않다. 하지만 worker_thread 모듈을 사용하여 메인 스레드의 개수를 늘림으로써 서버의 성능을 개선할 수 있다.
(worker_thread 모듈은 위에서 언급한 '클러스터'와 다른 개념이다. 클러스터의 경우 '프로세스'를 생성하는 것이고, worker_thread 모듈은 '스레드'를 생성하는 것이다. 둘 다 결국 성능 향상을 도와주는 역할을 하지만 상황에 맞게 사용해야 한다.)
*Auto-scaling이란?
-클라우드 컴퓨팅에서 자주 사용되는 기능으로, 애플리케이션의 요구에 따라 자동으로 컴퓨팅 리소스를 조절하는 기능이다. 이 기능은 사용자의 요청이나 트래픽이 증가하거나 감소할 때, 서버 인스턴스의 수를 자동으로 늘리거나 줄여서 성능과 비용 효율성을 최적화하는데 도움이 된다.
예를 들어, 웹 어플리케이션의 트래픽이 급격하게 증가하면, auth-scaling 시스템은 자동으로 추가적인 서버 인스턴스를 생성하여 트래픽을 처리한다. 반대로 트래픽이 감소하면, 불필요한 서버 인스턴스를 종료하여 비용을 절감해준다.
대표적으로 AWS, Google Cloud Platform, Microsoft Azure와 같은 클라우드 서비스 제공 업체에서 자체적으로 제공하고 있다.
-'서버 인스턴스'란 서버에서 실행 중인 개별 환경을 의미한다. 일반적으로 가상화된 환경에서 실행되는 가상 서버이다. 각 인스턴스는 독립된 운영 체제, 스토리지, CPU 및 메모리 리소스를 가지고 있어서 하나의 물리적 서버에서 여러 개의 인스턴스를 동시에 실행할 수 있다. 즉, 가상의 서버를 여러 개 생성하는 것이다.
(실제 물리적인 서버를 여러 대 두어 관리하는 방식과 결정적인 차이는 '가상화' 된 환경에서 실행한다는 점이다.)
이를 사용하면 서버의 수를 늘리거나 줄이는 것이 쉬워지는데, 트래픽이 증가하면 필요한만큼 인스턴스를 생성하여 분산시키고, 트래픽이 감소하면 불필요한 인스턴스를 종료함으로써 비용을 절감해준다. 이는 실제 물리적인 서버를 여러 대 두는 것 보다 확장 및 축소가 용이하기에 더욱 효율적이다.
*미니파이란?
-코드의 공백, 주석, 줄바꿈 등을 최소화 하고 변수명을 짧게 만드는 것을 뜻한다.
-프로그래밍 언어마다 이를 도와주는 라이브러리들이 존재한다.
'기술 노트' 카테고리의 다른 글
IPC란? (0) | 2023.07.02 |
---|---|
쿠키와 세션, OAuth, JWT에 대하여 (0) | 2023.04.29 |
Node.js의 '특징'과 '동작원리' 그리고 JS의 '동작원리' (0) | 2023.04.08 |
DB Index란? (0) | 2023.03.28 |
컴퓨터의 구조와 OS의 관계 (0) | 2023.03.21 |