모니터링 환경 구축
구축 배경
서버 상태, Rabbit MQ 상태, Mysql 상태를 실시간으로 확인할 수 있는 환경을 구축하고 싶다는 생각은 계속 해왔다.
개발서버의 경우 Proxmox로 구성되어 있어 언제든지 서버 상태를 조회해볼 수 있었지만, 서비스운영 서버의 경우에는 직접 들어가 일일히 top 또는 htop 을 통해 확인 해줘야 했다.
만약 데이터베이스 이슈 확인을 위해 슬로우쿼리가 의심되는 경우라면 그게 맞는지 로그를 뒤져 지연 시간을 확인해야 한다.
여럿 다양한 경우들이 발생할 수 있고, 서비스 운영을 하는 상황이라면 더더욱 모니터링 시스템 구축은 필수이다.
그 중 오픈소스로 사용이 가능한 프로메테우스와 그라파나를 소개 설치 시 시행착오를 줄일 수 있도록 설치 가이드를 작성하고자 한다.
설치 및 세팅
프로메테우스는 자료 수집을 진행 , 그라파나는 수집된 자료를 시각화하는 오픈소스이다.
일반적으로 프로메테우스와 그라파나를 함께 쓰는게 일반적이다.
프로메테우스의 기본 용어
메트릭(Metric) | 측정 가능한 데이터 포인트로, 시스템의 상태를 나타내는 숫자값. 예를 들어 CPU 사용량, 메모리 사용량, 요청 수 등이 메트릭에 해당. |
타임 시리즈(Time Series) | 시간의 흐름에 따른 메트릭의 연속적인 데이터 포인트 집합. 메트릭과 레이블(Label)의 조합으로 구성. |
레이블(Label) | 메트릭에 부가적인 식별 정보를 제공하는 키-값 쌍. 예를 들어 job=node_exporter, instance=host1:9100 등이 레이블에 해당. |
타겟(Target) | 메트릭을 수집하는 대상으로, 일반적으로 엔드포인트 URL을 의미. 예를 들어 node_exporter의 엔드포인트가 타겟이 됨. |
작업(Job) | 동일한 목적의 타겟 그룹으로, 유사한 메트릭을 수집하는 타겟들의 집합. 예를 들어 node_exporter를 실행하는 모든 노드들이 하나의 작업이 될 수 있음 |
스크랩(Scrape) | 프로메테우스가 타겟의 메트릭을 수집하는 행위. 특정 간격(scrape_interval)으로 주기적으로 수행. |
알림 규칙(Alerting Rule) | 특정 조건을 만족하면 알림을 발생시키는 규칙. 이를 통해 문제 상황을 감지하고 관리자에게 알림을 보낼 수 있음. |
레코딩 규칙(Recording Rule) |
새로운 타임 시리즈 데이터를 만들거나 기존 데이터를 전처리하는 규칙. 데이터 가공 및 차원 축소에 사용. |
익스포터 ( Exporter ) | 애플리케이션이나 시스템 메트릭을 프로메테우스가 수집할 수 있는 형태로 노출해주는 프로그램. Exporter가 메트릭을 HTTP 엔드포인트로 노출하면, 프로메테우스가 이를 주기적으로 스크랩하여 수집 함. 다시 정리해보면 타깃 시스템의 메트릭을 수집하고 프로메테우스 포맷으로 변환, HTTP 엔드포인트를 통해 이 메트릭들을 노출시키는 역할을 수행. |
출처 : claude 3 AI
도커기반으로 설치하지 않으면 매우 귀찮아지는데, 아주 다행스럽게 도커기반 이미지로도 제공하고 있어 이를 기반으로 서버에 세팅했다.
프로메테우스에서 익스포터 (Exporter)는 말 그대로 자료를 제공해주는 역할을 하는 도구로써, 기본적으로 툴킷 기반으로 커스텀하게 제작해 사용도 가능하지만 왠만한 익스포터는 만들어져있기도 하고 프로메테우스측에서 오피셜하게 공식적으로 지원하는 익스포터들이 있다.
그중 몇개를 함께 사용해보고자 한다.
노드 익스포터 - https://github.com/prometheus/node_exporter
MySQL server exporter - https://github.com/prometheus/mysqld_exporter
폴더 및 파일 구조
./grafana/
./nodeExporter/
./prometheus/prometheus.yml
./docker-compose.yml
prometheus.yml
global:
scrape_interval: 15s
evaluation_interval: 15s
scrape_configs:
- job_name: 'node_exporter'
metrics_path: /metrics
static_configs:
- targets: ['서버주소:9100']
- job_name: 'rabbitmq_exporter'
metrics_path: /metrics
static_configs:
- targets: ['서버주소:15692']
- job_name: 'mysqld_exporter'
metrics_path: /metrics
static_configs:
- targets: ['서버주소:9104']
evaluation_interval : 규칙 파일에 정의된 레코딩 룰과 알림룰을 평가하는 주기
scrape_interval : 프로메테우스가 모니터링 대상의 메트릭을 수집(스크랩)하는 주기
metrics_path : 엔드포인트 패스
docker-compose.yml
version: "3.8"
services:
prometheus:
image: prom/prometheus
container_name: prometheus
ports:
- "9090:9090"
volumes:
- ./prometheus:/etc/prometheus
command:
- '--config.file=/etc/prometheus/prometheus.yml'
restart: always
grafana:
image: grafana/grafana
container_name: grafana
ports:
- "4000:3000"
volumes:
- ./grafana:/var/lib/grafana
restart: always
mysql:
container_name: mysql
image: mysql:8.0.34
volumes:
- ./mysql/init/:/docker-entrypoint-initdb.d/
- ./mysql/conf:/etc/mysql/conf.d
- ./mysql/storage:/var/lib/mysql
environment:
TZ: "Asia/Seoul"
MYSQL_DATABASE: 데이터베이스명
MYSQL_ROOT_PASSWORD: 루트_비밀번호
MYSQL_USER: 유저_계정명
MYSQL_PASSWORD: 유저_계정비밀번호
ports:
- "3306:3306"
restart: always
mysqld-exporter:
container_name: mysqld_exporter
image: prom/mysqld-exporter
environment:
- DATA_SOURCE_NAME="계정명:비밀번호@(mysql:3306)/"
command:
- "--mysqld.username=계정명:비밀번호"
- "--mysqld.address=mysql:3306"
links:
- mysql
ports:
- 9104:9104
depends_on:
- mysql
restart: unless-stopped
node_exporter:
image: quay.io/prometheus/node-exporter:latest
container_name: node_exporter
command:
- '--path.rootfs=/host'
restart: unless-stopped
volumes:
- '/:/host:ro,rslave'
ports:
- "9100:9100"
일단 여기선 Mysql 설정을 길게 얘기하진 않겠다. 볼륨은 직관적이니 수정해서 쓰면 된다.
개인적으로 초기 sql 과 별도 설정이 필요해 따로 빼둔 것이다.
중요한건 mysqld-exporter인데, 공식 github에는 enviroment 로 DATA_SOURCE_NAME 을 저렇게 넣으면 된다고 하는데 실제로 구동시엔 안된다.
해결방법은 command를 이용하는 방법인데, 위 docker-compose에 나와있는대로 mysqld.username과 address 를 지정해주면 된다.
우선 도커 컴포즈에 명시한 mysqld exporter를 제외하고 구동 (docker-compose up -d) 하여 mysql 컨테이너에 접속해 내부에서 데이터베이스 계정을 미리 만들어주자. 루트를 사용해도 되긴 하는데, 과한 권한을 굳이 줄 필요가 없기 때문에 새로 만들어보자.
# mysql 컨테이너 아이디를 확인한다.
docker ps
# 컨테이너 접속
docker exec -it 컨테이너ID bash
# mysql 접속
sh#> mysql -uroot -p
# 계정 생성
CREATE USER 'exporter'@'%' IDENTIFIED BY '비밀번호' WITH MAX_USER_CONNECTIONS 3;
# 권한 부여
GRANT PROCESS, REPLICATION CLIENT, SELECT ON *.* TO 'exporter'@'%';
# 적용
FLUSH PRIVILEGES;
# ctrl + c 이후 exit
# MYSQL 메트릭을 수집하기 위해 필요한 권한 리스트
PROCESS : 프로세스 목록, 프로세스 상태 등을 확인.
REPLICATION CLIENT : 슬레이브 상태 및 마스터 로그 상태를 확인.
SELECT : 데이터베이스 정보를 읽기 위해 information_schema , 메트릭 수집 대상이 되는 각 데이터베이스에 대한 SELECT 권한.
계정을 만들었다면 잠시 빼놨던 Docker-compose 내 mysqld-exporter 설정을 다시 삽입한다.
rabbitmq 익스포터도 따로 있긴한데, Official 도 아니기에 따로 깃헙에 있는 익스포터는 쓰지 않았다.
게다가 RabbitMQ 공식사이트에서 확인해보니 이미 엔드포인트단을 Plugin으로 제공하고 있어 굳이 라이브러리를 쓸 필요가 없었다.
# 관리자페이지를 설치하지 않았다면 설치
rabbitmq-plugins enable rabbitmq_management
# 프로메테우스용 Exporter Plugin
rabbitmq-plugins enable rabbitmq_prometheus
http://메세지큐_주소:15672/metrics 로 접속해보면 아래와 같은 사진이 나오는걸 확인할 수 있다.
여기까지 세팅하고 docker-compose를 구동했다면 아래의 주소들 접속이 이상없이 잘 됨을 확인할 수 있다.
http://서버주소:9090/ : 프로메테우스
http://서버주소:4000/ : 그라파나
http://서버주소:9100/ : 노드 익스포터
http://서버주소:9104/ : MySQL 익스포터
http://서버주소:15672/ : RabbitMQ 관리자 및 익스포터
물론 RabbitMQ 의 경우에는 별도(도커가 아닌 일반설치)로 켰다는 전제하다.
사실 편의상 docker-compose에 넣어도 되는데 이미 서비스 중인 곳에서 사용하는게 있어서 스킵한다.
각 주소로 접속해보면 잘 되는걸 확인할 수 있다. 안된다면, 본인 방화벽 또는 폴더권한을 한번 봐야한다.
여기까지 했다면 프로메테우스와 각 익스포터 설정은 끝났다.
아래 사진과 같이 프로메테우스에 접속해서 status-Target을 눌러보자.
아래 사진과 같이 뜨면 된다.
Node Exporter 가 두 개인건, 나는 두 서버를 등록해서 그런건데 아마 따라한 사람들이라면 하나만 뜰 것 이다.
스테이트가 UP이고 각 메트릭스주소를 눌러 아까 RabbitMQ때 Metrics 페이지와 비슷하게 뜨는 것 같으면 정상이다.
이제 그라파나를 설정하러 가보자.
Prometheus 와 Grafana, Node Exporter , Mysqld Exporter , RabbitMQ Exporter 환경 구축 (2/2)
'운영체제 및 서버 > Linux' 카테고리의 다른 글
프로메테우스 - prom-client 를 통한 Node.js 웹소켓 메세지 수신량 파악 (0) | 2024.04.05 |
---|---|
Prometheus 와 Grafana, Node Exporter , Mysqld Exporter , RabbitMQ Exporter 환경 구축 (2/2) (0) | 2024.04.03 |
데이터베이스 백업용 SCP 사용을 위한 서버간 SSH 키 등록 (0) | 2024.03.20 |
Ubuntu 22.04 Docker ( with docker-compose) 설치 (1) | 2024.03.19 |