톡 장애 후기
오늘 갑자기 서비스가 안된다고 팀에서 말이 나옴 -> 그럴리가 없는데??
→ 확인해보니 API 서버에서 Redis 연결 오류 발생
→ 클러스터링된 Redis(6379 포트)가 아예 죽어 있었음
→ Redis 다시 살리니까 서비스 정상 복귀
🔍 장애 원인
- Redis systemd 설정 중 ProtectSystem=strict 옵션 켜져 있었음
- 이 옵션은 systemd 보안 하드닝 기능으로,
Redis 프로세스가 파일시스템에 쓰기 불가능(읽기 전용) 상태로 동작함 - Redis는 클러스터 구성 정보(nodes-16379.conf) 파일에 접근해야 하는데
접근이 막혀서 프로세스가 즉시 종료(exit code 1) 됨 - 결국 Redis 클러스터가 기동되지 않음 → API 서버에서 연결 실패
⚠️ 증상
- API 로그에 아래 메시지 반복 출력됨
-
ClusterAllFailedError: Failed to refresh slots cache
- Redis 로그엔 이런 에러 찍힘
-
Can't open nodes-16379.conf in order to acquire a lock: Read-only file system
- systemctl restart redis-server 해도 재기동 안 됨
-
redis-server.service: Failed with result 'exit-code'
🧠 원인 요약
- systemd의 ProtectSystem=strict 때문에 Redis가 파일을 못 씀
- 클러스터 상태 파일 생성 불가 → Redis 프로세스 종료
- Redis 죽으면서 API 서버들이 클러스터 노드 못 찾음 → 서비스 응답 지연 및 일부 기능 오류
🛠 조치 내역
- nodes-16379.conf 파일 수동 생성
- Redis 서비스 설정 수정
-
[Service] ProtectSystem=no ProtectHome=no
- Redis 재시작 → 정상 기동
- 다른 Redis 노드(DB 서버 3대)에도 동일하게 설정 반영
✅ 결과
- Redis 클러스터 정상 복구
- API 서버 Redis 연결 복원
- 서비스 전체 정상화 완료
💬 요약 한 줄
systemd 보안 옵션이 Redis 파일 쓰기를 막아서 클러스터가 죽었던 케이스.
ProtectSystem=strict → no로 변경해서 해결함.
'TIL' 카테고리의 다른 글
| Node.js의 !! 키워드 정리 (0) | 2025.10.22 |
|---|---|
| Redis 메모리 정책 삽질기 — noeviction → allkeys-lru 전환 (0) | 2025.10.22 |
| 다중 소켓서버 삽질 후기 (feat. 미친 20%) (0) | 2025.10.13 |
| node JS 스프레드 연산자에 대해 (1) | 2025.10.13 |
| 서버간 ping 은 동작 안되는데 curl은 되는 경우 (0) | 2025.10.13 |