콘텐츠로 이동

Redis 장애 대응과 트러블슈팅

Redis 장애 대응은 증상 확인 -> 영향 범위 파악 -> 완화 -> 원인 제거 -> 재발 방지 순서로 움직입니다.

용어

용어 의미
Connection Timeout Redis 연결을 만들지 못하거나 연결 대기 중 timeout
Command Timeout 연결은 됐지만 명령 응답이 늦어 timeout
Swapping Redis 메모리가 OS swap으로 밀려 성능이 급락하는 상황
Memory Fragmentation 실제 RSS가 Redis 사용 메모리보다 커지는 현상
Replication Lag replica가 master보다 늦는 정도
Slot Migration Cluster에서 slot을 다른 노드로 옮기는 작업

Redis 장애 유형

유형 대표 증상
지연 API timeout, p99 증가
메모리 OOM, eviction 증가
CPU 특정 명령 폭증, Lua 지연
네트워크 connection timeout, packet loss
복제 replica lag, stale read
failover write 실패, READONLY 에러
Cluster MOVED, ASK, CROSSSLOT
데이터 캐시 불일치, 유실, 복구 실패

공통 5분 점검 순서

장애가 났을 때는 한 번에 원인을 단정하지 말고, Redis 자체 문제인지 애플리케이션 문제인지 먼저 나눕니다.

# 1. Redis 응답 여부
redis-cli PING

# 2. 전체 상태 요약
redis-cli INFO stats
redis-cli INFO memory
redis-cli INFO clients

# 3. 느린 명령과 지연 이벤트
redis-cli SLOWLOG GET 20
redis-cli LATENCY DOCTOR

# 4. 복제/클러스터 상태
redis-cli INFO replication
redis-cli CLUSTER INFO
먼저 볼 것 판단
PING 실패 네트워크, 프로세스, 보안 그룹, DNS 확인
connected_clients 급증 pool leak, retry 폭주
used_memory 한계 접근 eviction/OOM 위험
slowlog에 O(N) 명령 애플리케이션 명령 패턴 문제
replication link down replica read, failover 위험

1. Redis 지연이 급증함

단계 확인
증상 API 응답 지연, Redis timeout, connection pool 대기 증가
즉시 확인 SLOWLOG GET, LATENCY DOCTOR, INFO commandstats, CPU, 네트워크
의심 원인 big key 조회/삭제, KEYS, 큰 HGETALL, AOF rewrite, fork 비용, swap
완화 느린 명령 중단, 트래픽 제한, timeout 조정, 큰 key 접근 차단
재발 방지 big key 탐지, SCAN 사용, 명령별 timeout, slowlog 알림
redis-cli SLOWLOG GET 20
redis-cli LATENCY DOCTOR
redis-cli INFO commandstats
redis-cli --bigkeys

추가로 애플리케이션 쪽에서는 Redis 호출 p95/p99, pool 대기 시간, timeout count를 함께 봅니다. Redis는 멀쩡하지만 connection pool이 고갈되어 API가 느려지는 경우도 많습니다.

2. Connection Timeout

단계 확인
증상 Redis 연결 실패, pool exhausted
즉시 확인 INFO clients, app pool 설정, network ACL
의심 원인 connection leak, pool 과다, Redis maxclients, 네트워크 장애
완화 pool 제한, client 재시작, 재시도 backoff
재발 방지 connection pool 표준, idle timeout, circuit breaker
redis-cli INFO clients
redis-cli CONFIG GET maxclients
redis-cli CLIENT LIST
확인 의미
connected_clients 현재 연결 수
blocked_clients blocking 명령으로 대기 중인 client
rejected_connections maxclients 초과로 거부된 연결
CLIENT LIST 어떤 client가 많이 붙어 있는지

3. Command Timeout

단계 확인
증상 연결은 있으나 명령 응답 지연
즉시 확인 slowlog, latency, big key, CPU
의심 원인 O(N) 명령, Lua 장시간 실행, fork/AOF rewrite
완화 문제 명령 차단, batch 축소, timeout 조정
재발 방지 명령 시간 복잡도 리뷰, slowlog 알림
redis-cli SLOWLOG GET 50
redis-cli INFO commandstats
redis-cli LATENCY LATEST

slowlog에 KEYS, HGETALL, SMEMBERS, 큰 LRANGE, 긴 Lua가 보이면 해당 API와 배포 시각을 연결해서 봅니다.

4. 메모리 부족 또는 Eviction 발생

단계 확인
증상 OOM command not allowed, write 실패, evicted_keys 증가
즉시 확인 INFO memory, CONFIG GET maxmemory, CONFIG GET maxmemory-policy
의심 원인 TTL 없는 key 증가, big key, eviction 정책 부적합, 단편화
완화 불필요 key 삭제, TTL 부여, scale up, write traffic 제한
재발 방지 메모리 알림, key 수 추적, 도메인별 TTL 표준화
redis-cli INFO memory
redis-cli INFO stats | grep evicted_keys
redis-cli CONFIG GET maxmemory
redis-cli CONFIG GET maxmemory-policy
지표 위험 해석
used_memory Redis가 사용하는 메모리
used_memory_rss OS가 잡은 실제 메모리
mem_fragmentation_ratio 단편화 정도
evicted_keys 메모리 부족으로 제거된 key
expired_keys TTL 만료로 제거된 key

noeviction 정책에서는 메모리가 꽉 차면 쓰기 명령이 실패합니다. 캐시 목적이면 allkeys-lruallkeys-lfu를 검토하고, 세션처럼 함부로 지우면 안 되는 데이터와 한 Redis에 섞지 않는 것이 좋습니다.

5. Swapping과 CPU 병목

문제 확인 대응
Swapping OS swap 사용량, latency spike 메모리 증설, swap 방지, maxmemory 조정
CPU 병목 CPU 사용률, commandstats 느린 명령 제거, sharding, scale out
fork 비용 RDB snapshot / AOF rewrite 시 지연 메모리 여유 확보, rewrite 기준 조정
redis-cli INFO cpu
redis-cli INFO persistence
redis-cli LATENCY DOCTOR

RDB snapshot이나 AOF rewrite는 fork를 동반할 수 있어 메모리 여유가 부족하면 지연이 커집니다. 지연 시각과 rdb_bgsave_in_progress, aof_rewrite_in_progress를 함께 확인합니다.

6. Big Key 장애

단계 확인
증상 특정 명령만 느림, network output 급증, failover 지연
즉시 확인 --bigkeys, MEMORY USAGE, 자료구조 길이
완화 key 접근 차단, UNLINK, 배치 분할
재발 방지 key 크기 제한, 페이지 단위 저장, 만료 정책
redis-cli --bigkeys
redis-cli MEMORY USAGE some:key
redis-cli HLEN some:hash
redis-cli SCARD some:set
redis-cli ZCARD some:zset

발견한 big key는 바로 DEL하지 말고 크기와 자료구조를 먼저 봅니다. 큰 key 삭제는 UNLINK나 작은 단위 분할 삭제가 안전합니다.

redis-cli UNLINK huge:key

7. Hot Key 장애

단계 확인
증상 Cluster 일부 노드 CPU·network만 높음
즉시 확인 key별 QPS, MONITOR는 짧게만 사용, 애플리케이션 로그
완화 local cache, read replica, 임시 TTL 증가
재발 방지 hot key sharding, 캐시 계층화, 인기 key 별도 정책
# 운영에서는 짧게만 사용
redis-cli MONITOR

# Cluster라면 특정 노드만 높은지 확인
redis-cli --cluster info redis-node-1:6379

MONITOR는 Redis에 부담을 줄 수 있으므로 짧게만 사용합니다. 가능하면 애플리케이션 metric에서 key prefix별 호출량을 수집하는 편이 안전합니다.

8. O(N) 명령 장애

위험 명령 대안
KEYS SCAN
HGETALL HSCAN, 필드 단위 조회
SMEMBERS SSCAN, pagination
LRANGE 0 -1 범위 제한

9. Replication Lag

단계 확인
증상 replica read에서 오래된 값 조회, failover 후 데이터 유실 의심
즉시 확인 INFO replication, master/replica offset, network
의심 원인 네트워크 지연, replica 성능 부족, 큰 쓰기, full resync
완화 replica read 중단, master read 전환, 쓰기량 제한
재발 방지 lag 기준 알림, replica sizing, 큰 key 제거
redis-cli INFO replication
필드 의미
role master/replica 역할
master_link_status replica가 master와 연결됐는지
master_repl_offset master 복제 offset
slave_repl_offset replica 복제 offset

replica read를 사용 중이면 lag가 커졌을 때 오래된 값을 읽을 수 있습니다. 중요한 조회는 master read로 전환하거나 replica read를 일시 중단합니다.

10. Failover 지연

단계 확인
증상 write 실패, READONLY, 짧은 장애 후 일부 데이터 누락
즉시 확인 Sentinel/Cluster 상태, client topology 갱신
의심 원인 quorum 문제, replica lag, client 설정 미흡
완화 새 master로 연결 갱신, 쓰기 재시도, 장애 노드 격리
재발 방지 failover 훈련, timeout·retry 정책, lag 알림
redis-cli INFO replication
redis-cli ROLE
redis-cli SENTINEL masters
redis-cli CLUSTER INFO
redis-cli CLUSTER NODES

failover 이후 애플리케이션이 새 master를 인식하지 못하면 READONLY나 write timeout이 반복됩니다. client topology refresh, DNS cache, connection pool 재생성을 확인합니다.

11. Cluster Slot Migration 문제

증상 원인 대응
MOVED slot 담당 노드 변경 cluster client topology refresh
ASK slot 이동 중 임시 리다이렉트 ASKING 후 재시도
CROSSSLOT 다중 key가 서로 다른 slot hash tag 사용
특정 slot unavailable master/replica 장애 cluster 상태 확인
redis-cli CLUSTER INFO
redis-cli CLUSTER NODES
redis-cli CLUSTER KEYSLOT cart:{user-1}:items
redis-cli CLUSTER KEYSLOT cart:{user-1}:summary

CROSSSLOT은 장애라기보다 key 설계 문제인 경우가 많습니다. 다중 key 명령이 필요한 key는 {user-1}처럼 같은 hash tag를 사용합니다.

12. 캐시 값이 DB와 다름

단계 확인
증상 사용자가 오래된 정보 조회
즉시 확인 key TTL, DB updated_at, 캐시 갱신 로그
의심 원인 DB update 후 cache delete 실패, write 순서 문제
완화 해당 key 삭제, 도메인 캐시 일괄 무효화
재발 방지 cache aside 표준화, outbox 기반 무효화 이벤트, 짧은 TTL
redis-cli GET product:1001:summary
redis-cli TTL product:1001:summary
redis-cli DEL product:1001:summary

장애 중에는 먼저 해당 key를 삭제해 사용자 영향을 줄이고, 이후 DB update 로그와 캐시 delete 로그의 순서를 확인합니다.

13. 분산 락 중복 실행

단계 확인
증상 같은 주문·쿠폰·배치가 두 번 처리됨
즉시 확인 TTL, 작업 수행 시간, 프로세스 중단 여부
의심 원인 TTL보다 작업이 길었음, 락 해제 시 소유자 확인 누락
완화 중복 처리 보정, idempotency key로 재처리 차단
재발 방지 작업 시간보다 긴 TTL, fencing token, DB unique 제약
redis-cli GET lock:coupon:100
redis-cli PTTL lock:coupon:100

락 TTL이 작업 시간보다 짧았는지, unlock이 owner 확인 없이 DEL만 수행했는지, DB에 unique 제약이 있는지 확인합니다.

장애 격리 전략

전략 설명
timeout 제한 Redis 장애가 app thread 고갈로 번지지 않게 함
circuit breaker 장애 중 Redis 호출을 잠시 차단
fallback 조회 캐시는 DB 직접 조회, 일부 기능은 graceful degradation
rate limit 캐시 소실 후 DB 폭주 방지
bulkhead Redis 의존 기능과 핵심 기능 thread pool 분리

장애 후 데이터 복구

데이터 복구 기준
조회 캐시 DB에서 재생성
세션 정책에 따라 재로그인
카운터 DB/로그 기준 보정
랭킹 이벤트 로그 또는 DB 집계로 재계산
stream 메시지 PEL, DLQ, 원본 이벤트 로그 확인

베스트 프랙티스

권장 방식 이유
장애 유형별 Runbook 작성 대응 순서 단축
slowlog, latency, memory 알림 장애 전조 감지
Redis fallback 정책 명시 서비스 전체 장애 방지
big key/hot key 정기 점검 대표 장애 원인 제거
failover와 restore 훈련 실제 복구 가능성 검증

실무에서는?

증상 첫 확인
API 전체 지연 Redis timeout, pool 대기, slowlog
일부 API만 지연 특정 key, big key, hot key
DB 부하 폭증 cache miss, Redis 장애, warming 실패
failover 후 오류 client topology, READONLY, DNS/cache
데이터 이상 TTL, 무효화 로그, DB 기준 보정

관련 파일: - 성능 최적화 - 운영 구조와 고가용성 - 모니터링과 보안