현재 진행중인 굿즈 포유 프로젝트의 서버 성능과 가용성을 테스트 하기 위해 JMeter를 통해, 로그인 요청에 대한 부하 테스트를 진행했습니다.
위 그림과 같이로그인 요청에 대해, 토큰을 저장하는 레디스 서버와 웹 서버가 단일 인스턴스에 존재하는 형태에서의 테스트 결과 입니다.
- 테스트 시, user 수(Number of Threads)는 100명으로, 초당 요청(Ramp-up period)은 1번으로, 반복 횟수(Loop Count)는 1로 설정 했습니다.
- 즉, 100명의 사용자가 1초에 1개씩 요청을 보내는 상황을 가정했습니다.
단일 서버 환경에서의 굿즈 포유 서버의 처리량은 6.3TPS입니다.
단일 서버 환경에서 웹 서버 - 캐시 서버 - 데이터베이스 서버를 각각 분리한 후 처리량은 5.8TPS 입니다. 오히려 각각의 서버를 분리한 후 처리량이 더 감소했지만, 이렇게 함으로서 단일 서버에서의 장애로 인해 전체 서비스가 중단되는 일을 방지할 수 있습니다. 또한 각각의 계층(웹, 캐시, 데이터베이스)을 독립적으로 수평적 확장을 해나갈 수 있다는 장점이 있습니다.
그렇다면 Throughput(서버의 처리량)을 향상시키려면 어떻게 해야 할까요?
위와 같이 Nginx가 사용자의 요청에 대해, 각각의 Load Balancing Set에 정의되어 있는 Web Application Server( 이후 WAS 라고 줄여서 말하겠습니다.)로 사용자의 요청에 대한 부하를 고르게 분산처리 해줍니다.
그렇다면 Nginx를 사용해, 로드 밸런싱과 웹 서버를 분산 처리를 함으로서 실제로 서버의 Throughput이 증가하는지 알아 보겠습니다.
앞서 진행한 부하 테스트와 동일하게 테스트를 진행 했습니다.
먼저 Throughput이 눈에 띄게 차이 나는 것을 알수 있습니다.
- Average(평균 걸린 시간) : 13172(ms) → 3933(ms)
- Min (최소 걸린 시간) : 11220 → 1396
- Max(최대 걸린 시간) : 16343 → 5044
- Error(오류 발생) : 0% → 0% (오류는 thread group 수가 적어서 발생하지 않은 것으로 파악됩니다.)
- Throughput(분당 처리량) : 5.8/sec → 16.8/sec로 증가
추가로 테스트 설정을 변경 해서, 10명의 유저가 1초에 300개씩 요청을 보내는 상황을 가정하고 테스트를 진행해봤습니다( 즉, 1초에 총 3000개의 요청을 보내는 것 입니다.)
테스트 결과 8TPS 정도가 나왔습니다. 높은 수치는 아니지만, 로드 밸런싱을 적용하기 전 단일 서버 환경에서는 Error가 40%에 다다를 정도로 에러가 많이 발생했지만, 부하 분산 처리를 함으로서 Error가 0%가 되는 좋은 결과를 만들어 냈습니다.
로드 밸런싱을 통해 부하 분산 처리를 진행하기 전, 후의 서버의 가용성과 성능 차이를 부하 테스트를 통해 알아 보았습니다.
추가로 하면 좋을 것들
- Scale-Out 뿐만 아니라 Scale-Up을 통해 분산 처리된 서버 중 한 서버의 스펙을 올려, 서버 성능을 올림으로서 TPS 를 높이는 방법도 있을 것 같습니다
- 또한 Nginx의 설정 중 Server Weights 라는 설정을 통해, 스케일 업된 서버의 가중치를 다른 서버보다 높게 줌으로서 좀 더 많은 부하를 처리하도록 하는 방법도 있을 것 같습니다.
- 현재 저는 Nginx 로드 밸런싱 알고리즘으로 라운드 로빈 알고리즘을 선택해 사용하고 있습니다.
- 라운드 로빈 뿐만 아니라 Least Connections, IP Hash 등등.. 다른 알고리즘을 적용했을때 각각의 성능 지표에 대해 분석해본 후, 적합한 알고리즘을 선택하는 것도 좋을 것 같습니다
- 현재 CI/CD 중 CD 시에, 단일 서버 기준으로 배포가 진행되고 있었는데, 이제 분산처리를 진행함으로서 여러 서버에 배포를 진행해야합니다. 따라서 CD 과정에서 각각의 웹 서버 인스턴스에 배포를 하도록 수정해줘야 할 것 입니다.
- 또한 이 과정에서 배포때 마다, 서버 인스턴스가 중단되지 않도록 무중단 배포는 어떤식으로 구현해야 할지도 앞으로 헤쳐나가야 할 과제일 것 같습니다
참고 자료
https://docs.nginx.com/nginx/admin-guide/load-balancer/http-load-balancer/
https://jmeter.apache.org/usermanual/get-started.html https://velog.io/@msung99/Nginx-로드밸런싱-환경을-구축해-트래픽-분산시키기-feat.-무중단배포#2로컬에있는-jar-파일-전송
'프로그래밍 > 프로젝트' 카테고리의 다른 글
상품 목록 조회 시, 페이징 처리 성능 개선 (2) | 2023.06.11 |
---|---|
테스트 시, Redis Session 으로 인해 생긴 문제 해결 (0) | 2023.04.19 |
SQL Injection (0) | 2023.04.05 |
Builder 패턴? (0) | 2023.04.05 |
테스트 커버리지를 70% 이상 유지하면서 느낀점 (0) | 2023.03.21 |