전공 프로젝트로 분산 시스템 환경을 만들기로 했다. 주제는 nGrinder로 서버 부하 테스트를 진행하고, 수없이 쌓이는 요청 로그들을 Hadoop을 활용해서 수집해보는 것이다.
System Architecture
프로젝트의 전체적인 아키텍처를 간략하게 구성해보자.
- 우선 서버는 Spring Boot, 클라이언트는 React를 사용해서 만든다.
- LB구성은 Nginx를 이용하려 했으나, health check를 사용하려면 유료 버전을 사용해야 한다길래 HAProxy로 변경..
- 호스팅 서버의 경우 1TB Storage 32GB Memory CPU를 구했다.
- 여기서 docker container 설정으로 각 서버를 2Core CPU/4GiB Memory로 제한해 테스트를 진행할 예정
부하 테스트를 위한 서비스 만들기
우선 부하 테스트를 진행하기 위한 테스트 서비스를 만든다.
간단한 CRUD 기능을 가진 웹 게시판 서비스로 테스트를 진행할 계획이다. (테스트할 API는 게시글 목록 조회, 게시글 상세 조회, 로그인, 게시글 생성 - 총 4개)
nGrinder 설치 및 설정
nGrinder?
네이버에서 서버 성능 측정 목적으로 개발한 오픈소스 프로젝트. 서버에 부하를 걸어 테스트함으로써 서버의 성능을 가늠할 수 있다.
nGrinder의 주요 구성 요소로는 Controller/Agent가 있다.
Controller
- 부하 테스트를 진행하기 위한 인터페이스를 제공하는 서버.
- Controller를 통해 성능 테스트를 설정하고 생성하며, 테스트를 모니터링 할 수 있다.
- 테스트의 대시보드와 웹 인터페이스를 통해 테스트의 상태 및 결과를 분석할 수 있다.
Agent
- Controller의 명령을 받아 실제로 부하를 발생시키는 서버.
- 다수의 Agent를 만들어 동시에 부하를 발생시킬 수도 있다.
따라서 nGrinder를 통한 테스트를 하기 위해서는 Controller와 Agent를 먼저 설치/설정을 해줘야 한다. 기본적으로 nGrinder는 JDK 11에서 동작한다.
Controller 설치
먼저 nGrinder의 최신 release를 확인하자. (2023.06 기준 ngrinder-3.5.8)
Controller를 설치할 리눅스 서버에 다음과 같이 입력한다. (JDK 11이 설치되어 있어야 함)
wget https://github.com/naver/ngrinder/releases/download/ngrinder-3.5.8-20221230/ngrinder-controller-3.5.8.war
설치가 되었으면 실행한다. (nGrinder는 기본적으로 8080포트를 쓰지만, 현재 서버에서 8080포트를 쓰고 있기 때문에 8300으로 변경해서 실행, 물론 방화벽 8300포트도 열어둬야 한다.)
java -jar ngrinder-controller-3.5.8.war --port=8300
http://서버의 공인IP:8300 으로 들어가보면 nGrinder Controller에 접속할 수 있다. (초기 ID/PW: admin/admin)
Agent 설치
Controller에 로그인하고 에이전트 관리에 들어가보면, Agent를 다운받을 수 있는데, 해당 파일을 다운받아서 Agent를 설치할 리눅스 서버에 옮겨도 되고, 커맨드로 다운로드 받아도 된다.
wget http://{Controller서버의공인IP}:8300/download/ngrinder-agent-3.5.8.tar
다운받은 tar 파일의 압축을 해제하고, 실행한다.
sudo tar xvf ngrinder-agent-*.tar
cd ngrinder-agent
./run_agent.sh
잘 실행됐다면 다음과 같이 Controller의 신호를 기다리고 있다는 문구가 나온다.
(리눅스 서버가 JDK 17이었는데 nGrinder가 JDK 11에서 동작한다는걸 모르고 계속 실행이 안돼서 다른 곳에서 시간낭비하면서 삽질했음...)
Controller의 웹 인터페이스의 에이전트 관리에 들어가보면, 다음과 같이 등록한 Agent가 나타난다.