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-lru나 allkeys-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 기준 보정 |
관련 파일:
- 성능 최적화
- 운영 구조와 고가용성
- 모니터링과 보안