IL-0276 Parse.ly · 2016-06-09database
Chef 가 ZooKeeper 세 노드 가운데 두 대를 동시에 재시작해 쿼럼이 깨지면서 Parse.ly 의 실시간 데이터 전달이 약 3시간 멈췄다
Parse.ly 는 200대가 넘는 운영 서버를 Chef 로 관리한다. Chef 는 소프트웨어 버전을 올리고, 클러스터 전체의 설정을 바꾸고, 설정이 바뀌면 서비스를 재시작한다. 재시작이 한꺼번에 몰리지 않도록 장비마다 Chef 실행 시각을 흩어 두지만, 노드가 수백 대가 되면 두 실행이 겹칠 가능성이 실제로 생긴다. Parse.ly 의 ZooKeeper 클러스터 하나는 실시간 데이터 전달에 관련된 작은 설정만 맡고, 여러 데이터센터에 걸친 세 노드로 이루어진다. 한 노드가 꺼지면 나머지 두 노드가 쿼럼을 이뤄 요청을 처리하지만, 두 노드 이상이 꺼지면 쿼럼이 없어 요청을 거부한다.
6월 9일 11:30am ET 에 정기 Chef 실행이 이 클러스터의 두 노드를 정확히 같은 시각에 재시작해 쿼럼이 깨졌고, 이 클러스터에 의존하는 서비스들이 한동안 복구할 수 없게 망가졌다. 대시보드로 가는 데이터 전달이 멈췄다. 팀은 워룸을 열고 Twitter 와 대시보드 알림으로 고객에게 알렸다. 클러스터 장비 재시작은 효과가 없는 것 같았다. 1pm 무렵 팀은 근본 원인을 몰랐지만 콜드 스타트로 관련 없는 변수를 없애기로 했다. 실시간 시스템에서 몇 시간치 데이터를 비우고, 클러스터를 내렸다가 처음부터 다시 올리는 방법이다. 2pm 에 데이터 파이프라인이 다시 돌기 시작했고 2:30pm 에 실시간 기능이 복구됐다. 근본 원인은 그 뒤 몇 시간과 며칠에 걸쳐 후보 셋을 지워 나가며 모니터링 데이터와 시스템 로그로 확인했다. 잃은 데이터는 없었고, 그 3시간치 데이터는 이력 재구축으로 늦게 대시보드에 반영됐다.
- 심각도
- –
- 영향 범위
- Parse.ly real-time data delivery to the dashboard stopped for about 3 hours; the data from that window was delivered late and none was lost
- 영향 사용자
- Parse.ly customers
- 지역
- –
- 감지까지
- –
- 복구까지
- 3h
증상
2016년 6월 9일 목요일 11:30am ET 에 대시보드로 가는 데이터 전달이 갑자기 멈췄다. 데이터 전달 모니터 말고는 어떤 시스템도 장애를 알리지 않았다.
망가진 하드웨어나 장비가 없어서 처음에는 원인이 분명하지 않았다.
엔지니어 일부는 클러스터 장비를 재시작하는 것처럼 뻔한 조치를 해 봤지만 효과가 없는 것 같았다. 다른 엔지니어들은 시스템 로그와 모니터를 살펴 근본 원인을 찾았다.
나중에 모니터링 그래프를 보니 Chef 실행 이벤트와 같은 시점에 실시간 데이터 흐름이 갑자기 0 으로 떨어져 있었다.
증상 서비스 중단
원인
원인 배포 결함
- 촉발
- 2016년 6월 9일 정기적으로 도는 Chef 가 설정 변경에 따라 서비스를 재시작하면서, 세 노드로 된 ZooKeeper 클러스터의 두 노드를 정확히 같은 시각에 재시작했다.
감지
데이터 전달 모니터가 대시보드로 가는 데이터 전달이 멈춘 것을 알렸다. 다른 시스템은 장애를 알리지 않았다.
조치
- 실시간 시스템에서 몇 시간치 데이터를 비우고, 클러스터를 내렸다가 처음부터 다시 올리는 콜드 스타트를 했다.
- 멈춘 3시간치 데이터를 이력 재구축 과정으로 대시보드에 다시 넣었다.
후속 조치
- 운영 환경의 설정 변경과 노드 재시작을 분리한다.
- 시스템과 절차에 빠르게 복구할 대안을 늘 준비해 둔다.
교훈
Parse.ly 는 자동 서비스 재시작을 다시 생각하게 됐다. Chef 가 설정 변경은 자동으로 내보내되 서비스 재시작은 엔지니어가 손으로 하거나 승인하도록 대기시켜 두었다면, 이 작업의 위험이 바로 드러났을 것이다. ZooKeeper 가 노드 하나의 장애를 견디도록 설계됐어도 여러 노드가 함께 죽는 일이 불가능하다고 여기면 안 된다. 큰 분산 시스템에서는 무엇이든 일어날 수 있으므로 시스템과 절차에 빠르게 복구할 대안을 늘 준비해 둬야 한다.
출처
- https://www.parse.ly/postmortem-2016/ · blog · 보관본
관련 사례
–
내 클러스터에도 있는지 확인하기
AI 도구와 스크립트용
- 이 사례의 JSON: https://incidentlib-api.benchlet.com/cases/IL-0276
- 가장 비슷한 사례들: https://incidentlib-api.benchlet.com/cases/IL-0276/similar
- MCP 서버(Streamable HTTP, 키 없음):
https://incidentlib-mcp.benchlet.com/mcp
API 는 키가 필요 없습니다. MCP 서버는 search_incidents, get_incident, list_incidents, get_topic, vocab 도구를 내놓습니다. 사용법은 API 와 MCP.