이번에 할 작업은 Jmeter를 사용해 로드밸런싱이 적용된 채팅 서버에 부하 테스트를 한 후, Prometheus + Grafana을 사용해 서버 상태를 모니터링하는 것이다.
👨🏻💻 Prometheus
프로메테우스는 서버의 시계열 데이터를 수집하고, 이를 시각화하며, 경고 알림을 제공하는 오픈소스 모니터링 도구이다.
주요 특징 중 하나는 서비스 디스커버리(Service Discovery) 기능이다. 서비스 디스커버리 덕분에 URL만 설정하면 Spring Actuator 의 메트릭을 손쉽게 수집할 수 있다.
또한, 데이터 조회는 프로메테우스 전용 쿼리 언어인 PromQL 을 사용해 간편하게 할 수 있다.
프로메테우스 아키텍처는 다음과 같다.
👨🏻💻 Grafana
그라파나는 프로메테우스와 연동하여 시각화 작업에 집중할 수 있도록 도와주는 오픈소스 도구이다.
사실 그라파나는 필수로 사용하지 않아도 된다.
하지만 이미 많이 배포된 대시보드들이 많아서, 이를 Import 하여 손쉽게 활용할 수 있어 매우 유용하다.
👨🏻💻 Prometheus ・ Grafana 설치 및 실행
난 HomeBrew 를 사용하기 때문에 아래 명령어를 사용해 매우 쉽게 설치했다.
brew install prometheus
brew install grafana
설치가 끝나면 일단 실행중인 Spring 서버와 프로메테우스를 연동해야 한다. (Spring에서 사용되는 메트릭을 프로메테우스가 수집할 수 있도록 함)
vi /opt/homebrew/etc/prometheus.yml
한 서버의 메트릭만 수집하는 경우
global:
scrape_interval: 5s # 데이터 수집 시간 (5초마다 메트릭 수집)
scrape_configs:
- job_name: "prometheus"
metrics_path: '/actuator/prometheus'
static_configs:
- targets: ["localhost:8080"]
두 개 이상의 서버 메트릭을 수집하는 경우
global:
scrape_interval: 5s
scrape_configs:
- job_name: "prometheus"
metrics_path: '/actuator/prometheus'
static_configs:
- targets: ["localhost:8080", "localhost:8081", "localhost:8082"]
prometheus.yml 을 수정 및 저장했으면 반드시 재실행해야 한다.
brew service restart prometheus
위의 프로메테우스 설정 파일까지 모두 작성했고, 재실행까지 했다면 프로메테우스에서 할 작업은 끝이다.
다음은 메트릭을 수집할 대상인 서버에 메트릭을 설정해야 한다.
아래 코드는 Spring의 application.yml 일부분이다.
# Metric 설정
management:
endpoints:
web:
exposure:
include: '*'
prometheus:
metrics:
export:
enabled: true
...
난 일단 모든 메트릭 정보를 볼 수 있도록 management.endpoints.web.exposure.include 을 ‘*’ 로 설정했다.
그리고 프로메테우스에서 이 메트릭 정보에 접근할 수 있도록 prometheus.metrics.export.enabled 를 true 로 설정한다.
Spring 서버를 실행시킨 후 http://localhost:8080/actuator/metrics 에 접속하면 다음과 같이 조회 가능한 메트릭 정보가 나온다.
이제 Spring과 프로메테우스에서 할 준비는 모두 끝났다. 다음은 그라파나다.
brew service start grafana
그라파나의 주소는 http://localhost:3000 이다.
그라파나에 접속하면 맨 처음 아이디와 비밀번호를 입력해야 하는데, 초기값은 둘 다 admin, admin 이다.
아이디와 비밀번호를 입력하면 다음과 같은 화면이 나오는데, 저기서 빨간색 네모에 있는 Data sources를 클릭한다.
Add new data source를 클릭한 후, Prometheus를 클릭한다.
그리고 Connection의 URL에 프로메테우스 URL을 입력한다. 참고로 프로메테우스의 기본 URL은 localhost:9090 이다.
그런 다음 Save & Test를 클릭하면 그라파나와 프로메테우스가 연동될 것이다.
다음은 프로메테우스에서 수집한 데이터를 대시보드에 보기 좋게 시각화하는 과정이다.
처음 화면으로 돌아온 후, 빨간색 네모에 있는 Dashboards를 클릭한다.
그리고 오른쪽 상단에 있는 New 버튼과, Import 버튼을 클릭하면 아래와 같은 화면이 나온다.
Import dashboard 화면에 들어왔으면, 빨간색 네모 안에 아래 URL을 입력한다.
https://grafana.com/grafana/dashboards/4701-jvm-micrometer
Load를 하고 대시보드에 접속하면 다음과 같이 아름다운 대시보드가 완성된 것을 볼 수 있다.
🛠️ JMeter를 사용한 부하 테스트
이제 프로메테우스・그라파나 설정이 완료되었다.
다음은 JMeter를 사용해 부하 테스트를 진행해 보자.
Thread Group 설정은 이전에 단일 서버와 다중 서버 간 성능 비교를 할 때 사용했던 정보를 그대로 활용했다.
그리고 현재 진행 중인 작업의 주목적은 부하 테스트가 아니므로, 프로메테우스와 그라파나를 활용한 메트릭 시각화 및 모니터링에 집중하겠다.
초당 요청 작업 횟수
CPU 사용량
참고로 다중 서버에서 CPU 사용량이 급증한 이유는 3개의 Spring 서버를 Docker 컨테이너로 실행했기 때문이다.
Docker는 하나의 호스트에서 여러 개의 컨테이너를 실행하므로, 다중 서버 환경에서는 CPU 사용량이 증가할 수밖에 없다.
만약 여러 개의 AWS EC2 인스턴스에 Spring 서버를 각각 배포했다면, CPU 사용량이 더 줄어들었을 것이다.
'Spring > MSA' 카테고리의 다른 글
[MSA] Spring Boot + Kafka를 사용한 채팅 (2) (1) | 2024.10.21 |
---|---|
[MSA] Spring Boot + Kafka를 사용한 채팅 (1) (3) | 2024.10.05 |
[MSA] Spring Boot + MSA (2) (Feat : Kafka) (0) | 2024.09.25 |
[MSA] Spring Boot + MSA (1) (1) | 2024.09.24 |