2024.05.21 - [Spring/대용량 트래픽] - Prometheus, Grafana 오픈소스로 Redis 모니터링하기
이전 글에선는 Redis에서의 일어나는 정보들을 Redis-cli로 하는 것이 아니라, 실제 운영의 관점에서 어떻게 모니터링 할지 에 대해 Prometheus, grafana 오픈소스를 이용해서 살펴봤다.
Replication
해석하는 그대로 "복제"를 의미한다.
일반적으로 RDB에서의 복제는 원본 데이터 복사본에 관한 별도의 DB를 관리하는 것을 의미한다.
복구, 시스템 성능에 관한 문제해결등에 활용가능하다.
- 성능을 위해 master DB에서 복제데이터 전송시, 비동기 방식을 사용한다.
master-slave 구조에서 master DB가 다운되면, slave를 사용하게 된다.
- 서비스 가용성을 확보할수 있다.
- 부하 분산, 성능 확장
일반적인 RDB에서의 Replicaion은 크게 이런식으로 동작한다.
Redis에서는 어떻게 동작할까?
Redis Replication
고가용성, 성능확장을 위해 3가지 설정을 지원한다.
- Redis Replication : master - replica(복제본) 의 관계
- 명령 스트림 전달(데이터 쓰기, TTL설정 동일하게 동작)
- 네트워크적으로 끊어지면 다시 이어서 진행
- 진행하기 어려운경우 처음부터 동기화 (resync)
- Redis Sentinel
- automatic failover : Replication에서는 master에서 장애가 발생했을때, 자동으로 failover가 되지 않음.(서비스 가용성↑)
- sentinel은 별도의 프로세스로 동작 : 자동적으로 Replica중 하나가 master로 승격 → 정상운영
- Redis Cluster : 다수의 master 서버 운영
- 해시 알고리즘을 통한 저장할 master결정
- 다수의 복제서버(replica) 운영
실습
https://hub.docker.com/_/redis
replica로 레디스를 실행하기 위해서 필요한 명령어가 위 사이트에 있다.
설정 방법을 위한 명령어다.
replicaof [ip주소] [포트번호]
replica는 read-only로 동작하게 된다.
이제 다수의 Redis 컨테이너를 만들어보고, replica가 어떻게 동작하는지 확인해보자.
- windows용 준비물 : wsl2, ubuntu, docker desktop
나는 replica를 위한 폴더를 따로 만들어주었고, 이전 시간에 썼던 여러컨테이너를 한번에 실행할때 효율적인 docker-compose를 사용하기 위해 docker-compose.yaml 파일을 만들어줬다, replica의 경우 volumes 설정을 해줬는데, conf폴더를 하위에 만들고, redis.conf파일을 만들어줬다.
docker-compose.yaml
version: '3.8'
networks:
replica:
driver: bridge
services:
redis:
container_name: redis
image: redis:6.2
ports:
- 6379:6379
networks:
- replica
restart: always
replica:
container_name: replica
image: redis:6.2
ports:
- 6378:6379
networks:
- replica
volumes:
- ./conf:/usr/local/etc/redis/
command: redis-server /usr/local/etc/redis/redis.conf
restart: always
replica2:
container_name: replica2
image: redis:6.2
ports:
- 6377:6379
networks:
- replica
volumes:
- ./conf:/usr/local/etc/redis/
command: redis-server /usr/local/etc/redis/redis.conf
restart: always
redis.conf
replicaof redis 6379
- 도메인 : redis, 포트 : 6379에 접속해라
도메인이 redis인 이유? docker hub에서 컨테이너 서비스의 이름을 redis로 정의해놨기 때문
이제 다음 명령어로 컨테이너들을 실행시키자.
docker-compose up -d
세 개의 Redis 컨테이너가 잘 생성된것을 확인할 수있고, 생성된 컨테이너의 동기화 여부를 확인하기 위해 cli를 들어가본다.
docker-compose exec redis redis-cli
info replication
위 정보를 분석하면
- connected_slaves : 해당 ip, port, 상태가 보인다.
- id, offset : 이것을 기반으로 하기 때문에, master와 연결이 끊겼다가 다시 이어졌을때, 이어서 동기화를 진행하는 방식이 가능하다.
테스트를 위해 세팅을 진행한다.
key1 ~ key5 까지 설정해줬다.
master에서 저장한 키값을 replica에서 get으로 잘가져오는 걸 확인할수 있고,set을 통해 key값을 써주려고했지만, READONLY 로 쓰여지는것도 확인할 수 있다.
그렇다면 master가 down 된다면?
docker-compose stop redis
명령으로 master를 종료시킨뒤, 다른 replica에서 값을 get으로 잘가져오는 걸 확인할수 있었고,
docker-compose exec redis redis-cli
info replication
다시 replicaion 정보를 확인해보면
다시 두개의 replica가 재연결된것을 확인할수 있다.
이렇게 성능과 가용성 확보를 위해 replication에 대해 다뤄보는 시간이 되었다.
2024.05.21 - [Spring/대용량 트래픽] - Spring Webflux란?
'Spring > 대용량 트래픽' 카테고리의 다른 글
CPU Bound vs I/O Bound (1) | 2024.05.21 |
---|---|
Spring Webflux란? (0) | 2024.05.21 |
Prometheus, Grafana 오픈소스로 Redis 모니터링하기 (0) | 2024.05.21 |
Spring Boot Pub/Sub (0) | 2024.05.14 |
Spring Session (0) | 2024.05.13 |