Incident Library

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분 안에 알림을 보냈다.

조치

후속 조치

교훈

Buildkite 는 데이터베이스 샤딩 작업과 함께 새 테이블에 시간 순서 UUID 기본 키를 쓰고 있지만, 기존 숫자 기본 키는 한동안 남겨 둔다. 이 장애로 모니터링에 사각지대가 있다는 것이 드러났다.

출처

관련 사례

내 클러스터에도 있는지 확인하기

kubegap 은 Claude Code 나 Codex 에서 쿠버네티스 클러스터를 읽기만 하며 이 사례와 같은 상태를 점검합니다. 이 사례의 구성 요소: 데이터베이스. 점검 항목의 근거는 이 사례 같은 공개 보고서입니다.

AI 도구와 스크립트용

API 는 키가 필요 없습니다. MCP 서버는 search_incidents, get_incident, list_incidents, get_topic, vocab 도구를 내놓습니다. 사용법은 API 와 MCP.