이번 게시글에서는 한번에 많은 양의 요청이 들어올 때, Scale-Out 을 적용하여 분산 처리하는 방법에 대해 다뤄보려 한다.
1. Scale-Out 적용 전
일단 필자의 지갑 사정이 좋지 않으므로 한 개의 EC2 서버에서 여러 개의 Docker 컨테이너를 만들어서 분산 처리에 대한 효과를 체감해보도록 하겠다.
위 사진과 같이 자바 애플리케이션의 JVM 메모리를 설정하여 다소 적은 요청에도 서버에 부하가 발생되도록 만들었다.
nGrinder를 이용해 30개의 요청을 1분동안 테스트한다.
테스트 결과이다. 에러율 5.7%를 보이면서
서버가 다운되었다.
2. nginx 설치 및 로드밸런스 설정
이제 위 문제를 해결하기 위해 nginx 를 설치하여 분산 처리를 하도록 설정해보겠다.
똑같은 조건의 애플리케이션 컨테이너를 두 개 띄운다. 이때 포트는 각각 8080, 8081 로 해주었다.
nginx 이미지를 다운로드하고 컨테이너를 80 포트로 실행시켜주었다.
서버의 80번 포트로 접속했을 때 위와 같이 뜬다면 잘 작동되는 것이다.
이제 nginx 의 설정을 통해 로드밸런싱을 해주어야 한다.
nginx 컨테이너 내부에 접속하여 nginx.conf 라는 이름의 설정 파일을 수정해야 한다.
vi 명령어를 통해 수정하려 했으나 컨테이너에 vim 이 설치되어 있지 않아서 apt-get update 명령어로 패키지를 업데이트 하고 apt-get install vim 명령어로 vim 에디터를 설치해준다.
이제 nginx.conf 파일을 열고 사진에 보이는 것과 같이 명령줄을 추가해준다. 해당 경로에 있는 add.conf 파일의 설정 정보를 읽어들이겠다는 뜻이다.
nginx.conf 파일을 저장하고 닫았다면 바로 vi add.conf 명령을 통해 파일을 생성하고 열어준다.
그리고 위와 같이 작성해준다. 그러면 80번 포트로 요청이 들어왔을 때, backend 라는 업스트림을 찾아서 알고리즘에 의해 서버를 라우팅시켜준다. 여기서 알고리즘은 별도의 설정을 하지 않으면 라운드 로빈 알고리즘을 사용한다.
(172.17.0.1 은 Docker의 호스트 OS 아이피 주소를 말한다.)
모두 설정해주었다면 service nginx reload 명령을 통해 nginx 서비스를 리로딩하여 설정을 동적 로딩시켜준다.
(이렇게 설정을 마친 컨테이너는 따로 commit 하여 이미지화 해두면 사용하기 편리하다.)
서버 컴퓨터의 80번 포트로 접속하면 아까 ngnix 화면이 뜨는 것과 달리 애플리케이션의 홈 화면이 나타나는 것을 확인할 수 있다.
3. Scale-Out 적용 후
자 이제 비교해보도록 하자.
Scale-Out 적용 전에는 개별 서버 포트인 8080번 포트로 테스트를 했다면 이젠 nginx 서버의 포트인 80번 포트로 테스트해야 한다. (http 프로토콜이라서 80 포트는 생략해도 됨)
같은 API 요청에 대해 1분동안 30개의 요청을 보냈을 때의 결과이다.
구분 | Scale-Out 적용 전 | Scale-Out 적용 후 |
TPS | 27.8 | 63.0 |
MTT | 645.8 | 327.5 |
확실히 개선되었다.
![]() |
![]() |
그리고 무엇보다 위와 같이 두 개의 서버 모두 죽지 않고 잘 살아있다.
현재까지의 아키텍처 구조를 간단히 정리하자면 다음과 같다.
참고자료
[Nginx] 로드밸런싱 개념 및 구축 - 1
서버의 과부하로 인한 shutdown을 막기 위해 웹서버로 이용하고 있는 Nginx를 로드밸런서로 사용하고자 알아보았습니다. 먼저 저는 nodejs(express)로 서버가 이루어져 있고 앞단과 뒷단에 nginx를 프록
velog.io
https://velog.io/@devjooj/Server-Ngnix-%EC%99%9C-%EC%82%AC%EC%9A%A9%ED%95%A0%EA%B9%8C
[Server] Ngnix 왜 사용할까?
Nginx 탄생 비포 애프터 비교해보자! 뭐가 그렇게 좋은걸까?
velog.io
https://kangmanjoo.tistory.com/132
[CI/CD] - 무중단 배포 with CI/CD 1: nginx + spring 로드 밸런싱 편
구축하고자 하는 최종 아키텍쳐는 다음과 같다. 3편까지 모두 따라하고 나면 다음과 같은 아키텍쳐를 구축하게 된다. (단, 추후 EC2가 한 개 더 필요해진다.) 먼저 이번장에서는 스프링으로 구축
kangmanjoo.tistory.com
'기타 > 관리' 카테고리의 다른 글
Prometheus 를 사용하고 AlertManager 를 통해 서버 부하 알림 전송 해보기 (0) | 2024.07.06 |
---|---|
SpringBoot 3 에서 Zipkin 서버를 통한 분산 추적 해보기 (0) | 2024.07.05 |
Redis 를 사용하여 성능 최적화 (0) | 2024.06.01 |
nGrinder 설치 및 사용(부하 테스트)해보기 (1) | 2024.05.22 |
[APM] Scouter 설치 및 자바 애플리케이션과 연동하기 with Docker (0) | 2024.05.17 |