make-delivery 프로젝트

[#11] 성능 테스트 결과에 따라 비용을 고려하여 적절한 서버 구조 설계 과정

sunggook lee 2020. 12. 17. 15:45

제가 진행했던 make-delivery라는 프로젝트는 배달앱 서버를 구축해보는 것을 목표로 진행했습니다.

 

사용한 서버 목록

- WAS 서버 (자바+스프링) 3대

- Mysql 서버 2대 (Master, Slave)

- Redis 서버 1대 (세션,캐시)

- Nginx 웹서버 1대

- Jenkins 서버 1대

- Vault 서버 1대

- Ngrinder 서버 1대

- Pinpoint 서버 1대

make-delivery 프로젝트 서버 구조도

 

프로젝트 서버 구조에 대한 전반적인 설명

- 사용자는 Nginix IP로 Http 요청을 보냅니다.

- Nginix의 Reversed Proxy 기능을 통해 WAS서버 3대에 부하를 분산시킵니다.

- WAS서버는 데이터 접근을 위해 Mysql서버와 Redis서버에 요청을 보냅니다.

- Jenkins서버는 CI/CD 구축을 위해 사용하여 Github에 코드를 push할 시 통합, 배포를 자동화 시켜줍니다.

- Jenkins서버에서 배포 시 Docker를 이용해 3대의 WAS서버에 배포를 시켜줍니다.

- 배포 시 암호값, 설정값들은 Vault서버에 Http요청을 통해 받아와 배포 서버 이미지 실행 시 외부 주입을 시켜줍니다.

- 라이더들에게 배차 요청을 보내기 위해 Push 알람을 보내는데 이 때 WAS서버에서 파이어베이스 FCM 서버에 Async 메시지 요청을 보냅니다.

- 성능테스트를 위해 좋은 사양의 Ngrinder 서버에서 부하를 발생시킵니다.

 

여러 대의 서버 비용

취준생일 때 여러대의 서버를 띄운다는 것은 비용적으로 부담이 가는 일입니다. 어떻게 서버를 구축하지? 라고 생각하며 여러 방법을 찾아봤습니다.

 

1. Naver Cloud Platform의 무료 크레딧 사용

 

ncloud.com

현재 네이버 클라우드 플랫폼은 신규 가입시 10만원의 무료 크레딧을 제공하고 있습니다. 네이버 클라우드도 AWS, GCP와 같이 좋은 서비스와 성능을 제공하고 있으며 가이드 센터(www.ncloud.com/guideCenter)  에서 한글로 문서화가 아주 잘되어 있습니다. 따라서 서버를 처음 구축해보는 입문자들도 쉽게 접근할 수 있으며 꼭 AWS등을 사용하지 않아도 충분한 학습 효과를 얻을 수 있습니다. 저는 네이버 클라우드 플랫폼을 크레딧을 계기로 사용하게 되었지만 만족하며 서비스를 이용하고 있습니다.

 

2. AWS Student 계정으로 무료 크레딧 100$ 받기 

https://imyeonn.github.io/blog/web/42/

AWS에서도 대학생을 위해 무료 크레딧을 매년 100$씩 지급한다고 합니다. 위 블로그 링크에 매우 잘 설명되어 있습니다.

 

저는 네이버 클라우드 플랫폼을 써보지 않아 궁금했고 한글로 문서화가 잘 되어있는 점이 마음에 들어 네이버 클라우드를 이용하였습니다. 또한 네이버 클라우드에서는 Jenkins, Redis, Mysql등 서버이미지가 이미 설치 되어있는 application 서버도 제공하므로 이를 쉽게 이용할 수 있습니다. 하지만 저는 학습목적이 컸기 때문에 직접 리눅스 서버에 설치하여 프로젝트를 진행했습니다.

 

각 서버에 대한 설명과 사양

1. Jenkins 서버

저 혼자 프로젝트를 진행했기 때문에 고성능의 서버로 통합 배포를 하기 보다는 서버 비용을 고려했습니다. 따라서 Compact급 서버 1vCPU 2GB 메모리의 서버를 이용하였고 잦은 코드 Push에도 전혀 불편함 없이 사용했습니다. 비용은 시간당 48원, 월 34000원이었고 사용하지 않을시 서버 정지를 시켜놓으면 과금되지 않아 비용을 절약할 수 있었습니다.

 

젠킨스를 이용해 CI/CD 서버 구축해보기

tjdrnr05571.tistory.com/13?category=876333

 

2. WAS 서버

처음엔 WAS서버에서도 Compact급 서버 1vCPU 2GB 서버를 이용하였으나 Ngrinder를 이용해 성능테스트를 해봤습니다.

서버 성능을 위해 캐시, Mysql이중화 등 여러가지를 고려했음에도 TPS는 500대가 최고였고 동시사용자 350명 이상이 되면 Read time out이 일어나고 서버에서 응답을 받을 수 없었습니다. 따라서 서버 성능을 Scale out(여러 대의 서버로 성능처리) 과 Scale up 둘다 적용하기로 결정했습니다. 서버를 우선 2대로 늘리고 1대의 서버는 Standard급 2vCPU 4GB메모리의 서버를 이용하였습니다. 이는 시간당 105원 정도로 네이버에서 제공받은 크레딧으로 이용하기에 충분했습니다.

 

1vCPU 2GB 메모리의 서버 1대와 2vCPU 4GB 서버 1대 총 서버 두대로 Scale out을 하였고 성능 테스트 시 동시 사용자 1000명대에서도 TPS 2600정도의 급격한 성능 향상이 있었습니다.

 

성능테스트 시 서버의 CPU이용률을 확인해보니 99%, 190%정도로 모든 CPU자원을 활용하고 있었습니다. 또한 Ngrinder의 CPU는 40~70%인 것으로 미루어보아 WAS서버의 CPU를 더 좋은 것을 쓴다면 훨씬 좋은 성능을 낼 것이라 생각됩니다.

 

 

3. Nginx 서버

서버를 2대로 늘렸으므로 서버에 들어오는 요청들을 분산시켜줘야 했습니다. 따라서 Nginx 웹서버를 한대 띄웠고 Nginx의 Reversed Proxy기능을 이용해 로드밸런싱을 통해 부하를 분산시켜줬습니다.  weight설정을 통해 성능이 좋은서버에 트래픽을 2배 더 보내도록 설정 해주었습니다. 3000명의 동시 사용자로 성능테스트를 했음에도 불구하고 Nginx의 CPU 이용률은 6~70%에 그치는 것으로 보아 Nginx의 서버 성능은 충분해 보였습니다. (Nginx는 싱글스레드와 이벤트 루프 기반의 비동기 처리 방식을 이용합니다) 서버 사양은 마찬가지로 1vCPU 2GB 서버를 이용하였습니다.

 

Nginx 설정

 

4. Mysql 서버

Mysql은 학습을 위해 Replication을 적용하였으나 성능테스트시 1대의 서버로만 먼저 테스트해봤습니다. 마찬가지로 1vCPU 2GB 서버를 사용하였고 2~3천명의 동시사용자 성능테스트에서도 CPU이용률은 70%정도에 그쳤고 슬로우 쿼리 로그를 분석해봐도 슬로우 쿼리는 없었습니다. 따라서 현재 WAS서버의 성능에 충분한 사양이라고 생각했습니다.

 

Spring에서 Mysql 이중화 해보기

tjdrnr05571.tistory.com/14?category=876333

 

5. Redis 서버

레디스 또한 싱글스레드와 이벤트 루프 기반의 비동기 방식이여서 높은 성능을 가집니다. 먼저 1vCPU 2GB서버로 성능테스트를 진행하였고 CPU이용률 또한 충분히 낮아 이정도 사양으로 충분하다고 판단했습니다. 하지만 레디스의 경우 메모리에 키값이 많이 저장될 경우를 대비해 TTL설정을 잘해주어야 하고 최대 메모리 설정, cache eviction 알고리즘 설정을 프로젝트에 맞게 잘해주어야 합니다. 

 

6. Vault 서버

볼트는 HashiCorp사에서 제공해주는 서비스로 암호,설정값등 보안유지를 위한 서비스입니다. 스프링에 외부 주입으로 넣어줘야할 설정값과 암호값들이 많았으므로 WAS서버 도커 이미지 실행 시 Http 요청으로 볼트서버에서 이 값들을 받아 주입시켜줬습니다. 따라서 많은 트래픽을 처리할 필요가 없었기 때문에 네이버 클라우드에 가입하면 1년간 무료 제공되는 1GB 서버에 볼트를 설치했습니다. 

 

7. Ngrinder 서버 & Pinpoint 서버 

성능테스트를 위해 Ngrinder를 이용했고 이 Ngrinder는 높은 성능의 서버를 사용해야 테스트 결과에 노이즈가 끼지 않고 올바른 수치가 나오기 때문에 vCPU 8개 16GB급의 서버를 사용했습니다. Pinpoint 또한 높은성능을 요구하기 때문에 같은 서버를 이용했고 이는 네이버 클라우드에서 제공하는 이미지를 그대로 이용하였습니다.

 

결론

네이버 클라우드 플랫폼에서 감사하게도 크레딧을 제공해주셔서 무료로 여러대의 서버를 이용해봤고 서버 환경, 구조등에 대해 깊게 이해해 볼 수 있는 프로젝트를 진행했습니다.

 

 

프로젝트 URL

github.com/f-lab-edu/make-delivery

 

f-lab-edu/make-delivery

구매자에게 음식 배달을 제공하는 서비스입니다. Contribute to f-lab-edu/make-delivery development by creating an account on GitHub.

github.com