IL-0255 37signals · 2020-08-28networkingdatabase
데이터센터 사이 메트로 회선이 잠깐 끊긴 뒤 Redis 레플리카가 재동기화 루프에 빠져 BC3 가 느려지고 채팅이 멈췄다
Basecamp 는 Ashburn 의 주 데이터센터와 Chicago 의 데이터센터 사이에 이중 메트로 회선을 둔다. 기존 공급사가 인수되면서 새 공급사로 바꿨고, 몇 주 동안 두 공급사를 나란히 쓴 뒤 6월 말에 완전히 옮겼다.
8월 28일 금요일 11:59AM CDT 에 메트로 회선이 짧게 끊긴 뒤 BC3 응답이 계속 느렸고 채팅과 Pings 가 멈췄다. 채팅 재연결이 네트워크에 과부하를 걸었다. 운영 팀은 Cable 서비스를 두 번 재시작했지만 소용이 없었고, 로드 밸런서 계층에서 채팅을 꺼서 나머지 BC3 를 안정시켰다. 그 뒤 Redis DB 인스턴스 하나의 알림을 따라가 대기 서버의 레플리카가 재동기화 루프에 빠져 주 노드를 느리게 하는 것을 찾았다. 레플리카의 Redis 를 재시작하자 곧바로 나아졌고 BC3 는 곧 정상으로 돌아왔다. 레플리카의 재동기화 루프는 문서화된 우회 방법이 있는 알려진 Redis 문제였다. 운영 리더는 그 설정 변경을 할 일 목록에 올렸지만, 담당자를 분명히 정하지 않았고 서둘러 끝내지도 못했다.
사고 뒤 남은 질문은 이중 회선 하나가 30초 끊긴 것으로 어떻게 BC3 가 멈추느냐였다. Basecamp 는 로그에서 두 회선이 모두 짧게 끊긴 것을 확인하고 공급사들에 물었다. 공급사들의 첫 답은 BGP 설정이 최적이 아니라는 내용이었지만, 그것으로는 두 회선이 함께 끊긴 이유를 다 설명하지 못했다. 9월 1일 같은 끊김이 다시 났을 때 공급사들이 실시간으로 지켜보면서, 두 메트로 회선이 펜실베이니아에서 같은 물리 경로를 지나고 그곳의 광케이블 절단이 영향을 줬다는 것이 드러났다. Basecamp 도 공급사들도 몰랐던 일이었다.
- 심각도
- –
- 영향 범위
- BC3: slow responses throughout, and chats and pings not working
- 영향 사용자
- –
- 지역
- –
- 감지까지
- –
- 복구까지
- –
증상
2020년 8월 28일 금요일 11:59AM CDT 에 PagerDuty, Nagios, Prometheus 에서 알림이 쏟아졌다. 모니터링에는 새 메트로 회선이 20~30초쯤 끊긴 것이 보였고, 네트워크가 돌아온 뒤에도 BC3 응답이 계속 느렸다.
이어서 채팅과 Pings 가 전혀 동작하지 않는 것이 보였다. 채팅 재연결이 네트워크에 과부하를 걸어 BC3 전체를 느리게 하고 있었다.
팀은 문제가 채팅에 있다고 보고 Cable 서비스를 재시작했지만 연결 문제는 풀리지 않았다. 로드 밸런서 계층에서 채팅을 끄자 BC3 의 다른 서비스는 안정됐다. Cable 을 다시 재시작해도 효과가 없었다.
상황이 진정되자 Redis DB 인스턴스 하나에 알림이 계속 떠 있는 것이 보였다. DB 가 죽은 것은 아니어서 처음에는 이 경고를 지나쳤다. 명령줄로 확인해도 응답이 왔다. 더 살펴보니 대기 서버에 복제 오류가 있었고, 레플리카가 재동기화 루프에 갇혀 있었다. 이 루프가 자원을 계속 빼앗아 주 노드를 느리게 했고, Redis 는 모니터링 검사에만 겨우 응답할 만큼 느려져 있었다.
사고 뒤 로그를 보니 이중으로 둔 메트로 회선 두 개가 모두 짧게 끊겼었다.
원인
- 촉발
- 2020년 8월 28일 11:59AM CDT 에 Ashburn 의 주 데이터센터와 Chicago 데이터센터를 잇는 이중 메트로 회선이 짧게 끊겼다. 모니터링에는 새 회선이 20~30초 끊긴 것만 보였지만, 로그에서는 두 회선이 모두 잠깐씩 끊긴 것이 드러났다.
감지
PagerDuty, Nagios, Prometheus 에서 알림이 쏟아졌다. Redis 문제는 상황이 진정된 뒤 Redis DB 인스턴스 하나에 계속 떠 있던 알림을 보고 찾았다.
조치
- 로드 밸런서 계층에서 채팅을 꺼 나머지 BC3 를 안정시켰다.
- 레플리카의 Redis 를 재시작했다.
후속 조치
- 알려진 Redis 문제의 문서화된 우회 방법대로 Redis 서버의 설정을 바꾼다.
- 두 메트로 회선이 펜실베이니아에서 같은 물리 경로를 지나는 문제를 없앨 구체적인 계획을 세운다.
- 장애 조치 시스템을 최대 부하 때 운영 환경에서 직접 검증한다.
- 사고 후속 조치를 할 시간을 명시적으로 비우고, 우선순위를 밝혀 다른 일을 뒤로 미룬다.
교훈
이중화를 계획하고 실제 시험을 늘려 왔지만 충분하지 않았고, 특히 최대 부하에서는 안전하다는 착각을 하고 있었다. 데이터센터 사이로 부하를 옮기거나 이중 회선 사이를 오가는 일은 문제없이 돼야 한다. 그렇지 않다면 팀 전체가 준비된 통제된 상황에서 그 사실을 알아야 한다. 장애에서 나온 후속 조치는 목록에 더하는 데서 그치지 말고 더 급하게 처리해야 한다.
출처
관련 사례
IL-0267싱가포르 캐시 거점 eqsin 의 전송 회선 두 개가 함께 끊겨 BGP 가 내려가고 eqsin 의 호스트에 닿을 수 없게 됐다Wikimedia Foundation · 2023같은 원인 · 공통 BGP 라우팅, 백본망
같은 원인 · 공통 BGP 라우팅, 백본망
IL-0408API 키 조회 캐시가 비워진 채 돌아와 OpenRouter API 가 두 번에 걸쳐 500 과 401 "User not found" 오류를 냈다OpenRouter · 2026같은 원인 · 공통 인메모리 캐시
같은 원인 · 공통 데이터베이스 복제
같은 원인 · 공통 BGP 라우팅
같은 원인 · 공통 BGP 라우팅
같은 원인 · 공통 인메모리 캐시
내 클러스터에도 있는지 확인하기
AI 도구와 스크립트용
- 이 사례의 JSON: https://incidentlib-api.benchlet.com/cases/IL-0255
- 가장 비슷한 사례들: https://incidentlib-api.benchlet.com/cases/IL-0255/similar
- MCP 서버(Streamable HTTP, 키 없음):
https://incidentlib-mcp.benchlet.com/mcp
API 는 키가 필요 없습니다. MCP 서버는 search_incidents, get_incident, list_incidents, get_topic, vocab 도구를 내놓습니다. 사용법은 API 와 MCP.