IL-0172 Devsisters · 2021-02-19kubernetesaws
데브시스터즈는 쿠키런: 킹덤의 데이터베이스로 CockroachDB 를 쿠버네티스 위에 Helm 차트 하나로 배포해 운영했다. CockroachDB 에는 AZ 나 리전이 통째로 죽어도 데이터를 잃지 않도록 레플리카를 나눠 두는 Locality 기능이 있다. 다만 운영자가 토폴로지를 직접 설정해야 한다. 파드가 어느 노드와 AZ 에 배치될지는 차트를 작성할 때 알 수 없고 쿠버네티스 API 로도 얻을 수 없어서, 이를 설정하려면 구현이 지나치게 복잡해졌다. 2013년부터 AWS 를 쓰는 동안 AZ 장애가 한 번도 없었기 때문에 이 작업을 미뤘다. 대신 더 흔한 Instance Retirement 에 대비해 Replication Factor 를 7로 잡아, 노드 3대까지 동시에 내려가도 데이터를 잃지 않게 했다.
2021년 2월 19일 AWS 도쿄 리전 데이터센터의 냉각 시스템이 고장 났다. 22분 동안 노드 60대 중 6대가 죽었고, 하필 게임 서버가 아니라 DB 서버였다. 레플리카 7개 중 과반인 4개 이상이 죽은 6대에 몰려 있던 Range 가 정족수를 잃었다. 전체 25,000개 Range 가운데 Data Range 2개와 System Range 32개가 사라졌다.
Cockroach Labs 서포트 엔지니어에게 확인해 보니 System Range 는 사라져도 복구할 수 있었다. 그래서 유저 데이터가 들어 있는 Data Range 2개를 살리는 데 집중했다. 살아남은 54대에서 테이블 백업 기능으로 데이터를 꺼내려 했지만 깨진 Range 때문인지 잘 되지 않았다. 그래서 깨진 Range 를 뺀 데이터를 새 테이블로 옮겼다. 백업에서 데이터를 가져오는 방법도 함께 진행했지만 8시간이 지나도 끝날 기미가 없었다. 그러던 중 CockroachDB 소스 코드에서 debug unsafe-remove-dead-replicas 명령을 찾았다. Cockroach Labs 엔지니어와 줌으로 화면을 공유하며 이 명령을 실행해 Range 2개 중 하나를 살렸다. 남은 Range 하나는 1차 장애 때처럼 스토리지 레이어에서 직접 복원했다. 이 Range 에 걸린 유저는 적으면 500명, 많으면 2천 명으로 추정됐고, 결과적으로 유저 데이터를 잃지 않고 모두 복구했다.
2021년 2월 19일, DB 노드 한 대가 내려갔다는 에러 알람이 슬랙에 올라왔다. CockroachDB 는 노드 일부가 죽어도 견디도록 만든 분산 데이터베이스라서 데브옵스 엔지니어들은 처음에는 크게 걱정하지 않았다.
그런데 3분 뒤에 2대, 6분 뒤에 또 2대, 20분 뒤에 다시 2대가 내려갔다는 알람이 Ops 채널에 이어졌다. 22분 만에 전체 60대 가운데 6대가 작동하지 않게 됐다.
애플리케이션의 DB 호출 로직이나 DB 설계에 문제가 없는데 노드가 이렇게 한꺼번에 죽는다면 원인은 다른 곳에 있다고 판단했다. 커뮤니티 사이트와 여러 경로를 살펴보니 다른 AWS 고객사들도 문제를 겪고 있었다. 확인해 보니 AWS 도쿄 리전 데이터센터의 냉각 시스템이 고장 나 서버가 과열돼 있었다.
죽은 6대는 Host Status Failure 상태였다. 안전 마진으로 잡아 둔 3대를 넘었기 때문에 전체 25,000개 Range 가운데 Data Range 2개와 System Range 32개가 사라졌다. 게임은 긴급 점검에 들어갔다.
원인 ? 클라우드 제공자 장애
회식 중에 DB 노드 한 대가 내려갔다는 에러 알람이 슬랙에 올라왔고, 이어서 다른 노드들의 장애 알람이 Ops 채널에 연달아 들어왔다.
쿠키런: 킹덤 정도 규모의 게임에서 멀티 AZ 전략은 선택이 아니라 필수다. 분산 DB 라도 레플리카가 어느 AZ 에 놓이는지 정하지 않으면, AZ 하나가 죽을 때 동시에 잃는 노드 수가 안전 마진을 넘을 수 있다. 차트를 깔끔하게 만드는 것보다 반복적이더라도 확실하게 토폴로지를 설정하는 쪽이 낫다. 클라우드 업체를 믿기보다 스스로 할 수 있는 최대한의 대비를 해 두어야 한다.
같은 원인 · 공통 애플리케이션 데이터베이스
같은 원인 · 공통 애플리케이션 데이터베이스
같은 원인 · 공통 애플리케이션 데이터베이스