Redis는 단일 인스턴스로도 운영 가능하지만 물리 머신이 가진 메모리 한계를 초과하는 데이터를 저장하고 싶거나, failover에 대한 처리를 통해 고가용성을 보장하려면 Sentinel이나 Cluster 등의 운영 방식을 선택해서 사용해야 한다.
Failover : 장애 조치 기능으로 시스템 장애 이벤트 발생 시 하나의 예비 백업 시스템으로 자동 전환되는 것을 말한다.
Sentinel
- 모니터링 : Master/Slave 동작 감시
- 자동 장애 조치 (Automatic Failover)
- 알림 : failover 됐을 때, client에게 알릴 수 있다.
구성 요소
- 최소 3개 이상의 Sentinel 인스턴스를 권장하여 장애 발생 시 합의를 통해 안정적인 장애 조치가 이루어지도록 한다.
- Master-Slave 구조 : 하나의 마스터와 다수의 슬레이브로 구성되며, Sentinel이 마스터의 상태를 관리한다.
동작 방식
- Sentinel 인스턴스 과반수 이상이 Master 장애를 감지하면 Slave 중 하나를 Master로 승격시키고 기존의 Master는 Slave로 강등시킨다.
- Slave가 여러 개 있을 경우 Slave가 새로운 Master로부터 데이터를 받을 수 있도록 재구성 된다.
장점
- 고가용성 보장 : 마스터 서버 장애 시 자동으로 슬레이브를 마스터로 승격시켜 서비스 중단 시간을 최소화한다.
- 유연성 : 기존의 Master-Slave 구조를 활용하여 고가용성을 강화할 수 있다.
단점
- 확장성 한계 : Sentinel 자체를 클러스터링을 지원하지 않기 때문에, 수평적 확장에 한계가 있다.
- 복잡한 관리 : Sentinel 인스턴스 수와 구성을 관리하는 데 추가적인 노력이 필요하다.
Cluster
Redis Cluster는 Redis의 수평적 확장성과 고가용성을 동시에 제공하기 위한 분산 시스템이다. 클러스터는 데이터를 여러 노드에 분산 저장하고, 각 노드가 마스터와 슬레이브 역할을 수행하여 데이터의 복제와 장애 조치를 관리한다.
주요 기능
- 데이터 분산
- 고가용성 : 각 마스터 노드는 하나 이상의 슬레이브 노드를 가지며, 마스터 노드 장애 시 슬레이브노드 중 하나를 새로운 마스터로 승격시킨다.
- 자동 장애 조치(Failover) : 클러스터 내에서 마스터 노드의 장애를 감지하고, 자동으로 슬레이브 노드를 마스터로 승격시켜 클러스터의 안정성을 유지한다.
- 데이터 재분배 : 노드 추가/제거 시 데이터 슬롯을 재분배하여 클러스터의 균형을 맞춘다.
구성 요소
- 노드 : 클러스터를 구성하는 개별 Redis 인스턴스로 마스터와 슬레이브 역할을 수행한다.
- Master-Slave : 각 마스터 노드는 하나 이상의 슬레이브 노드를 가지며, 데이터 복제를 통해 고가용성을 보장한다.
장점
- 수평적 확장 : 클러스터링을 통해 데이터와 트래픽을 여러 노드에 분산시켜 성능을 향상시킬 수 있다.
- 고가용성
- 자체적인 데이터 분산 : 데이터 분산과 복제를 자동으로 관리한다.
단점
- 복잡한 설정
- 제한된 명령어 : 특정 명령어는 제한될 수 있다.
- 데이터 일관성 : 여러 노드에 데이터가 분산 저장되기 때문에, 일부 상황에서 데이터 일관성 관리가 복잡해질 수 있다.
그래서 뭘 써야 될까?
Sentinel
- 고가용성만이 주요 요구 사항일 때 : 단일 마스터-슬레이브 구조로도 충분한 고가용성 제공
- 데이터 분산이 필요 없을 때 : 데이터가 한 노드에 집중돼도 문제 없는 경우
- 소규모 or 중간 규모
Cluster
- 수평적 확장과 높은 처리량이 필요할 때 : 데이터와 트래픽을 여러 노드로 분산시켜 성능 향상이 필요한 경우
- 대규모 데이터 저장 : 단일 노드에 저장하기 어려운 경우
- 자동 데이터 분산이 필요할 때 : 별도 데이터 분산 로직 없이 Redis가 자체적으로 데이터 분산 관리하고 싶은 경우