본문 바로가기
언어 & 라이브러리/레디스

[레디스] 레디스 Master-Slave를 도커에 올려보자

by illlilillil 2022. 3. 17.

이번 포스팅에서는 Master - Slave를 구성하고 도커에 올려보고 장애 시 어떤 로직이 발생하는지 알아보겠습니다.

Sentinel Mode를 활용해 마스터 슬레이브를 감시하는 노드도 함께 만들어보겠습니다.

 

docker compose를 활용하면 쉽게 노드를 구성할 수 있습니다.

구조는 Master 1, Slave 2, Sentinel 3개로 구성하겠습니다. 센티넬은 최소 3개 이상 홀수로 구성해야 합니다.

docker-compose.yml

version: '2'

services:

  # master : bitnami/redis:6.2.6
  redis-master:
    hostname: redis-master
    container_name: redis-master
    image: bitnami/redis:6.2.6
    environment:
      - REDIS_REPLICATION_MODE=master
      - ALLOW_EMPTY_PASSWORD=yes
    ports:
      - 6379:6379

  # slave1 : bitnami/redis:6.2.6
  redis-slave-1:
    hostname: redis-slaves-1
    container_name: redis-slaves-1
    image: bitnami/redis:6.2.6
    environment:
      - REDIS_REPLICATION_MODE=slave
      - REDIS_MASTER_HOST=redis-master
      - ALLOW_EMPTY_PASSWORD=yes
    ports:
      - 6480:6379
    depends_on:
      - redis-master

  # slave2 : bitnami/redis:6.2.6
  redis-slave-2:
    hostname: redis-slaves-2
    container_name: redis-slaves-2
    image: bitnami/redis:6.2.6
    environment:
      - REDIS_REPLICATION_MODE=slave
      - REDIS_MASTER_HOST=redis-master
      - ALLOW_EMPTY_PASSWORD=yes
    ports:
      - 6481:6379
    depends_on:
      - redis-master
      - redis-slaves-1

  # sentinel1 : bitnami/redis-sentinel:6.2.6
  redis-sentinel-1:
    hostname: redis-sentinel-1
    container_name: redis-sentinel-1
    image: bitnami/redis-sentinel:6.2.6
    environment:
      - REDIS_SENTINEL_DOWN_AFTER_MILLISECONDS=3000
      - REDIS_MASTER_HOST=redis-master
      - REDIS_MASTER_PORT_NUMBER=6379
      - REDIS_MASTER_SET=master-name
      - REDIS_SENTINEL_QUORUM=2
    depends_on:
      - redis-master
      - redis-slaves-1
      - redis-slaves-2
    ports:
      - 26379:26379

  # sentinel2 : bitnami/redis-sentinel:6.2.6
  redis-sentinel-2:
    hostname: redis-sentinel-2
    container_name: redis-sentinel-2
    image: bitnami/redis-sentinel:6.2.6
    environment:
      - REDIS_SENTINEL_DOWN_AFTER_MILLISECONDS=3000
      - REDIS_MASTER_HOST=redis-master
      - REDIS_MASTER_PORT_NUMBER=6379
      - REDIS_MASTER_SET=master-name
      - REDIS_SENTINEL_QUORUM=2
    depends_on:
      - redis-master
      - redis-slaves-1
      - redis-slaves-2
    ports:
      - 26380:26379

  # sentinel3 : bitnami/redis-sentinel:6.2.6
  redis-sentinel-3:
    hostname: redis-sentinel-3
    container_name: redis-sentinel-3
    image: bitnami/redis-sentinel:6.2.6
    environment:
      - REDIS_SENTINEL_DOWN_AFTER_MILLISECONDS=3000
      - REDIS_MASTER_HOST=redis-master
      - REDIS_MASTER_PORT_NUMBER=6379
      - REDIS_MASTER_SET=master-name
      - REDIS_SENTINEL_QUORUM=2
    depends_on:
      - redis-master
      - redis-slaves-1
      - redis-slaves-2
    ports:
      - 26381:26379

 

터미널에 docker-compose가 있는 폴더의 위치에서 아래 명령어를 입력해줍니다.

docker compose의 기본 설정이 docker-compose.yml을 읽도록 해줘 따로 기재를 하지 않아도 됩니다.

docker compose up -d

docker ps로 확인하면 잘 올라온 것을 확인할 수 있습니다.

 

Docker에 들어가 레디스 마스터 로그를 살펴 보겠습니다.

두 개의 연결된 Slave에 동기화하는 로그를 살펴볼 수 있습니다.

Slave의 로그 또한 살펴보겠습니다.

위에 로그엔 RDB, 아래 로그는 AOF를 사용한 메모리 할당 방식을 볼 수 있습니다.

이제 설정 정보들을 확인하기 위해 쉘에 접속해보겠습니다.

docker exec -it redis-master bash

//client 접속
redis-cli

 

접속 후 info 명령어를 입력하면 각종 설정 정보들이 나오게 됩니다.

127.0.0.1:6379> info
# Server
redis_version:6.2.6
redis_git_sha1:00000000
redis_git_dirty:0
redis_build_id:5b326c4b337eb561
redis_mode:standalone
os:Linux 5.10.76-linuxkit x86_64
arch_bits:64
multiplexing_api:epoll
atomicvar_api:c11-builtin
gcc_version:8.3.0
process_id:1
process_supervised:no
run_id:742b05de3412c8c620818ff1dbc2a95b5df0d759
//포트 정보
tcp_port:6379
server_time_usec:1647498790281661
uptime_in_seconds:523
uptime_in_days:0
hz:10
configured_hz:10
lru_clock:3331622
executable:/opt/bitnami/redis/bin/redis-server
config_file:/opt/bitnami/redis/etc/redis.conf
io_threads_active:0

# Replication
//복제 구성 정보들
role:master
connected_slaves:2
slave0:ip=172.21.0.7,port=6379,state=online,offset=106345,lag=0
slave1:ip=172.21.0.5,port=6379,state=online,offset=106345,lag=0
master_failover_state:no-failover
master_replid:31bc34326c986a09bc0f0aa4bd8c2c6316c80b64
master_replid2:0000000000000000000000000000000000000000
master_repl_offset:106345
second_repl_offset:-1
repl_backlog_active:1
repl_backlog_size:1048576
repl_backlog_first_byte_offset:1
repl_backlog_histlen:106345

센티넬의 로그도 확인해볼게요

master-slave 관계를 알고있고 모니터링하는 것으로 보여집니다.

센티넬에 접속해 잠시 master 노드를 꺼보겠습니다.

 docker exec -it redis-sentinel-1 bash
 redis-cli -p 26379
 //마스터 노드 확인 명령어
 SENTINEL get-master-addr-by-name master-name

 

 

마스터 노드를 종료 시키고 센티넬의 로그를 확인해볼게요

.2 노드가 마스터 노드였는데 장애가 나 failover를 수행하고 센티넬끼리 vote하는 것을 확인할 수 있습니다. 과반수가 되어 slave .5 노드가 master 노드가 되고 다른 slave 또한 바뀐 Master 노드를 바라보도록 재설정된 것이 보입니다.

 

댓글