1. Prometheus란?
- 관련된 신화 : 신으로부터 불을 훔친 자로써, 형벌로 동생에게 판도라라는 여성을 보내 판도라의 상자 사건이 일어남
- 메트릭 수집, 시각화, 알림, 서비스 디스커버리 기능을 모두 제공하는 오픈 소스 모니터링 시스템이다.
- 프로메테우스로 모니터링을 하려면 모니터링 항목 수집을 위해 Exporter라고 하는 Agent가 수행되어야 한다.
ex. node_exporter, mysql_exporter, postgre_exporter, redis_exporter, kafka_exporter.....
2. Dockerfile로 mysqld_exporter와 node_exporter가 포함된 MySQL 컨테이너 생성하기
- Prometheus에서 모니터링을 하려면 MySQL 컨테이너에 node_exporter와 mysqld_exporter를 같이 설치해줘야한다.
- 기존의 percona에서는 두 exporter가 없었기 때문에 커스텀 image를 생성해줘야한다.
[1] custom_image 디렉토리 안에 dockerfile로 커스텀 image 생성
FROM centos:7
COPY ["Percona-Server-client-57-5.7.31-34.1.el7.x86_64.rpm",\
"Percona-Server-server-57-5.7.31-34.1.el7.x86_64.rpm", \
"Percona-Server-shared-57-5.7.31-34.1.el7.x86_64.rpm", \
"Percona-Server-shared-compat-57-5.7.31-34.1.el7.x86_64.rpm", \
"node_exporter-1.7.0.linux-amd64.tar.gz", \
"mysqld_exporter-0.15.1.linux-amd64.tar.gz", \
"start_node_exporter.sh", \
"start_mysqld_exporter.sh", \
".my.cnf","/home/opc/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 /home/opc/tmp/
RUN rpm -ivh Percona-Server-shared-57-5.7.31-34.1.el7.x86_64.rpm \
Percona-Server-shared-compat-57-5.7.31-34.1.el7.x86_64.rpm \
Percona-Server-client-57-5.7.31-34.1.el7.x86_64.rpm \
Percona-Server-server-57-5.7.31-34.1.el7.x86_64.rpm
RUN mkdir -p /home/opc/opt/exporters/ && \
tar -xzvf ./node_exporter-1.7.0.linux-amd64.tar.gz -C /home/opc/opt/exporters && \
tar -xzvf ./mysqld_exporter-0.15.1.linux-amd64.tar.gz -C /home/opc/opt/exporters
WORKDIR /home/opc/opt/exporters/
RUN mkdir -p node_exporter && \
mkdir -p mysqld_exporter && \
mv node_exporter-1.7.0.linux-amd64 node_exporter && \
mv mysqld_exporter-0.15.1.linux-amd64 mysqld_exporter && \
mv /home/opc/tmp/start_node_exporter.sh /home/opc/opt/exporters/node_exporter/ && \
mv /home/opc/tmp/start_mysqld_exporter.sh /home/opc/opt/exporters/mysqld_exporter/ && \
mv /home/opc/tmp/.my.cnf /home/opc/opt/exporters/mysqld_exporter/ && \
chmod o+x node_exporter/start_node_exporter.sh && \
chmod o+x mysqld_exporter/start_mysqld_exporter.sh && \
rm -rf /home/opc/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 /home/opc/tmp/docker-entrypoint.sh
RUN chmod +x /home/opc/tmp/docker-entrypoint.sh
ENTRYPOINT ["/home/opc/tmp/docker-entrypoint.sh"]
USER mysql
EXPOSE 3306
CMD ["mysqld"]
[2] 링크를 통해 설치 파일 다운로드
https://docs.percona.com/percona-server/5.7/installation/yum_repo.html#installing-from-the-percona-yum-repository
https://www.percona.com/downloads/Percona-Server-5.7/Percona-Server-5.7.31-34/binary/redhat/7/x86_64/Percona-Server-5.7.31-34-r2e68637-el7-x86_64-bundle.tar
https://prometheus.io/download/#node_exporter
[3] mysqld_exporter 설정 파일 추가 및 mysqld/node_exporter 실행 쉘스크립트 작성
- mysqld_exporter 설정 파일
vi .my.cnf
[client]
host=localhost
user=exporter
password=exporter123
- node_exporter와 mysqld_exporter 실행 쉘스크립트
#vi start node_exporter.sh
nohup /opt/exporters/node_exporter/node_exporter &
#vi start_mysqld_exporter.sh
nohup /opt/exporters/mysqld_exporter/mysqld_exporter
--config.my-cnf="/opt/exporters/mysqld_exporter/.my.cnf" &
[4] 모두 하나의 디렉토리 안에 넣었는지 확인
tree -a
[5] 이미지 생성
docker build -t mysql57:0.0 ./
docker images
[6] 컨테이너 실행
docker run -it --name mydb \
-e MYSQL_ROOT_PASSWORD="root" -d mysql57:0.0
3. Customer Image로 컨테이너 생성 및 Prometheus 컨테이너 구성
[1] 기존의 컨테이너를 모두 정지 및 삭제
# rm -f 를 쓰면 stop과 동시에 삭제
[root@dev opc]# docker rm -f db001 db002 db003
db001
db002
db003
[2] 호스트에서 사용자 그룹(GID)을 생성하고, 사용자(UID)를 생성한다.
- groupadd를 통해 mysql이라는 사용자 그룹을 생성한다(이때, GID는 1001)
- useradd를 통해 mysql이라는 사용자를 생성한다.(이때, UID도 1001)
- chown 에서 -R은 하위 디렉토리까지 권한을 준다는 의미이며, mysql:mysql은 소유자:그룹형식을 의미한다.
groupadd -g 1001 mysql
useradd -u 1001 -r -g 1001 mysql
chown -R mysql:mysql /db/db001 /db/db002 /db/db003
[3] Mysql 컨테이너 세대를 다시 생성
docker run -it --name db001 -h db001 -p 3306:3306 \
--net mybridge --net-alias=db001 \
-v /db/db001/data:/var/lib/mysql \
-v /db/db001/log:/var/log/mysql \
-v /db/db001/conf:/etc/percona-server.conf.d \
-e MYSQL_ROOT_PASSWORD="root" -d mysql57:0.0
docker run -it --name db002 -h db002 -p 3307:3306 \
--net mybridge --net-alias=db002 \
-v /db/db002/data:/var/lib/mysql \
-v /db/db002/log:/var/log/mysql \
-v /db/db002/conf:/etc/percona-server.conf.d \
-e MYSQL_ROOT_PASSWORD="root" -d mysql57:0.0
docker run -it --name db003 -h db003 -p 3308:3306 \
--net mybridge --net-alias=db003 \
-v /db/db003/data:/var/lib/mysql \
-v /db/db003/log:/var/log/mysql \
-v /db/db003/conf:/etc/percona-server.conf.d \
-e MYSQL_ROOT_PASSWORD="root" -d mysql57:0.0
[4] Prometheus가 사용할 디렉토리와 Computer 디렉토리 생성
mkdir -p /db/prom001 /db/prom001/data /db/prom001/conf
chmod 777 /db/prom001 /db/prom001/data /db/prom001/conf
[5] 프로메테우스 컨테이너 실행
(1) 설정 파일 구성
cd /db/prom001/conf
vi prometheus.yml
- 각 컨테이너별로 node_exporter와 mysqld_exporter 잡과 연결 정보를 등록한다.
- node_exporter는 주로 9100을 디폴트로 사용하고, mysqld_exporter는 주로 9104을 디폴트로 사용한다.
global:
scrape_interval: 5s
evaluation_interval: 5s
scrape_configs:
- job_name: linux_db001
static_configs:
- targets: ['db001:9100']
labels:
alias: db001
- job_name: mysql_db001
static_configs:
- targets: ['db001:9104']
labels:
alias: db001
- job_name: linux_db002
static_configs:
- targets: ['db002:9100']
labels:
alias: db002
- job_name: mysql_db002
static_configs:
- targets: ['db002:9104']
labels:
alias: db002
- job_name: linux_db003
static_configs:
- targets: ['db003:9100']
labels:
alias: db003
- job_name: mysql_db003
static_configs:
- targets: ['db003:9104']
labels:
alias: db003
(2) Docker로 Prometheus Container 실행
docker run -it --name prom001 -h prom001 -p 9090:9090 \
--net mybridge --net-alias=prom001 \
-v /db/prom001/data:/data \
-v /db/prom001/conf:/etc/prometheus \
-d prom/prometheus-linux-amd64
(3) Prometheus 설정
- Master MySQL 컨테이너에서 아래와 같이 프로메테우스용 user 생성
docker exec -it -uroot db001 /bin/bash
mysql -uroot -p
mysql > create user 'exporter'@'localhost' identified by 'exporter123' with MAX_USER_CONNECTIONS 3;
mysql > grant PROCESS, REPLICATION CLIENT, SELECT ON *.* TO 'exporter'@'localhost';
- 호스트에서 각각의 exporter 시작 쉘스크립트 실행
docker exec db001 sh /opt/exporters/node_exporter/start_node_exporter.sh
docker exec db001 sh /opt/exporters/mysqld_exporter/start_mysqld_exporter.sh
docker exec db002 sh /opt/exporters/node_exporter/start_node_exporter.sh
docker exec db002 sh /opt/exporters/mysqld_exporter/start_mysqld_exporter.sh
docker exec db003 sh /opt/exporters/node_exporter/start_node_exporter.sh
docker exec db003 sh /opt/exporters/mysqld_exporter/start_mysqld_exporter.sh
[6] Prometheus 웹 콘솔 접속
- 아래 주소로 접속을 하면 된다.
http://{{호스트id}}:9090/graph
- "up"이라는 쿼리를 쓰면 각 컨테이너별 exporter를 확인할 수 있다.
3. Grafana Container 실행 및 Dashboard만들기
[1] Docker로 Granfana Container 실행
docker run -it --name grafana -h grafana -p 13000:3000 \
--net mybridge --net-alias=grafana \
-d grafana/grafana
[2] http://{{host ip}}:13000/ 으로 그라파나 접속
- default 접속 : admin/admin
[3] Grafana 구성
- Connections > Data Sources > [Add Data Source] 에서 Prometheus를 선택한다.
- 접속 URL에 프로메테우스 컨테이너 정보 http://prom001:9090 입력 후 저장 및 테스트
[4] Dashboard 추가
- Dashboard 유형에는 여러가지가 있는데, 그 중
- 아래 링크에서 MYSQL_Overview.json의 json 정보를 복사한 후
https://github.com/percona/grafana-dashboards/tree/master/dashboards
- 프로메테우스의 [+] > Import dashboard 를 통해 로그 후 임포트
-
[참고]
https://www.lesstif.com/lpt/linux-chown-93127453.html
https://yjkim97.tistory.com/53
https://gurumee92.tistory.com/220
'Infra > Docker' 카테고리의 다른 글
[Docker] Proxy Layer 구성하기 (2) | 2024.01.08 |
---|---|
[Docker] Orchestra를 통해 High Availability(HA) 구축하기 (1) | 2024.01.08 |
[Docker] 브리지를 통해 컨테이너 통신 (1) | 2024.01.08 |
[Docker] Master-Slave Replication 구성 (0) | 2023.12.31 |
[Docker] 호스트OS에 log, config 연결 (+my.cnf) (1) | 2023.12.29 |