Master/Slave 구조란?
redis의 master/slave 구조는 쓰기와 읽기 역할을 나누기 위한 구조입니다. Master는 쓰기 작업을 처리하고, Slave는 읽기 작업을 처리합니다. master는 한 개만 운영되고 slave는 여러개 운영됩니다. 즉, redis의 master/slave 구조는 읽기 역할을 담당하는 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에서 읽는 상황보다 더 높은 성능을 보여줄 수 있겠죠?
'데이터베이스, ORM' 카테고리의 다른 글
[MySQL] 쿼리 실행 계획(Query Execution Plan)을 통해 쿼리 최적화하기 (0) | 2025.05.06 |
---|---|
[DB] 동시성 문제 직접 테스트해보고 이해하자 - 비관적 락 / 낙관적 락 (0) | 2025.04.14 |
RDB에서 외래키 사용하지 않는 이유? (0) | 2025.03.17 |