이번 포스팅에서는 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 노드를 바라보도록 재설정된 것이 보입니다.
'언어 & 라이브러리 > 레디스' 카테고리의 다른 글
[레디스] 캐싱 전략에 대해 알아보자 (0) | 2022.07.06 |
---|---|
[레디스] 레디스 클러스터를 도커에서 구성해보자 (0) | 2022.03.17 |
[레디스] 메모리 관리 기법 RDB vs AOF 차이 (0) | 2022.03.17 |
[레디스] 레디스에 대해 알아보자 (0) | 2022.03.17 |
댓글