Incident Library
  • 원인
  • 구성 요소
  • 증상
  • 기여 요인
  • 사례

사례6건

6건 중 5~6번째

  1. 증상

    하쿠나 서비스의 API latency 가 특정 시간에 주기적으로 치솟았다. APM 의 Dependency 별 Latency 분석에서 병목은 Redis 였다.

    촉발

    가용 메모리가 부족한 상태에서, 하루 한 번 primary 노드에서 도는 ElastiCache 백업이 forkless 방식으로 실행됐다.

    원인
    구성 요소
    기여 요인
    감지

    특정 시간에 주기적으로 치솟는 API latency 를 그래프에서 보았고, APM 의 Dependency 별 Latency 분석으로 병목이 Redis 임을 알아냈다.

    조치
    • ElastiCache 백업을 primary 노드가 아니라 secondary 노드에서 실행하도록 바꿨다.
    • TTL 없이 저장되던 데이터에 TTL 을 걸어 저장하도록 코드를 고쳤다.
    • Redis Hash CrudRepository 를 쓰던 곳을 RedisTemplate 으로 다시 구현한 CustomRepository 로 바꿨다.
    • 이미 쌓여 있던 필요 없는 데이터를 지우는 스크립트를 실행했다.
    교훈

    백엔드 팀은 Redis 운영과 모니터링에 미흡한 부분이 있었다고 돌아봤다. 데이터 사이에 관계가 있거나 값으로 검색해야 하면 관계형 데이터베이스를 쓰고, 영속성이 필요한 데이터는 되도록 Redis 가 아닌 on-disk 기반 저장소에 둔다. ElastiCache Snapshot 을 만들어야 하면 가용 메모리를 50% 이상으로 유지한다. DEL collection 처럼 O(n) 인 명령 때문에 운영 Redis 가 멈추지 않게 조심한다. 애플리케이션과 데이터베이스 사이에 불필요한 I/O 가 없는지도 주기적으로 확인한다. Spring Data Redis Repository 는 secondary index 를 프레임워크가 관리해 주므로, TTL 이 필요 없고 쿼리 성능이 많이 요구되는 업무에서는 좋은 선택지가 될 수 있다.

  2. 증상

    10월 19일과 20일 Newark 와 Atlanta 데이터 센터의 Linode Object Storage 에서 성능과 가용성이 떨어졌다. 고객은 “503 - Slow Down” HTTP 응답 코드로 나타나는 속도 제한을 더 많이 받았다.

    촉발

    10월 19일과 20일 Newark 와 Atlanta 의 Object Storage 클러스터로 요청 수와 처리량이 모두 아주 높은 트래픽이 들어왔다.

    원인
    구성 요소
    기여 요인
    조치
    • Object Storage 클러스터 경계의 속도 제한을 고쳐 공개한 한도인 버킷당 초당 750 요청을 정확히 지키게 했다. 이전에는 클라이언트가 이 값보다 훨씬 많은 I/O 를 할 수 있었다.
    • 일부 내부 Object Storage 인프라에서 메모리를 지나치게 쓰게 하던 Ceph 버그를 해결하고, 하드웨어나 네트워크 고장 뒤 클러스터 복구 같은 스토리지 압박 상황에서 메모리가 폭주하지 않게 설정 값을 조정했다.
    • 자원 경합을 겪던 내부 Object Storage 구성 요소를 덜 붐비고 더 안정적이며 성능이 더 높은 인프라로 옮겼다.
    • 내부 Object Storage 구성 요소와 백엔드 클러스터의 성능 설정 값 몇 개를 조정해 고객을 너무 일찍 속도 제한하지 않게 했다.
    후속 조치
    • 처리량 제한을 더 세밀하게 만든다.
    • 부하를 더 효율적으로 나누도록 내부 Object Storage 인프라를 키운다.
    • 내부 Object Storage 인프라의 하드웨어 성능을 더 높일 방법을 찾는다.
    • 클러스터에 부하가 한곳에 몰리지 않도록 부하 분산 알고리즘을 다듬는다.
    교훈

    백엔드 속도 제한은 한번 걸리면 공개한 한도를 넘지 않은 클라이언트까지 모든 클라이언트에 영향을 준다. Linode 는 버킷당 프런트엔드 속도 제한이 뜻한 대로 동작한다면 클라이언트를 가리지 않는 이런 백엔드 제한은 아예 걸리지 않아야 한다고 봤고, 그래서 백엔드 설정 값을 바꿨다.

내 클러스터에도 있는지 확인하기

이 6건에서 가장 많이 나오는 구성 요소: 인메모리 캐시, 데이터베이스. kubegap 은 Claude Code 나 Codex 에서 쿠버네티스 클러스터를 읽기만 하며 이런 틈을 점검합니다. 점검 항목의 근거는 이 라이브러리와 같은 공개 보고서입니다.

원인별1