레이블이 mysqld exporter인 게시물을 표시합니다. 모든 게시물 표시
레이블이 mysqld exporter인 게시물을 표시합니다. 모든 게시물 표시

[PMM] #120 Coffee Break


Coffee Break

{PMM] 이라는 이름으로 11개의 포스팅을 통해서 PMM의 플랫폼을 설치했고, 최종 목적인 MySQL 서버 모니터링 환경(모니터링 정보 수집, 대시보드 구성 등)을 구성해 보았다. 주요 모듈(Prometheus, Grafana, node/mysqld exporter )에 대한 상세한 구조와 원리에 대한 설명보다는 실행(Action)에 중점을 두어 설명했으므로, 여기까지 잘 따라해 보았다면, 잠시 쉬어가자.

지난 포스팅을 쭈욱 살펴보는것도 괜찮다.

[PMM] #010 PMM Tutorial for MySQL Monitoring
[PMM] #020 PMM (Percona Monitoring and Management)
[PMM] #030 PMM Server - Client 서버 정보
[PMM] #040 PMM Server - Prometheus 설치
[PMM] #050 PMM Client - Node Exporter 설치
[PMM] #060 PMM Client - Mysqld Exporter 설치
[PMM] #070 PMM Server - Grafana 설치
[PMM] #080 PMM Server - Grafana/Prometheus 데이터소스 연동
[PMM] #090 PMM Server - Percona App for Grafana 설치
[PMM] #100 Percona Dashboard - 리눅스 모니터링
[PMM] #110 Percona Dashboard - MySQL 모니터링



그리고 본 포스팅시리즈를 읽고 있는 독자들이 갖고 있을지도 모르는 몇가지 의아한 점에 대해서 간단히 언급해본다.



010. PMM 관련 포스팅을 왜 시작했나요?
- 한글 매뉴얼이 없음.
- 인터넷 검색을 해봐도 한글로 포스팅한 자료를 찾을 수 없음. 없는 듯 함.


020. PMM을 설치할 때 왜 Docker 이미지가 아니라 각각의 모듈별로 따로 설치하나요?
- Docker가 익숙치 않은 독자들을 위함.
- PMM을 구성하는 모듈의 개별 버전 업데이트가 빠르게 announce되고 있다. 개별 모듈별로 설치하므로써, 아직 실험적인 모듈들은 나중에 안정화 버전이 나오면 설치하고 싶다.
- PMM의 기능 중에서 꼭 필요한 기능만 사용하고 싶기 때문에.
- 각각의 모듈을 설치해보고 연동하는 과정은 생각보다 간단하기에 독자가 이해하고 실습하기에 더 적절할 것이라고 생각함.


030. PMM 아키텍쳐에는 Query Analytics, Ochestrator, Proxy Exporter 등의 모듈들이 있던데, 이 모듈들의 설명이나 설치에 관련한 내용은 왜 없나요?
- Query Analytics : 추후, 포스팅 하고 싶음. 아직까지는 시간적인 여유가 없기에.
- Ochestrator : 아직 실험적인 툴. 나중에 안정화 버전이 나오면 PMM과는 별도로 테스트해 보고 공유하고 싶음.
- Proxy Exporter : ProxySQL 관련 포스팅은 별도로 진행 예정.


040. Percona Dashborad TokuDB Metrics 대시보드는 언급하지 않고 건너뛴 이유가 있나요?
MySQL 서버를 사용하는 시스템에서 TokuDB 엔진에 비하여 InnoDB 엔진을 사용하는 것이 아직은 일반적이라고 생각하고 있다. 물론 Toku 엔진을 상용서비스( Production환경)에서 사용하고 있는 시스템이 없지는 않을 것이라 예상한다. “보편적으로 더 많이 사용하는 것들에 대한 모니터링하는 것을 먼저 언급하는 것뿐이다. Toku엔진, Galera Cluster, MyISAM 엔진 등에 대한 모니터링 지표도 기회가 되면 꼭 포스팅 하고 싶다


050. 리눅스 모니터링, MySQL 모니터링 지표 설명이 너무 간단한 것 같다. 실제로 MySQL 모니터링 지표를 성능 관점의 튜닝 등을 위하여 자세히 설명하거나 다양한 케이스를 예를 들어 설명해줄 수 없나요?
가장 공유하고 싶은 내용이다. 하지만 이 내용은 매우 자세하고 다양한 케이스를 언급해야 하는데 내용도 많고, 튜닝 케이스 재연이 필요하므로 포스팅에 오랜 시간이 필요하다. 이 내용도 나중에 기회가 된다면


060. 다음 PMM관련 포스팅 내용에는 어떤 것들이 있을지 미리 알려주세요.
다음 포스팅 내용을 미리 공유하자면 간단히 다음과 같다.

MySQL 실시간 모니터링
MySQL
모니터링 지표 중 실시간으로 조회하는 것이 의미있는 그래프로 구성하는 대시보드 만들기..
- [PMM] #130 MySQL
모니터링 - Realtime#1
- [PMM] #140 MySQL
모니터링
- Realtime#2

MySQL
일별 모니터링
MySQL
모니터링 지표 중 일별로 조회하는 것이 의미있는 그래프로 구성하는 대시보드 만들기
- [PMM] #150 MySQL
모니터링 - Daily#1
- [PMM] #160 MySQL
모니터링
- Daily#2


MySQL 모니터링 알림
Prometheus
Alert Manager를 설치하여 MySQL 모니터링 지표 중 특정 지표의 상태 변경시 알림(이메일 등) 기능 연동
- [PMM] #170 MySQL
모니터링 - 알림-Prometheus Alertmanager 설치
- [PMM] #180 MySQL
모니터링 - 알림
-Replication Stop

MySQL
데이터 모니터링
MySQL 성능 지표가 아닌 MySQL 서버의 특정 테이블들에 대한 SQL 질의 결과를 Prometheus에 저장하고 이를 대시보드로 구성.
- [PMM] #190 MySQL
모니터링 - 데이터모니터링#1-mysqlexporter 설치
- [PMM] #200 MySQL
모니터링 - 데이터모니터링#2-대시보드구성













[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