simDev1234
심플하고 차분하게
simDev1234
전체 방문자
오늘
어제
  • 분류 전체보기
    • Computer Science
      • Basic Math
      • Data Structure
      • Algorithm
      • Database
      • OS
    • Language
      • Java
      • Kotlin
      • SQL
    • Framework
      • Spring
      • Orm&Mapper
      • 프로젝트로 스프링 이해하기
      • 스프링 라이브러리
    • Infra
      • Cloud
      • Docker
      • Redis
      • AWS, Azure
      • Device
    • Etc
      • CleanCoding
    • Git,Github

블로그 메뉴

  • 홈
  • 태그
  • 방명록

공지사항

인기 글

태그

  • 참조변수
  • null
  • JVM메모리구조
  • 자바프로그래밍
  • 자바메모리구조
  • 자바프로그램
  • 컨트롤러
  • 스프링
  • scanner #next() #nextLine()
  • controllerTest
  • 404
  • 참조타입
  • 자바

최근 댓글

최근 글

티스토리

hELLO · Designed By 정상우.
simDev1234

심플하고 차분하게

[Docker] Prometheus와 Grafana를 통해 실시간 로그 확인
Infra/Docker

[Docker] Prometheus와 Grafana를 통해 실시간 로그 확인

2024. 1. 9. 01:12

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
    'Infra/Docker' 카테고리의 다른 글
    • [Docker] Proxy Layer 구성하기
    • [Docker] Orchestra를 통해 High Availability(HA) 구축하기
    • [Docker] 브리지를 통해 컨테이너 통신
    • [Docker] Master-Slave Replication 구성
    simDev1234
    simDev1234
    TIL용 블로그. * 저작권 이슈가 있는 부분이 있다면 댓글 부탁드립니다.

    티스토리툴바