Nginx로 동시 사용자 천명 관리하기 (로드밸런싱)

chisae·2024년 1월 24일

끄적이기

목록 보기
6/12
post-thumbnail

안녕하세요, 오늘은 nginx로 이용해서 동시 사용자가 많이 들어올 때
여러 서버에 부하를 나눌 수 있는 로드밸런싱과 관련해서 알아보고자 합니다,
최근 들어 k6를 통해서 API 성능 테스트를 하거나 멀티스레딩과 캐싱으로
큰 정보를 가져올 때 최적화를 시켜 더 빨리 가져오거나 이전에 서비스를 만들면서
뼈저리게 느낀 저의 단점들을 다음 서비스를 시작하기 전 하나씩 채워나가고자 합니다.

왜 Nginx인가?

Nginx란

nginx는 고성능 웹 서버, 리버스 프록시 그리고 이메일 프록시의 기능을 제공하는
오픈 소스 소프트웨어입니다, 가볍고 높은 동시성을 처리할 수 있으며 낮은 메모리 사용량으로
알려져있습니다,

즉, Nginx는 높은 동시성을 처리하고 낮은 메모리를 사용하는 웹 서버입니다.


웹 서버란 무엇인가

  • 웹 서버는 정적 파일을 클라이언트에게 제공하여
    HTML, CSS, JavaScript, 이미지 파일 등을
    서버에서 변경 없이 그대로 제공합니다,
    • Nginx의 역할 : 이때 Nginx는 정적 파일을 빠르고 효율적으로 클라이언트에게 전달하며
      Nginx의 고성능 처리 능력을 통해 웹사이트의 로딩 속도를 향상시키는데 기여할 수 있습니다.


왜? 웹 서버를 사용해야하는가

  • WAS의 부담 분산
    • WAS는 로그인, 회원가입, 정보 업데이트 등 동적 작업량이 많기에
      HTML, CSS, JS 이미지 등 정적인 파일을 클라이언트에게 전달하는 역할을
      웹 서버에 넘겨줌으로써 WAS 작업 부담을 줄일 수 있습니다
  • 보안 기능을 제공
    • 웹 서버는 보안 기능을 제공하여 웹 페이지와 관련된 접근을 제어할 수 잇습니다,
      예를 들어 웹 서버는 SSL/TLS 프로토콜을 사용하여 데이터를 암호화하고, 액세스 제어,
      웹 방화벽 등의 보안 기능을 제공함으로써 웹 사이트를 보호할 수 있습니다
  • 높은 성능을 제공
    • 웹 서버는 대부분 비동기 처리 방식을 사용하여 높은 성능을 제공합니다
      Nginx, Apache 등의 웹 서버는 이벤트 기반, 멀티 프로세싱, 스레드 풀 등의 기술을 사용하여
      수천 대의 클라이언트 요청을 동시 처리가 가능합니다.


WAS란? (Web Application Server)
WAS는 클라이언트 요청에 대해서 동적인 처리를 담당하는 영역입니다,
실질적인 로직을 처리하는 영역으로 DB 연동, 트랜잭션 관리, 보안, 로깅 등의
기능도 제공하고 있으며 대표적으로 Tomcat, WebLogic, JBoss 등이 있습니다.



주요 기능(특징)

  • 리버스 프록시
    • 왜 중요한가?
      : 리버스 프록시는 클라이언트와 백엔드 서버 사이에서 중개자 역할을 하여
      보안을 강화하고 효율적인 트래픽 관리를 가능하게 해줍니다,
    • 문제 해결
      : Nginx를 리버스 프록시로 사용하면 외부 요청을 적절한서버로 라우팅하고
      SSL/TLS 종료, 캐시 관리 등을 통해 성능을 최적화하고 보안을 강화할 수 있습니다.
  • 로드 밸런싱
    • 왜 중요한가?
      : 로드 밸런싱은 여러 서버에 걸쳐 트래픽을 균등하게 분산시켜
      서버 과부하를 방지하고 서비스의 가용성을 높이는데 중요합니다
    • 문제 해결
      : Nginx를 통한 로드 밸런싱은 트래픽이 증폭하는 상황에서도
      웹사이트가 안정적으로 작동하도록 도와주며, 서버 다운타임을 최소하하고
      사용자 경험을 개선합니다.
  • 캐싱
    • 왜 중요한가?
      : 캐싱은 자주 요청되는 콘텐츠를 임시로 저장하여, 같은 요청이 들어왔을 때
      빠르게 응답할 수 있게 합니다, 이는 서버의 부하를 줄이며 응답 시간을 단축시킵니다
    • 문제 해결
      : Nginx의 캐싱 기능은 서버의 처리량을 증가시키고,
      사용자에게 더 빠른 콘텐츠 로딩 경험을 제공합니다, 결과적으로
      웹사이트의 전반적인 성능이 향상됩니다.

그리고 오늘은 이중에서 로드 밸런싱을 Nginx의 주요 기능 중 하나인
로드 밸런싱을 활용해서 여러 사용자 요청을 받아보도록 하겠습니다.



실습 조건

로드 밸런싱을 사용하게 되면 어떤식으로 동작하는지 위 이미지를 참고하시면 될 거 같습니다,
여러 클라이언트가 요청 → Nginx에서

또한 로드 밸런싱을 사용함으로써 성능이 향상되는걸 보기 위해선 동일한 조건에서 이루어져야 합니다

1. 200명에서 5초 동안 점차적으로 증가
2. 15초 동안 1000명의 가상유저 유지
3. 5초 동안 점차적으로 가상유저를 0으로 감소

이 조건을 지키면서 서버를 1개 사용했을 때와 서버 3개를 사용했을 때를 비교해서
로드 밸런싱을 통해 얼만큼 좋아졌는지 알아봅시다.



로컬으로 시도

일단 aws나 네이버 클라우드로 서버를 열어서 테스트해보고 싶지만
혹시나 로컬으로 실행해도 괜찮은지 궁금하기에 로컬으로 시도해보겠습니다.

인텔리J에서 실행 구성을 여러가지 만들어 포트번호 8081, 8082, 8083에서 실행해봤습니다.

그리고 세가지 서버를 다 실행해주었습니다.

그리고 Nginx.conf를 수정해주었습니다,
'upstream' 지시어를 사용하여 어러 서버를 그룹화 하여
로드 밸런싱 해주었습니다.

깨지고 부서지다

로컬에서 로드 밸런싱을 포함한 성능 테스트를 해볼까 하는 저의 생각은
불과 1시간만에 깨지고 부서지게 됐습니다, 로컬 환경과 실제 서비스 환경은 당연히 다르며
이 두가지의 차이점을 제대로 숙지하지 못하고 이런 생각을 하게 된 거 같습니다,

그럼 지금부터 로컬에서 로드 밸런싱 실습을 했을 때 부적절한 이유를 설명드리도록 하겠습니다.

  • 리소스 제한
    : 로컬 환경은 일반적으로 제한된 자원(메모리, CPU등)을 가지고 있어서
    여러 인스턴스를 동시에 실행하는 것이 성능 저하를 초래할 수 있습니다
  • 네트워크 환경 차이
    : 로컬 환경에서는 모든 요청이 같은 네트워크(대개는 로컬호스트)를 통해 이루어졌기에
    실제 분산 환경에서 발생할 수 있는 네트워크 지연, 네트워크 병목 현상, 네트워크 오류 등을 제대로
    시뮬레이션 하기 적절하지 않습니다.
  • 가용성과 신뢰성
    : 실제 운영 환경에서 로드 밸런싱의 주 목적은 가용성과 신뢰성을 높이는 것입니다,
    하지만 로컬 환경에서는 하드웨어나 네트워크 장애에 대한 내성 테스트를 하기 부적절합니다.



aws에 서버 열기

서버 1개의 경우

그래서 AWS로 서버 하나를 켜서 실행하고 테스트했습니다...

  • 성공률 (is status 200)
    : 상당수의 요청이 성공적으로 처리되었으나, 일부 요청에서 실패가 발생했습니다 (89% 성공률).
  • 응답 시간 (response time is less than 2000ms)
    : 많은 요청이 2000ms 이상 걸렸습니다 (90% 성공률).
  • 평균 대기 시간 (http_req_waiting)
    : 평균 대기 시간이 약 709.83ms로, 서버 3개를 사용했을 때보다 훨씬 긴 시간이 걸립니다.

최대 응답 시간: 최대 응답 시간이 25.2초로, 서버 3개를 사용했을 때보다 더 길게 나타났습니다.


서버 3개의 경우

  • 성공률 (is status 200)
    : 거의 모든 요청이 성공적으로 처리되었습니다 (99% 성공률). 오직 1개의 요청만 실패했습니다.
  • 응답 시간 (response time is less than 2000ms)
    : 대부분의 요청이 2000ms 이내에 처리되었습니다 (99% 성공률).
  • 평균 대기 시간 (http_req_waiting)
    : 약 25.52ms로, 서버가 요청을 처리하는 데 걸리는 시간이 매우 짧습니다.

두 경우를 비교

  • 성공률 비교:
    • 서버 3개 사용 시의 성공률: 99.99%
    • 서버 1개 사용 시의 성공률: 89%
  • 응답 시간 비교:
    • 서버 3개 사용 시의 평균 대기 시간 (http_req_waiting): 25.52ms
    • 서버 1개 사용 시의 평균 대기 시간 (http_req_waiting): 709.83ms

두 경우를 비교했을 때 서버 3개를 사용했을 때가 서버 1개를 사용했을 때보다
성공률이 약 11% 정도 더 높으며, 응답 시간은 약 96% 정도 개선되었습니다,
무엇보다도 k6를 실행하면서 오류 메시지가 잡히지 않았습니다.

추가로 서버 1개의 경우 최대 응답 시간이 매우 길어졌기에 일부 요청에 대한 처리가
지연되었습니다, 이는 서버가 과부하 상태에 빠졌을 가능성이 보이며 부하 분산을 통해서
1개에 서버로 보내지던 요청이 여러 서버에 분산되어 처리되기에 전체 시스템의 처리 능력이
향상된 것을 볼 수 있었습니다.



얻은 점

이번 포스팅을 통해서 몇 가지 더 자세히 알게된 점이 있는 거 같습니다.
Nginx가 무엇인지, 로드 밸런싱의 이해, 부하 테스트 도구 활용
이렇게 3가지를 더 자세히 알 수 있는 기회였으며

다시 한번 얻은점들을 복기하며 이번 포스팅을 마치도록 하겠습니다.

  • Nginx가 무엇인지
    : Nginx는 고성능 웹 서버이자 리버스 프록시 서버로
    낮은 메모리 사용량과 높은 동시성 처리 능력으로 잘 알려져 있으며
    효율적인 정적 파일 전송 및 웹 사이트의 로딩 속도 향상에 기여합니다.
  • 로드밸런싱의 이해
    : 로드 밸런싱은 여러 서버에 걸쳐 트래픽을 균등하게 분산시켜
    서버의 과부하를 분산시키며 서버 과부하를 방지하고 서비스의 가용성을 높입니다
    (위 내용에서는 서버 3개를 사용함으로써 성능 및 안정성을 향상시키는 활동을 했습니다)
  • 부하 테스트 도구 활용
    : 이전 포스팅에서도 계속해서 k6를 활용해서 API 성능 테스트를 했었는데
    k6의 코드를 변경하여 실제 서비스 환경에서 예상되는 트래픽을 모방하고
    서비스의 성능을 평가할 수 있었습니다.
profile
초보 개발자

0개의 댓글