ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • [Redis] 서비스 고가용성을 위한 Replica
    DataBase/NoSQL 2023. 2. 19. 15:24

     RDB를 사용하거나 AOF를 사용하는 백업방식은 disk에 있는 파일로부터 Redis를 복구하는 방법인데, 백업만으로는 백업 실패 가능성도 있고 복구에 시간도 꽤 소요되는 등 장애 대비에 부족한 측면이 있다.

     

     하지만 Redis 복제를 하면 가용성을 확보할 수 있을 뿐만 아니라 빠른 장애조치가 가능하다. master가 죽었을 경우 복제본(replica)중 하나를 master로 승격시켜 즉시 서비스 정상화가 가능하기 때문이다.

     

     replica는 read-only 모드로 사용하는 것이 권장된다. 입력/수정/삭제가 가능하다면 데이터 무결성이 보장되지 않기 때문이다. 또, 하드웨어적인 문제 발생을 대처하기 위해 master와 replica는 물리적으로 다른 머신에 두어야 한다. 


     아래는 docker를 이용해서 redis를 master-replica로 실행시켜보고 master와 replica가 redis를 공유하고 있는지 확인하는 실습 과정이다.  

    ⚙️ 실습 환경
    Mac OS
    Docker(Engine) 20.10.22
    Redis 7.0.8

     

     

     

     

    1. master node 실행

    master는 따로 redis 설정파일을 건드릴 필요가 없고 아래 command와 같이 replica가 붙을 port만 forwarding해서 실행시킨다.

    $ docker run --name my-redis-master -p 5000:6379 redis

    docker run --name {컨테이너 이름} -p {외부에서 master로 붙을 port}:{실제 master port} redis

    => replica가 5000번으로 master에 붙으면 master의 실제 port인 6379와 연결된다. 

    (단, master는 RDB나 AOF를 이용한 백업 기능 활성화가 필수이다. -> 재시작 후 비어있는 데이터 상태가 복제되지 않도록)

     

     

     

    2. replica node 실행

    2-1. redis.conf 설정

    - replica로 동작하도록 # replicaof <masterip> <masterport>의 주석을 해제하고 마스터의 ip와 port를 입력한다. 
    - read-only 모드인지 확인한다. (yes: 읽기 전용, no: 수정, 삭제 가능)
      (Redis 2.6 부터 yes가 default로 설정되어있다.)
    - replica 자체 port는 9993으로 설정한다. (그냥 해봤다)

     

    replicaof <masterip> <masterport> 설정

     

    default로 replica-read-only yes 설정되었는지 확인

     

    replica의 port 설정

     

    2-2. replica 컨테이너 실행

    $ docker run --network host -v /($pwd)/redis.conf:/redis.conf --name my-redis-replica redis redis-server /redis.conf

    docker run --network host -v {local의 redis.conf 경로}:{컨테이너 안에서 위치할 redis.conf 경로} --name {컨테이너 이름} redis redis-server {마운팅된 설정파일의 경로}

    • --network host: host의 네트워크 설정을 따라감
    • -v: 볼륨 마운팅 옵션

     

     

     

    3. replica가 master와 연동되고 있는지 확인

    3-1. master 컨테이너에 진입해 redis에 key-value를 저장한다. 

    $ docker exec -it my-redis-master /bin/sh

    # redis-cli

    127.0.0.1:6379> set a 123

    127.0.0.1:6379> set w yes!

     

    3-2. replica 컨테이너에 진입해 redis에 저장된 key를 확인한다. 

    $ docker exec -it my-redis-replica /bin/sh

    # redis-cli -p 9993

    127.0.0.1:9993> keys * 

     

    3-3. master에서 저장한 key a와 w를 replica에서 확인할 수 있다!

     

    상: master 컨테이너 내부 redis-cli, 하: replica 컨테이너 내부 redis-cli

     

     

     지금까지 수동으로 master - replica를 구성하는 방법을 알아봤다. 

     

    갑자기 분위기 ROUND 2

    : docker compose를 통해 자동으로 master - replica 구성하기

    docker-compose.yml을 작성하고 도커 이미지를 이용하면 replica 관리를 자동으로 할 수 있어서 굉장히 편리하다. 

     

    1. docker compose를 사용하기 위해 bitnami/redis 이미지를 pull한다. 

    $ docker pull bitnami/redis

     

     

    2. docker-compose.yml을 작성한다.

    • master의 REDIS_REPLICATION_MODE=master
    • replica의 REDIS_REPLICATION_MODE=slave
    • replica가 실행되기 위해서는 master의 실행을 전제로 하기 위해 replica의 depends_on에 master를 추가한다. 

    + 자세한 내용은 아래 파일 확인

    docker-compose_master-replica.yml
    0.00MB

     

     

    3. docker-compose.yml이 위치한 경로에서 docker-compose를 build한다. 

    $ docker-compose up --build

     

    4. master와 replica가 잘 생성되었는지 확인한다. 

    $ docker ps

     

     

     

    5. master의 redis에서 저장한 key가 replica의 redis에서 조회되는 것을 확인할 수 있다.

     

     

     

    훨씬 편리하다 (ノ・o・)ノ

     

     

    ※ fast campus의 "백엔드 개발자를 위한 한 번에 끝내는 대용량 데이터 & 트래픽 처리 초격차 패키지"를 수강하고 정리한 글입니다. 

    'DataBase > NoSQL' 카테고리의 다른 글

    [Redis] 백업을 통한 데이터 영속화  (0) 2023.03.12
    [Redis] Sentinel을 이용한 자동 장애조치  (0) 2023.02.19

    댓글

Designed by Tistory.