데이터베이스를 사용하면서 예상치 못한 장애 발생 및 비정상적인 쿼리문과 자원 소모 등 이슈가 발생할 수 있다.
이러한 이슈는 서비스를 운영하는 데 있어 치명적인 문제로 이어질 수 있다.
때문에 실시간 모니터링을 통해 장애 예방, 성능 최적화, 운영 효율성 확보 등의 모니터링 작업이 필요하다.
직접 DB 서버에 접속하여 성능 관련 쿼리를 수동으로 작성해 확인할 수도 있지만, 시간에 따른 데이터베이스의 변화 추이를 파악할 때는 전용 모니터링 툴을 사용하는 것이 효과적이다.
모니터링 툴은 Zabbix, Prometheus, MaxGauge, Datadog 등이 있지만, 무료로 사용할 수 있는 점과 실시간으로 데이터베이스의 변화를 확인할 수 있는점에서 Prometheus가 가장 적합한 선택이라 생각한다.
Prometheus는 오픈소스 모니터링 툴이다. 다양한 기능을 제공하고 있으며, 특히 시계열 데이터(Time-series data)를 수집하고 분석하는 데 최적화된 툴이다.
[시계열 데이터(Time-series data)]
시간에 따라 저장된 데이터를 의미한다.
Prometheus는 시간에 따라 생성되는 메트릭(지표) 데이터를 수집(Pull) 해와야 하는데, 이때 사용되는 개념이 Exporter이다. 이러한 Exporter는 사용하는 서비스에 따라 다양한 종류가 있다.
- Node Exporter : IT Infra(하드웨어 및 운영체제)의 메트릭 데이터를 수집
- MySQL Exporter : MySQL 데이터베이스 서버의 메트릭 데이터 수집
위 Exporter 외에도 다양한 Exporter가 존재한다.
Grafana는 시간에 따라 생성되는 메트릭(지표) 데이터를 시각화하는 오픈소스 대시보드 툴이다.
Prometheus를 사용한다면 거의 필수로 함께 사용하는 툴로 메트릭 데이터를 불러와 다양한 차트와 테이블, 그래프로 표현할 수 있다.
MySQL 모니터링은 아래와 같은 구조로 설계/실행할 계획이다.

Prometheus의 mysqld_exporter는 MySQL 서버에서 주요 성능 지표(메트릭)를 수집한다.
수집된 데이터는 Prometheus의 시계열 데이터베이스에 저장되며, Grafana가 이를 시각화하여 대시보드 형태로 표현한다.
/opt/monitoring/ ├── download/ # 모니터링 관련 압축 파일 및 압축 해제 파일 저장 │ ├── prometheus/ │ ├── prometheus # binary │ ├── promtoll # binary │ ├── prometheus.yml # 설정 파일 │ └── data/ # 수집된 시계열 데이터 저장 └── mysqld_exporter/ └── mysqld_exporter # binaryGrafana는 패키지 매니저(dnf, yum, apt)를 통해 설치되므로 별도의 디렉터리를 수동으로 생성하지 않아도 된다.
Prometheus와 mysqld_exporter는 압축 파일을 직접 다운로드한 후 수동으로 설치하는 방식이므로
/opt/monitoring/하위에 디렉터리를 생성하여 구성 파일을 정리한다.
CREATE USER 'exporter'@'%' IDENTIFIED BY 'password';
- PROCESS : 현재 실행 중인 쿼리/스레드 조회
- REPLICATION CLIENT : 복제(마스터/슬레이브) 상태 조회
- SELECT : 모든 DB/테이블 조회
GRANT PROCESS, REPLICATION CLIENT, SELECT ON *.* TO 'exporter'@'%';
프로메테우스 공식 사이트에 접속하여 mysqld_exporter 설치 URL을 확인한 후 설치 명령어를 통해 설치한다.
mysqld_exporter 설치는 서버 환경에 맞게 설치해야 정상적인 모니터링이 가능하다.
wget https://github.com/prometheus/mysqld_exporter/releases/download/v0.17.2/mysqld_exporter-0.17.2.linux-arm64.tar.gz
tar -xvf mysqld_exporter-0.17.2.linux-arm64.tar.gz
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 실행 후 http://<설치 IP 주소>:9104 접속을 통해 정상 실행되고 있는지 확인 할 수 있다.
mysqld_exporter는 기본적으로 9104 포트를 사용한다.프로메테우스 공식 사이트에 접속하여 prometheus 설치 URL을 확인한 후 설치 명령어를 통해 설치한다.
prometheus 설치는 서버 환경에 맞게 설치해야 정상적인 모니터링이 가능하다.
wget https://github.com/prometheus/prometheus/releases/download/v3.5.0/prometheus-3.5.0.linux-arm64.tar.gz
tar -xvf prometheus-3.5.0.linux-arm64.tar.gz
prometheus 파일 압축 해제 후 prometheus.yml 내부에 MySQL 모니터링 작업 타겟을 설정한다.
prometheus.yml하단부에 아래와 타겟 설정 코드를 기입한다.scrape_configs: - job_name: "mysqld_exporter" static_configs: - targets: ["localhost:9104"]
타겟 설정이 완료된 prometheus.yml을 기반으로 prometheus를 실행한다.
./prometheus --config.file=prometheus.yml &
prometheus 실행 후 http://<설치 IP 주소>:9090 접속을 통해 정상 실행되고 있는지 확인 할 수 있다.
prometheus 기본적으로 9090 포트를 사용한다.그라파나 공식 사이트에 접속하여 grafana 설치 URL을 확인한 후 설치 명령어를 통해 설치한다.
grafana 설치는 서버 환경에 맞게 설치해야 정상적인 대시보드 제작이 가능하다
현재 모니터링 구축은 Enterprise 아닌 OSS 버전으로 설치 진행했다.
sudo yum install -y https://dl.grafana.com/oss/release/grafana-12.1.0-1.aarch64.rpm
systemctl start grafana-server.service
systemctl status grafana-server.serviceActive 부분이
active (running)으로 되어 있으면 정상 실행되고 있다는 의미이다.
grafana 실행 확인 후 http://<설치 IP 주소>:3000 접속을 통해 grafana에 접속할 수 있다.
grafana처음 접속 시 ID와 PW는 admin이다.
(첫 로그인 후 PW를 변경하라는 화면이 나온다)
Prometheus와 Grafana를 연동하기 위해서는 Grafana 접속 후 좌측 상단의 "Grafana 로고" 클릭 후 Configuration -> Data sources 순서로 클릭을 진행한다.
이후 "Add data source" 버튼을 클릭하여 데이터를 연동한다.
데이터 연동은 Prometheus 기반의 데이터이기 때문에 화면에 보이는 "Prometheus"를 선택한다.
이후 이름과 URL 등 다양한 옵션을 설정하고 하단의 "Save & Test" 버튼을 클릭한다.
"Save & Test" 버튼을 클릭한 후 위와 같은 성공 문구가 나오면 정상적으로 연동이 되었다는 의미다.
대시보드를 제작하기 위해서는 grafana 접속 후 좌측 상단에 "Grafana 로고" 클릭 후 "Dashboards"를 선택한다.
이후 "+ Create dashboards" 버튼을 클릭한다.
"+ Create dashboards" 버튼을 클릭한 후 위 이미지 화면에서 "import dashboard" 버튼을 클릭한다.
다음 화면에서 불러올 대시보드를 설정할 수 있다.
이후 "Load" 버튼을 클릭하면 된다.
대시보드의 데이터를 Prometheus로 설정한 뒤 "Import" 버튼을 클릭하면 된다.
지금까지 위 대시보드 확인은 모두 서버 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
MySQL 서버가 현재까지 가동된 시간.
초당 처리된 쿼리 수 (데이터베이스의 부하 상태 확인 가능, 트래픽 변화에 따른 성능 상태 파악)
InnoDB의 버퍼 풀 크기 (MySQL의 메모리 활용 상태)
전체 메모리 대비 버퍼풀이 차지하는 비율(%)
현재 연결된 클라이언트 수와 최대 사용된 연결 수
MySQL 클라이언트의 활성 스레드 수
처리 중인 스레드 수가 급증하면 동시 처리 병목 가능성이 높아진다.
- Peak Threads Connected : 특정 시간 동안 MySQL에 동시 접속된 클라이언트 수
- Peak Threads Running : 특정 시간 동안 동시에 실행 중인 스레드 수
- Avg Threads Running : 특정 시간 동안 평균 실행 스레드 수
시간별 전체 쿼리 수
- 그래프는 초당 질문 수(QPS)의 시계열 평균을 보여줌
MySQL의 스레드/캐시 사용량
성능 병목 원인의 슬로우 쿼리 확인
대시보드에서는 슬로우 쿼리 수량을 보여줄 뿐, 쿼리 내용을 확인 할 순 없다.
아래는 슬로우 쿼리 로그 활성화 방법이다. 또한 임시 기록 방법이며, 만약 영구적으로 로그 기록을 활성화하려면 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;
비정상적으로 끊긴 연결 수 (오류 및 접속 문제 판단)
테이블 잠금 발생 수 (락 경합 및 병목 확인)
디스크 성능 지표 (버퍼풀 미스 및 과도한 쓰기 작업 감지)