세상을 멈춘 아마존 장애, 무슨 일 있었나?
- 아마존 스스로도 핵심 인프라로 사용하던 다이나모DB
- 그 다이나모DB의 DNS 시스템에서 충돌이 발생
- 충돌 발생하면서 DNS 기록들이 자동으로 삭제되고
이번 주 아마존 일부 서비스가 마비되면서 인터넷의 광범위한 영역에서 장애가 발생하는 사건이 있었다. 왜 그런 일이 일어난 걸까? 아마존이 자체 조사 후 발표한 내용에 의하면 “다이나모디비(DynamoDB)의 DNS 관리 시스템에 있던 경합 조건 관련 현상으로부터 촉발된 연쇄적 장애 때문”이라고 한다. 이게 도대체 무슨 말인지 살펴보자.
구조적 문제
먼저 다이나모DB는 AWS가 제공하는 완전관리형 NoSQL 데이터베이스 서비스다. NoSQL이라는 말에서 볼 수 있듯, 다이나모DB는 전통적 방식의 MySQL 혹은 PostgreSQL 데이터베이스와 다르다. MySQL 등은 ‘관계형 데이터베이스’라고 하며, 테이블과 행, 열로 구성돼 있다. NoSQL은 키값과 문서 형태로 데이터를 저장한다. 관계형 데이터베이스보다 NoSQL 방식이 유연하며, 대규모 트래픽을 빠르게 처리하는 데 유리하다. 다이나모DB도 이런 특성을 가지고 있어 ‘빠르고 확장성 좋은 클라우드 저장소’로 홍보된다.
‘완전관리형’이라는 건 AWS가 서버, 스토리지, 백업, 확장 등을 모두 자동으로 처리한다는 의미다. 아마존의 고객사 측에서 인프라 걱정과 관리를 전혀 할 필요가 없다. 그러므로 다이나모DB는 사용자 입장에서 매우 편리한데다가 유연하며 확장하기도 용이한, 만능 데이터베이스라고 할 수 있다. 그렇게 믿고 있던 것에서 이와 같은 사고가 발생한 거라 아이러니 하다.
흥미로운 건 이 다이나모DB가 ‘아마존에서 제공하는 여러 서비스 중 하나’에 그치지 않는다는 것이다. AWS 스스로도 다이나모DB를 핵심 인프라로서 활용하고 있었다. 그러니 다이나모DB에서 문제가 생기면 AWS를 통해 다이나모DB를 유료로 사용하던 사용자들만 문제를 겪는 게 아니었다. AWS 스스로도 흔들릴 수밖에 없던 구조였다. 일개 서비스의 장애가, 광범위한 마비 사태로 번진 요인 중 하나가 바로 이것이었다.
경합 조건 발생
이 중요한 다이나모DB에서 정확히 어떤 문제가 발생한 것일까? 아마존은 “DNS 관리 시스템에서 경합 조건이 발생했다”고 설명했다. 경합 조건(race condition)은 컴퓨터 시스템 내에서 두 개 이상의 프로세스가 동시에 같은 자원에 접근할 때 생기는 현상이다. 물론 같은 자원을 여러 프로세스가 동시에 접근하는 건 현대 컴퓨터에서는 늘 있는 일이다. 그럴 때 순서대로 접근 권한이 주어지면 아무 이상이 일어나지 않는다. 이 순서가 꼬이면서 발생하는 게 ‘경합 조건’이다.
DNS 관리 시스템은 일종의 ‘전화번호부’와 같은 것이다. 여기에 인터넷의 여러 ‘전화번호’ 즉 IP 주소와 도메인 이름 정보가 저장된다. AWS의 경우 이 DNS 관리 시스템은 크게 두 가지로 구성돼 있다고 아마존 측은 발표했다. 바로 DNS 플래너(DNS Planner)와 DNS 인액터(DNS Enactor)다. 전자는 로드밸런서 상태를 관찰해 DNS 플랜이라는 것을 생성하고, 후자는 이 DNS 플랜을 실제 적용한다.
DNS 플랜이란, 특정 서비스가 어떤 IP 주소 세트를 사용할지 미리 정의해 놓은 계획표다. 예를 들어 thetechedge.ai라는 도메인이 어떤 IP 주소에 실제 연결되어야 할지를 결정한 내용을 담고 있는 것으로, DNS 인액터는 바로 이 내용을 바탕으로 DNS 이름과 IP 주소를 매칭시킨다. 그러므로 이 DNS 플랜은 일종의 설정표라고도 할 수 있다.
그러므로 DNS 플래너와 DNS 인액터는 순서대로 작동해야 한다. 플래너가 플랜을 만들고, 인액터가 플랜을 실행한다는 게 바로 그 순서다. 경합 조건은 ‘순서가 꼬일 때’ 나타나는 현상이라 했다. 그러면 DNS 관리 시스템에서 경합 조건이 발생했다는 아마존의 발표가 슬슬 이해되기 시작한다.
정확히 무슨 일 일어났나
현재까지 알려진 바에 따르면 다이나모DB의 DNS 관리 시스템에서 일어난 일은 순서대로 다음과 같다.
1) DNS 플래너가 새로운 DNS 플랜을 평소처럼 생성하고 있었다.
2) DNS 인액터가 이 플랜들을 여느 때처럼 실행하려 했다.
3) 하지만 2)번이 무슨 이유에서인지 지연됐다.
4) 2)번이 지연된 상태에서 또 다른 플랜을 실행하려는 인액터의 시도가 발생했다.
5) 그러면서 2)번과 4)번의 인액터들이 동시에 같은 DNS 처리를 시작했다.
6) 작업이 꼬이면서 DNS 엔드포인트에서 충돌이 일어나 IP 주소가 삭제됐다.
7) IP 주소가 비어있으니 연결이 되지 않았다.
8) 이 현상은 AWS 내부에서도 일어났고(다이나모DB를 아마존도 핵심 인프라로서 사용하고 있었으므로)
9) 곧 DNS 조회 실패 이후 연결 불가 상태가 광범위한 인터넷 영역에서 보고됐다.
이 상황을 여행에 비유하자면, 오늘 비행 스케줄을 짜는 사람(DNS 플래너) A가, 그 스케줄을 실제 항공사 시스템에 반영하는 사람(즉, DNS 인액터) B가 오늘따라 늑장을 부리는 걸 모른 채, 내일 스케줄을 다음 반영 담당자 C에게 건내준 것과 같다. C 역시 B가 일 처리를 늦게 한다는 걸 모르고 있다. 새 스케줄을 등록시키려면 이전 스케줄을 지워야 하는데, 하필이면 A가 막 적용 완료한 오늘 스케줄까지도 같이 지워버리면서 항공사 전체가 따라야 할 오늘 스케줄이 사라진 것이다.
이를 파악한 아마존은 전 세계적으로 DNS 플래너와 DNS 인액터라는 자동화 시스템을 일시적으로 비활성화시켰다. 그리고 지워진 DNS 레코드를 수동으로 복구했다. 그 후 다이나모DB를 재시작하면서 하위 서비스들을 재가동했다. 그렇게 함으로써 급한 불을 최대한 빨리 껐다.
장기적으로 아마존은 DNS 플래너와 DNS 인액터의 동기화 알고리즘을 강화해 두 플랜이 동시에 적용되지 않도록 할 예정이다. 또한 DNS 레코드가 빈 상태로 저장되지 않도록 설정을 변경시켰다고 한다. 예외적인 상태가 발생했을 때 자동 롤백이 되도록 하는 기능 역시 추가했다.
by 문가용 기자(anotherphase@naver.com)
Related Materials
- What the Huge AWS Outage Reveals About the Internet, Wired, 2024년
- AWS Outage Analysis: June 13, 2023, ThousandEyes, 2023년
- What to Know About the Amazon Web Services Outage, PBS, 2024년
- Amazon Identifies the Issue that Broke Much of the Internet, TechCrunch, 2024년
