대규모 트래픽 환경을 컨트롤하는 프로젝트에서 서버의 상태를 알아보기 위한 모니터링 시스템을 만들어보았다.
결과적으로 분산 서버 환경과 오토스케일링으로 늘어나는 서버에서 발생하는 메트릭을 자동으로 수집하는 환경을 구현하였다.
모니터링 환경을 구현하는 시스템들은 여러가지가있다 AWS의 CloudWatch, Pinpoint, prometheus 등등 그리고 수집한 메트릭 정보를 UI로 그려주는 Grafana가 있다. 네이버 클라우드에도 모니터링을 지원하고 와탭이라는 모니터링 서비스 플랫폼도 존재한다.
여러 방법이 있는데 이 중에 나는 grafana에 prometheus를 물려서 모니터링 하는 방식을 선택했다 이유는 두 가지인데
비용 문제는 서버가 ec2 환경에서 구동 되기 때문에 cloudwatch를 사용하면 간편하게 받을 수 있지만 비용이 발생할 수 있다고 해서 최대한 지원금을 아껴보고자 포기했고, jvm 정보는 prometheus와 actuator를 이용해서 메트릭을 수집하기 때문에 cpu 부하 정보도 prometheus로 수집하면 되는게 아닐까 해서 시작하게 되었다.
가장 간단하게 구현하는 방법은 도커를 이용하는 방법이다.
실제로 사용한 방법이기도 하다.
그라파나의 경우 이미지를 받아와 실행 시켜주기만 하면 바로 해당 ip의 3000번 포트(변경가능)로 호스팅이 된다. 굉장히 가벼운데 그라파나가 제공하는 서비스를 보면 경이롭기까지 하다.
모니터링을 구현하면서 서버를 새로 생성하거나 다른 계정 서버로 옮기는 경우가 있어서 나는 도커 컴포즈를 이용해서 구동시켰다.
docker-compose.yml
version: '3'
services:
prometheus:
container_name: prometheus
image: prom/prometheus
volumes:
- /home/ubuntu/prometheus:/etc/prometheus
ports:
- "9090:9090"
grafana:
container_name: grafana
image: grafana/grafana
ports:
- "3000:3000"
위의 컴포즈파일에 적혀있듯 프로메테우스는 설정파일이 필요하다.
우리가 수집할 정보는 node-exporter를 이용한 PC 정보와 spring actuator에서 나오는 jvm 정보다.
이 둘의 메트릭을 수집하기 위해 설정을 해줘야한다.
도커에서 실행될 프로메테우스의 설정 정보를 파일로 작성해놓고 volumes에 적어서 복사하도록 해준다.
prometheus.yml
global:
scrape_interval: 15s
evaluation_interval: 15s
scrape_configs:
- job_name: "node-exporter"
static_configs:
- targets: ["{ip}:{port}"]
- job_name: "spring-actuator"
metrics_path: "/actuator/prometheus"
static_configs:
- targets: ["{ip}:{port}"]
그라파나를 구동하는 서버에서 node exporter나 spring boot 서버를 구동중이라면 ip가 아니라 localhost만 적어도 구동 되도록 설정할 수도있다.
방법은 도커의 network_mode 검색.
docker run 명령어로 이미지 받아서 실행하면 끝.
gradle에 의존성 주입하고
Spring Security를 적용중이라면 /actuator/** 를 permitall 시켜주면 된다.
ec2 서버 ip:3000 접속
아이디 비밀번호 기본값 admin
데이터 추가
프로메테우스 선택
프로메테우스 구동중인 서버:9090 으로 정보 받아오기
(그라파나 구동서버에 프로메테우스 실행했으니 ip정보는 동일)
Dashbords 에 jvm과 node-exporter 그리기
1860 == 남이 만들어 놓은 node-exporter 대시보드
4701 == 남이 만들어 놓은 jvm 대시보드
아까 등록한 프로메테우스 정보 등록하기
확인
단일 서버의 경우 위의 방법으로 구동하면 되는데 분산 서버 환경이라면 어떻게 해야할까?
두 가지 방법이있다.
오토 스케일링의 경우는 어떻게 확인하지?