Redis가 다운되면 캐싱, 분산락, LuaScript 기반의 원자적 연산 등이 모두 영향을 받습니다.
이를 대비해 Redis는 Sentinel 기반으로 구성해 장애 발생 시 자동으로 Slave에서 Master를 선출하고 연결을 재구성하도록 했습니다. 만약 캐시가 유효하지 않거나 Redis 접근이 완전히 불가능한 경우, DB에서 직접 데이터를 조회한 후 응답을 반환하고 Redis는 비동기로 복구합니다.
Redisson Lock이나 LuaScript 기반 연산이 실패할 경우에는 lock 획득 실패 로직에 따라 재시도 또는 예외 처리를 수행하고, 임계구간에서는 fallback 전략(예: 큐에 저장 후 지연 처리, 유저에게 대기 안내)을 적용해 일관성을 지키며 사용자 경험을 유지합니다.
장애 상황은 ELK와 Slack 연동을 통해 관리자에게 실시간 알람이 전송되도록 했습니다.
꼬리 질문
1. Redisson 락 실패 시 어떤 비즈니스 로직을 어떻게 보호하나요?
Redisson 락 실패 시에는 동시성 문제가 발생할 수 있는 민감한 로직만 보호 대상으로 삼고, 락 획득 실패 시 곧바로 재시도하거나, 대기 없이 큐에 등록 후 비동기 처리로 넘기도록 설계했습니다.
예를 들어, 선착순 좌석 예매나 재고 감소 같은 로직은 락 획득 실패 시 유저에게 ‘대기 중’ 메시지를 반환하고, Kafka로 이벤트를 발행해 나중에 처리하도록 했습니다. 이를 통해 과도한 재시도나 서비스 지연 없이 일관성과 사용자 경험을 모두 확보했습니다.
2. Redis Sentinel외에 Redis Cluster를 쓴다면 어떤 차이가 있나요?
Redis Sentinel은 단일 Master 기반의 고가용성을 위한 Failover 기능을 제공하는 반면, Redis Cluster는 수평 확장이 가능해 샤딩 기반의 데이터 분산 처리가 가능합니다.
따라서 조회/쓰기 성능을 확장하려면 Redis Cluster가 적합하며, 각 노드 간에 키 슬롯을 기반으로 분산 저장됩니다. 다만 Redisson Lock이나 Lua Script는 Redis Cluster 환경에서는 제한이 있어 단일 키 락 처리만 안전하게 지원됩니다.
3. 캐시 fallback 로직에서 발생할 수 있는 병목을 어떻게 방지했나요?
캐시 fallback 시 다수의 요청이 동시에 DB를 조회하면 Cache Stampede가 발생할 수 있습니다. 이를 방지하기 위해 분산 락 기반의 캐시 재생성 제어를 적용했습니다.
하나의 요청만 DB에서 값을 조회하고, 다른 요청은 대기하거나 캐시 갱신이 완료되면 재시도하도록 구현했습니다. 또한 TTL 만료에 랜덤 지터를 더해 일시에 만료되는 키가 몰리는 현상도 방지했습니다.
4. Redis장애가 전체 서비스 장애로 확산되지 않게 하려면 어떤 조치가 필요한가요?
Redis 장애가 전체 시스템에 영향을 주지 않도록 하기 위해 기능 격리와 오류 허용 설계(Failure Tolerance)를 적용했습니다.
예를 들어, 인증, 결제처럼 반드시 Redis 의존성이 있는 기능 외에는 Redis 사용 여부에 따라 degrade 모드로 전환되도록 했습니다. 또한 Redis가 핵심이 아닌 로직은 try-catch로 오류를 흡수하거나, 자체 임시 캐시로 대체해 Redis 장애가 전체 서비스 중단으로 확산되지 않도록 했습니다.
Redis Sentinel과 Clustering의 차이점
Redis는 구성에 따라 Standalone, Clustering, Sentinel로 나뉘며 각각 가용성과 확장성에서 차이를 보인다.
- Standalone은 단일 Redis 인스턴스로, 가장 간단하지만 장애가 발생한 경우 복구할 수 없는 환경을 갖고 있다.
- Sentinel은 하나의 Master와 다수의 Slave를 구성하고, Master에 장애가 발생한 경우 FailOver를 수행한다. Sentinel은 수평적 확장은 불가능하며 단일 Master를 유지한다.
- Clustering은 여러 Master 노드를 통해 데이터를 샤딩 분산 저장하며, 자동 Failover와 수평 확장 기능을 모두 지원한다.
'면접 준비' 카테고리의 다른 글
[설계 면접] Spring Cloud Gateway나 Config Server가 죽으면 어떻게 되나요? (0) | 2025.05.27 |
---|---|
[설계 면접] 만약 Filebeat, ELK중 하나라도 장애가 발생한다면 어떻게 처리할 수 있나요? (0) | 2025.05.27 |
[설계 면접] 트래픽이 갑자기 몰리는 경우 어떻게 처리할 수 있도록 설계했나요? (1) | 2025.05.27 |
[면접 스터디용 질문 리스트] OS / DB / NETWORK/ MSA (0) | 2025.03.02 |
[면접 스터디용 질문 리스트] JAVA/SPRING/JPA/Redis/ 면접 질문 리스트 10개 씩 (0) | 2025.03.02 |