Prometheus - Grafana - Thanos 사내 도입기

Mysql exporter Docker 설치

슬리퍼는 맨발에 2023. 4. 18. 23:53

 
 
#사용법만.
- 준비 mysql 설치, 권한 부여, docker 설치
 
설치는 여기 보고 했습니다.
https://jins-dev.tistory.com/entry/Amazon-Linux2-%EC%97%90%EC%84%9C-MySQL-%EC%B4%88%EA%B8%B0-%ED%99%98%EA%B2%BD-%EC%84%B8%ED%8C%85%ED%95%98%EA%B8%B0

 

Amazon Linux2 에서 MySQL 초기 환경 세팅하기

22 년 기준 Amazon Linux2 는 CentOS 기반으로 되어있으며, 기본적으로 Yum Repository 에는 MySQL 서버의 패키지 경로가 존재하지 않는다. 따라서 먼저 Amazon Linux2 서버 위에 Yum Repository 를 추가해준다. sudo yum

jins-dev.tistory.com

 
권한부여

CREATE USER 'exporter'@'localhost' IDENTIFIED BY 'XXXXXXXX' WITH MAX_USER_CONNECTIONS 3;
GRANT PROCESS, REPLICATION CLIENT, SELECT ON *.* TO 'exporter'@'localhost';
flush privileges;

 
1. my.cnf 파일 설정

sudo echo '''
[client]
host=localhost
port=3306
socket=/home/mysql.sock
user=exporter
password=비밀번호~
''' | sudo tee /home/ec2-user/mysql_exporter.cnf

 
2. mysql exporter 설치

docker run -itd \
-p 9104:9104 \
-v /home/ec2-user/mysql_exporter.cnf:/home/.my.cnf \
-v /var/lib/mysql/mysql.sock:/home/mysql.sock \
--name mysql_exporter \
prom/mysqld-exporter

 
3. prometheus.yml 파일 설정 후 재시작
(mysql exporter 포트는 9104입니다~)

echo """
global:
  scrape_interval: 15s
  evaluation_interval: 15s

scrape_configs:
  - job_name: 'mysql_exporter'
    static_configs:
      - targets: ['10.1.1.42:9104']

""" | tee /home/ec2-user/prometheus.yml

docker restart prometheus

promethues, grafana 설치는 저번 포스트에
https://cherry-blossome-in-march.tistory.com/5

 

Prometheus - Grafana docker 설치 [centos]

#두괄식 요약 1. Docker 설치 #!/bin/sh #centOS yum update -y yum install -y yum-utils yum-config-manager --add-repo https://download.docker.com/linux/centos/docker-ce.repo yum install docker-ce docker-ce-cli containerd.io -y systemctl start docker sy

cherry-blossome-in-march.tistory.com

 
4. grafana에서 대시보드 켜보기

 
 
 
#자세하게
 
새 Exporter가 필요해질때마다 제일 먼저 보는 것은 언제나 Prometheus 공식 Docker hub 이미지가 있는가 없는가입니다.
(없으면 고통 시작인가? 생각하고 있으면 됩니다.)
 
docker hub에 올라온 공식이미지가 있느냐 없느냐에 따라서 삽질을 하는 시간이 극단적으로 줄어든다고 봐도 과언이 아니며, 공식은 대부분의 경우가 github에 적혀있는데로 설치만 하면 끝납니다.
 
https://hub.docker.com/r/prom/mysqld-exporter/
 
https://github.com/prometheus/mysqld_exporter
 
오오! 공식 docker image도 있고, github에도 설명이 있다!
 
이걸 믿고 오늘 하루를 통으로 날렸습니다.
 
삽질한 기록을 여기에 정리해둡니다. 이 글을 읽는 사람들은 나처럼 시간낭비 하지 않길 바랍니다...
 
 
1. mysql 유저 생성 - mysql 버전별 명령어가 다르니까 조심해야됩니다.
- 데이터를 가져가기 위한 권한을 설정해줍니다.
 
 
일단 설치 먼저
https://jins-dev.tistory.com/entry/Amazon-Linux2-%EC%97%90%EC%84%9C-MySQL-%EC%B4%88%EA%B8%B0-%ED%99%98%EA%B2%BD-%EC%84%B8%ED%8C%85%ED%95%98%EA%B8%B0

 

Amazon Linux2 에서 MySQL 초기 환경 세팅하기

22 년 기준 Amazon Linux2 는 CentOS 기반으로 되어있으며, 기본적으로 Yum Repository 에는 MySQL 서버의 패키지 경로가 존재하지 않는다. 따라서 먼저 Amazon Linux2 서버 위에 Yum Repository 를 추가해준다. sudo yum

jins-dev.tistory.com

설치는 여기 보고 고대로 따라했어요.
 

 
 

CREATE USER 'exporter'@'localhost' IDENTIFIED BY 'XXXXXXXX' WITH MAX_USER_CONNECTIONS 3;
GRANT PROCESS, REPLICATION CLIENT, SELECT ON *.* TO 'exporter'@'localhost';
flush privileges;

 
 
 
2. 지원하는 방식
 
mysql exporter는 두가지 방식의 구성을 지원합니다.
 
1) node exporter 처럼 각 DB 인스턴스에 설치해서 사용
2) blackbox exporter 처럼 한 인스턴스에서 나머지 DB에 접속하는 방식
 2번 비추합니다. 쿠버네티스에서는 어쩔지 모르겠는데
 ssl 접근 설정을 일일이 해주는 것도 일이고,
 key를 monitoring 서버에 다 몰아넣고 DB에 직접 연결하는게 보안적으로 바람직하지 않아보이네요.
single point of failure가 되는 점도 그렇구요.
 그래서 저는 당당하게 포기했습니다.
 이유가 없으면 도망이지만
 이유가 있으면 후퇴입니다.
 
그래서 1) 번 처럼 하면 node exporter 설치하듯이 구조가 되서 익숙합니다!

 
 
3. my.cnf 파일 넣어서 실행
=> mysql 설치하면 나오는 /etc/my.cnf 파일이 아닙니다. 헷갈려서 이걸 넣지 마세요. (시간낭비 원인 중 하나...)
github에 적힌 대로 새로 작성해야 해요.
 

 
 
이제 docker run에 넣자!
공식에서 시켰으니까 되겠지?
 
docker run -itd \
-p 9104:9104 \
--name mysql_exporter \
--config.my-cnf=/etc/my.cnf \
prom/mysqld-exporter
 
4. 즉시 실패... (공식 git hub에서 된다고 적어놨는데...)

 
 
5. 아무튼 두가지 해결책이 있습니다.
- Dockerfile을 간단하게 만들어서 CMD에 넣어라. prometheus 저장 기간 늘릴때도 이렇게 했습니다. (그러고 보니까 그때도 공식 이미지인데 flag가 정상 작동을 안했네?)
 
OR
 
- docker logs mysql_exporter에서 에러 메세지를 열심히 치우다 보니까 데이터가 /home/.my.cnf 위치에 저장됨을 알게 되었습니다.
(저는 이 에러가 바로 보이는게 아니라 다른 에러를 치우고 난 다음에야 보이게 되었거든요...)
그러니까 prometheus에서 -v로 prometheus.yml 파일을 넣은 것 처럼
-v /home/ec2-user/my.cnf:/home/.my.cnf 를 넣으면 동작합니다.
prometheus.yml 쓸때 느꼈지만 이렇게 해두면 자주 내용을 바꿀 일 있을때 container 밖에서 바꿀 수 있어서 참 좋은거 같아요.
 
6. 이 시점에서 데이터를 정상적으로 넣었으면 정상작동할거에요. - 다만 docker logs에는 계속 에러가 발생합니다.
(이게 위 에러를 가려서 시간 많이 날렸습니다.)
 
mysql.sock 을 찾을 수가 없습니다 라는 에러가 발생합니다.
 
7. 나는 잘 몰랐었는데 mysql의 원격접속은 IP로만 되는 줄 알았는데 mysql.sock 파일을 통해서도 가능하더라구요.
/var/run/mysqld/mysqld.sock
이 위치 아니면
 
/var/lib/mysql/mysql.sock
여기쯤 있습니다.
 

 
이거의 위치를 my.cnf에 넣어주면 되겠지라고 생각하고 시간 엄청 버렸습니다.
 
그럴 수 밖에...
/var/lib/mysql/mysql.sock 은 host의 디렉토리기 때문에 컨테이너는 당연히 접근 불가능 합니다.
외부의 mysql.sock 파일과연결해줘야 합니다.
 
-v /var/lib/mysql/mysql.sock:/home/mysql.sock 으로 넣어주고 my.cnf 파일에 위치를 명시해주면 됩니다.
 
 
8. 추가 삽질
에러 메시지 중에 exporter@localhost에 접근할 수 없습니다 하는 에러가 있었다.
 
그래서 해맑게 아! 접근 경로가 localhost여서 그런가?
 
하고 my.cnf 파일의 주소도 바꿔보고,
prometheus.yml 파일의 주소도 바꿔보고,
 
exporter@localhost가 아니라 exporter@private ip OR public ip
localhost 가 아니라 docker host의 주소인 172.17.0.1을 가리키면 되겠지? 하고...
바꾸면 되나? 싶어서 대량의 시간낭비를 했습니다.
 
그러기 위해서 github에서 clone 받은 Dockerfile을 build를 하려고 했다가 GO언어가 적힌거 보고 못알아먹어서 못하고...
 
Dockerfile에서 CMD 에 --mysqld.address="172.17.0.1" 을 아무리 넣어도 빌드가 안되는 거에요?
unknown long flag 라고...
 
한참을 github를 노려보다가 알게 되었는데
 
이 플래그는 github에서만 제공하는 플래그고 docker image는 제공을 안하더라구요 ㅎㅎ;; (github에는 그렇다고 안적어줬으면서???)
 
아무튼 docker image 에서는
 
docker run -itd \
-p 9104:9104 \
-v /home/ec2-user/mysql_exporter.cnf:/home/.my.cnf \
-v /var/lib/mysql/mysql.sock:/home/mysql.sock \
--name mysql_exporter \
-e DATA_SOURCE_NAME="exporter:PAASSWWOORRDD@(172.17.0.1:3306)/database" \
my/myimage:test
 
이렇게 data source name을 명시해주는 방식이라고 하네요.
 
이렇게 해서 드디어 바꿨지만... 바꿨어도 
에러 메시지에 exporter@172.17.0.1에 접근할 수 없습니다 하는 에러가 나왔고...
아, 이건 원인이 아니었구나... 복원했습니다...
 
문제의 원인은 아래에 있었습니다.
 
 
 
#일하다가 외국 블로거에게 비웃음 당한 썰...
https://alexkunin.medium.com/prometheus-mysqld-exporter-and-access-denied-errors-8e4d3e54f0af
 
여기를 들어가 보니까. 감사하게도 여러가지 실수하는 케이스 들을 적어주셨는데요?
 
선생님 제 병명은 뭔가요?
 
FUNNY PASSWORD!!!
 
암호에 #이 들어가 있어서...
 
오우! 정말 Funny 한 Password 로군요?
 
선생님께서 행복하셨다면 저는 그걸로 좋습니다...
 
다음부터는 비밀번호에 특수기호가 있다면
"""FUNNY_PASSWORD"""
로 감싸도록 합시다...
 
 
#결과 확인

아무튼 이렇게 state가 up으로 나오고!
 
 
mysql_ 이라는 prefix로 시작하는 쿼리들이 나오면 보통 제대로 연결 된겁니다.
제대로 연결이 되지 않았다면 state가 up으로 나와도, mysql_ 관련 쿼리가 3~4개 정도만 뜰겁니다.
이렇게 다 나와야 되요.

 
확실히 차트도 나오고~

그라파나 보드도 하나 띄워보면?
 
 

정상 작동 완료했습니다.