Redis를 사용할 경우 고가용성을 확보하고 싶은 경우 크게 2가지 방법이 있습니다.
첫 번째는 Redis Sentinel을 이용하는 것이고 두 번째는 Redis Cluster를 이용하는 것입니다.
+-------------+
| Sentinel 1 |----- Client A
| Redis 1 (M) |
+-------------+
|
|
+-------------+ | +------------+
| Sentinel 2 |-----+-- // ----| Sentinel 3 |----- Client B
| Redis 2 (S) | | Redis 3 (M)|
+-------------+ +------------+
Redis Sentinel은 Redis를 모니터링하는 프로그램으로, 위와 같은 구조를 가집니다. 만약 Redis 3이 멈추는 경우 Sentinel이 이를 파악하고 자동으로 failover를 거치게 됩니다.
Sentinel은 다음 master를 선출하기 위해 투표를 진행합니다. 이 때, 최소 3 이상의 홀수 대수의 Sentinel을 구성하는 것이 권장됩니다. 이렇게 함으로써 고가용성을 높일 수 있습니다.
또한 고가용성을 확보하기 위해 Sentinel을 분리해서 배치하는 것이 권장됩니다.
masterauth 1111
requirepass 1111
master redis의 구성 파일입니다.
간단하게 비밀번호만 설정해주었습니다.
masterauth 1111
requirepass 1111
replicaof master 6379
slave redis의 구성입니다.
master redis와 같은 비밀번호를 사용하도록 하였으며 repliacof로 복제를 하였습니다.
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를 통해서 알려주어야 합니다.
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."