PMM Client - Mysqld Exporter 설치
MySQL Server Exporter
MySQL Server Exporter(Mysqld Exporter)는 MySQL 서버의 모니터링 지표와 성능 관련 메트릭들을 Prometheus용 포멧으로 추출에서 웹 서비스로 제공하는 에이전트이다.
Mysqld Exporter 설치
- 설치버전 - 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/ 디렉토리에 복사 한 후, 해당 파일을 압축 해제 한다.
| [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). 그 후, 설치 디렉토리에 대한 심볼릭 링크를 생성하여 편의상 디렉토리 경로를 단순하게 한다.
| [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 -s /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(모든 데이터베이스) 권한을 부여한다.
| 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”라는 이름으로 생성한다.
| [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 와 같이 로그를 남기도록 실행한다.
| [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 & [1] 58988 [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 Client의 Mysqld 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의 프로세스를 중지하고 재 기동한다.
| [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 & [1] 64362 [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 서버가 정상적으로 등록되었는지 확인해본다.
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 | |
추가한 pmmclient의 mysql 메트릭을 클릭하면, 현재 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 |