2010년 9월, 페이스북은 약 2시간 30분 동안 접속이 끊겼다. 소프트웨어 엔지니어링 담당 이사 로버트 존슨이 같은 날 올린 드문 공개 사후 분석에서 회사 엔지니어링 팀은 이를 사이트가 4년 넘게 겪은 최악의 장애라고 불렀다. 모든 방문자가 모든 페이지에서 오류를 만났고, 사이트가 복구될 때까지 이어졌다.

근본 원인은 구성 값을 건강하게 유지하도록 설계된 자동화 시스템이었다. 이 시스템은 캐시된 값을 영구 저장소와 비교하고, 무효라고 판단한 값을 교체했다. 그날 한 변경으로 인해 영구 저장소 자체에 잘못된 값이 남았다. 모든 클라이언트가 그 '무효' 값을 보고 복구를 시도했고, 복구란 데이터베이스 클러스터에 질의하는 것을 의미했기 때문에 클러스터에는 초당 수십만 건의 질의가 몰렸다.

오류 처리가 상황을 더 악화시켰다. 클라이언트의 질의가 실패하면, 실패를 '값이 여전히 무효'라고 해석하고 해당 캐시 키를 삭제했으며, 이는 또 다른 복구 질의를 만들어냈다. 원래의 잘못된 값이 수정된 뒤에도 루프는 스스로를 계속 먹여 살렸다. 유일한 탈출구는 데이터베이스 클러스터로 가는 모든 트래픽을 중단하는 것이었고, 이는 사이트를 완전히 끄고 데이터베이스가 회복되도록 한 뒤 사용자를 천천히 다시 받아들이는 것을 의미했다.

약 2.5시간 동안 전체 사이트 다운 — 페이스북 자체 엔지니어들은 이를 4년 넘게 이어진 최악의 장애라고 불렀다

검증기는 영구 저장소가 항상 올바르다고 가정했다. 저장소에 잘못된 값이 들어 있자 모든 클라이언트가 동일한 오염된 복구 지시를 받았다.

오류 처리가 '데이터베이스 과부하'와 '무효 값'을 혼동했기 때문에, 각 실패가 더 많은 부하를 만들어냈다. 즉 증폭하는 피드백 루프였다.

오류 시 캐시 키를 삭제한 것은 재시도 폭풍을 흡수할 수 있었던 유일한 계층을 제거한 것이었다.

클라이언트와 클러스터 사이에 회로 차단기가 없었기 때문에, 남은 유일한 수단은 사이트 전체를 종료하는 것이었다.

모든 오류를 '가서 고쳐라'로 처리하는 자가 복구 코드는 결함을 흡수하기는커녕 증폭시킨다. 클라이언트별 재시도를 제한하고, 피드백 루프를 억제하며, 전체 종료에 이르지 않는 복구 수단을 마련하라.

페이스북은 같은 날 자가 수정 구성 시스템을 껐고, 일시적 급증과 피드백 루프를 견디는 패턴을 중심으로 재설계하겠다고 밝혔다. 서비스는 그날 완전히 복구되었고, 당시 세계 최대 소셜 네트워크였던 이 회사는 기술적 세부 사항을 몇 시간 안에 공개했다. 이 사건은 작은 결함을 스스로 지속되는 폭풍으로 바꾸는 오류 처리의 교과서적 사례로 여전히 인용된다.

근거 확인하기

출처

  1. More Details on Today's Outage Facebook Engineering (Wayback Machine snapshot of the original note) · web.archive.org ·
  2. How Facebook fixed the site: they turned it off and on again. Literally The Guardian · theguardian.com ·
  3. Massive Facebook outage caused by improper error handling, not improper Facebook flirting as previously feared Engadget · engadget.com ·