데이터베이스, ORM

[Redis] Master/Slave 구조와 사용 방법

SparkIT 2024. 11. 2. 14:51

Master/Slave 구조란?

redis의 master/slave 구조는 쓰기와 읽기 역할을 나누기 위한 구조입니다. Master는 쓰기 작업을 처리하고, Slave는 읽기 작업을 처리합니다. master는 한 개만 운영되고 slave는 여러개 운영됩니다. 즉, redis의 master/slave 구조는 읽기 역할을 담당하는 slave를 여러 개 생성해 읽기 성능을 향상시키고자 하기 위한 구조인것이죠.

redis 하나로 모든 서버의 쓰기, 읽기 작업을 진행하는 경우
redis master/slave 구조 이용해 쓰기, 읽기 작업 분할하는 경우

 

아래는 더 자세한 redis의 master/slave 구조에 대한 설명입니다.

 

Master/Slave 구조 특징

  • 읽기 부하 분산
    여러 Slave 노드를 이용해서 읽기 작업을 분산하기때문에 성능이 향상됩니다.
  • 내결함성
    Master는 단 한 개만 존재하기 때문에 해당 Master가 다운되면 위험한 구조입니다. 그러므로 Master가 다운될 경우, 다른 Slave를 새로운 Master로 승격시켜 시스템의 가용성을 높였습니다.
  • 쓰기 병목 현상
    Master 노드가 단 한 개만 존재하기 때문에 발생하는 문제점으로, 높은 쓰기 부하기 있을 경우 Master 노드에서 병목 현상이 발생해 성능에 문제가 발생할 수 있습니다.

 

docker-compose로 redis master/slave 구조 구현하기

docker-compose를 이용해 master 컨테이너 1개와 slave 컨테이너 2개를 띄워서 실습을 진행해보았습니다. 아래는 docker-compose.yml 파일 중 일부입니다.

services:
	redis-master:
        image: redis:latest
        container_name: redis-master
        ports:
        - "6379:6379"
        volumes:
        - ./redis/redis-master.conf:/usr/local/etc/redis/redis.conf
        command: redis-server /usr/local/etc/redis/redis.conf

    redis-slave-1:
        image: redis:latest
        container_name: redis-slave-1
        ports:
        - "6380:6379"
        volumes:
        - ./redis/redis-slave.conf:/usr/local/etc/redis/redis.conf
        command: redis-server /usr/local/etc/redis/redis.conf
        depends_on:
        - redis-master
    
    redis-slave-2:
        image: redis:latest
        container_name: redis-slave-2
        ports:
        - "6381:6379"
        volumes:
        - ./redis/redis-slave.conf:/usr/local/etc/redis/redis.conf
        command: redis-server /usr/local/etc/redis/redis.conf
        depends_on:
        - redis-master

docker-compose 실행 결과 위와 같이 3개의 컨테이너가 실행되고 있는 모습을 확인할 수 있습니다. 그리고 slave 컨테이너에 접속하여 다음과 같은 명령어를 통해 정상적으로 master와 연결되었음을 확인할 수 있습니다.

# redis-cli
127.0.0.1:6379> INFO replication
# Replication
role:slave
master_host:redis-master
master_port:6379
master_link_status:up
master_last_io_seconds_ago:8
master_sync_in_progress:0
slave_read_repl_offset:14
slave_repl_offset:14
slave_priority:100
slave_read_only:1
replica_announced:1
connected_slaves:0
master_failover_state:no-failover
master_replid:e632b8f9fb633894be0d6670deaed33532c4dfb4
master_replid2:0000000000000000000000000000000000000000
master_repl_offset:14
second_repl_offset:-1
repl_backlog_active:1
repl_backlog_size:1048576
repl_backlog_first_byte_offset:1
repl_backlog_histlen:14
127.0.0.1:6379>

 

결과적으로 3개의 redis 도커 컨테이너를 띄운 것입니다. master로 명시한 컨테이너는 쓰기 작업에 사용합니다. 그리고 서버를 두 개 띄운 후 각각 slave-1과 slave-2를 이용하도록 설정해 읽기 작업을 분산시킵니다. 이러면 읽기 작업이 많아져도 하나의 redis에서 읽는 상황보다 더 높은 성능을 보여줄 수 있겠죠?