Redis Replication

2024. 5. 21. 13:24·Spring/대용량 트래픽

2024.05.21 - [Spring/대용량 트래픽] - Prometheus, Grafana 오픈소스로 Redis 모니터링하기

 

Prometheus, Grafana 오픈소스로 Redis 모니터링하기

2024.05.14 - [Spring/대용량 트래픽] - Spring Boot Pub/Sub Spring Boot Pub/Sub2024.05.13 - [Spring/대용량 트래픽] - Spring Session Spring Session2024.05.13 - [Spring/대용량 트래픽] - Spring cache abstraction, Vegeta 오픈소스 사용

lsdiary.tistory.com

이전 글에선는 Redis에서의 일어나는 정보들을 Redis-cli로 하는 것이 아니라, 실제 운영의 관점에서 어떻게 모니터링 할지 에 대해 Prometheus, grafana 오픈소스를 이용해서 살펴봤다.

 

Replication

 

해석하는 그대로 "복제"를 의미한다.

일반적으로 RDB에서의 복제는 원본 데이터 복사본에 관한 별도의 DB를 관리하는 것을 의미한다.

복구, 시스템 성능에 관한 문제해결등에 활용가능하다.

본 그림에서의 slave를 Replica라고 한다.

  • 성능을 위해 master DB에서 복제데이터 전송시, 비동기 방식을 사용한다.

master-slave 구조에서 master DB가 다운되면, slave를 사용하게 된다.

  • 서비스 가용성을 확보할수 있다.

  • 부하 분산, 성능 확장

일반적인 RDB에서의 Replicaion은 크게 이런식으로 동작한다.

Redis에서는 어떻게 동작할까?


Redis Replication

 

고가용성, 성능확장을 위해 3가지 설정을 지원한다.

  1. Redis Replication : master - replica(복제본) 의 관계
    1. 명령 스트림 전달(데이터 쓰기, TTL설정 동일하게 동작)
    2. 네트워크적으로 끊어지면 다시 이어서 진행
    3. 진행하기 어려운경우 처음부터 동기화 (resync)
  2. Redis Sentinel
    1. automatic failover : Replication에서는 master에서 장애가 발생했을때, 자동으로 failover가 되지 않음.(서비스 가용성↑)
    2. sentinel은 별도의 프로세스로 동작 : 자동적으로 Replica중 하나가 master로 승격 → 정상운영
  3. Redis Cluster : 다수의 master 서버 운영
    1. 해시 알고리즘을 통한 저장할 master결정
    2. 다수의 복제서버(replica) 운영

실습

 

https://hub.docker.com/_/redis

 

redis - Official Image | Docker Hub

Quick reference Supported tags and respective Dockerfile links 7.2.4, 7.2, 7, latest, 7.2.4-bookworm, 7.2-bookworm, 7-bookworm, bookworm 7.2.4-alpine, 7.2-alpine, 7-alpine, alpine, 7.2.4-alpine3.19, 7.2-alpine3.19, 7-alpine3.19, alpine3.19 7.0.15, 7.0, 7.0

hub.docker.com

 

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 Webflux란?

2024.05.21 - [Spring/대용량 트래픽] - Redis Replication Redis Replication2024.05.21 - [Spring/대용량 트래픽] - Prometheus, Grafana 오픈소스로 Redis 모니터링하기 Prometheus, Grafana 오픈소스로 Redis 모니터링하기2024.05.14

lsdiary.tistory.com

 

'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
'Spring/대용량 트래픽' 카테고리의 다른 글
  • CPU Bound vs I/O Bound
  • Spring Webflux란?
  • Prometheus, Grafana 오픈소스로 Redis 모니터링하기
  • Spring Boot Pub/Sub
Ls._.Rain
Ls._.Rain
안되면 될때까지 삽질했던 기록
  • Ls._.Rain
    Ls{Diary}
    Ls._.Rain
  • 전체
    오늘
    어제
    • 분류 전체보기 (136)
      • Github (2)
      • Spring (51)
        • Batch Programming (13)
        • 결제 (4)
        • 대용량 트래픽 (32)
        • OpenAI (0)
        • Security (0)
        • WebSocket (0)
        • JPA (1)
      • Algorithm (67)
        • DFS (6)
        • BFS (6)
        • Dynamic Programming (10)
        • Brute Force (4)
        • Binary Search (6)
        • 구현, 시뮬레이션 (15)
        • Stack (1)
        • Greedy (4)
        • Priority_Queue (2)
        • Back Tracking (3)
        • Geometry (2)
        • SCC (1)
        • 투포인터 (4)
        • 최대유량 (1)
        • 정렬 (1)
      • OS (0)
      • DevOps (15)
        • AWS (11)
        • Docker (4)
  • 블로그 메뉴

    • 홈
    • 태그
    • 방명록
  • 링크

  • hELLO· Designed By정상우.v4.10.0
Ls._.Rain
Redis Replication
상단으로

티스토리툴바