docker로 redis sentinel 띄워보기

greenTea·2024년 3월 16일

redis sentienl

Redis를 사용할 경우 고가용성을 확보하고 싶은 경우 크게 2가지 방법이 있습니다.
첫 번째는 Redis Sentinel을 이용하는 것이고 두 번째는 Redis Cluster를 이용하는 것입니다.

Redis Sentinel 구조

            +-------------+
            | Sentinel 1  |----- Client A
            | Redis 1 (M) |
            +-------------+
                    |
                    |
+-------------+     |          +------------+
| Sentinel 2  |-----+-- // ----| Sentinel 3 |----- Client B
| Redis 2 (S) |                | Redis 3 (M)|
+-------------+                +------------+

출처: Redis Sentinel 문서

Redis SentinelRedis를 모니터링하는 프로그램으로, 위와 같은 구조를 가집니다. 만약 Redis 3이 멈추는 경우 Sentinel이 이를 파악하고 자동으로 failover를 거치게 됩니다.

Sentinel은 다음 master를 선출하기 위해 투표를 진행합니다. 이 때, 최소 3 이상의 홀수 대수의 Sentinel을 구성하는 것이 권장됩니다. 이렇게 함으로써 고가용성을 높일 수 있습니다.

또한 고가용성을 확보하기 위해 Sentinel을 분리해서 배치하는 것이 권장됩니다.

docker compose 구성

master.conf

masterauth 1111
requirepass 1111

master redis의 구성 파일입니다.
간단하게 비밀번호만 설정해주었습니다.

slave.conf

masterauth 1111
requirepass 1111
replicaof master 6379

slave redis의 구성입니다.
master redis와 같은 비밀번호를 사용하도록 하였으며 repliacof로 복제를 하였습니다.

sentinel.conf

port 5000
sentinel monitor myprimary master 6379 2
sentinel down-after-milliseconds myprimary 5000
sentinel failover-timeout myprimary 60000
sentinel auth-pass myprimary 1111

sentinel입니다.
sentinel monitor를 통해 master를 감시하게 되는데 해당 정보만 작성해도 알아서 slave까지 파악하기 때문에 위 구성만 해주시면 될 것 같습니다.
redis에 비밀번호를 설정하였기 때문에 sentinel에서도 이를 알 수 있게 auth-pass를 통해서 알려주어야 합니다.

docker-compose.yml

version: '3.8'
services:
  master:
    image: redis:latest
    container_name: master
    volumes:
      - ./master.conf:/usr/local/etc/redis/redis.conf
    command: redis-server /usr/local/etc/redis/redis.conf
    ports:
      - "6379:6379"
      - "6380:6380"
      - "6381:6381"
      - "5000:5000"
      - "5001:5001"
      - "5002:5002"
  redis-1:
    image: redis:latest
    network_mode: "service:master"
    container_name: slave-1
    volumes:
      - ./slave:/slave
    command: redis-server /slave/slave-1.conf

  redis-2:
    network_mode: "service:master"
    image: redis:latest
    container_name: slave-2
    volumes:
      - ./slave:/slave
    command: redis-server /slave/slave-2.conf

  sentinel-1:
    network_mode: "service:master"  
    image: redis:latest
    container_name: sentinel-1
    volumes:
      - ./sentinel:/sentinel
    command: redis-server /sentinel/sentinel-1.conf --sentinel
    depends_on:
      - master
  sentinel-2:
    network_mode: "service:master"
    image: redis:latest
    container_name: sentinel-2
    volumes:
      - ./sentinel:/sentinel
    command: redis-server /sentinel/sentinel-2.conf --sentinel
    depends_on:
      - master
  sentinel-3:
    network_mode: "service:master"
    image: redis:latest
    container_name: sentinel-3
    volumes:
      - ./sentinel:/sentinel
    command: redis-server /sentinel/sentinel-3.conf --sentinel
    depends_on:
      - master

master 1개 slave 2개 형태로 redis를 동작시켰습니다.
sentinel의 경우 최소 권장 대수인 3대를 가동시켰습니다.

네트워크의 경우 모두 같은 network를 사용할 수 있도록 network_mode: "service:master" 이렇게 작성하였습니다.
위 방식을 사용하지 않는 경우 라면 sentinel에서 dns 관련 설정을 해주셔야 합니다.

참고자료

Redis Developer Hub
redis-sentinel throws error: " Can't resolve master instance hostname."

profile
greenTea입니다.

0개의 댓글