오늘 강의를 들으면서 모르는 단어의 연속이었지만.. 암 오케..
옆에 맛있는 빵을 두고 먹으면서 이겨내 보았습니다.
이겨낸 김에 적어보는 Grafana와 Prometheus로 Redis-exporter 모니터링 해보는 방법..
1. docker 대신 docker-compose 사용 준비
Docker
단일 컨테이너를 관리하는 도구로, 애플리케이션과 그 애플리케이션이 실행되는 데 필요한 모든 것을 컨테이너라는 단위로 패키징하고 실행
Docker Compose
여러 컨테이너를 한 번에 관리할 수 있는 도구로, 애플리케이션이 여러 컨테이너로 구성된 경우(예: 웹 서버, 데이터베이스, 캐시), 이를 하나의 설정 파일(docker-compose.yml)로 정의하고 실행
Redis, Redis Exporter, Prometheus, Grafana로 구성된 총 4개의 컨테이너를 관리할 예정이므로 Docker Compose를 사용할 예정입니다.
Docker Desktop을 설치했을 경우, Docker 및 Docker Compose 모두 설치되므로 따로 설치 작업은 필요 없습니다.
2. docker-compose 설정 파일 준비
docker-compose.yaml
여러 개의 Docker 컨테이너를 정의하고 관리하기 위해 사용되는 설정 파일
⭐💡학습 목표: Redis 데이터를 기반으로 Prometheus가 모니터링 데이터를 수집하고, Grafana가 이를 시각화 💡⭐
전체 데이터 흐름
- Redis
- 데이터베이스로 동작하며, 현재 상태와 메트릭(예: 메모리 사용량, 키 개수 등)을 제공
- Redis Exporter
- Redis의 상태 정보를 수집하여 Prometheus가 이해할 수 있는 형식으로 변환
- Redis와 연결(여기선 REDIS_ADDR=redis://redis:6379)하고 메트릭 데이터를 Prometheus로 전달
- Prometheus
- Redis Exporter가 제공한 메트릭 데이터를 주기적으로 수집하고 저장
- 데이터베이스 역할을 하며, 요청 시 데이터를 반환
- Grafana
- Prometheus에 저장된 데이터를 가져와 사용자 정의 대시보드를 통해 시각화
- 사용자는 웹 인터페이스로 그래프, 차트 등을 확인할 수 있음
version: '3.8' #Docker Compose 파일 버전
networks: #네트워크 설정으로, 서비스 간 통신을 가능하게 함
monitor:
driver: bridge #네트워크 드라이버로 bridge를 사용
services: #services 아래에 실행할 컨테이너를 정의
redis:
container_name: redis #container 이름 지정
image: redis:6.2 #Image 지정
ports: #port 매핑
- 6379:6379
networks:
- monitor
#연결할 네트워크
#Docker 네트워크는 컨테이너 간의 통신을 가능하게 하는 가상의 네트워크
#docker-compose.yml에서 networks를 정의하고, 각 컨테이너가 이를 사용하도록 설정하면 같은 네트워크를 공유하는 컨테이너끼리 이름(container_name)을 통해 접근할 수 있음
#예: redis://redis:6379
restart: #컨테이너 중단 시, 동작 설정
always
prometheus: #모니터링 및 경보 시스템
image: prom/prometheus:latest
user: root
volumes:
#호스트(내 컴퓨터)와 Docker 컨테이너의 특정 폴더를 연결하는 설정
#컨테이너 내부에서 생성된 파일이 호스트에 저장되거나, 호스트의 파일이 컨테이너에서 사용될 수 있게 됨
#데이터를 영구적으로 저장하거나 공유하기 위해 사용
#volumes를 통해 데이터를 외부(호스트)에 저장하면 컨테이너를 삭제해도 데이터가 보존
- ./prometheus/config:/etc/prometheus
#호스트의 ./prometheus/config에 있는 설정 파일이 컨테이너 내부에서 사용
#컨테이너 내부에서 설정을 수정하면 그 내용이 호스트의 ./prometheus/config에 그대로 저장
- ./prometheus/data:/prometheus
#호스트의 폴더 ./prometheus/data → 컨테이너 내부의 폴더 /prometheus와 연결
#Prometheus가 수집한 데이터가 컨테이너 내부의 /prometheus에 저장되는데, 이 데이터가 호스트의 ./prometheus/data에 동기화
#컨테이너를 삭제해도 데이터는 호스트의 ./prometheus/data 폴더에 남아 있음
#요약: Prometheus의 설정 파일과 데이터를 호스트의 특정 폴더에 저장하고 컨테이너가 이를 읽고 쓰도록 연결하는 작업
ports:
- 9090:9090
networks:
- monitor
restart: always
grafana: #Prometheus의 데이터를 시각화해주는 툴
container_name: grafana
image: grafana/grafana:latest
environment:
- GF_SECURITY_ADMIN_USER=admin #관리자 ID를 admin으로 설정
- GF_SECURITY_ADMIN_PASSWORD=password #비밀번호를 password로 지정
- GF_USERS_ALLOW_SIGN_UP=false #사용자가 직접 가입하지 못하도록 설정
volumes:
- ./grafana/data:/var/lib/grafana #Grafana 데이터 저장소
- ./grafana/provisioning:/etc/grafana/provisioning #Grafana의 초기 설정 파일들이 들어 있는 디렉터리
ports:
- 3000:3000
depends_on: #Prometheus가 먼저 실행되어야 함
- prometheus
networks:
- monitor
restart: always
redis-exporter: #Redis 데이터를 Prometheus에 전송해주는 툴
container_name: redis-exporter
image: oliver006/redis_exporter:latest
environment:
- REDIS_ADDR=redis://redis:6379 #Redis 컨테이너와 연결
#redis:// Redis 프로토콜(통신 방식)
#redis Redis 컨테이너의 이름 (DNS처럼 사용)
ports:
- 9121:9121
depends_on:
- prometheus #Prometheus가 먼저 실행되어야 함
networks:
- monitor
restart: always
3. 의존성의 기반에 되는 prometheus 설정 파일 만들기
prometheus.yml
Prometheus가 어디에서 데이터를 수집할지(스크래핑) 설정하는 파일
global:
scrape_interval: 1m
#모든 스크래핑 기본 간격 설정
#기본적으로 1분마다(targets에서 지정한 서버에서) 데이터를 수집
scrape_configs: #스크래핑 대상 정의
- job_name: 'prometheus'
scrape_interval: 1m
# scrape_configs.scrape_interval이 global.scrape_interval보다 우선 적용
static_configs: #고정된 타겟 리스트
- targets: ['localhost:9090'] #Prometheus 자체를 스크래핑
- job_name: 'redis-exporter'
scrape_interval: 5s
static_configs:
- targets: ['redis-exporter:9121'] #Redis Exporter에서 메트릭 수집
4. 가자, Docker-compose!
docker-compose -f -d docker-compose.yml up
# Docker Compose는 기본적으로 커맨드가 실행하는 디렉토리에 있는 docker-compose.yml 또는 docker-compose.yaml을 설정 파일로 사용
# -f: 다른 이름이나 경로의 파일을 Docker Compose 설정 파일로 사용
# : 여러 개의 설정 파일 사용
# up: Docker Compose에 정의되어 있는 모든 서비스 컨테이너를 한 번에 생성하고 실행하기 위해서 사용
# -d: 백그라운드에서 컨테이너 실행
docker-compose start redis
# 내려가 있는 있는 특정 서비스 컨테이너를 올리기 위해서 사용
# 서비스에 대한 기존 컨테이너를 시작
# docker-compose.yml 파일에서 서비스 이름을 기준으로 사용
docker-compose ps
# Docker Compose에 정의되어 있는 모든 서비스 컨테이너 목록을 조회할 때 사용
5. 실행 화면
Redis-exporter(127.0.0.1:9121)
Prometheus(127.0.0.1:9090)
Grafana(127.0.0.1:3000)
(3000 포트... 이제 React만의 것이 아닙니다..🍂)
+ Grafana에 Prometheus 연결
⚙️설정 → Data Sources → Add new data source: Prometheus 선택
🚨url 입력 시, localhost가 아닌 localhost가 아니라 서비스 이름(prometheus)을 사용해야함
* Prometheus 컨테이너는 기본적으로 localhost:9090에서 동작하지만, 이는 Prometheus 컨테이너 내부에서만 접근 가능한 주소
* Grafana 컨테이너는 네트워크 상에서 Prometheus 컨테이너에 접근해야 하며, 이 경우 localhost가 아니라 서비스 이름(prometheus)을 사용해야 함(Docker Compose는 서비스 이름을 DNS 이름으로 자동 해석)
+ Grafana Redis Dashboard 설정
* 해당 Dashboard Template의 Copy ID to clipboard 또는 Download JSON 클릭
* Dashboards → Import → Import via grafana.com 또는 Upload dashboard JSON file → Import 클릭
- Grafana Dashboard Template
https://grafana.com/grafana/dashboards/
- Redis Exporter Dashboard Template
https://grafana.com/oss/prometheus/exporters/redis-exporter/?tab=dashboards
6. 안녕, Dokcer-Compose!
docker-compose down
# Docker Compose에 정의되어 있는 모든 서비스 컨테이너를 한 번에 정지시키고 삭제
docker-compose stop redis
# 돌아기고 있는 특정 서비스 컨테이너를 정지시키기 위해서 사용
# 컨테이너를 제거하지 않고 실행중인 컨테이너를 중지
# docker-compose.yaml 파일에서 서비스 이름을 기준으로 사용
📑
참고 자료
Chat GPT
https://solo5star.tistory.com/19
https://www.daleseo.com/docker-compose/
'MinimiProject > 아이돌 티켓팅 접속자 대기열 시스템' 카테고리의 다른 글
[대기열 시스템] R2DBC와 Custom Query (0) | 2025.01.31 |
---|---|
[대기열 시스템] Redis와 Replication (0) | 2025.01.28 |
[대기열 시스템] RedisTemplate, RedisHash, @Cacheable (1) | 2025.01.25 |
[대기열 시스템] HTTP load testing tool, Vegeta 설치(Window) (0) | 2025.01.21 |
[대기열 시스템] objectRedisTemplate과 ClassCastException (0) | 2025.01.19 |