2019년 10월부터 유지

사후 분석: 로그인 실패 26분, 2026년 1월 19일

세션 저장소 변경을 구성으로 분류한 결과 모든 고객이 패널과 API에서 26분 동안 잠겼습니다. 실행 중인 인스턴스는 영향을 받지 않았습니다.

요약

2026년 1월 19일 14:02~14:28 UTC 사이, 패널에 로그인하거나 API에 인증을 시도한 모든 시도의 약 3분의 2가 실패했습니다. 기존 세션도 무작위로 무효화되었습니다. 실행 중인 인스턴스, 해당 네트워킹 및 트래픽은 그 기간 내내 영향을 받지 않았습니다. 프로비저닝은 26분 동안 일시 중지되었다가 다시 진행되었습니다. 주문 손실은 없었습니다.

타임라인

모든 시간은 2026년 1월 19일 UTC 기준입니다.

시간이벤트
14:02세션 토큰 스키마 변경이 컨트롤 플레인에 적용되었습니다. 구성으로 표시되어 6개 패널 노드 모두에 동시에 배포되었습니다.
14:03로그인 오류율이 거의 0에서 61%로 상승했습니다. 자동 경보는 2분 창이 있어 아직 발동하지 않습니다.
14:06경보가 발동했습니다. 당직 엔지니어에게 페이지가 전송되었습니다.
14:08첫 번째 대응자가 온라인 상태가 되었습니다. 코드 변경 로그에는 배포가 없는데 오류율을 보고 데이터베이스부터 살펴보기 시작합니다.
14:14두 번째 엔지니어가 합류하여 코드 로그가 아닌 구성 변경 로그를 확인하고 14:02 항목을 찾습니다.
14:16원인 파악: 두 노드가 이전 리더로 토큰을 검증하고 있습니다.
14:19롤백이 시작됩니다.
14:24토큰이 6개 노드 모두에서 올바르게 발급 및 검증됩니다. 오류율이 0으로 떨어집니다.
14:28대기 중인 프로비저닝 작업이 처리됩니다. 복구가 완료되었습니다.
15:10상태 페이지가 업데이트되었습니다. 42분 늦었으며, 이는 그 자체로 실패이며 아래에서 다룹니다.

근본 원인

세션 토큰에 필드가 추가되었습니다. 작성자는 새 형식을 즉시 내보냈지만, 6개 패널 노드 중 2개 노드의 리더가 재시작되지 않아 새 필드가 포함된 모든 것을 거부했습니다. 요청은 6개 노드에 분산되므로 새 노드에서 발급된 세션은 특정 요청에서 이전 노드에 의해 검증될 확률이 약 3분의 1이었습니다. 결과가 간헐적으로 보였기 때문에 처음 6분간의 진단이 배포 로그가 아닌 데이터베이스에 집중되었습니다.

더 깊은 원인은 2023년에 작성한 규칙입니다. 애플리케이션 코드가 아닌 스키마 파일을 변경하는 것은 구성으로 분류되었고, 구성은 '단지 값일 뿐'이라는 이유로 카나리아 단계를 건너뛰었습니다. 이 규칙은 유일한 스키마 파일이 기능 플래그였을 때는 합리적이었습니다. 스키마 파일의 정의가 확장됨에 따라 아무도 이 규칙을 재검토하지 않았고, 이 변경은 조용히 잘못된 규칙에 따라 올바르게 분류되었습니다.

이는 적용한 엔지니어의 실수가 아닙니다. 분류는 작성된 대로 정확히 따랐습니다.

영향 범위

  • 패널 로그인: 26분 동안 61% 실패율.
  • API 토큰: 동일한 실패율, 동일한 시간대. 멱등성 키 덕분에 재시도된 생성이 중복되지 않았습니다.
  • 실행 중인 인스턴스: 영향 없음. 패킷 손실, 재부팅, 스토리지 영향 없음.
  • 프로비저닝: 일시 중지되었으며 실패하지 않았습니다. 이 기간 동안 4건의 주문이 처리되었고 14:28까지 모두 완료되었습니다.

변경 사항

  1. 카나리아 단계는 이제 무조건 적용됩니다. 어떤 분류든 배포하는 것은 다른 곳에 가기 전에 합성 트래픽으로 5분 동안 한 노드에 먼저 적용됩니다. 1월 21일 완료.
  2. 리더는 30일 동안 이전 형식을 허용합니다. 토큰 검증은 이제 명시적으로 버전이 지정되고 오버랩 기간이 있어 부분적으로 배포된 변경의 영향이 전혀 없게 됩니다. 1월 23일 완료.
  3. 합성 로그인이 15초마다 실행됩니다. 네트워크 외부, 3개 리전에서 실행되며, 2분 평균 창 후가 아닌 두 번째 연속 실패 시 페이지를 전송합니다. 1월 22일 완료.
  4. 합성 로그인이 두 번 실패하면 상태 페이지가 자동으로 게시됩니다. 사람이 문장을 작성할 때까지 기다리지 않습니다. 사람이 작성한 문장이 뒤따릅니다. 1월 26일 완료.

변경하지 않은 사항과 이유

패널 트래픽에 대해 클라이언트 IP 또는 요청 본문을 계속 기록하지 않습니다. 이를 기록했다면 노드 간 3분의 1 분포를 즉시 보여주고 아마 9분을 절약했을 것입니다. 9분은 모든 고객이 어디에서 로그인하는지 영구적으로 기록하는 것보다 가치가 없습니다. 로깅 페이지의 보존 테이블은 변경되지 않았습니다.

세션을 공유 사이트 간 저장소로 이동하지 않았습니다. 모든 사이트에 걸친 단일 세션 저장소는 리더가 하나이므로 혼합 리더 문제를 완전히 피했을 것입니다. 또한 우리가 6년 동안 구축하지 않기로 한, 누가 무엇에 연결되어 있는지에 대한 중앙 집중식이고 항상 핫한 기록을 정확히 만들었을 것입니다.

상태 페이지 외부에 중단 공지 채널을 추가하지 않았습니다. 여러 사람이 소셜 미디어를 제안했습니다. 상태 페이지는 우리가 정확성을 유지하기 위해 운영할 수 있는 유일한 것이며, 두 번째 표면을 추가하면 두 번째 표면이 오래될 수 있습니다.

크레딧

SLA는 인스턴스 가용성을 포함합니다. 인스턴스는 26분 동안 모두 사용 가능했으므로 계약상 누구에게도 보상할 의무가 없었습니다. 이 기간 동안 인증 실패가 있었던 모든 계정에 1일 크레딧을 적용했으며, 이는 약 3,100유로에 해당합니다. 서버에 연결할 수 없는 사람들과 그 구분을 논쟁하는 것은 모두의 오후를 낭비하는 것이기 때문입니다.

준비 완료

도시를 고르고, 크기를 고르고, 코인으로 결제하세요.

신원 확인 양식도, 승인을 기다리는 담당자도, 검증을 위한 전화도 없습니다. 청구서가 결제되면 자격 증명이 받은 편지함에 도착합니다.