Incident Library

IL-0291 GitLab · 2023-01-05 (게시일)databasegcp

GitLab.com 의 redis-sidekiq Sentinel 이 쿼럼을 만들지 못해 Sidekiq 이 30분 동안 멈추고 500 오류가 늘었다

GitLab.com 의 redis-sidekiq 에서 redis-sidekiq-01-db-gprd 노드가 30일 넘게 꺼져 있었고, 그동안 클러스터는 쿼럼 2로 돌고 있었다. 그러다 primary 인 redis-sidekiq-03-db-gprd 가 GCP 호스트 오류로 실패해 VM 이 리셋되고 다른 노드로 옮겨졌다. primary 를 잃자 쿼럼을 만들 수 없었다. 서비스가 부팅할 때 자동으로 시작되지 않게 돼 있어서, 쿼럼 충돌에 걸린 replica 하나만 남았다. Sidekiq 작업을 쓰는 모든 서비스가 30분 동안 멈췄고 Web 과 API 요청, SAML 로그인까지 영향을 받았다. 엔지니어는 primary 를 뽑을 노드가 모자란다는 것을 확인한 뒤 실패한 노드를 재시작해 복구했다. 머지 리퀘스트는 Redis Sidekiq 장애에서 스스로 회복하지 못해, 장애 중에 만들어진 약 4,000개가 몇 시간 동안 쓸 수 없는 상태로 남았다. 영향받은 고객은 16,621명으로 추정했지만 실제로는 훨씬 많았을 수 있다. 꺼진 노드를 잡을 알림이 runbooks 머지 리퀘스트 2040 으로 추가된 적이 있었지만 너무 시끄러워 쓸모가 없다는 이유로 지워졌다. 같은 근본 원인으로 난 이전 사건이 reliability 이슈 9431 이다.

심각도
–
영향 범위
All services using Sidekiq jobs on GitLab.com fully down for 30 minutes, with knock-on errors in Web and API requests and SAML login; about 4,000 merge requests unusable for several hours
영향 사용자
External customers; best estimate 16,621, possibly much more
지역
–
감지까지
–
복구까지
–

증상

#production 채널에 Redis 클라이언트 오류 알림이 먼저 오고, 이어서 여러 서비스의 Error SLO 위반 알림이 잇따랐다. Sidekiq 작업을 쓰는 모든 서비스가 30분 동안 완전히 멈췄고 Web 과 API 요청에서도 500 오류가 늘었다.

Error SLO 위반은 Webservice & API LoadBalancer 와 Puma 에서 났다. 장애 30분 동안 사용자는 SAML 로그인이 안 되는 것을 포함해 곳곳에서 들쭉날쭉한 동작을 겪었다.

Redis 가 돌아온 뒤에도 장애 시간 중에 만들어진 머지 리퀘스트 약 4,000개는 몇 시간 동안 diff 와 파이프라인 상태를 볼 수 없었고 머지할 수도 없었다.

조사해 보니 primary 를 뽑을 만큼 노드가 남아 있지 않았고, 남은 replica 하나가 쿼럼 충돌에 걸린 채 멈춰 있었다.

증상 장애 조치 실패오류율 상승

원인

촉발
primary 였던 redis-sidekiq-03-db-gprd 가 GCP 호스트 오류로 실패했고, 이 VM 은 리셋되어 다른 노드로 옮겨졌다.

감지

#production 채널에 여러 알림이 왔다. Redis 클라이언트 오류 알림부터 시작해 Webservice & API LoadBalancer 와 Puma 를 포함한 여러 서비스의 Error SLO 위반 알림으로 번졌다.

조치

후속 조치

교훈

꺼진 Sentinel 노드를 알림으로 잡았다면 장애 조치에 필요한 쿼럼을 만들 노드 수를 미리 확보해 이 장애를 아예 막을 수 있었다. 너무 시끄럽다는 이유로 알림을 지운 것이 꺼진 노드를 쿼럼 문제 전에 잡을 기회를 줄였을 수 있다. 복구가 몇 시간 길게 이어진 것은 머지 리퀘스트가 Redis Sidekiq 장애에서 스스로 회복하지 못했기 때문이다.

출처

참고 문서

관련 사례

–

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

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

AI 도구와 스크립트용

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