IL-0004 Grafana Labs · 2019-07-19kubernetesobservability
Grafana Cloud 의 Hosted Prometheus 는 CNCF 프로젝트인 Cortex 위에 만든 서비스다. Cortex 의 Ingester 서비스를 다운타임 없이 업그레이드하려면 업그레이드하는 동안 Ingester 레플리카가 하나 더 있어야 한다. Ingester 파드 하나는 CPU 4코어와 메모리 15GB 를 요청하고, 이는 쿠버네티스 노드 한 대의 CPU 와 메모리의 25% 다. 평소에는 노드 한 대에 그만큼의 빈자리가 없다. 그래서 Grafana Labs 는 파드 우선순위를 도입했다. Ingester 에 높은 우선순위를 주고, 필요할 때 다른 작은 파드를 잠시 선점해 자리를 만들려는 것이었다.
7월 18일 목요일 팀은 critical, high, medium, low 네 가지 우선순위 클래스를 클러스터에 배포했다. 고객 트래픽이 없는 내부 클러스터에서 약 1주 돌려 본 설정이었다. medium 은 우선순위를 지정하지 않은 파드의 기본값이 되었고 Ingester 는 high 로 정했다. 그러나 운영 Cortex 클러스터의 Ingester 에는 아직 high 지정이 반영되지 않았다.
다음 날 새 전용 Cortex 클러스터의 Ingester 가 기본값 medium 을 받았고, 우선순위가 없는 운영 Ingester 하나를 선점했다. 운영 ReplicaSet 이 새로 만든 Ingester 도 medium 을 받아 또 다른 운영 Ingester 를 선점했다. 이 연쇄로 운영 Cortex 클러스터의 Ingester 가 모두 선점됐다. Cortex 는 데이터를 시리즈 단위로 분산 해시 테이블에 샤딩하고 Ingester 세 개에 쿼럼 방식으로 복제한다. Ingester 가 대거 빠지자 쓰기를 충분히 복제하지 못해 쓰기가 실패했다.
당직자는 약 5분 만에 원인을 찾고 쿠버네티스 클러스터를 늘렸다. 다시 약 5분 뒤 옛 Ingester 가 데이터를 모두 플러시하고 새 Ingester 가 스케줄링되어 Cortex 클러스터가 돌아왔다. 이어서 인증 리버스 프록시의 OOM 을 약 10분 걸려 찾고 고쳤다. 장애는 모두 26분이었고 데이터는 잃지 않았다. 고객 Prometheus 서버는 WAL 기반 remote write 로 쓰기를 버퍼에 담아 두었다가 장애 뒤 다시 보냈다.
2019년 7월 19일 금요일, Grafana Cloud 의 Hosted Prometheus 서비스가 장애를 겪었다. 오류 예산 기반 Prometheus 알림이 장애 시작 4분 안에 당직자를 호출했다.
운영 Cortex 클러스터의 Ingester 파드가 선점되어 밀려났다. 밀려난 Ingester 를 대신하려고 ReplicaSet 이 새 파드를 만들었고, 이 파드가 다시 다른 운영 Ingester 를 선점했다. 이 연쇄로 운영 Cortex 클러스터의 Ingester 파드가 모두 선점됐다.
Cortex 는 종료 중인 Ingester 에는 데이터를 쓰지 않는다. 많은 Ingester 가 분산 해시 테이블에서 한꺼번에 빠지자 Cortex 는 쓰기를 충분히 복제하지 못했고 쓰기가 실패했다.
클러스터를 늘려 Cortex 가 돌아온 뒤에도 Cortex 앞에 있는 인증 리버스 프록시가 OOM 으로 죽었다. QPS 가 10배 넘게 뛰었고, 팀은 고객 Prometheus 서버가 지나치게 공격적으로 재시도했기 때문이라고 본다.
원인 설정 변경
새로 도입한 오류 예산 기반 Prometheus 알림이 장애 시작 4분 안에 당직자를 호출했다.
운영 Ingester 에 high 우선순위를 지정하기 전에 medium 을 기본 우선순위로 만들지 말았어야 했다. 운영 Ingester 의 high 지정도 더 일찍 배포했어야 했다. 팀은 이 변경이 설계 문서를 쓸 만큼 크지 않다고 보고 GitHub 이슈에서만 논의했다.
좋은 점도 있었다. Cortex 는 자원이 충분해지자 추가 조치 없이 스스로 회복했다. 팀은 새 로그 수집 시스템인 Grafana Loki 로 Ingester 가 정상적으로 종료됐는지 확인했다.
IL-0020 편집자가 연결함https://incidentlib-mcp.benchlet.com/mcpAPI 는 키가 필요 없습니다. MCP 서버는 search_incidents, get_incident, list_incidents, get_topic, vocab 도구를 내놓습니다. 사용법은 API 와 MCP.