漸入佳境

Grafana로 DB 성능 모니터링

DevLog

예전 프로젝트에서 DB의 데이터들을 모니터링하는 대시보드는 제작해봤었지만, DB 성능을 모니터링 대시보는 제작한 경험이 없어 이 참에 한번 도전해봤다.

환경

  • OS : Windows 11 HOME (WSL 설치)

시스템 구성도

MySQL ➡️ MySQL Exporter ➡️ Prometheus ➡️ Grafana

구성요소 역할
MySQL 실제 데이터베이스
Exporter MySQL에서 성능 정보 추출 + HTTP 형식으로 노출
Prometheus Exporter로부터 데이터를 주기적으로 수집 + 저장
Grafana Prometheus에서 데이터를 읽어와서 시각화 (Dashboard 형태)

그라파나로 MySQL의 성능을 모니터링하려면 MySQL Exporter 를 사용해 메트릭을 수집한 다음,
Prometheus로 저장한 뒤, 이를 Grafana 대시보드로 시각화하는 방식이 일반적이다.

MySQL은 자체적으로 성능을 확인할 수 있도록 show statusinformation_schema 를 제공하지만, 외부 모니터링 시스템이 직접 접근해서 수집하기 어렵다.
따라서 MySQL에서 쿼리를 실행 후 메트릭 데이터를 HTTP로 노출해주는 exporter 를 사용한다.
프로메테우스는 이 HTTP 엔드포인트(localhost:9104/metrics)에 정기적으로 접근해서 데이터를 수집하는 기능을 한다.

MySQL Exporter 설치 및 설정

Exporter의 경우 Windows 사용자는 WSL, Docker, Go 세 가지 환경 중 하나를 골라서 Exporter를 설치하면 된다. 나는 이전에 설치해둔 WSL에 Exporter를 설치했다. (대부분 Docker를 쓰는듯 하다.)

아래의 명령어로 간편하게 설치 및 압축해제 할 수 있다.

# 다운로드
wget https://github.com/prometheus/mysqld_exporter/releases/download/v0.15.1/mysqld_exporter-0.15.1.linux-amd64.tar.gz
tar -xzf mysqld_exporter-*.tar.gz
cd mysqld_exporter-*

이 프로그램을 실행하면 하나의 HTTP 서버처럼 동작하게 된다.

MySQL 계정생성

MySQL에서 exporter 계정을 생성해주어야 한다.

CREATE USER 'exporter'@'%' IDENTIFIED BY 'yourpassword';
GRANT PROCESS, REPLICATION CLIENT, SELECT ON *.* TO 'exporter'@'%';

exporteryourpassword에 개인 정보를 입력한 후 한 줄씩 실행하면 된다.

현재 나의 환경은 MySQL 서버가 Windows에 설치되어 있기 때문에 한 가지를 더 수정해야 한다.
C:\ProgramData\MySQL\MySQL Server 8.0\my.ini 경로에서 [mysqld] 부분을 찾아 bind-address를 추가한다.(모든 ip 접근 허용)

[mysqld]
bind-address=0.0.0.0

또한 3306의 포트를 열기 위해 powershell을 관리자 권한으로 실행하여 아래 명령어를 입력한다.

New-NetFirewallRule -DisplayName "Allow MySQL" -Direction Inbound -Protocol TCP -LocalPort 3306 -Action Allow

(윈도우 방화벽 설정가서 해도됨)

WSL 에서 .my.cnf 파일 설정

mysql_exporter가 MySQL에 접속하기 위해서는 사용자 계정이 필요하고, ReadOnly 권한만 있으면 된다. (SELECT, PROCESS, REPLICATION CLIENT)

exporter 계정은 모니터링 목적이므로 INSERT, DELETE, DROP 등의 권한은 절대 주지 않는다.

가장 먼저 .my.cnf 파일을 생성한다.

이 파일은 MySQL 클라이언트 설정 파일이며, Exporter 가 MySQL에 자동 로그인할 수 있도록 사용자 계정 정보를 저장하고 있다.
즉, mysql_exporter는 이 파일을 읽고 MySQL에 로그인할 때, -u exporter -p 입력없이 자동으로 인증되게 해준다.

파일 내용은 아래와 같으며 exporter 이름과 비밀번호는 개인설정 값으로 바꿔주면 된다.

echo -e "[client]\nuser=exporter\npassword=yourpassword" > ~/.my.cnf

하지만 나의 경우 이렇게만 하면 연결이 안된다.

[client]
user=exporter
password=yourpassword
host=IPv4주소 
port=3306

이렇게 IP 주소와 Port 정보까지 입력하니 연결이 됐다.

해당 파일의 경우 ls -a 로 존재 여부를 확인할 수 있다.

그리고, 반드시 접근 권한을 제한해야 한다. 권한이 열려 있으면 exporter 실행 시 보안 오류가 발생하거나, MySQL접속이 거부 될 수 있다.

chmod 600 ~/.my.cnf

그 다음 실행 해주면 ,

./mysqld_exporter --config.my-cnf=~/.my.cnf --web.listen-address="0.0.0.0:9104"

./mysqld_exporter --config.my-cnf=/home/your-username/.my.cnf --web.listen-address="0.0.0.0:9104"

상대경로 or 절대경로

Prometheus 설정

https://prometheus.io/download
위 링크에서 OS에 맞는 프로메테우스를 다운받은 후 압축을 해제한다.

prometheus.yml 에서 주요 설정을 변경한다.

global:
  scrape_interval: 15s  # 메트릭 수집 주기

scrape_configs:
  - job_name: 'mysql'
    static_configs:
      - targets: ['localhost:9104']  # Exporter가 WSL에서 실행 중일 경우, IP 변경 가능

그 다음 ,

prometheus.exe --config.file=prometheus.yml

으로 프로메테우스를 실행한 후 http://localhost:9090 으로 접속하여 확인한다.

Your Alt Text

이렇게 mysql이 up 상태이면 설정 완료.

Grafana 설정

https://grafana.com/grafana/download
여기서 본인 컴터에 맞는 그라파나를 다운로드 한다.

설치 완료 후 http://localhost:3000 으로 접속한다. 초기 계정 정보는 admin-admin 이며 이후 변경하는 것을 권장한다.

Add Data Source 탭에서 Prometheus를 클릭한 후 URL 정보를 http://localhost:9090 으로 입력 해준다. Save&Test가 정상적으로 작동된다면, 연결 완료.

대시보드의 경우 그라파나에서 자체 템플릿을 제공하는데, Dashboards > + Import > ID : 7362 입력 > Load > Import 순으로 실행하면 된다.

Your Alt Text

아직은 DB를 사용하지 않아 아무 데이터가 없다.

최종 정리

전체 구성을 표로 정리해봤다. (내 컴터 기준)

구성 요소 역할 설정 위치
MySQL 실제 DB Windows
mysqld_exporter MySQL 메트릭 수집 → HTTP로 노출 WSL
Prometheus Exporter에서 메트릭 수집 및 저장 Windows
Grafana Prometheus에서 메트릭 시각화 Windows
.my.cnf exporter 인증 정보 WSL 홈 디렉토리

실행 순서는

mysql_exporter(WSL 환경) 실행하여 HTTP 서버 띄우기 > prometheus 실행 > grafana 접속

이렇게 하면 된당.

그리고 이건 추가 정보

상황 조치
WSL에서 exporter 실행 시 Windows 접근 안 됨 WSL IP 확인 후 prometheus.yml에 명시
Prometheus에서 exporter가 DOWN일 경우 포트 열림 여부 확인 (curl <ip>:9104), WSL 방화벽 설정 확인
보안상 exporter 사용자 제한 필요 MySQL에서 SELECT, PROCESS, REPLICATION CLIENT만 부여
Grafana에 알림 추가 특정 지표(Slow query 등)에 alert 설정 가능