0. 멍플 소개
현재 진행하고 있는 프로젝트는 견주들을 위한 산책 정보 제공 서비스로 서비스 이름은 '멍플' 입니다.
해당 서비스는 사용자들의 산책 데이터를 수집하여 인기 경로를 확인하고 위험 정보를 등록하는 등 사용자 데이터를 통해 서비스를 제공하고 있습니다. 아키텍처는 다음과 같습니다.
멍플의 메인 기능 중 하나인 '블루존 조회' 는 주변 반경(1km, 2km) 에서 다른 사용자들이 많이 산책 한 경로에 가중치를 매겨 위와 같이 히트맵으로 보여주는 기능입니다.
주변 반경 1km = Grid 40,000 개
주변 반경 2km = Grid 160,000 개
사용자는 산책을 시작하면 15초 주기로 주변의 히트맵을 조회하게 되는데 이때 서버는 사용자의 위도, 경도를 중심으로 Level 9의 GeoHash Grid(5x5㎡)에 속한 GeoPoint 데이터들을 소켓을 통해 전송해줘야 합니다.
Elastic Search(이하 ES) 에서 GeoPoint 를 조회하고 Aggregation 하여 반환하는 과정에서 데이터 크기(청크)가 클 수록 응답시간이 늦어진다고 생각하였습니다. 따라서, 청크를 분할하여 각각의 청크를 따로 처리하는 로직을 작성하면 응답시간이 줄어드는지 테스트를 진행하여 확인해보고, 어떤 방식으로 히트맵 조회 기능을 제공할지 결정하기로 했습니다.
정리하자면, 다음 2가지 방법을 테스트하여 최초 응답 시간, 평균 응답 시간을 확인해보려고 합니다.
- 사용자가 히트맵을 조회할 때, 사용자 중심 1km 반경의 단일 청크 조회 및 Aggregationing 후 반환
- 사용자가 히트맵을 조회할 때, 사용자 중심 1km 반경의 단일 청크를 분할하여 분할 청크를 Aggregationing 후 반환
분할정복 방식의 흐름을 그림으로 나타내면 다음과 같습니다.
1. k6 설치
윈도우 설치
가장 먼저 k6 를 사용하기 위해 CLI package manager 인 chocolatey 를 설치해주어야 합니다.
PowerShell 을 실행하여 아래의 명령어를 입력하여 설치를 진행하면 됩니다.
Set-ExecutionPolicy Bypass -Scope Process -Force;
[System.Net.ServicePointManager]::SecurityProtocol = [System.Net.ServicePointManager]::SecurityProtocol -bor 3072;
iex ((New-Object System.Net.WebClient).DownloadString('<https://community.chocolatey.org/install.ps1>'))
그 후 choco 를 입력하여 버전이 표시된다면 설치가 완료된 것 입니다.
choco 를 사용해서 k6를 다운로드를 받으면 k6 가 window 환경에서 사용할 수 있습니다.
choco install k6
도커 설치
저의 경우 Docker 를 이용하여 K6 실행 환경을 구성하였습니다.
networks:
k6:
...
services:
...
k6:
image: grafana/k6:latest
container_name : k6
networks:
- k6
ports:
- "6565:6565"
environment:
- K6_OUT=influxdb=http://influxdb:8086/k6
volumes:
- ./scripts:/scripts
2. docker-compose 를 이용하여 테스트 실행
- ./scripts:/scripts 로 k6 와 local 볼륨 마운트
- scripts 안에 k6 공식 문서에서 제공해주는 테스트 용 js 파일을 아래의 명령어로 실행해줍니다.
import http from 'k6/http';
import { check, sleep } from 'k6';
export const options = {
stages: [
{ duration: '30s', target: 20 },
{ duration: '1m30s', target: 10 },
{ duration: '20s', target: 0 },
],
};
export default function () {
const res = http.get('<https://httpbin.test.k6.io/>');
check(res, { 'status was 200': (r) => r.status == 200 });
sleep(1);
}
docker-compose run k6 run /scripts/test-k6.js
테스트 결과가 잘 나온 모습!
이제 이 테스트 결과를 influx-db 와 grafana 를 이용해 대시보드를 구성해 시각화 해보려고 합니다.
3. Influx DB + Grafana 연동
Influx DB, Grafana 를 띄우기 위해 다음과 같이 docker-compose.yml 파일을 작성합니다. k6 스크립트를 실행하여 생성된 테스트 데이터를 InfluxDB에 저장하고, 저장된 데이터를 Grafana를 통해 시각화할 수 있습니다. 대략적인 흐름은 다음과 같습니다.
- k6 스크립트 실행: k6를 사용하여 테스트를 수행합니다.
- InfluxDB에 데이터 저장: k6는 생성된 데이터를 InfluxDB에 전송하여 성능 메트릭을 저장합니다.
- Grafana로 데이터 시각화: Grafana는 InfluxDB와 연동되어 저장된 데이터를 시각화합니다. 대시보드를 통해 실시간으로 성능 지표를 모니터링하고, 필요한 경우 그래프와 차트 형태로 데이터를 표현할 수 있습니다.
services:
influxdb:
image: bitnami/influxdb:1.8.5
container_name: influxdb
ports:
- "8086:8086"
environment:
- INFLUXDB_ADMIN_USER=name
- INFLUXDB_ADMIN_USER_PASSWORD=password
- INFLUXDB_ADMIN_USER_TOKEN=token
- INFLUXDB_HTTP_AUTH_ENABLED=false
- INFLUXDB_DB=mung_socket
networks:
- k6
- grafana
grafana:
image: bitnami/grafana:latest
container_name : grafana
networks:
- grafana
ports:
- "3000:3000"
environment:
- GF_AUTH_ANONYMOUS_ORG_ROLE=Admin
- GF_AUTH_ANONYMOUS_ENABLED=true
- GF_AUTH_BASIC_ENABLED=false
volumes:
k6:
image: grafana/k6:latest
container_name : k6
networks:
- k6
ports:
- "6565:6565"
environment:
- K6_OUT=influxdb=http://influxdb:8086/socket_test_db
volumes:
- ./scripts:/scripts
networks:
k6:
grafana:
3.1 Grafana Data Source 추가
1. Grafana 접속 후 [Connections] - [Data Source] influxDB 를 클릭해줍니다.
2. HTTP 연결 정보를 작성해줍니다.
도커 컨테이너로 influxdb를 실행했으므로 http://{container_name}:{port}으로 설정을 해주어야 합니다.
container_name 부분에 docker-compose 에서 지정한 containerName, port 를 작성 해줍니다.
3. DB 상세 정보 입력
docker-compose, influx 에서 작성한 DB, 사용자 정보를 입력해줍니다.
- INFLUXDB_ADMIN_USER=name
- INFLUXDB_ADMIN_USER_PASSWORD=password
- INFLUXDB_DB=mung_socket
[Save & test] 버튼을 통해 위와 같이 초록색 박스 표시를 통해 연결이 정상적으로 되었는지 확인해줍니다.
💡Error reading InfluxDB 이 발생한다면
grafana, influxdb 컨테이너 간 network 가 위 docker-compose 의 각 서비스 networks 가 잘 설정되어있는지 확인해주면 됩니다. (1시간을 날렸다..)
4. Grafana 대시보드 import 후 시각화
이제 연동이 완료되었으니 다음과 같은 k6 Load Testing Results 대시보드를 import 해줬습니다.
※ https://grafana.com/grafana/dashboards/2587-k6-load-testing-results/
다시 k6 테스트를 진행해보면 다음과 같이 시각화 된 테스트 결과를 확인할 수 있습니다.
docker-compose run k6 run /scripts/test-k6.js
마무리
테스트를 모니터링 할 환경 구성이 이루어졌으니 다음 장에서는 히트맵 조회 기능 중 단일 청크 응답시의 성능을 조회하는 테스트를 진행해보겠습니다!
참고
https://docs.chocolatey.org/en-us/choco/setup/
https://grafana.com/docs/k6/latest/set-up/install-k6/
https://grafana.com/grafana/dashboards/2587-k6-load-testing-results/
'Test' 카테고리의 다른 글
[멍플] 히트맵 조회 테스트 구현기 - 1 : 단일 청크 성능 테스트 (1) | 2024.10.14 |
---|