[PMM] #060 PMM Client - Mysqld Exporter 설치

PMM Client - Mysqld Exporter 설치

MySQL Server Exporter
MySQL Server Exporter(Mysqld Exporter)MySQL 서버의 모니터링 지표와 성능 관련 메트릭들을 Prometheus용 포멧으로 추출에서 웹 서비스로 제공하는 에이전트이다
- 공식 홈페이지(github) : https://github.com/prometheus/mysqld_exporter

Mysqld Exporter 설치
- 다운로드 메인 : https://prometheus.io/download/
- 설치버전 - 0.9.0 / 2016-09-27 Release
- 웹 서비스 포트 : 9104 (기본값)


010. Mysqld Exporter 바이너리 압축 해제
Mysqld Exporter 바이너리(node_exporter-0.13.0-rc.1.linux-amd64.tar.gz) 파일을 다운로드 받아 /home/mysql/DBA/programs/PMM105/client/ 디렉토리에 복사 한 후, 해당 파일을 압축 해제 한다.
1
2
3
4
5
6
[mysql@pmmclient ~]$ cd /home/mysql/DBA/programs/PMM105/client/
[mysql@pmmclient client]$ tar xvzf mysqld_exporter-0.9.0.linux-amd64.tar.gz
mysqld_exporter-0.9.0.linux-amd64/
mysqld_exporter-0.9.0.linux-amd64/LICENSE
mysqld_exporter-0.9.0.linux-amd64/NOTICE
mysqld_exporter-0.9.0.linux-amd64/mysqld_exporter
cs



020. Mysqld Exporter 설치 디렉토리 생성
- 설치 디렉토리(3306포트 인스턴스) : /data/pmm_client/mysqld_exporter/3306/
- 심볼릭 링크 생성 : /home/mysql/mysqld_exporter_3306 à /data/pmm_client/mysqld_exporter/3306/mysqld_exporter-0.9.0.linux-amd64
Mysqld Exporter 설치 디렉토리를 생성하고 압축 해제한 Mysqld Exporter 바이너리를 설치 디렉토리에 옮긴다(move). 그 후, 설치 디렉토리에 대한 심볼릭 링크를 생성하여 편의상 디렉토리 경로를 단순하게 한다.

1
2
3
4
5
6
7
[mysql@pmmclient client]$ mkdir /data/pmm_client/mysqld_exporter
[mysql@pmmclient client]$ mkdir /data/pmm_client/mysqld_exporter/3306
[mysql@pmmclient client]$ mv mysqld_exporter-0.9.0.linux-amd64 /data/pmm_client/mysqld_exporter/3306/
[mysql@pmmclient client]$ ln -/data/pmm_client/mysqld_exporter/3306/mysqld_exporter-0.9.0.linux-amd64 /home/mysql/mysqld_exporter_3306
[mysql@pmmclient client]$ cd /home/mysql/
[mysql@pmmclient ~]$ ls -al | grep mysqld_exporter
lrwxrwxrwx   1 mysql mysql    71 2016-10-19 13:52 mysqld_exporter_3306 -> /data/pmm_client/mysqld_exporter/3306/mysqld_exporter-0.9.0.linux-amd64
cs


030. MySQL DB 계정 생성(for Mysqld Exporter)
Mysqld Exporter MySQL 데이터베이스에 접속하여 여러 상태값들을 수집한다. 이를 위하여 모니터링 대상 MySQL 서버(pmmclient, 3306포트로 서비스)에 접속하기 위한 DB 계정이 필요하다. 해당 계정에는 PROCESS, REPLICATION CLIENT, SELECT(모든 데이터베이스) 권한을 부여한다.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
mysql > use mysql;
mysql > CREATE USER 'pmmclient'@'localhost' IDENTIFIED BY 'pmmclient2@';
mysql > CREATE USER 'pmmclient'@'127.0.0.1' IDENTIFIED BY 'pmmclient2@';
mysql > GRANT PROCESS, REPLICATION CLIENT, SELECT ON *.* TO 'pmmclient'@'localhost' WITH MAX_USER_CONNECTIONS 20;
mysql > GRANT PROCESS, REPLICATION CLIENT, SELECT ON *.* TO 'pmmclient'@'127.0.0.1' WITH MAX_USER_CONNECTIONS 20;
mysql > FLUSH PRIVILEGES;
mysql > SELECT USER, HOST FROM user WHERE user='pmmclient';
+-----------+-----------+
| USER      | HOST      |
+-----------+-----------+
| pmmclient | localhost |
| pmmclient | 127.0.0.1 |
+-----------+-----------+
2 rows in set (0.00 sec)
cs

[주의]
모니터링용 MySQL 계정(pmmclient) 생성 시, 암호에 샵(#) 문자가 포함된다면 오류가 발생하므로 샵(#) 문자를 제외하고 암호를 설정한다.
[주의]
모니터링용 MySQL 계정을 생성할 때 "WITH MAX_USER_CONNECTIONS 20" 절을 추가하는 이유는 굉장히 중요하다. 이는 후반부에서 자세히 설명한다.


040. Mysqld Exporter 접속 정보 파일 세팅
Mysqld Exporter는 모니터링 대상 MySQL서버에 대한 접속 정보를 별도의 파일로 설정할 수 있으며, 해당 파일을 “mysqld_exporter_포트번호.cnf”라는 이름으로 생성한다.

1
2
3
4
5
6
7
8
9
[mysql@pmmclient ~]$ cd /home/mysql/mysqld_exporter_3306/
[mysql@pmmclient mysqld_exporter_3306]$ touch mysqld_exporter_3306.cnf
[mysql@pmmclient mysqld_exporter_3306]$ chmod 640 mysqld_exporter_3306.cnf
[mysql@pmmclient mysqld_exporter_3306]$ vi mysqld_exporter_3306.cnf
[client]
user=pmmclient
password=pmmclient2@
port=3306
socket=/tmp/mysql.sock
cs


050. Mysqld Exporter 기동
Mysqld Exporter를 기동하고 정상적으로 기동되었는지 로그와 프로세스 정상여부를 확인해본다.
Mysqld Exporter 기동 시, 설정한 옵션은 다음과 같다.
-config.my-cnf : Mysqld Exporter 접속 정보 파일 지정
-collect.binlog_size : MySQL binlog 크기 수집 여부
-collect.info_schema.processlist : MySQL information_schema processlist 정보 수집 여부
-web.listen-address : Mysqld Exporter 웹 서비스 포트(기본값:9104)
또한 백그라운드 실행 시, Mysqld Exporter의 정상작동 여부를 확인하기 위하여 /home/mysql/mysqld_exporter_3306/mysqld_exporter.log 와 같이 로그를 남기도록 실행한다.

1
2
3
4
5
6
7
8
9
10
[mysql@pmmclient mysqld_exporter_3306]$ nohup ./mysqld_exporter -config.my-cnf="/home/mysql/mysqld_exporter_3306/mysqld_exporter_3306.cnf" -collect.binlog_size=true -collect.info_schema.processlist=true -web.listen-address=:9104 -log.level=info > /home/mysql/mysqld_exporter_3306/mysqld_exporter.log 2>&1 &
[158988
[mysql@pmmclient mysqld_exporter_3306]$ ps -ef | grep mysqld_exporter
mysql    58988 40985  0 14:22 pts/0    00:00:00 ./mysqld_exporter -config.my-cnf=/home/mysql/mysqld_exporter_3306/mysqld_exporter_3306.cnf -collect.binlog_size=true -collect.info_schema.processlist=true -log.level=info
mysql    59029 40985  0 14:22 pts/0    00:00:00 grep mysqld_exporter
[mysql@pmmclient mysqld_exporter_3306]$ cat mysqld_exporter.log
nohup: ignoring input
time="2016-10-19T14:22:39+09:00" level=info msg="Starting mysqld_exporter (version=0.9.0, branch=master, revision=8400af20ccdbf6b5e0faa2c925c56c48cd78d70b)" source="mysqld_exporter.go:432"
time="2016-10-19T14:22:39+09:00" level=info msg="Build context (go=go1.6.3, user=root@2c131c66ca20, date=20160926-18:28:09)" source="mysqld_exporter.go:433"
time="2016-10-19T14:22:39+09:00" level=info msg="Listening on :9104" source="mysqld_exporter.go:451"
cs

Mysqld Exporter기동 시, 지정할 수 있는 모든 콜렉터에 대한 정보는 MySQL Server Exporter github 사이트(https://github.com/prometheus/mysqld_exporter)에서 확인할 수 있다.

060. Prometheus 설정 파일 변경(클라이언트 추가)
PMM Server prometheus.yml 파일에 PMM Client의 노드정보를 추가한다.
추가한 PMM ClientMysqld Exporter가 추출하는 MySQL 서버 모니터링 지표를 5초마다 Prometheus가 수집(scrape)하도록 설정하는 것이다.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
[pmm@pmmserver ~]$ cd prometheus
[pmm@pmmserver prometheus]$ vi prometheus.yml
# my global config
global:
  scrape_interval:     5s # By default, scrape targets every 15 seconds.
  evaluation_interval: 5s # By default, scrape targets every 15 seconds.
  # scrape_timeout is set to the global default (10s).
  # Attach these labels to any time series or alerts when communicating with
  # external systems (federation, remote storage, Alertmanager).
  external_labels:
      monitor: 'codelab-monitor'
# Load rules once and periodically evaluate them according to the global 'evaluation_interval'.
rule_files:
  # - "first.rules"
  # - "second.rules"
# A scrape configuration containing exactly one endpoint to scrape:
# Here it's Prometheus itself.
scrape_configs:
  # The job name is added as a label `job=<job_name>` to any timeseries scraped from this config.
  - job_name: 'prometheus'
    # Override the global default and scrape targets from this job every 5 seconds.
    scrape_interval: 5s
    # metrics_path defaults to '/metrics'
    # scheme defaults to 'http'.
    static_configs:
      - targets: ['localhost:9090']
 
  - job_name: 'linux'
    scrape_interval: 5s
    static_configs:
      - targets: ['192.168.0.11:9100']
        labels:
          alias"pmmclient:3306"
 
  - job_name: 'mysql'
    scrape_interval: 5s
    static_configs:
      - targets: ['192.168.0.11:9104']
        labels:
          alias"pmmclient:3306"
cs



070. Prometheus 재 기동
prometheus.yml 설정 파일의 변경사항(PMM Client 추가)을 적용하기 위해서는 Prometheus를 재 기동해야 한다. Prometheus의 프로세스를 중지하고 재 기동한다.

1
2
3
4
5
6
7
[pmm@pmmserver prometheus]$ ps -ef | grep prometheus
pmm      63570     1  0 11:55 ?        00:00:42 /home/pmm/prometheus/prometheus -config.file=/home/pmm/prometheus/prometheus.yml -storage.local.retention=8760h -log.level=info
[pmm@pmmserver prometheus]$ kill 63570
[pmm@pmmserver prometheus]$ nohup /home/pmm/prometheus/prometheus -config.file=/home/pmm/prometheus/prometheus.yml -storage.local.retention=8760h -log.level=info > /home/pmm/prometheus/prometheus.log 2>&1 &
[164362
[pmm@pmmserver prometheus]$ ps -ef | grep prometheus
pmm      64362 61630  2 14:24 pts/0    00:00:00 /home/pmm/prometheus/prometheus -config.file=/home/pmm/prometheus/prometheus.yml -storage.local.retention=8760h -log.level=info
cs


080. Prometheus 웹 서비스 접속
Prometheus를 정상적으로 재 기동하였다면, Prometheus 웹 서비스에 접속하여 추가한 pmmclient 서버가 정상적으로 등록되었는지 확인해본다.

- Status > Targets : http://192.168.0.10:9090/targets
Job name“mysql” pmmclient(192.168.0.11) 노드가 추가되었고, state UP(정상)이라면 Prometheus pmmclient 서버를 정상적으로 인식한것이다


Linux
Endpoint
State
Labels
Last Scrape
Error
UP
alias="pmmclient:3306"
2.33s ago
 
mysql
Endpoint
State
Labels
Last Scrape
Error
UP
alias="pmmclient:3306"
1.24s ago
 
prometheus
Endpoint
State
Labels
Last Scrape
Error
UP
none
4.13s ago
 

추가한 pmmclientmysql 메트릭을 클릭하면, 현재 Prometheus pmmclient 서버의 mysqld_exporter로부터 수집한 MySQL 서버 모니터링 정보를 확인할 수 있다.

..............
# HELP mysql_global_status_connections Generic metric from SHOW GLOBAL STATUS.
# TYPE mysql_global_status_connections untyped
mysql_global_status_connections 570
# HELP mysql_global_status_cpu_time Generic metric from SHOW GLOBAL STATUS.
# TYPE mysql_global_status_cpu_time untyped
mysql_global_status_cpu_time 52.339415
..............
cs


090. 멀티 인스턴스 MySQL 서버 고려사항
만일 한대의 서버에 여러 개의 MySQL 서버 인스턴스를 운영한다면, 각각의 MySQL인스턴스를 모니터링 할 수 있어야 한다. MySQL 서버 인스턴스들의 서비스 포트는 서로 다른것이다.
예를 들어 PMM Client 서버에 3개의 MySQL 인스턴스를 운영(3306, 3307, 3308이 각 인스턴스의 서비스 포트로 가정)중이고, 3개의 MySQL인스턴스를 각각 모니터링하길 원한다면 다음과 같이 Mysqld exporter를 추가 설치하고 설정하면 된다.


- mysqld_exporter 설치 디렉토리(3개의 디렉토리에 각각 설치한다)
/data/pmm_client/mysqld_exporter/3306
/data/pmm_client/mysqld_exporter/3307
/data/pmm_client/mysqld_exporter/3308
- mysqld_exporter.cnf 파일 생성(3개의 디렉토리에 각각 생성한다)
/home/mysql/mysqld_exporter_3306/mysqld_exporter_3306.cnf
/home/mysql/mysqld_exporter_3307/mysqld_exporter_3307.cnf
/home/mysql/mysqld_exporter_3308/mysqld_exporter_3308.cnf
- mysqld_exporter 프로세스 기동(3개의 프로세스를 각각 다른 웹 서비스 포트로 기동한다.)
cd /home/mysql/mysqld_exporter_3306/
nohup ./mysqld_exporter -config.my-cnf="/home/mysql/mysqld_exporter_3306/mysqld_exporter_3306.cnf" -collect.binlog_size=true -collect.info_schema.processlist=true -web.listen-address=:9104 -log.level=info > /home/mysql/mysqld_exporter_3306/mysqld_exporter.log 2>&1 &
cd /home/mysql/mysqld_exporter_3307/
nohup ./mysqld_exporter -config.my-cnf="/home/mysql/mysqld_exporter_3307/mysqld_exporter_3307.cnf" -collect.binlog_size=true -collect.info_schema.processlist=true -web.listen-address=:9105 -log.level=info > /home/mysql/mysqld_exporter_3307/mysqld_exporter.log 2>&1 &
cd /home/mysql/mysqld_exporter_3308/
nohup ./mysqld_exporter -config.my-cnf="/home/mysql/mysqld_exporter_3308/mysqld_exporter_3308.cnf" -collect.binlog_size=true -collect.info_schema.processlist=true -web.listen-address=:9106 -log.level=info > /home/mysql/mysqld_exporter_3308/mysqld_exporter.log 2>&1 &
cs


당연히 각 MySQL 인스턴스에 모드 ‘pmmclient’ DB 계정을 생성해야 한다.
또한 Prometheus prometheus.yml 파일에서 3개의 인스턴스 정보를 모두 추가하여 재 기동한다.


1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
[pmm@pmmserver ~]$ cd prometheus
[pmm@pmmserver prometheus]$ vi prometheus.yml
# my global config
global:
  scrape_interval:     5s # By default, scrape targets every 15 seconds.
  evaluation_interval: 5s # By default, scrape targets every 15 seconds.
  # scrape_timeout is set to the global default (10s).
  # Attach these labels to any time series or alerts when communicating with
  # external systems (federation, remote storage, Alertmanager).
  external_labels:
      monitor: 'codelab-monitor'
# Load rules once and periodically evaluate them according to the global 'evaluation_interval'.
rule_files:
  # - "first.rules"
  # - "second.rules"
# A scrape configuration containing exactly one endpoint to scrape:
# Here it's Prometheus itself.
scrape_configs:
  # The job name is added as a label `job=<job_name>` to any timeseries scraped from this config.
  - job_name: 'prometheus'
    # Override the global default and scrape targets from this job every 5 seconds.
    scrape_interval: 5s
    # metrics_path defaults to '/metrics'
    # scheme defaults to 'http'.
    static_configs:
      - targets: ['localhost:9090']
  - job_name: 'linux'
    scrape_interval: 5s
    static_configs:
      - targets: ['192.168.0.11:9100']
        labels:
          alias"pmmclient:3306"
      - targets: ['192.168.0.11:9100']
        labels:
          alias"pmmclient:3307"
      - targets: ['192.168.0.11:9100']
        labels:
          alias"pmmclient:3308"
  - job_name: 'mysql'
    scrape_interval: 5s
    static_configs:
      - targets: ['192.168.0.11:9104']
        labels:
          alias"pmmclient:3306"
      - targets: ['192.168.0.11:9105']
        labels:
          alias"pmmclient:3307"
      - targets: ['192.168.0.11:9106']
        labels:
          alias"pmmclient:3308"
cs







댓글 1개:

  1. 안녕하세요~ 쉽게 잘 알려주셔서 따라하고 있는데 prometheus에서 linux와 mysql의 state가 down으로 나오네요...최신버전으로 설치해봤는데 동일하고...혹시 서버-클라이언트 간에 추가 설정이 필요한가요?

    답글삭제