서비스 개발 이후, 일반적으로 실제 요구 부하를 서버가 견뎌낼 수 있는지 확인하는 작업 중 하나이다. 유저의 활동을 시뮬레이션하는 작업으로 앱이 상용 단계로 나아갈 수 있는지, 동시 사용자는 얼마나 견딜 수 있는지를 알아낼 수 있다.
nGrinder
는 스크립트 생성, 테스트, 모니터링과 결과 생성까지 이어질 수 있는 도구로, 네이버에서 만들었다. Groovy
나 Jython
으로 스크립트를 작성할 수 있다. Groovy
의 경우 익숙한 JUnit
기반 문법으로 익숙한 형태로 테스트를 작성할 수 있다.
대략 위 그림과 같은 구조로 GUI 환경의 Controller
를 이용해 테스트 스크립트를 조정하고 여러 Agent
를 이용해 실제 요청을 날린다.
여러 agent
를 쉽게 추가하고 제거하기 위해 agent
는 도커 스웜에서 레플리카 값을 주는 형식으로 만들 것이다. nGrinder
의 공식 이미지 저장소는 다음과 같다. https://hub.docker.com/r/ngrinder/controller/
우선 도커 스웜 모드로 시작하기 위해 다음과 같이 입력하자.
docker swarm init
결과로 다음과 같은 문구가 나올 것이다.
Swarm initialized: current node (dxn1zf6l61qsb1josjja83ngz) is now a manager.
To add a worker to this swarm, run the following command:
docker swarm join \
--token SWMTKN-1-49nj1cmql0jkz5s954yi3oex3nedyz0fb0xx14ie39trti4wxv-8vxv8rssmk743ojnwacrr2e7c \
192.168.99.100:2377
To add a manager to this swarm, run 'docker swarm join-token manager' and follow the instructions.
말 그대로이다. 이제 해당 노드는 매니저 노드로서 도커 스웜을 관리하는 역할을 맡게 된다.
이제 다른 agent
역할을 할 서버에서 다음과 같이 입력하자.
docker swarm join \
--token <docker-swarm-join-token> \
<hostname>
정상적으로 워커로 등록되었다면 다음과 같은 문구가 나온다.
This node joined a swarm as a worker.
이제 다시 마스터 노드로 돌아와 (처음 docker swarm init
을 했던 노드) 다음 명령어로 노드들을 확인하자.
$ docker node ls
ID HOSTNAME STATUS AVAILABILITY MANAGER STATUS
46aqrk4e473hjbt745z53cr3t node-5 Ready Active Reachable
61pi3d91s0w3b90ijw3deeb2q node-4 Ready Active Reachable
a5b2m3oghd48m8eu391pefq5u node-3 Ready Active
e7p8btxeu3ioshyuj6lxiv6g0 node-2 Ready Active
ehkv3bcimagdese79dn78otj5 * node-1 Ready Active Leader
위와 같이 여러 노드가 준비된 것이 보일 것이다.
다음과 같이 입력해 overlay
모드로 새로운 네트워크를 만들자. 이 네트워크 레이어를 agent
를 설치할 여러 노드가 공유할 것이다.
docker network create -d overlay --attachable <network_name>
이번에는 네트워크 이름을 momos
로 지었다고 하자. 다음과 같이 입력하면 된다.
docker network create -d overlay --attachable momos![](https://velog.velcdn.com/images%2Fheka1024%2Fpost%2Fb450ca63-bab0-4747-8fac-e775038164a7%2F%EC%8A%A4%ED%81%AC%EB%A6%B0%EC%83%B7%2C%202021-07-27%2017-13-42.png)
overlay
옵션을 주면 여러 호스트 사이에서 해당 네트워크를 이용할 수 있게된다. --attachable
은 컨테이너에 명시적으로 네트워크를 붙이는 걸 허용하게 만든다. 이제 Controller
와 Agent
들을 momos
에 연결하면 된다.
docker run -d -v ~/ngrinder-controller:/opt/ngrinder-controller \
--name controller \
-p 8000:80 \
--network momos \
ngrinder/controller
이제 localhost
의 8000번 포트로 들어가면 된다. 초기 아이디 / 비밀번호는 admin
이다.
이제 agent
를 도커 서비스로 만들어보자.
docker service create \
--name agent \
--network momos \
--replicas 2 \
ngrinder/agent
--replicas
옵션 뒤에 준 개수만큼 컨테이너를 생성한다. 컨테이너는 등록된 worker들 사이에 분포한다. 원하는 개수만큼 레플리카 개수를 설정하자. 다시 앞선 컨트롤러로 들어가서 agent
가 잘 등록되었는지 보자.
두 개의 agent
가 잘 등록된 것을 확인할 수 있다. 이제 확장 가능한 테스팅 환경이 구축되었다. 더 많은 부하가 필요하다면 언제든 swarm
에 조인한 후 replica
의 개수를 늘려주면 된다.