AI 요약
블루스카이의 시스템 엔지니어 짐 칼라브로(Jim Calabro)는 2026년 4월 6일 발생한 서비스 중단 사태에 대한 사후 분석 보고서를 발표했습니다. 이번 장애는 약 8시간 동안 전체 사용자의 절반에게 영향을 미쳤으며, 블루스카이 역사상 가장 심각한 수준의 장애로 기록되었습니다. 조사 결과, 사고의 징후는 4월 4일 토요일부터 나타났으며 데이터 백엔드인 'AppView'에서 TCP 포트 고갈을 의미하는 로그 에러가 급증한 것이 확인되었습니다. 근본 원인은 지난주 배포된 신규 내부 서비스가 초당 요청 수는 적으나 단일 요청에 15,000~20,000개의 URI를 포함하는 거대한 배치를 보냈기 때문입니다. 시스템 내 다른 모든 곳에는 적용되어 있던 고루틴(Goroutine) 동시성 제한 코드(errgroup.SetLimit)가 GetPostRecord 엔드포인트에만 유일하게 누락되어 있었습니다. 이로 인해 단시간에 수만 개의 연결 시도가 발생했고, TCP TIME_WAIT 상태의 연결이 급증하며 시스템 자원을 모두 소진시킨 것으로 판명되었습니다.
핵심 인사이트
- 장애 규모와 기간: 2026년 4월 6일(월요일) 발생, 약 8시간 지속, 전체 사용자 약 1/2에게 간헐적 장애 발생.
- 기술적 결함: Go 언어의
errgroup.SetLimit(50)코드 한 줄이 누락되어 무제한으로 고루틴이 생성됨. - 비정상적 트래픽 패턴: 초당 요청(RPS)은 3회 미만이었으나, 요청당 데이터 배치 크기가 평소(1~50개)보다 수백 배 큰 15,000~20,000개에 달함.
- 자원 고갈 메커니즘: memcached 연결 시 최대 유휴 연결(max idle conn) 제한인 1,000개를 초과하는 수만 개의 연결이 시도되며 TCP 포트가 고갈됨.
주요 디테일
- 관측성(Observability) 한계: 기존 모니터링 시스템은 개별 요청이 작을 것이라고 가정하여, 대규모 배치 요청이 유발하는 부하를 즉각 탐지하는 데 어려움을 겪음.
- 에러 메시지: 데이터 평면 로그에서
dial tcp 127.32.0.1:0->127.0.0.1:11211: bind: address already in use라는 구체적인 포트 부족 에러가 발견됨. - 데이터베이스 구조: 블루스카이는 Scylla 데이터베이스의 부하를 줄이기 위해 memcached를 캐시 레이어로 사용하고 있었으며, 이번 장애는 캐시 연결 과정에서 발생함.
- 장애 타임라인: 4월 3일 밤부터 에러 로그가 발생하기 시작했으며, 4월 4일 토요일에 최초 경보(Page)가 발송됨.
- 해결책: 누락되었던 동시성 제한 설정을 추가하여 시스템이 한 번에 처리할 수 있는 고루틴의 수를 제한하도록 수정함.
향후 전망
- 시스템 안정성 강화: 모든 엔드포인트에 대한 코드 리뷰를 통해 동시성 제한 설정이 누락된 곳이 없는지 전수 조사가 이뤄질 것으로 보임.
- 모니터링 체계 개편: 개별 요청의 크기나 배치 단위의 리소스 점유율을 감시할 수 있는 보다 정밀한 관측 도구 도입이 예상됨.
