Prometheus/Grafana 모니터링 구축

hansung.dev·2021년 2월 18일
6
post-thumbnail

MySQL 모니터링 환경 구축하기

MySQL 운영에 필요한 모니터링 환경을 구축합니다.
아래는 Prometheus, Grafana를 이용하여 MySQL 대시보드를 구성한 모습니다.

Grafana, Prometheus, MySQL의 위키백과의 정의는 아래와 같습니다.

Grafana는 다중 플랫폼 오픈 소스 분석 및 대화형 시각화 웹 애플리케이션입니다. 지원되는 데이터 소스에 연결되면 웹에 대한 차트, 그래프 및 경고를 제공합니다. 추가 기능이 있는 Grafana Enterprise 버전도 사용할 수 있습니다. 위키백과(영어)

Prometheus는 이벤트 모니터링 및 경고에 사용되는 무료 소프트웨어 응용 프로그램입니다. 유연한 쿼리 및 실시간 경고와 함께 HTTP 풀 모델을 사용하여 구축된 시계열 데이터베이스에 실시간 메트릭을 기록합니다. 위키백과(영어)

MySQL은 세계에서 가장 많이 쓰이는 오픈 소스의 관계형 데이터베이스 관리 시스템이다. 다중 스레드, 다중 사용자 형식의 구조 질의어 형식의 데이터베이스 관리 시스템으로서 오라클이 관리 및 지원하고 있으며, Qt처럼 이중 라이선스가 적용된다. 위키백과

MySQL 서버 운영을 위해 OS 및 MySQL 주요 메트릭을 수집합니다. 수집은 Prometheus의 node_exporter, mysqld_exporter를 MySQL 서버에 설치 후 Prometheus 서버로 5초 단위로 수집하도록 설정합니다. 그리고 Grafana 서버에서 Promethus를 데이터 소스로 지정 후 대시보드를 구성합니다

환경 정보

테스트 환경 정보는 아래와 같습니다.

OS : macOS Big Sur Ver 11.1
Docker : 20.10.2
MySQL : MySQL 8.0.22
Grafana : 7.3
node_exporter : 1.1.0
mysqld_exporter : 0.12.1

Dockerfile 생성하기

Dockerfile을 이용해 MySQL과 node_exporter, mysqld_exporter가 설치된 도커 이미지를 생성합니다.

vi Dockerfile

FROM centos:7
COPY ["percona-server-client-8.0.22-13.1.el7.x86_64.rpm",\
      "percona-server-server-8.0.22-13.1.el7.x86_64.rpm", \
      "percona-server-shared-8.0.22-13.1.el7.x86_64.rpm", \
      "percona-server-shared-compat-8.0.22-13.1.el7.x86_64.rpm", \
      "node_exporter-1.1.0.linux-amd64.tar.gz", \
      "mysqld_exporter-0.12.1.linux-amd64.tar.gz", \
      "start_node_exporter.sh", \
      "start_mysqld_exporter.sh", \
      ".my.cnf","/tmp/"]
USER root
RUN groupadd -g 1001 mysql
RUN useradd -u 1001 -r -g 1001 mysql
RUN yum install -y perl.x86_64 \
    libaio.x86_64 \
    numactl-libs.x86_64 \
    net-tools.x86_64 \
    sudo.x86_64 \
    openssl.x86_64
WORKDIR /tmp/
RUN rpm -ivh percona-server-shared-8.0.22-13.1.el7.x86_64.rpm \
    percona-server-shared-compat-8.0.22-13.1.el7.x86_64.rpm \
    percona-server-client-8.0.22-13.1.el7.x86_64.rpm \
    percona-server-server-8.0.22-13.1.el7.x86_64.rpm
RUN mkdir -p /opt/exporters/ && \
    tar -xzvf ./node_exporter-1.1.0.linux-amd64.tar.gz -C /opt/exporters && \
    tar -xzvf ./mysqld_exporter-0.12.1.linux-amd64.tar.gz -C /opt/exporters
WORKDIR /opt/exporters/
RUN mv node_exporter-1.1.0.linux-amd64 node_exporter && \
    mv mysqld_exporter-0.12.1.linux-amd64 mysqld_exporter && \
    mv /tmp/start_node_exporter.sh /opt/exporters/node_exporter/ && \
    mv /tmp/start_mysqld_exporter.sh /opt/exporters/mysqld_exporter/ && \
    mv /tmp/.my.cnf /opt/exporters/mysqld_exporter/ && \
    chmod o+x /opt/exporters/node_exporter/start_node_exporter.sh && \
    chmod o+x /opt/exporters/mysqld_exporter/start_mysqld_exporter.sh && \
    rm -rf /tmp/*.rpm && \
    /usr/bin/install -m 0775 -o mysql -g mysql -d /var/lib/mysql \
    /var/run/mysqld /docker-entrypoint-initdb.d
VOLUME ["/var/lib/mysql", "/var/log/mysql","/etc/percona-server.conf.d"]
COPY ps-entry.sh /tmp/docker-entrypoint.sh
RUN chmod +x /tmp/docker-entrypoint.sh
ENTRYPOINT ["/tmp/docker-entrypoint.sh"]
USER mysql
EXPOSE 3306
CMD ["mysqld"]

mysqld_exporter가 접속할 서버 및 사용자, 패스워드 설정 파일을 생성합니다. (파일명 : .my.cnf)

vi .my.cnf

[client]
host=localhost
user=exporter
password=exporter

도커 이미지를 빌드하고 빌드된 이미지를 확인합니다.

docker build -t mysql80:0.0 ./
docker images

MySQL 구성하기

MySQL 도커를 실행합니다. MySQL의 설정 파일 및 데이터, 로그 경로는 도커가 종료되어도 사라지지 않도록 볼륨으로 구성해놓습니다.

# docker network
docker network ls
docker network create --driver bridge bridge_mysql

# mysql80
cd \
mkdir -p docker/mysql80/{data,log,conf}
chmod -R 777 docker/mysql80

docker run -it --name mysql80 -h mysql80 -p 3306:3306 \
--net bridge_mysql --net-alias=mysql80 \
-v /Users/hansung/docker/mysql80/data:/var/lib/mysql \
-v /Users/hansung/docker/mysql80/log:/var/log/mysql \
-v /Users/hansung/docker/mysql80/conf:/etc/percona-server.conf.d \
-e MYSQL_ROOT_PASSWORD="root" -d mysql80:0.0

Prometheus 구성하기

Prometheus 설정 파일을 생성합니다.

# Prometheus
cd \
mkdir -p docker/prometheus/{data,conf}
chmod -R 777 docker/prometheus

# prometheus.yml
cd \
vi docker/prometheus/conf/prometheus.yml

global:
  scrape_interval:     5s
  evaluation_interval: 5s

scrape_configs:
- job_name: linux_mysql80
  static_configs:
    - targets: ['mysql80:9100']
      labels:
        alias: mysql80
- job_name: mysql_mysql80
  static_configs:
    - targets: ['mysql80:9104']
      labels:
        alias: mysql80

Prometheus 도커를 실행합니다. MySQL의 메트릭을 수집할 mysqld_exporter가 접속할 exporter 계정 및 권한을 생성합니다. node_exporter, mysqld_exporter를 실행합니다.

# prometheus
docker run -it --name prometheus -h prometheus -p 9090:9090 \
--net bridge_mysql --net-alias=prometheus \
-v /Users/hansung/docker/prometheus/data:/prometheus \
-v /Users/hansung/docker/prometheus/conf:/etc/prometheus \
-d prom/prometheus-linux-amd64

# mysql
docker exec -it -uroot mysql80 /bin/bash
mysql -uroot -p

create user 'exporter'@'localhost' identified by 'exporter' WITH MAX_USER_CONNECTIONS 3;
grant process, replication client, select on *.* to 'exporter'@'localhost';

# exporter
docker exec mysql80 sh /opt/exporters/node_exporter/start_node_exporter.sh
docker exec mysql80 sh /opt/exporters/mysqld_exporter/start_mysqld_exporter.sh

Grafana 구성하기

Grafana 도커를 실행합니다.

docker run -it --name grafana -h grafana -p 3000:3000 \
--net bridge_mysql --net-alias=grafana \
-d grafana/grafana

http://localhost:9090/graph 접속 후 up 명령어를 수행하면 연결된 exporter를 확인할 수 있습니다.

http://localhost:3000/ 접속합니다. 접속 후 데이터 소스를 Prometheus로 선택합니다. HTTP> URL에 Prometheus서버 정보를 입력합니다. (ex. http://promethus:9090)

Grafanan Dashboard import하기

MySQL 대시보드를 생성하기 위해 percona의 Grafana dashboards json 파일을 다운로드합니다. 그리고 대시보드 생성 시 파일을 불러오거나 Json파일을 붙여 넣습니다. 그러면 대시보드가 생성됩니다.

percona>Grafana dashboards Github에서 AWS RDS, MongoDB, MySQL 등의 다양한 대시보드를 살펴볼 수 있습니다. 필요한 부분을 다운로드하여 수정해가며 사용하면 좋을 것 같습니다.

링크텍스트

profile
Data Engineer

2개의 댓글

comment-user-thumbnail
2021년 2월 18일

잘보고 갑니다!

1개의 답글