[MySQL] 모니터링(Prometheus & Grafana)

코린이·2025년 7월 23일

포트폴리오

목록 보기
7/7

✅ DataBase 모니터링

데이터베이스를 사용하면서 예상치 못한 장애 발생 및 비정상적인 쿼리문과 자원 소모 등 이슈가 발생할 수 있다.

이러한 이슈는 서비스를 운영하는 데 있어 치명적인 문제로 이어질 수 있다.

때문에 실시간 모니터링을 통해 장애 예방, 성능 최적화, 운영 효율성 확보 등의 모니터링 작업이 필요하다.

직접 DB 서버에 접속하여 성능 관련 쿼리를 수동으로 작성해 확인할 수도 있지만, 시간에 따른 데이터베이스의 변화 추이를 파악할 때는 전용 모니터링 툴을 사용하는 것이 효과적이다.

모니터링 툴은 Zabbix, Prometheus, MaxGauge, Datadog 등이 있지만, 무료로 사용할 수 있는 점과 실시간으로 데이터베이스의 변화를 확인할 수 있는점에서 Prometheus가 가장 적합한 선택이라 생각한다.

📌 Prometheus

Prometheus는 오픈소스 모니터링 툴이다. 다양한 기능을 제공하고 있으며, 특히 시계열 데이터(Time-series data)를 수집하고 분석하는 데 최적화된 툴이다.

[시계열 데이터(Time-series data)]
시간에 따라 저장된 데이터를 의미한다.

Prometheus는 시간에 따라 생성되는 메트릭(지표) 데이터를 수집(Pull) 해와야 하는데, 이때 사용되는 개념이 Exporter이다. 이러한 Exporter는 사용하는 서비스에 따라 다양한 종류가 있다.

  • Node Exporter : IT Infra(하드웨어 및 운영체제)의 메트릭 데이터를 수집
  • MySQL Exporter : MySQL 데이터베이스 서버의 메트릭 데이터 수집

위 Exporter 외에도 다양한 Exporter가 존재한다.


📌 Grafana

Grafana는 시간에 따라 생성되는 메트릭(지표) 데이터를 시각화하는 오픈소스 대시보드 툴이다.

Prometheus를 사용한다면 거의 필수로 함께 사용하는 툴로 메트릭 데이터를 불러와 다양한 차트와 테이블, 그래프로 표현할 수 있다.


✅ MySQL 모니터링

MySQL 모니터링은 아래와 같은 구조로 설계/실행할 계획이다.

Prometheus의 mysqld_exporter는 MySQL 서버에서 주요 성능 지표(메트릭)를 수집한다.

수집된 데이터는 Prometheus의 시계열 데이터베이스에 저장되며, Grafana가 이를 시각화하여 대시보드 형태로 표현한다.

📌 디렉터리 구조

/opt/monitoring/
├── download/             # 모니터링 관련 압축 파일 및 압축 해제 파일 저장
│
├── prometheus/
│   ├── prometheus        # binary
│   ├── promtoll          # binary
│   ├── prometheus.yml    # 설정 파일
│   └── data/			  # 수집된 시계열 데이터 저장
└── mysqld_exporter/
    └── mysqld_exporter   # binary

Grafana는 패키지 매니저(dnf, yum, apt)를 통해 설치되므로 별도의 디렉터리를 수동으로 생성하지 않아도 된다.

Prometheus와 mysqld_exporter는 압축 파일을 직접 다운로드한 후 수동으로 설치하는 방식이므로 /opt/monitoring/ 하위에 디렉터리를 생성하여 구성 파일을 정리한다.

📌 MySQL 모니터링용 계정 생성

▶︎ MySQL 모니터링 전용 계정 생성

CREATE USER 'exporter'@'%' IDENTIFIED BY 'password';

▶︎ MySQL 모니터링 계정 권한 부여

  • PROCESS : 현재 실행 중인 쿼리/스레드 조회
  • REPLICATION CLIENT : 복제(마스터/슬레이브) 상태 조회
  • SELECT : 모든 DB/테이블 조회
GRANT PROCESS, REPLICATION CLIENT, SELECT ON *.* TO 'exporter'@'%';

📌 mysqld_exporter 설치

프로메테우스 공식 사이트에 접속하여 mysqld_exporter 설치 URL을 확인한 후 설치 명령어를 통해 설치한다.

mysqld_exporter 설치는 서버 환경에 맞게 설치해야 정상적인 모니터링이 가능하다.

  • 현 서버 환경 스펙 : ARM64 기반의 centOS 09

프로메테우스 다운로드 사이트
mysqld_exporter 릴리즈 다운로드 사이트

▶︎ mysqld_exporter 설치

wget https://github.com/prometheus/mysqld_exporter/releases/download/v0.17.2/mysqld_exporter-0.17.2.linux-arm64.tar.gz

▶︎ mysqld_exporter 압축 해제

tar -xvf mysqld_exporter-0.17.2.linux-arm64.tar.gz

▶︎ mysqld_exporter 실행

mysqld_exporter를 실행할 때는 MySQL 설정 파일(.my.cnf)을 사용하여 mysqld_exporter를 실행한다.

설정 파일에는 모니터링에 사용할 계정ID와 PW를 기입한다.

[.my.cnf 파일 내부]

[client]
user=<모니터링용 mysql 계정>
password=<모니터링용 mysql 계정 비밀번호>

[mysqld_exporter 실행]

# 백그라운드에서 실행
./mysqld_exporter --config.my-cnf=/root/.my.cnf &

▶︎ mysqld_exporter 실행 확인

mysqld_exporter 실행 후 http://<설치 IP 주소>:9104 접속을 통해 정상 실행되고 있는지 확인 할 수 있다.

  • mysqld_exporter는 기본적으로 9104 포트를 사용한다.

📌 Prometheus 설치

프로메테우스 공식 사이트에 접속하여 prometheus 설치 URL을 확인한 후 설치 명령어를 통해 설치한다.

prometheus 설치는 서버 환경에 맞게 설치해야 정상적인 모니터링이 가능하다.

  • 현 서버 환경 스펙 : ARM64 기반의 centOS 09

프로메테우스 다운로드 사이트
prometheus 릴리즈 다운로드 사이트

▶︎ prometheus 설치

wget https://github.com/prometheus/prometheus/releases/download/v3.5.0/prometheus-3.5.0.linux-arm64.tar.gz

▶︎ prometheus 압축 해제

tar -xvf prometheus-3.5.0.linux-arm64.tar.gz 

▶︎ prometheus 설정

prometheus 파일 압축 해제 후 prometheus.yml 내부에 MySQL 모니터링 작업 타겟을 설정한다.

prometheus.yml 하단부에 아래와 타겟 설정 코드를 기입한다.

scrape_configs:
  - job_name: "mysqld_exporter"
    static_configs:
      - targets: ["localhost:9104"]

▶︎ prometheus 실행

타겟 설정이 완료된 prometheus.yml을 기반으로 prometheus를 실행한다.

./prometheus --config.file=prometheus.yml &

▶︎ prometheus 실행 확인

prometheus 실행 후 http://<설치 IP 주소>:9090 접속을 통해 정상 실행되고 있는지 확인 할 수 있다.

  • prometheus 기본적으로 9090 포트를 사용한다.

📌 Grafana 설치

그라파나 공식 사이트에 접속하여 grafana 설치 URL을 확인한 후 설치 명령어를 통해 설치한다.

grafana 설치는 서버 환경에 맞게 설치해야 정상적인 대시보드 제작이 가능하다

  • 현 서버 환경 스펙 : ARM64 기반의 centOS 09

현재 모니터링 구축은 Enterprise 아닌 OSS 버전으로 설치 진행했다.

그라파나 다운로드 사이트

▶︎ grafana 설치

sudo yum install -y https://dl.grafana.com/oss/release/grafana-12.1.0-1.aarch64.rpm

▶︎ grafana 실행

systemctl start grafana-server.service

▶︎ grafana 실행 확인

systemctl status grafana-server.service

Active 부분이 active (running)으로 되어 있으면 정상 실행되고 있다는 의미이다.

▶︎ grafana 접속

grafana 실행 확인 후 http://<설치 IP 주소>:3000 접속을 통해 grafana에 접속할 수 있다.

  • grafana 기본적으로 3000 포트를 사용한다.

grafana 처음 접속 시 ID와 PW는 admin이다.
(첫 로그인 후 PW를 변경하라는 화면이 나온다)

📌 Prometheus -> Grafana 데이터 연동

Prometheus와 Grafana를 연동하기 위해서는 Grafana 접속 후 좌측 상단의 "Grafana 로고" 클릭 후 Configuration -> Data sources 순서로 클릭을 진행한다.

이후 "Add data source" 버튼을 클릭하여 데이터를 연동한다.

데이터 연동은 Prometheus 기반의 데이터이기 때문에 화면에 보이는 "Prometheus"를 선택한다.

이후 이름과 URL 등 다양한 옵션을 설정하고 하단의 "Save & Test" 버튼을 클릭한다.

"Save & Test" 버튼을 클릭한 후 위와 같은 성공 문구가 나오면 정상적으로 연동이 되었다는 의미다.

📌 Grafana MySQL 대시보드 제작

대시보드를 제작하기 위해서는 grafana 접속 후 좌측 상단에 "Grafana 로고" 클릭 후 "Dashboards"를 선택한다.

이후 "+ Create dashboards" 버튼을 클릭한다.

"+ Create dashboards" 버튼을 클릭한 후 위 이미지 화면에서 "import dashboard" 버튼을 클릭한다.

다음 화면에서 불러올 대시보드를 설정할 수 있다.

  • MySQL의 경우 ID값 7362를 사용하면 된다.
  • ID 7362는 MySQL Exporter 전용 대시보드를 의미한다.
  • MySQL Overview

이후 "Load" 버튼을 클릭하면 된다.

대시보드의 데이터를 Prometheus로 설정한 뒤 "Import" 버튼을 클릭하면 된다.

📌 대시보드 확인


✅ 외부 PC에서 대시보드 확인

지금까지 위 대시보드 확인은 모두 서버 PC에서 확인한 결과이다.

이러한 서버의 결과를 클라이언트 PC에서 확인하려면 별도의 포트 방화벽 설정이 필요하다.

만약 클라이언트 PC로 아래 URL 접근이 가능하다면 별도의 설정 없이 서버의 대시 보드를 확인 할 수 있다.

http://<서버 PC IP>:3000

📌 포트 방화벽 설정

Grafana는 기본 3000번 포트를 사용하고 있기 때문에 3000번 포트가 열려 있어야 외부 접근이 가능하다.

현재 열려 있는 포트 확인

firewall-cmd --list-ports

만약 3000번 포트가 안 열려 있는 경우 아래 명령어를 통해 3000번 포트를 열어준다.

firewall-cmd --add-port=3000/tcp --permanent
firewall-cmd --reload

📌 외부 PC에서 대시보드 확인


✅ 모니터링 주요 항목

▶︎ MySQL Uptime

MySQL 서버가 현재까지 가동된 시간.

▶︎ Current QPS

초당 처리된 쿼리 수 (데이터베이스의 부하 상태 확인 가능, 트래픽 변화에 따른 성능 상태 파악)

▶︎ InnoDB Buffer Pool Size

InnoDB의 버퍼 풀 크기 (MySQL의 메모리 활용 상태)

▶︎ Buffer Pool Size of Total RAM

전체 메모리 대비 버퍼풀이 차지하는 비율(%)

▶︎ MySQL Connections

현재 연결된 클라이언트 수와 최대 사용된 연결 수

▶︎ MySQL Client Thread Activity

MySQL 클라이언트의 활성 스레드 수
처리 중인 스레드 수가 급증하면 동시 처리 병목 가능성이 높아진다.

  • Peak Threads Connected : 특정 시간 동안 MySQL에 동시 접속된 클라이언트 수
  • Peak Threads Running : 특정 시간 동안 동시에 실행 중인 스레드 수
  • Avg Threads Running : 특정 시간 동안 평균 실행 스레드 수

▶︎ MySQL Questions

시간별 전체 쿼리 수

  • 그래프는 초당 질문 수(QPS)의 시계열 평균을 보여줌

▶︎ MySQL Thread Cache

MySQL의 스레드/캐시 사용량

▶︎ MySQL Slow Queries ⭐️⭐️⭐️

성능 병목 원인의 슬로우 쿼리 확인
대시보드에서는 슬로우 쿼리 수량을 보여줄 뿐, 쿼리 내용을 확인 할 순 없다.

아래는 슬로우 쿼리 로그 활성화 방법이다. 또한 임시 기록 방법이며, 만약 영구적으로 로그 기록을 활성화하려면 my.cnf 파일에 설정이 필요하다.

[활성화 현황 확인 및 저장 위치 확인]

SHOW VARIABLES LIKE 'slow_query_log';
SHOW VARIABLES LIKE 'slow_query_log_file';
SHOW VARIABLES LIKE 'long_query_time';

[슬로우 쿼리 로그 기록 활성화]

SET GLOBAL slow_query_log = ON;
-- 1초 이상 소요되는 쿼리문을 슬로우 쿼리로 지정
SET GLOBAL long_query_time = 1;

[슬로우 쿼리 확인]
슬로우 쿼리 로그 파일 내부를 확인하면 아래와 같이 슬로우 쿼리를 확인 할 수 있다.

[root@localhost mysql]# cat localhost-slow.log 
/usr/libexec/mysqld, Version: 8.0.41 (Source distribution). started with:
Tcp port: 3306  Unix socket: /var/lib/mysql/mysql.sock
Time                 Id Command    Argument
# Time: 2025-07-27T02:49:52.528663Z
# User@Host: admin[admin] @  [172.30.1.25]  Id:  4008
# Query_time: 32.438005  Lock_time: 0.000003 Rows_sent: 0  Rows_examined: 13716675
use nba_db;
SET timestamp=1753584560;
with tmp_tb as (
	select A.game_id from game A left join line_score B
		on A.game_date = B.game_date_est
    left join team_details C
		on B.team_id_home = C.team_id
)
select *
from play_by_play A left join tmp_tb B
	on A.game_id = B.game_id;

▶︎ MySQL Aborted Connections

비정상적으로 끊긴 연결 수 (오류 및 접속 문제 판단)

▶︎ MySQL Table Locks

테이블 잠금 발생 수 (락 경합 및 병목 확인)

▶︎ I/O Activity

디스크 성능 지표 (버퍼풀 미스 및 과도한 쓰기 작업 감지)

0개의 댓글