DBAtlas · 데이터베이스 운영 아틀라스

Redis Sentinel + Cluster를 이용한 고가용성

증상

목표: Sentinel로 Redis에 자동 페일오버가 있는 master-replica 구성을 만들고, 수평 확장이 필요하면 Redis Cluster 모드로 전환한다.

1. master와 replica를 구성한다

master 하나와 최소 두 개의 replica를 실행한다. replica는 REPLICAOF로 master를 따른다(redis.conf에 'replicaof <host> <port>'로도 작성 가능). 지속성을 위해 AOF 또는 RDB를 활성화하고, requirepass/masterauth로 인증하는 것을 권장한다.

Redis

# at runtime on the replica nodes:
REPLICAOF 10.0.0.10 6379
# to make it persistent, redis.conf:
# replicaof 10.0.0.10 6379
# masterauth secret
INFO replication

2. monitor와 quorum으로 Sentinel을 구성한다

각 Sentinel 노드의 sentinel.conf에 감시할 master와 quorum을 정의한다. quorum은 master를 'down'으로 판단하는 데 필요한 최소 Sentinel 수다. 운영 환경에서는 3개의 별도 서버에 3개의 Sentinel을 권장한다(split-brain 대비).

Redis

# sentinel.conf:
sentinel monitor mymaster 10.0.0.10 6379 2
sentinel down-after-milliseconds mymaster 5000
sentinel failover-timeout mymaster 60000
sentinel parallel-syncs mymaster 1

3. Sentinel 프로세스를 시작한다

각 노드에서 Sentinel을 시작한다. Sentinel은 서로와 replica를 자동으로 발견하며, 런타임에 구성을 파일에 기록한다. 따라서 sentinel.conf는 쓰기 가능해야 한다.

Redis

redis-sentinel /etc/redis/sentinel.conf
# or:
redis-server /etc/redis/sentinel.conf --sentinel

4. Sentinel로 상태를 조회하고 페일오버를 테스트한다

SENTINEL 명령으로 현재 master와 replica를 조회한다. 애플리케이션은 Sentinel에 'get-master-addr-by-name'을 요청하여 현재 master를 알아내야 한다. 계획된 페일오버로 자동 전환을 확인한다.

Redis

SENTINEL master mymaster
SENTINEL get-master-addr-by-name mymaster
SENTINEL replicas mymaster
# planned switchover:
SENTINEL failover mymaster

5. 대안: Redis Cluster로 데이터를 분할한다

단일 master의 메모리/처리량이 부족하면 Redis Cluster를 사용한다: 데이터는 16384개 hash slot으로 나뉘어 여러 master에 분산되며, 각 master는 자체 replica를 가진다. 애플리케이션은 cluster-aware 클라이언트를 사용해야 한다. redis-cli --cluster create로 구성한다.

Redis

redis-cli --cluster create \
  10.0.0.11:6379 10.0.0.12:6379 10.0.0.13:6379 \
  10.0.0.21:6379 10.0.0.22:6379 10.0.0.23:6379 \
  --cluster-replicas 1

6. 클러스터 상태를 확인한다

클러스터 생성 후 모든 slot이 할당되고 노드가 연결되었는지 확인한다. cluster_state는 'ok'여야 하며 16384개 slot 전체가 할당된 것으로 보여야 한다. CLUSTER 명령으로 노드와 slot 분포를 모니터링한다.

Redis

redis-cli --cluster check 10.0.0.11:6379
redis-cli -c -h 10.0.0.11 CLUSTER INFO
redis-cli -c -h 10.0.0.11 CLUSTER NODES
DBAtlas에서 열기 →