2021년 10월 4일 15시 40분 UTC 무렵, 페이스북은 인터넷의 나머지에게 자기가 어디 사는지 잊으라고 말했다 — 그리고 거의 여섯 시간 동안 그 주소를 다시 알려주지 못했다.

해커는 없었다. 기록적인 DDoS도, 제로데이도, 랜섬웨어 협박문도 없었다. 페이스북·인스타그램·왓츠앱·메신저·오큘러스가 수십억 사용자에게서 사라진 것은, 정기 점검 중 실행한 명령어 하나 때문이었고 — 그리고 여기서 잠깐 곱씹을 대목인데 — 안전장치가 설계된 그대로 정확히 작동했기 때문이었다. 여기서 흥미로운 실패는 누군가 설정을 잘못 쳤다는 게 아니다. 세계 최고 수준의 네트워크 엔지니어를 보유한 회사가, 스스로를 끊어버릴 수 있고 그다음엔 물리적으로 다시 이을 수 없는 시스템을 만들었다는 것 — 돌아가는 모든 길이 하필 다운된 바로 그것을 통과했기 때문이다.

명령어 하나, 백본 전체

페이스북의 전 세계 데이터센터는 사설 백본으로 엮여 있다 — 시설 사이로 트래픽을 나르는 글로벌 네트워크로, 한 지역에서 올린 사진과 다른 지역에서 그걸 보는 친구가 중간 어딘가에서 만나게 하는 것이다. 페이스북 자체 포스트모템에 따르면, 정기 작업 중 한 엔지니어가 그 백본의 가용 용량을 점검하려는 명령을 내렸다. 명령은 대신 백본 네트워크의 모든 연결을 끊어, 페이스북 데이터센터를 전 세계적으로 서로에게서 그리고 인터넷에서 분리했다.

가드레일이 있었어야 했다. 페이스북은 바로 이런 명령을 잡아 실행 전에 막는 것이 유일한 임무인 감사 도구를 운영한다. 그 도구에 버그가 있었다. 명령을 표시하지 않았고, 그래서 아무것도 막지 못했으며, 한 동작에 백본이 침묵했다.

이것만으로도 나쁜 오후였을 것이다. 이걸 전설로 만든 건, 방 안의 누구도 예상 못 한 2차 효과였다. 그건 공개 인터넷 바깥에서 벌어졌기 때문이다.

DNS 서버가 스스로를 철회했다 — 의도적으로

백본 장애를 소멸로 바꾼 메커니즘이 여기 있고, 이건 진짜로 우아하다. 그게 이걸 끔찍하게 만든다.

페이스북의 권위 DNS 서버 — “facebook.com의 IP가 뭐냐”에 답하는 기계들 — 는 데이터센터에 살지 않는다. 네트워크 가장자리에 더 가까이 앉아, BGP로 자신의 존재를 인터넷의 나머지에게 광고한다. BGP(경계 경로 프로토콜)는 지구상 모든 네트워크가 다른 모든 네트워크에게 자기가 닿을 수 있는 IP 대역을 알려주는 라우팅 체계다.

이 DNS 서버들은 헬스체크를 돈다. 그중 하나가 페이스북 데이터센터 — 진짜 진실의 원천이 사는 곳 — 로의 연결을 잃으면, 자기에게 뭔가 문제가 생겼다고 결론짓고 책임 있는 행동을 한다: BGP 경로 광고를 멈춘다. 논리는 타당하다. 모선에 닿지 못하는 DNS 서버가 계속 자신 있게 질문에 답해서는 안 된다; 뒷받침 못 할 답을 나눠주느니 스스로 로테이션에서 빠지는 게 낫다.

그런데 이번엔 모든 DNS 서버가 동시에 데이터센터로의 연결을 잃었다. 그들을 잇던 백본이 방금 증발했기 때문이다. 그래서 하나하나가, 독립적으로 그리고 올바르게, 철회를 결정했다. 바깥에서 지켜보던 클라우드플레어는 15시 40분 UTC 무렵 BGP 경로 변경이 정점에 이르는 것을 봤고, 15시 58분에는 페이스북이 네임서버를 담은 대역의 경로 광고를 아예 멈춘 상태였다. 몇 분 사이 페이스북 DNS는 오류를 반환한 게 아니다. 존재하기를 멈췄다. 물어볼 서버가 없었다. 서버들이 인터넷에게 자기들로 라우팅하지 말라고 말했으니까.

클라우드플레어의 리졸버 1.1.1.1은 15시 50분 UTC 무렵 이미 facebook.com 조회에 실패하고 있었고, 다른 곳의 캐시된 답도 만료되면서 그 이름은 어디서도 해석되지 않게 됐다. 글로벌 DNS가 아는 한, 페이스북은 애초에 주소를 가진 적이 없었다.

인터넷이 알아챘다, 요란하게

수십억 요청을 처리하는 도메인이 갑자기 해석을 멈추면, 클라이언트들은 어깨를 으쓱하고 넘어가지 않는다. 앱을 열어둔 모든 폰, 모든 브라우저 탭, “페이스북으로 로그인” 버튼을 단 모든 서비스가 재시도를 시작한다 — 그리고 각 재시도는 세계의 재귀 리졸버로 쏘아지는 새 DNS 쿼리다. 답을 못 받은 리졸버도 재시도한다. 클라우드플레어는 페이스북 소프트웨어의 설치 기반 전체가 어두워진 이름을 두드리면서 1.1.1.1 리졸버가 평소의 약 30배 질의를 처리했다고 밝혔다.

요란한 교훈 안에 조용한 교훈이 끼어 있다: 한 회사의 장애가 모두의 DNS 부하 급증이 됐다. “답 없음” 상태에서 DNS의 실패 방식이 “더 세게 다시 물어봐”이기 때문이다. 페이스북의 소멸은 자기가 소유하지도 않은 인프라에 세금을 물렸다.

잠긴 방

이제 엔지니어들이 고쳐야 했다. 그리고 함정을 발견했다.

백본을 진단하고 수리할 때 평소 쓰던 도구 — 대시보드, 원격 접속, 내부 커뮤니케이션 — 는 전부 다운된 바로 그 네트워크 위에서 돌았고, 더는 해석되지 않는 바로 그 DNS에 의존했다. 복구를 조율하려던 사람들은 서로에게도 안정적으로 닿지 못했다고 전해진다. 내부 툴링이 공개 사이트만큼이나 사라졌기 때문이다. 원격으로 들어갈 수 없는 이유를 고치려고 그 네트워크에 원격으로 들어갈 수는 없다.

그래서 물리적 접근으로 물러섰고, 함정엔 한 겹이 더 있었다. 페이스북 포스트모템에 따르면 데이터센터는 일부러 들어가기 어렵게, 하드웨어는 물리적으로 접근해도 고치기 어렵게 설계돼 있어서, 사람을 현장에 들여보내 작업하게 하는 보안 접근 절차를 가동하는 데만 추가 시간이 걸렸다. 그날 언론 보도는 일부 직원의 출입 배지가 먹통이 됐다고도 전했다. 공격자를 라우터에서 떼어놓으려 만든 보안이 수리팀까지 떼어놓은 것이다.

결국의 해결책은, 페이스북 규모로 돌아가는 회사치고는 우습도록 로우테크였다: 엔지니어들이 데이터센터에 직접 들어가 손으로 디버깅하고 시스템을 재시작했다. 평소 그 일을 하던 네트워크가 바로 사라진 그것이었으니까. 그리고 천천히 되살려야 했다 — 모든 걸 한 번에 켜면 전력 소모와 트래픽이 급증해 전체가 다시 넘어질 위험이 있었다. 클라우드플레어는 21시 UTC에 페이스북의 BGP 활동이 재개되는 것을 봤고, 21시 20분경 1.1.1.1에서 facebook.com이 다시 해석됐으며, 21시 28분에는 페이스북이 DNS가 작동하는 상태로 인터넷에 돌아왔다. 앱들이 완전히 회복되기까지는 더 걸렸다.

이 이야기가 진짜로 말하는 것

이걸 “인적 오류”로 분류하고 넘어가고 싶어진다. 그건 틀린 교훈이다. 더 나은 규율이 당신을 구했으리라 믿게 만들기 때문이다. 물론 명령은 실수였다. 하지만 실수는 상수다; 회복력 있는 시스템의 임무는 실수에서 살아남는 것이다. 각각 개별적으로는 합리적인 두 설계 결정이, 실수를 여섯 시간짜리 소멸로 바꿨다.

첫째는 DNS 자기 철회다. 이건 좋은 안전장치다 — 검증 못 할 답을 내주지 말 것 — 그리고 신중한 엔지니어라면 누구나 추가할 법한 헬스체크다. 동시에 그건 “백본이 다운됐다”를 “우리는 인터넷에 더는 존재하지 않는다”로 변환한 증폭기가 됐다. 같은 근원 조건에서 전부 발동하는 안전장치들은 합쳐서 더 많은 안전이 되지 않는다; 합쳐서 사방에서 동시에 터지는 하나의 상관된 실패가 된다.

둘째는, 어딘가에 문신으로 새길 만한 것인데, 페이스북의 복구 경로가 실은 out-of-band가 아니었다는 것이다. out-of-band 채널이란 복구하려는 시스템과 아무것도 공유하지 않는 채널이다 — 네트워크도, DNS도, 인증도, 문 잠금장치도. 페이스북 것은 공유했다. 모니터링, 커뮤니케이션, 원격 접속, 그리고 보도대로라면 출입 배지 일부까지, 스택 어딘가에서, 자기가 독립적이어야 할 바로 그 인프라에 기대고 있었다. 그것이 무너지자 사다리까지 함께 가져갔다.

중요한 무언가를 돌리는 모든 조직은 이 그래프의 자기 버전을 갖고 있고, 그걸 바닥까지 실제로 추적해 본 곳은 거의 없다. 불편한 질문을 던져보라: 지금 당장 주 네트워크가 사라진다면, 고칠 경로가 정말로 분리돼 있는가 — 아니면 복구 계획이 조용히, 당신이 복구하려는 그것이 이미 작동 중이라고 가정하고 있는가? 페이스북은 그 답을, 월요일 오후, 모두가 보는 앞에서, 어렵게 알아냈다. 나머지 우리는 그걸 공짜로 배울 수 있었다.