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 위반 알림으로 번졌다.
조치
- primary 를 뽑을 만큼 노드가 없다는 것을 확인한 뒤 실패한 노드를 재시작했다.
후속 조치
- Sentinel 서비스가 꺼지면 알림을 보낸다.
- 머지 리퀘스트가 Redis Sidekiq 장애 뒤에 스스로 회복하도록 고친다.
교훈
꺼진 Sentinel 노드를 알림으로 잡았다면 장애 조치에 필요한 쿼럼을 만들 노드 수를 미리 확보해 이 장애를 아예 막을 수 있었다. 너무 시끄럽다는 이유로 알림을 지운 것이 꺼진 노드를 쿼럼 문제 전에 잡을 기회를 줄였을 수 있다. 복구가 몇 시간 길게 이어진 것은 머지 리퀘스트가 Redis Sidekiq 장애에서 스스로 회복하지 못했기 때문이다.
출처
참고 문서
- https://gitlab.com/gitlab-com/gl-infra/reliability/-/issues/17063
- https://gitlab.com/gitlab-com/gl-infra/reliability/-/issues/17075
- https://gitlab.com/gitlab-org/gitlab/-/issues/387176
- https://gitlab.com/gitlab-com/gl-infra/reliability/-/issues/9431
- https://gitlab.com/gitlab-com/runbooks/-/merge_requests/2040
관련 사례
–
내 클러스터에도 있는지 확인하기
AI 도구와 스크립트용
- 이 사례의 JSON: https://incidentlib-api.benchlet.com/cases/IL-0291
- 가장 비슷한 사례들: https://incidentlib-api.benchlet.com/cases/IL-0291/similar
- MCP 서버(Streamable HTTP, 키 없음):
https://incidentlib-mcp.benchlet.com/mcp
API 는 키가 필요 없습니다. MCP 서버는 search_incidents, get_incident, list_incidents, get_topic, vocab 도구를 내놓습니다. 사용법은 API 와 MCP.