2024.05.14 - [Spring/대용량 트래픽] - Spring Boot Pub/Sub
이전글까지 Redis를 다양한 방법으로 활용해보고, Java에서는 어떻게 쓸수 있는지, 특히 Spring Data Redis라는 편리한 기능을 사용하기 위해, RedisTemplate을 써서 연동하는 경험을 했다.
이번 글에서는 Redis에서의 실시간 모니터링 방법에 대해서 다룬다. 우선 모니터링이란 지표를 확인하는 것이다.
여러가지 방법이 있는데 하나씩 설명해보자면
- redis-cli monitor : Redis에 전달되어 실행된 명령 리스트를 출력
이때까지 계속해서 했던것이다. 개발과정에서 잘 작동하는지 체크할때 용이하다.
- redis-cli --stat : Redis서버의 주요 통계정보를 보여준다.
- 메모리, 연결, 클라이언트 수, 요청량
- redis-cli --bigkeys : SCAN 명령을 기반으로 element개수가 많은 KEY들을 찾아서 보여준다.
- redis-cli --memkeys : memory를 많이 사용하는 KEY들을 찾아서 보여준다.
- redis-cli --latency : 실시간으로 전달받은 명령들의 처리되는 min, max, avg 값을 보여준다.
** 명령어를 입력한 시점부터 조회가 가능하다는 점을 숙지해야한다. 그래서 실제운영관점에서는 쓰기가 어렵다.
그렇다면 실제 운영을 할때는 어떤 방식으로 모니터링 할까?
Prometheus/Grafana
- Prometheus : 서버, 어플리케이션, 컨테이너등의 지표정보를 수집하고, 이를 활용해서 모니터링과 Alert를 지원하는 오픈소스 시스템이다. 시계열 데이터를 수집하고 저장한다.
- Grafana : 시각화를 지원하는 오픈소스이다. Prometheus와 함께 잘 쓰인다.
CNCF(Cloud Native Computing Foundation)
비영리 단체이름이다. Cloud Native를 위한 다양한 오픈소스를 관리하고 제시하고 있다.
Cloud Native란?
Cloud Computing 환경에서 어플리케이션을 구축하고, 베포, 관리할수 있는 소프트웨어 접근방식을 의미한다.
이제 실제로 오픈소스를 사용해보자.
Redis에 관한 지표는 Redis exporter를 통해서 수집이된다.
수집에 대한 트리거는 Prometheus에서 Redis exporter로 수집을 요청하면 Redis exporter는 실제 Redis Server로 지표를요청하고, 다시 Prometheus로 전달하게 된다.
- Redis exporter : Prometheus가 수집하고 모니터링 하는 데이터 수집 역할, 별도의 소프트웨어로 동작.
저장된 metric 정보에 대해 Grafana에서 Prometheus와 연동그래프로 모니터링을 할수 있게된다.
Redis는 Memory에 대해 몇가지 정책을 지원하고 있다.
in-memory DB이기 때문에 물리적인 메모리가 부족하면 운영이나 모니터링 관점에서 치명적인 단점으로 작용한다.
참고로 지금 나는 노트북 메모리가 8GB밖에 안되어서 InteliJ랑 도커에 띄운 Redis랑 MySQL랑 Postman이랑 이것저것 키다보니까 노트북이 진짜 개느리다,,,
Memory Eviction
- maxmemory : 메모리 최댓값 설정
- 기본설정 : 0
- maxmemory-policy : 메모리 최댓값을 넘어가면 어떤 알고리즘을 써서 기존에 있던 KEY삭제해서 가용 메모리 확보?
- 기본설정 : noeviction
- 많이 사용하는 설정으로는 allkeys-lru, allkeys-lfu가 있다. 운영체제에서 메모리 관리 정책을 배웠다면 다들 알것이라 생각하지만 lru, lfu는 알아둬야할 지식이니까 잘 모르거나 헷갈리는 분은 검색을 해서 익히길 바란다.
기본적으로 KEY를 삭제하지 않는다.
실습
Prometheus와 Grafana를 설치해야한다.
이때까지 Docker라는 툴을 사용해서 이미지를 만들고 활용했는데, 이번에는 Docker Compose를 다루고자 한다.
Docker Compose
멀티 컨테이너들을 다루기 위한 도구이다. 동시에 여러가지 컨테이너를 실행, 종료, 관리할때 유용한 도구이다.
아래 명령을 통해 실행할수 있다.
docker compose
그리고 Prometheus와 Grafana를 사용하기 위해 설정파일을 만들어 줘야한다.
우선 본인은 Windows11을 사용중이므로, wsl ubuntu를 사용해서 docker compose를 사용한다.
docker-compose.yml
version: '3.8'
networks:
monitor:
driver: bridge
services:
prometheus:
image: prom/prometheus:latest
container_name: prometheus
user: root
restart: always
ports:
- 9090:9090
volumes:
- ./prometheus/config:/etc/prometheus/
- ./prometheus/data:/prometheus
grafana:
image: grafana/grafana:latest
container_name: grafana
restart: always
ports:
- 3000:3000
volumes:
- ./grafana/data:/var/lib/grafana
- ./grafana/provisioning:/etc/grafana/provisioning/
environment:
- GF_SECURITY_ADMIN_USER=admin
- GF_SECURITY_ADMIN_PASSWORD=비밀번호원하는걸로설정
- GF_USERS_ALLOW_SIGN_UP=false
depends_on:
- prometheus
- networks : 서비스들이 함께 사용할 네트워크 세팅(여기서는 임의로 monitor라고 이름지음)
- volumes : 컨테이너가 함께 사용할 정보
- enviornment : 로그인할 환경변수정보
- depends_on : Prometheus 실행뒤에 Grafana가 실행되어야함
이제 위 volumes 설정파일에 해당하는 설정파일들을 만들어줘야한다. wsl cli를 키고 설정에 필요한 폴더를 생성한다.
mkdir -p grafana/provisioning
mkdir -p grafana/data
mkdir -p prometheus/config
mkdir -p prometheus/data
이제 만든 폴더에 각각 알맞게 설정파일들을 작성해줘야한다.
prometheus/config 폴더
prometheus.yml
global:
scrape_interval: 1m
scrape_configs:
- job_name: 'prometheus'
scrape_interval: 1m
static_configs:
- targets: ['localhost:9090']
- scrape_interval : 지표를 얼마마다 한번씩 가져올것인지
prometheus 컨테이너는 실행할때, 이 파일을 찾아서 읽게된다.
이제 설정해야 할 파일은 작성을 했고, 설정에 알맞게 다운받아야한다.
다음 명령어를 통해 다운받을 수 있다.
docker-compose -f docker-compose.yaml up -d
본인의 경우 메모리 용량이 너무 작아서 진짜진짜진짜 오래걸렸다ㅡㅡ,,,,
아무튼 다운 성공,,!
처음에 prometheus는 성공적으로 실행했는데, grafana의 경우 계속 종료를 해서 원인을 분석했다.
위에서 나는 호스트IP를 3000번 포트로 설정했는데, 생각해보니 3000번 포트는 이미 예전에 사용하던 Nginx가 사용하고 있어서, 둘 사이에 포트 conflict 가 난 것이다. 그래서 내 호스트IP를 3001번 포트로 수정하고 다시 실행시켰다.
그리고 설정한 포트로 로컬에서 직접 접속해보겠다.
그리고 위에서 grafana가 잘 실행된줄 알았지만, 로그 정보를 보니
쓰기 권한이 없다고 해서 chmod 명령어를 이용해서 권한을 풀어주었다.
설정한 3001번 포트로 접속하면 Grafana로그인화면이 나온다.
아까 docker-compese.yaml파일에서 설정한 사용자이름과 비밀번호를 이용해서 로그인한다.
아직 이 두컨테이너가 연결된 상태가 아니므로, 이 GUI에서 연결을 시켜야한다.
DATA SOURCES를 클릭하고 들어가보자.
클릭하고 들어가면,
프로메테우스의 URL을 기입하는란이 나온다. 여기서 localhost:9090 이라고 하면 안된다!!
나의 입장에서는 localhost:9090이 맞지만 지금 여기서 설정하는 것은 grafana입장에서의 prometheus주소이다.
사실 나는 docker-compose에서 네트워크 설정으로 두개가 연결이 되어있지만, 각자 컨테이너에 대한 주소는 잘 모른다.
docker-compose기반은 컨테이너 이름을 가지고, DNS를 자동으로 만들어준다.
따라서 grafana는 컨테이너이름인 proetheus를 기반으로 주소를 찾을수있다.
이렇게 Save & test를 누르고 저렇게 영롱한 초록색 성공 글씨가 뜨면 연결된것이다.
이제는 아까 전에 말한 Redis exporter라는 Redis와 Prometheus와의 매개체 역할을 하는 소프트웨어는 어떻게 연동을 할까?
Redis exporter도 마찬가지로 별도의 컨테이너를 생성해줘야한다.
이미지는 오픈소스로 공개되어있는 이미지를 사용했다.
https://hub.docker.com/r/oliver006/redis_exporter
그리고 Redis에서 정보를 가져와야하므로 Redis의 포트정보도 환경 값으로 설정해줬다.
최종 docker-compose.yaml
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
restart: always
ports:
- 9090:9090
volumes:
- ./prometheus/config:/etc/prometheus/
- ./prometheus/data:/prometheus
networks:
- monitor
grafana:
image: grafana/grafana:latest
container_name: grafana
restart: always
ports:
- 3001:3000
volumes:
- ./grafana/data:/var/lib/grafana
- ./grafana/provisioning:/etc/grafana/provisioning/
environment:
- GF_SECURITY_ADMIN_USER=admin
- GF_SECURITY_ADMIN_PASSWORD=5736
- GF_USERS_ALLOW_SIGN_UP=false
depends_on:
- prometheus
networks:
- monitor
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
최종 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']
이제 재실행하기 위해서 컨테이너를 없애줘야한다.
docker-compose -f docker-compose.yaml down
-f 옵션과 .yaml 파일명을 명시로 주지 않으면, 현재 디렉토리에서 기본 .yaml파일을 자동으로 찾는다.
암튼 성공,,,!
새로고침을 통해서 많은 지표들을 계속 갱신할수 있다.
프로메테우스가 Redis-exporter 한테 5초주기로 요청해서 가져온 값을 적재된것을 확인할수 있다.
위 정보를 grafana를 통해서 좀 더 보기좋게 해보자.
https://grafana.com/oss/prometheus/exporters/redis-exporter/?tab=dashboards
prometheus에서 데이터를 가져와 다양한 지표를 효과적으로 관찰할 수 있게 제공한다.
우선 들어가서 json파일을 다운받고 복사하자.
그 이후 grafana에 들어가서 우측상단 + 를 누르고 import dashboard를 누른다음 json파일을 복사 혹은 첨부해준 다음 import를 눌러준다.
그리고 대시보드를 보면
이렇게 여러가지 정보들을 시각적으로 모니터링할수 있다. 위에 보이는 빨간 동그라미는 현재로부터 모니터링 주기이다.
이 글에서 실질적으로 서비스를 운영할때 모니터링할수 있는 기법에 대해 알아보았다. 지금 진행하고 있는 프로젝트에도 적용해봐야겠다!
2024.05.21 - [Spring/대용량 트래픽] - Redis Replication
'Spring > 대용량 트래픽' 카테고리의 다른 글
Spring Webflux란? (0) | 2024.05.21 |
---|---|
Redis Replication (0) | 2024.05.21 |
Spring Boot Pub/Sub (0) | 2024.05.14 |
Spring Session (0) | 2024.05.13 |
Spring cache abstraction, Vegeta 오픈소스 사용해보기 (0) | 2024.05.13 |