IL-0546 Buildkite · 2023-07-22database
Buildkite 에 새로 연결한 에이전트가 잡을 받지 못했다
2023년 7월 22일 10:06:20 UTC 에 Buildkite 의 연결된 에이전트를 가리키는 내부 기본 키가 PostgreSQL `integer` 타입의 최댓값을 넘었다. `integer` 는 부호 있는 32비트 정수이고 최댓값은 2,147,483,647 이다. 기본 키 자체는 부호 있는 64비트 정수인 `bigint` 로 저장돼 여유가 충분했다. 하지만 빌드 잡과 에이전트를 잇는 외래 키는 더 작은 `integer` 로 저장돼 있었고, 그 시각 이후에 연결한 에이전트에는 잡을 배정할 수 없었다.
자동 모니터링이 4분 안에 알렸다. 팀은 외래 키를 bigint 로 바꾸는 마이그레이션을 시작하면서 더 빠른 해결책도 찾았다. SQL 표준과 PostgreSQL 은 부호 없는 정수 타입을 지원하지 않는다. 하지만 PostgreSQL 시퀀스는 음수 시작값과 음수 증가값을 지원하고 Rails/ActiveRecord 도 이를 받아들여서, 부호 있는 32비트 정수의 음수 쪽 절반을 임시로 쓸 수 있었다. 이 ID 는 내부에서만 쓰고 외부 참조에는 별도의 UUID 를 쓰므로, 외부 시스템이 음수 ID 를 거부할 위험은 없었다.
비운영 환경에서 해결책을 확인하고 테이블 파티셔닝을 다시 설정한 뒤, 11:40 UTC 에 ID 시퀀스를 -1 에서 시작해 -1 씩 증가하도록 바꿨다. 그 뒤에 연결한 에이전트는 제대로 동작했다. 12:08 UTC 까지 10:06 부터 11:40 사이에 연결한 에이전트를 모두 끊어 새 ID 로 다시 연결하게 했다.
- 심각도
- –
- 영향 범위
- Agents connected between 10:06:20 and 11:40:09 UTC could not pick up new jobs; the status page lists Agent API and Job Queue
- 영향 사용자
- –
- 지역
- –
- 감지까지
- 4m
- 복구까지
- 2h 2m
증상
2023년 7월 22일 10:06:20 UTC 이후에 연결한 Buildkite 에이전트가 새 잡을 받지 못했다. 그 전에 연결한 에이전트는 계속 동작했다.
연결된 에이전트의 내부 기본 키가 PostgreSQL `integer` 타입의 최댓값인 2³¹-1, 곧 2,147,483,647 을 넘었다. 기본 키는 `bigint` 였지만 빌드 잡과 에이전트를 잇는 외래 키는 `integer` 였고, 10:06:20 UTC 이후에 만들어진 에이전트 ID 는 32비트로 참조할 수 없었다.
자동 모니터링이 4분 안에 알림을 보냈다. 상태 페이지에는 10:42 UTC 에 새로 연결한 에이전트가 잡을 실행하지 못한다는 글이 올라왔고, 10:47 UTC 에 일부 테이블이 32비트 외래 키 열로 64비트 에이전트 ID 를 참조하려 해서 생긴 문제라는 설명이 올라왔다. 영향을 받은 구성 요소는 Agent API 와 Job Queue 였다.
Buildkite 가 11:40 UTC 에 문제를 고친 뒤에도 10:06:20 UTC 부터 11:44 UTC 사이에 연결한 에이전트는 계속 잡을 받지 못했다. 이 에이전트들은 연결을 끊어 새 ID 로 다시 연결하게 해야 했다.
증상 정수 ID 한계 초과
원인
- 촉발
- 2023년 7월 22일 10:06:20 UTC 에 연결된 에이전트의 내부 기본 키가 PostgreSQL `integer` 타입의 최댓값을 넘었다.
감지
자동 모니터링이 4분 안에 알림을 보냈다.
조치
- 비운영 환경에서 확인하고 테이블 파티셔닝을 다시 설정한 뒤, 11:40 UTC 에 에이전트 ID 시퀀스가 -1 에서 시작해 -1 씩 증가하도록 바꿨다. 그 뒤에 연결한 에이전트는 제대로 동작했다.
- 12:08 UTC 까지 10:06 부터 11:40 사이에 연결한 에이전트를 모두 끊어 새 ID 로 다시 연결하게 했다.
후속 조치
- 식별자가 최댓값의 50% 를 넘으면 알리는 모니터링과 알림을 만들었다.
- 기존의 모든 기본 키와 외래 키가 올바른지, 최댓값까지 여유가 얼마나 남았는지 점검했다.
- 새 32비트 `integer` 식별자가 들어오지 못하게 막는 ratchet 테스트를 더했다.
교훈
Buildkite 는 데이터베이스 샤딩 작업과 함께 새 테이블에 시간 순서 UUID 기본 키를 쓰고 있지만, 기존 숫자 기본 키는 한동안 남겨 둔다. 이 장애로 모니터링에 사각지대가 있다는 것이 드러났다.
출처
- https://www.buildkitestatus.com/incidents/63zxhjsysszc · official-status · 보관본
관련 사례
같은 원인 · 공통 데이터베이스
같은 원인 · 공통 데이터베이스
같은 원인 · 공통 데이터베이스
같은 원인 · 공통 데이터베이스
같은 원인 · 공통 데이터베이스
같은 원인 · 공통 데이터베이스
IL-0288CDN77 의 ClickHouse 데이터 파이프라인에서 이중화된 인스턴스 세 곳의 ZooKeeperWait 가 수천 초로 치솟아 복제가 한 시간 넘게 느려졌다CDN77 · 2026같은 원인 · 공통 데이터베이스
같은 원인 · 공통 데이터베이스
IL-0305Intercom 의 PlanetScale 샤드 하나에서 복제본이 CPU 100% 로 주 데이터베이스를 따라가지 못해 받은편지함에 최대 2.2시간 전의 데이터가 보였다Intercom · 2026같은 원인 · 공통 데이터베이스
IL-0390PostHog US Cloud 의 Persons Postgres 데이터베이스 쓰기가 크게 느려져 이벤트와 persons 수집이 최대 2일 지연됐다PostHog · 2025같은 원인 · 공통 데이터베이스
같은 원인 · 공통 데이터베이스
IL-0287Atlas 와 Cloud Manager 의 모니터링을 받치는 내부 데이터베이스 클러스터의 샤드 하나가 과부하되어 지표 수집과 클러스터 작업이 늦어졌다MongoDB · 2025같은 원인 · 공통 데이터베이스
같은 원인 · 공통 데이터베이스
같은 원인 · 공통 데이터베이스
IL-0298Wikimedia sessionstore 의 Cassandra 노드가 디스크가 가득 차 잇따라 죽고 쿼럼을 잃어 편집이 실패했다Wikimedia Foundation · 2025같은 원인 · 공통 데이터베이스
IL-0312max_connections 를 올리려고 재시작한 주 PostgreSQL 데이터베이스가 다시 올라오지 않아 Gadget 의 모든 앱 요청이 멈췄다Gadget · 2024같은 원인 · 공통 데이터베이스
같은 원인 · 공통 데이터베이스
같은 원인 · 공통 데이터베이스
같은 원인 · 공통 데이터베이스
IL-0110Grafana Agent 파드가 메모리를 많이 쓰던 노드에 Hangfire 파드가 함께 올라가 시스템 OOM 으로 CrashLoopBackOff 를 반복했고, 노드가 응답을 멈추고 NotReady 가 됐다.DFDS · 2024같은 원인 · 공통 데이터베이스
같은 원인 · 공통 데이터베이스
같은 원인 · 공통 데이터베이스
IL-0202갑자기 몰린 쿼리와 데이터베이스 쓰기로 Honeycomb 수집 호스트가 메모리 부족으로 죽었고, 쿠버네티스 CrashLoopBackOff 가 용량 회복을 막아 US1 이벤트 수집이 한 시간 넘게 불안정했다Honeycomb · 2023 · sev1같은 원인 · 공통 데이터베이스
IL-0386Google Cloud 로 옮긴 뒤 GKE 노드에서 Postgres 연결 타임아웃과 memcached i/o timeout 이 간헐적으로 튀었다incident.io · 2023같은 원인 · 공통 데이터베이스
같은 원인 · 공통 데이터베이스
같은 원인 · 공통 데이터베이스
같은 원인 · 공통 데이터베이스
IL-0206GKE 파드 안의 Consul 에이전트가 메모리 급증으로 거듭 OOM kill 되어 Rails 파드가 데이터베이스 복제본을 찾지 못했고, 모든 쿼리가 primary 로 몰려 GitLab.com 이 느려졌다.GitLab · 2022같은 원인 · 공통 데이터베이스
같은 원인 · 공통 데이터베이스
같은 원인 · 공통 데이터베이스
같은 원인 · 공통 데이터베이스
같은 원인 · 공통 데이터베이스
IL-0496전역 복제 Cassandra 클러스터에서 모든 리전의 인스턴스 CPU 가 100% 로 치솟아 쿼리가 타임아웃됐고, 같은 부하가 이틀 저녁 더 찾아왔다Ably · 2020같은 원인 · 공통 데이터베이스
IL-0443Aurora MySQL reader 가 이유 없이 재시작한 뒤 writer 의 insert latency 가 7배쯤 오르고 replication lag 가 하루 넘게 이어졌다Repro · 2019같은 원인 · 공통 데이터베이스
IL-0037imagePullPolicy가 Always인 DaemonSet이 크래시 루프를 돌며 이미지를 계속 받아, NAT 세 대를 같이 쓰던 리전 전체가 이미지 레지스트리에서 429로 막혔다Datadog · 2019같은 원인 · 공통 데이터베이스
같은 원인 · 공통 데이터베이스
IL-0211Mandrill 의 PostgreSQL 샤드 하나가 트랜잭션 ID 랩어라운드를 막으려고 쓰기를 멈춰 약 40시간 동안 메일 발송이 줄었다Mailchimp · 2019같은 원인 · 공통 데이터베이스
IL-0064CPU 를 많이 쓰는 파드가 Google Cloud 노드 하나에 몰려 노드가 커널 패닉으로 죽었고, 다시 배치된 파드가 다음 노드를 또 죽이며 웹사이트와 API 가 멈췄다.Moonlight · 2019같은 원인 · 공통 데이터베이스
같은 원인 · 공통 데이터베이스
IL-0334RDS MySQL 의 bookmarks 테이블이 2TB 파일 크기 한도에 닿아 INSERT 가 실패하고 Instapaper 가 31시간 동안 멈췄다Instapaper · 2017같은 원인 · 공통 데이터베이스
IL-0333사양을 낮춘 RDS PostgreSQL 인스턴스가 피크 부하를 못 버텨 헬스 체크가 실패하고 Buildkite 대시보드가 몇 시간 동안 내려갔다Buildkite · 2016같은 원인 · 공통 데이터베이스
IL-0282US-East 리전의 DynamoDB 스토리지 서버들이 멤버십 정보를 받지 못해 스스로 요청 처리에서 빠지면서 고객 요청의 약 55% 가 실패했다Amazon Web Services · 2015같은 원인 · 공통 데이터베이스
같은 원인 · 공통 데이터베이스
같은 원인 · 공통 데이터베이스
내 클러스터에도 있는지 확인하기
AI 도구와 스크립트용
- 이 사례의 JSON: https://incidentlib-api.benchlet.com/cases/IL-0546
- 가장 비슷한 사례들: https://incidentlib-api.benchlet.com/cases/IL-0546/similar
- MCP 서버(Streamable HTTP, 키 없음):
https://incidentlib-mcp.benchlet.com/mcp
API 는 키가 필요 없습니다. MCP 서버는 search_incidents, get_incident, list_incidents, get_topic, vocab 도구를 내놓습니다. 사용법은 API 와 MCP.