Redis Monitoring은 Redis 서버의 성능과 상태를 확인하고, 문제를 신속하게 진단할 수 있도록 다양한 통계와 지표를 제공하는 기능이다.
redis-cli monitor: monitor 옵션은 Redis에 전달되어 실행된 명령 리스트를 실시간으로 출력한다. 운영 서버에서 사용하는 것보다는, 개발 과정에서 애플리케이션이 의도대로 동작하는지 확인할 때 유용하다.
redis-cli --stat: Redis 서버의 주요 통계 정보를 보여주며, 메모리 사용량, 연결 상태, 클라이언트 수, 요청량 등을 확인할 수 있다.
redis-cli --bigkeys: SCAN 명령을 기반으로 요소 개수가 많은 key를 찾아 보여준다. 대용량 데이터에 대한 분석 및 최적화에 유용하다.
redis-cli --memkeys: 메모리 사용량이 높은 key들을 보여준다. 메모리 최적화 및 효율적인 데이터 관리를 돕는다.
redis-cli --latency: 실시간으로 전달된 명령의 최소, 최대, 평균 처리 시간을 수집하여 보여준다. 이는 Redis의 성능 병목을 파악하는 데 유용하다.
이러한 명령어들은 명령이 내려진 시점부터 통계를 제공하므로, 운영 중 서비스 지연이나 오류가 발생한 순간의 데이터를 기록하기 위해서는 별도의 모니터링 장치가 필요하다. Redis는 in-memory 특성상 문제 발생 이후 데이터를 조회하는 것이 어려우므로, Redis Exporter나 외부 모니터링 툴을 활용하여 장기적인 모니터링과 통계 수집을 한다.
Prometheus는 서버,어플리케이션,컨테이너 지표 정보를 수집하고 이를 활용하여 모니터링과 allert을 지원하는 오픈소스 시스템이다. 시계열 데이터 정보를 수집하고 저장하며 Grafana 시각화 오픈소스와 활용된다. Redis 지표들에 대해 Prometheus/Grafana를 활용하여 주요 정보를 저장하고 모니터링한다.
Prometheus에서 Redis에 대한 수집 요청을 하면 Redis exporter에서 Redis에 대한 정보를 요청하게 되고 Prometheus에 전달한다. 이후 저장된 metrics 정보에 대해 Grafana와 연동하여 시각화한다.
Redis 지표: Memory Usage (메모리 사용량),Command Throughput (명령 처리량),Latency (지연 시간),Connections (연결 수),Evicted Keys (제거된 키 수),Replication (복제),Cache Hit Ratio (캐시 적중률),Keyspace Statistics (키스페이스 통계) 등..
Redis는 메모리에 대한 몇가지 정책을 제공한다. in-memory database이기 때문에 물리적인 메모리가 부족한 상황이 되면 운용,모니터링 관점에서 치명적이다. 그래서 최대 메모리에 대한 설정과 그 수치를 넘을경우 저장된 key 삭제 정책(가용 메모리 확보)을 설정할수 있다. 기본 설정은 maxmemory 0와 noeviction으로 메모리를 삭제하지 않는다.
메모리 임계치를 설정한다.
어떤 알고리즘을 기반으로 key를 삭제할것인지 설정할수 있다.
서버 가용성을 높이기 위해서 allkey기반 설정이 유용하고 제한적인 key 삭제는 volatile 옵션이 좋다.
version: '3.8'
networks:
monitor:
driver: bridge
services:
redis:
container_name: redis
image: redis:6.2
ports:
- 6379:6379
networks:
- monitor
restart: always
prometheus:
image: prom/prometheus:latest
container_name: prometheus
user: root
volumes:
- ./prometheus/config:/etc/prometheus
- ./prometheus/data:/prometheus
ports:
- 9090:9090
networks:
- monitor
restart: always
grafana:
container_name: grafana
image: grafana/grafana:latest
environment:
- GF_SECURITY_ADMIN_USER=admin
- GF_SECURITY_ADMIN_PASSWORD=fastcampus
- GF_USERS_ALLOW_SIGN_UP=false
volumes:
- ./grafana/data:/var/lib/grafana
- ./grafana/provisioning:/etc/grafana/provisioning
ports:
- 3000:3000
depends_on:
- prometheus
networks:
- monitor
restart: always
redis-exporter:
container_name: redis-exporter
image: oliver006/redis_exporter:latest
environment:
- REDIS_ADDR=redis://redis:6379
ports:
- 9121:9121
depends_on:
- prometheus
networks:
- monitor
restart: always
해당 파일을 docker-compose.yaml으로 정의하였고 prometheus/config경로에 아래 prometheus.yml을 정의하였다.
global:
scrape_interval: 1m
scrape_configs:
- job_name: 'prometheus'
scrape_interval: 1m
static_configs:
- targets: ['localhost:9090']
- job_name: 'redis-exporter'
scrape_interval: 5s
static_configs:
- targets: ['redis-exporter:9121']
redis-exporter 컨테이너에서 Redis 관련 정보를 수집해서 웹 페이지로 출력한다. 이런 정보는 Prometheus에서 redis-exporter 컨테이너 URL에 요청하게 되고, 응답 값을 Prometheus에 적재한다.
http://localhost:9121/metrics (redis-exporter) 에 접속해보면 redis-exporter가 redis의 지표를 가져온 데이터를 확인할수 있고,
http://localhost:9090 에서 Prometheus에 redis_commands_total 입력 후 실행하면 scrape_interval 에서 설정한 5초 간격으로 최신 메트릭 데이터를 가져온다.
Grafana 시각화
앞선 방법으로 아키텍쳐를 구축하고 Grafana 시각화 툴을 통해 운용되는 서비스가 느려지거나 문제가 생길때의 분석을 용이하게 돕는다.