nGrinder로 부하테스트를 진행하면서 DB가 잘못된건지, WAS가 잘못된건지 정확히 파악할 수 없었다. 모니터링 툴이 없었고 Log를 통해서 유추할 수 밖에 없었기 때문에 모니터링 환경 구축이 필요했다. Replication을 진행할 때 또 부하테스트를 해야했고 모니터링 툴이 필요하다고 생각하여 학습하기로 했다.
그라파나와 프로메테우스를 도입하려고 한건 UI가 이쁘기 때문이다. 자료도 넉넉히 있었기에 도입하는데 그렇게 어렵지 않을거라 판단했다.
전반적인 구조는 아래와 같다.
가장 먼저 모니터링이 필요한 서버에 Exporter가 있어야한다. Exporter는 해당 서버의 필요한 정보를 내보내는 역할을 하는데 MySQL, SpringBoot, Nginx 등 서버의 용도에 따라 원하는 정보를 내보낼 수 있다.
데이터를 수집하는 역할을 한다. 정해진 주기마다 Exporter에 데이터를 요청한다. 여러 Exporter에 연결되어 정보를 받아서 수집하고 있는다.
데이터를 시각화하는 역할을 한다. 프로메테우스의 정보를 받아서 위에 나와있는 표처럼 정리해준다. 데이터를 확인할 때 Grafana에 접근해서 확인한다.
아래는 각각을 어떻게 설치할 수 있고, 구성해야하는지 소개한다.
가장 기본적인 서버의 Metric 정보를 확인할 수 있는 NodeExporter를 설치해보자.
서버의 스펙에 맞춰 설치하면 된다. 자세한건 공식문서를 보자.
wget https://github.com/prometheus/node_exporter/releases/download/v1.4.0/node_exporter-1.4.0.linux-arm64.tar.gz
tar xvfz node_exporter-1.4.0.linux-arm64.tar.gz
nohup ./node_exporter-1.4.0.linux-arm64/node_exporter --web.listen-address=:8080 > node_exporter.log 2>&1 &
curl localhost:8080/metrics
정상적으로 설치가 됐다면 아래와 같이 로그를 확인할 수 있다.
스프링 부트 기반의 WAS를 구성하고 있다면 의존성을 추가하면 된다.
build.gradle에 의존성 추가
implementation 'org.springframework.boot:spring-boot-starter-actuator'
implementation 'io.micrometer:micrometer-registry-prometheus'
application.yml에 내용 추가
management:
endpoints:
web:
exposure:
include: health, info, prometheus
공식문서를 참고하여 사양에 맞는 버전으로 mysqld_exporter를 다운 받는다.
wget https://github.com/prometheus/mysqld_exporter/releases/download/v0.14.0/mysqld_exporter-0.14.0.linux-arm64.tar.gz
tar xvfz mysqld_exporter-0.14.0.linux-arm64.tar.gz
MySQL에 접속하여 MySQL의 정보를 전달할 agent를 생성한다.
sudo mysql -u root -p
CREATE USER 'exporter'@'localhost' IDENTIFIED BY 'password' WITH MAX_USER_CONNECTIONS 3;
exporter
: 생성할 이름
localhost
: 접근을 허용할 IP 주소(exporter와 MySQL을 같은 서버에 설치하면 localhost)
password
: 비밀번호
WITH MAX_USER_CONNECTIONS 3
: 부하에 대비해 수집 요청이 무시 될 것을 대비한다.
GRANT PROCESS, REPLICATION CLIENT, SELECT ON *.* TO 'exporter'@'localhost';
생성한 사용자에게 권한을 부여한다.
export DATA_SOURCE_NAME='exporter:password@(localhost:8080)/'
제약상 MySQL을 8080포트로 띄우고 있어서 포트를 변경했다. 만약 3306을 쓰고 있다면 8080을 3306으로 바꾸면 된다.
nohup ./mysqld_exporter --web.listen-address=:8081 &
링크를 따라서 설치하면 된다.
# nginx 메트릭 수집을 위한 설정이다
# with-http_stub_status_module 라는 응답이 나와야 정상이다.
# 오류시 참고 https://www.nginx.com/blog/monitoring-nginx/
nginx -V 2>&1 | grep -o with-http_stub_status_module
# 예상 결과값
with-http_stub_status_module
/etc/nginx/nginx.conf 파일 내부에 http 스코프를 추가한다.
80포트는 /etc/nginx/sites-available/default 여기에서 listen 설정이 있으니 주의
해당 파일의 80포트 리슨을 nginx.conf로 옮겨왔다. 원하면 포트를 바꿔도 된다.
server {
listen 80 default_server;
listen [::]:80 default_server;
root /var/www/html;
index index.html index.htm index.nginx-debian.html;
server_name _;
location / {
try_files $uri $uri/ =404;
}
location /nginx_status {
stub_status;
allow 127.0.0.1;
deny all;
}
}
# 문법 확인 후 리로드
sudo nginx -t
sudo systemctl reload nginx
# 정상 동작 확인 후 nginx 재시작
curl localhost/nginx_status
# Active connections: 1
# server accepts handled requests
# 35 35 37
# Reading: 0 Writing: 1 Waiting: 0
sudo systemctl restart nginx
# nginx 로그파일 권한 허용
cd /var/log/nginx/
sudo chmod 755 access.log error.log
wget -qO- https://repos.influxdata.com/influxdb.key | sudo tee /etc/apt/trusted.gpg.d/influxdb.asc >/dev/null
source /etc/os-release
echo "deb https://repos.influxdata.com/${ID} ${VERSION_CODENAME} stable" | sudo tee /etc/apt/sources.list.d/influxdb.list
sudo apt-get update && sudo apt-get install telegraf
/etc/telegraf/telegraf.con 파일을 수정한다. 맨 아래에 아래 내용을 추가한다
#nginx-metrics and logs
[[inputs.nginx]]
urls = ["http://localhost/nginx_status"] # 앞서 nginx 설정에서 열어둔 엔드포인트
response_timeout = "5s"
[[inputs.tail]]
name_override = "nginxlog"
files = ["/var/log/nginx/access.log"] # 앞서 권한 허용한 로그.
from_beginning = true
pipe = false
data_format = "grok"
grok_patterns = ["%{COMBINED_LOG_FORMAT}"]
# telegraf 프로메테우스 연동
###############################################################################
# OUTPUT PLUGINS #
###############################################################################
[[outputs.prometheus_client]] # <<<< 이 두 라인을 입력해야함. 8080 포트 열기
listen = "0.0.0.0:8080" # <<<< 이 포트로 프로메테우스가 telegraf를 호출한다
# Configuration for sending metrics to InfluxDB
# [[outputs.influxdb]] <<< 이 라인을 주석처리해야함
telegraf 재시작 및 확인
sudo systemctl restart telegraf && systemctl status telegraf
curl localhost:8080/metrics
공식 문서를 참고하여 프로메테우스를 설치할 서버의 사양에 맞게 설치한다
wget https://github.com/prometheus/prometheus/releases/download/v2.39.0/prometheus-2.39.0.linux-arm64.tar.gz
tar xvfz prometheus-2.39.0.linux-arm64.tar.gz
설치 폴더 내 prometheus.yml 파일을 수정한다.
scrape_configs:
- job_name: "node-server"
static_configs:
- targets: ["아이피주소:포트번호"]
- job_name: "mysql-server"
static_configs:
- targets: ["아이피주소:포트번호"]
...
지금까지 설치한 exporter의 url과 port번호를 맞춰서 작성하면 해당 정보를 받아올 수 있다.
설정한 뒤 프로메테우스 서버를 리로드 시켜준다.
# 8080포트로 실행
nohup /home/ubuntu/prometheus-2.39.0.linux-arm64/prometheus --web.enable-lifecycle --config.file=/home/ubuntu/prometheus-2.39.0.linux-arm64/prometheus.yml --web.listen-address=:8080 > prometheus.log 2>&1 &
# prometheus.yml 리로드
curl -X POST http://localhost:8080/-/reload
프로메테우스 서버에 설정한 포트로 들어가면 아래와 같이 정보를 확인할 수 있다.
공식문서를 참고하여 사양에 맞게 설치한다.
wget https://dl.grafana.com/oss/release/grafana-9.2.0.linux-arm64.tar.gz
tar -zxvf grafana-9.2.0.linux-arm64.tar.gz
vi /home/ubuntu/grafana-9.2.0/conf/defaults.ini
# 실행
cd /home/ubuntu/grafana-9.2.0/bin/ && nohup /home/ubuntu/grafana-9.2.0/bin/grafana-server > grafana.log 2>&1 &
그라파나는 기본 포트가 3000번으로 설정되어있는데 수정이 필요하면 설치폴더/conf/defaults.ini 의 41번째 라인 port를 수정하면 된다.
기본 아이디와 비밀번호는 admin이다.
프로메테우스 추가
커스텀해서 사용할 수 있지만, 미리 만들어둔 대시보드를 활용하는 편이 훨씬 간단하다.
사용할 대시보드 id 값
- Node Exporter Full : 1860
- SpringBoot 2.1 System monitor : 11378
- MySQL Overview : 7362
- Nginx : 14900
Load → select prometheus data source
에서 프로메테우스를 고르면 대시보드가 생긴다.
아래와 같이 구성됨을 확인할 수 있다.
이렇게 모니터링 구성을 알아봤다.
HikariCP ConnectionPool Size를 조정할 때 유용하게 사용했다. Thread의 실 사용량도 측정할 수 있느니 최적화할 때 모니터링 환경까지 구축해서 원하는 값을 최적화할 수 있었다.