서버 과부하의 주요 원인 중 하나는 서버 자원의 한계점 도달
임
보통 서버의 CPU 사용량이 80 - 90%에 도달하거나 메모리가 부족해 계속해서 스와핑이 발생하면 과부하 상태가 됨
👉🏻 모니터링을 통해 자원의 사용 현황을 지속적으로 관찰하고 필요에 따라 자원을 적절히 할당함으로써 서버 과부하를 예방할 수 있음 (자원은 CPU, 메모리, 대역폭 포함)
애플리케이션을 모니터링하고 자원의 용량을 자동으로 조정하는 서비스
서비스 이용 불가능 상태가 발생하기 전에 AWS의 CloudWatch
가 서버 상태를 지속적으로 모니터링하여 필요 시 서버 대수를 자동적으로 늘려줌
이를 통해 트래픽 급증 시에도 안정적인 서비스 제공이 가능함
https://github.com/netdata/netdata (무료 모니터링 서비스)
Netdata
는 무료로 사용할 수 있는 모니터링 도구로 시스템 자원의 실시간 모니터링을 제공함
이를 통해 서버 상태를 실시간으로 파악하고 문제 발생 시 즉작적인 대응이 가능함
slack
과 연동하여 설정한 임계치(Threshold)
를 기반으로 알림 서비스를 구축할 수 있음
트래픽을 여러 서버에 분산시켜 특정 서버에 과부하가 걸리지 않도록 함
예측할 수 없는 사고가 발생하는 것
사후에는 이 사고의 원인 등을 분석할 수 있지만 사전에는 이 사고를 예측할 수 없는 것을 말함
서버 과부하로 인해 발생할 수 있는 서버 중지에 대한 사전 대처가 가능함
이를 통해 활용도가 낮은 페이지와 높은 페이지를 파악하여 서비스 개선에 도움이 됨
Cascading Failure 현상
👉🏻 사용자 입장에서 응답을 오래 기다려야 하는 것은 좋은 UX가 아님, 성공인지 실패인지는 중요하지 않음
❗️중요한 것은 사용자가 기다리지 않아야 한다는 점
서킷브레이커 동작 과정
응답 성공 시 | 응답 실패 시 |
---|---|
closed
, open
, half_open
의 상태값을 가짐
- closed[정상] : 네트워크 요청의 실패율이 임계치보다 낮은 상태, 모든 요청이 정상적으로 처리
- open[에러] : 임계치 이상의 상태로, 요청을 서비스로 전송하지 않고 바로 오류를 반환
- 이를
fail fast
라고 함- half_open[확인중] : open 상태에서 일정 timeout 시간이 지나면 장애가 해결됐는지 확인하기 위해
half_open
상태로 전환됨, 이때 일부 요청을 전송하여 응답을 확인, 장애가 해결되면 closed 상태로, 실패하면 다시 open 상태로 전환
https://github.com/Netflix/Hystrix
👉🏻 넷플릭스가 개발한 서킷 브레이커 라이브러리로, 마이크로서비스 아키텍처에 널리 사용
https://github.com/resilience4j/resilience4j
👉🏻 서킷 브레이커, 레이트 리미터, 리트라이 등의 기능을 제공하는 경량의 폴리시 라이브러리
인프런의 장애 복구 사례 - 불필요한 쿼리 제거
해당 트래픽이 발생하지 않도록 하는 것
gzip
또는 Brotli
를 통해 압축해야 함예를들어, 정적 테스트 페이지를 제공하거나 검색을 비활성화하거나 더 적은 수의 검색 결과를 반환하거나 필수적이지 않는 기능을 비활성화 함
실제 사례
정상 상태 | 대규모 트래픽 발생 당시 |
---|---|