Datadog / k8s

22 개의 포스트

datadog

How we built a real-world evaluation platform for autonomous SRE agents at scale (새 탭에서 열림)

Datadog은 자율형 사고 조사 에이전트인 'Bits AI SRE'를 개발하면서, 특정 기능을 개선했을 때 다른 영역에서 예상치 못한 성능 저하(Regression)가 발생하는 문제를 겪었습니다. 이를 해결하기 위해 실제 운영 환경의 사고 맥락을 재현하고 에이전트의 추론 과정을 일관되게 측정할 수 있는 '재현 가능한 평가 플랫폼'을 자체 구축했습니다. 이 플랫폼은 프로덕션 환경의 복잡한 신호를 오프라인에서 재실행 가능한 환경으로 변환함으로써, 에이전트의 품질을 데이터에 기반해 지속적으로 개선할 수 있게 해줍니다. **기존 테스트 방식의 한계와 회귀 문제** * 단순한 단위 테스트나 개별 도구(Tool) 레벨의 테스트는 에이전트가 여러 도구를 체이닝(Chaining)하며 추론하는 복합적인 과정을 검증하는 데 한계가 있었습니다. * 특정 모니터에서 서비스 이름을 추출하는 등의 기능 개선이 실제로는 불필요한 노이즈를 유발하여, 오히려 에이전트의 전체적인 추론 품질을 떨어뜨리는 사례가 발생했습니다. * 실시간 운영 환경에서의 재실행(Live Replay)은 데이터의 만료, 환경의 가변성, 결과 집계의 어려움으로 인해 대규모 평가에 적합하지 않았습니다. **재현 가능한 평가를 위한 '레이블'의 구조** * 플랫폼의 핵심인 '레이블'은 근본 원인을 정의하는 '정답(Ground Truth)'과 사고 당시의 신호를 담은 '월드 스냅샷(World-snapshot)'으로 구성됩니다. * 월드 스냅샷은 원시 데이터를 그대로 저장하는 대신 에이전트가 당시 사용할 수 있었던 텔레메트리 쿼리(지표, 로그, 배포 이벤트 등) 정보를 보존하여 실제 제약 사항을 재현합니다. * Kubernetes 파드 실패부터 Kafka 지연까지, 실제 SRE가 직면하는 다양한 장애 모드와 기술 스택을 포괄하는 광범위한 레이블 세트를 구축하여 평가의 객관성을 확보했습니다. **레이블 생성 및 검증의 자동화 (Agentic Validation)** * 초기 수동 레이블링의 한계를 극복하기 위해, 사용자의 피드백과 Bits AI의 자체 조사 데이터를 결합하여 레이블을 자동 생성하는 파이프라인을 구축했습니다. * 레이블의 양이 급증함에 따라 발생하는 품질 저하 문제를 해결하기 위해, 에이전트가 직접 모호한 신호를 정리하고 관계를 도출하는 '에이전트 기반 검증' 단계를 도입했습니다. * 이 시스템을 통해 레이블 생성 속도를 10배 이상 향상시켰으며, 사람이 최종 검토하기 전 데이터의 정밀도를 높여 평가 신뢰도를 강화했습니다. **대규모 평가 오케스트레이션과 성능 추적** * 다양한 모델 버전과 설정 변경 사항이 기존의 Kafka나 Kubernetes 조사 품질에 영향을 주지 않는지 확인하기 위해 대규모 병렬 평가 시스템을 운영합니다. * 레이블 세트를 세부 카테고리별로 분할(Segmentation)하여 관리함으로써, 어떤 변경이 특정 시나리오에 어떤 영향을 주는지 정밀하게 분석할 수 있습니다. * 모든 평가 결과는 지표화되어 시간에 따른 성능 추이를 추적하고, 버전 간 비교를 용이하게 하여 새로운 기능 배포에 대한 확신을 제공합니다. 복잡한 추론을 수행하는 AI 에이전트 개발 시, 단순히 개별 도구의 정확도에 의존하기보다 실제 운영 데이터의 '쿼리 가능성'과 '맥락'을 보존하는 오프라인 평가 환경을 구축하는 것이 필수적입니다. 이는 사용자 피드백을 제품 개선의 선순환으로 연결하는 핵심 인프라가 됩니다.

datadog

How we reduced the size of our Agent Go binaries by up to 77% (새 탭에서 열림)

Datadog은 에이전트 바이너리 크기가 5년 사이 3배 이상 비대해진 문제를 해결하기 위해, 기능 삭제 없이 Go 바이너리 크기를 최대 77% 줄이는 성과를 거두었습니다. 이들은 체계적인 의존성 감사, 코드 리팩토링, 링커 최적화 복원을 통해 1.22 GiB에 달하던 아티팩트를 5년 전 수준으로 되돌렸으며, 이 과정에서 발견한 Go 컴파일러의 특성을 활용해 Kubernetes 등 다른 대규모 오픈소스 프로젝트에도 기여했습니다. ### 데이터독 에이전트의 빌드 구조와 비대화 문제 * 데이터독 에이전트는 단일 제품처럼 보이지만, 실제로는 OS, 아키텍처, 환경(Docker, K8s, IoT 등)에 따라 수십 개의 서로 다른 빌드 구성을 가집니다. * 수백 개의 외부 라이브러리(Cloud SDK, 컨테이너 런타임 등)를 사용하며, Go 빌드 태그와 의존성 주입(Dependency Injection)을 통해 기능을 제어합니다. * 5년간의 기능 추가로 인해 Linux amd64 패키지의 압축 전 크기가 428MiB에서 1,248MiB로 약 192% 증가했으며, 이는 네트워크 비용 상승과 서버리스/IoT 환경에서의 사용 제약을 초래했습니다. ### Go 의존성 제거를 위한 전략적 접근 * **컴파일러의 패키지 처리 이해**: Go 컴파일러는 패키지 단위로 동작하며, 빌드 제약 조건에 맞는 파일 내에서 `main` 패키지로부터 전역적으로 도달 가능한(reachable) 모든 임포트를 포함합니다. * **빌드 태그 활용**: 불필요한 의존성을 포함하는 파일에 특정 빌드 태그(`//go:build`)를 추가하여, 해당 기능이 필요 없는 빌드에서는 컴파일 단계부터 제외되도록 구성했습니다. * **심볼 분리 및 리팩토링**: 무거운 의존성을 사용하는 특정 함수나 심볼을 별도의 패키지로 격리했습니다. 이를 통해 해당 기능이 꼭 필요한 바이너리에서만 해당 패키지를 임포트하도록 구조를 개선했습니다. ### 바이너리 분석 및 시각화 도구 활용 * **`go list`**: 특정 OS와 아키텍처, 빌드 태그 조합에서 포함되는 패키지 목록을 추출하여 의존성 현황을 파악했습니다. * **`goda`**: 패키지 임포트 관계를 그래프로 시각화하여, 특정 무거운 패키지가 어떤 경로를 통해 바이너리에 포함되었는지 추적했습니다. * **`go-size-analyzer`**: 바이너리 내부에서 각 의존성 패키지가 차지하는 실제 바이트 크기를 텍스트나 인터팩티브 웹 화면으로 분석하여 최적화 우선순위를 정했습니다. * **링커의 한계 파악**: 단순 임포트만으로도 `init` 함수 실행이나 전역 변수 초기화가 발생하여 링커가 해당 코드를 제거하지 못하는 경우가 있음을 확인하고 이를 관리했습니다. 대규모 Go 프로젝트에서 바이너리 크기를 줄이려면 단순한 코드 최적화를 넘어, `goda`나 `go-size-analyzer` 같은 도구로 의존성 그래프를 분석하고 빌드 태그를 활용해 패키지 간의 결합도를 낮추는 아키텍처적 접근이 필수적입니다. 특히 사용하지 않는 기능이 `init` 함수나 리플렉션(reflection)으로 인해 링커 최적화를 방해하지 않도록 주의 깊게 설계해야 합니다.

datadog

Failure is inevitable: Learning from a large outage, and building for reliability in depth at Datadog | Datadog (새 탭에서 열림)

2023년 3월, 데이터독(Datadog)은 인프라의 약 50~60%가 중단되는 대규모 장애를 겪으며 시스템의 일부가 마비될 때 플랫폼 전체가 완전히 다운된 것처럼 보이는 '정방형 파형(Square-wave)' 장애 패턴을 확인했습니다. 이를 계기로 데이터독은 모든 장애 상황을 완벽히 방지하는 것은 불가능하다는 점을 인정하고, 장애 발생 시에도 시스템이 점진적으로 기능을 유지하는 '우아한 성능 저하(Graceful Degradation)'를 최우선 가치로 삼게 되었습니다. 데이터 유실 방지, 실시간 데이터 우선 처리, 부분적인 결과 제공을 핵심 원칙으로 설정하여 인프라 전반의 회복 탄력성을 재설계하는 대대적인 변화를 추진하고 있습니다. **"결함 없음" 설계의 한계와 Square-wave 장애** - 과거 데이터독은 데이터의 '정확성'을 보장하기 위해 100% 완벽한 데이터가 수집될 때까지 쿼리 결과를 반환하지 않도록 시스템을 최적화했습니다. - 이러한 설계는 일부 노드가 다운되었을 때 시스템 전체가 응답을 멈추게 하여, 사용자에게는 플랫폼이 완전히 중단된 것처럼 보이는 이진적(Binary) 장애를 초래했습니다. - 고전적인 근본 원인 분석(RCA)을 통해 특정 트리거를 제거할 수는 있지만, 소프트웨어 업데이트, 인증서 만료 등 무한한 장애 원인을 모두 예방하는 것은 불가능하다는 결론에 도달했습니다. **우아한 성능 저하를 위한 새로운 우선순위** - 시스템 구성 요소가 완벽하게 작동해야만 가치를 제공하는 '결함 방지(Never-fail)' 아키텍처에서 '더 잘 실패(Fail better)'하는 구조로 전환했습니다. - 데이터 유실 방지: 처리가 늦어지더라도 고객의 데이터가 영구적으로 사라지지 않도록 보장합니다. - 실시간성 우선: 가용 자원이 부족할 때 오래된 데이터보다 실시간 데이터를 우선적으로 처리하여 현재 상태를 파악할 수 있게 합니다. - 부분 결과 제공: 모든 데이터가 준비되지 않았더라도 정확도가 확인된 범위 내에서 부분적인 데이터를 즉시 시각화합니다. **데이터 유실 방지를 위한 영구적 수집 저장소(Persistent Intake Storage)** - 장애 당시 메모리나 로컬 디스크에만 머물던 미복제 데이터가 노드 유실과 함께 사라졌던 문제를 해결하기 위해 파이프라인 초기 단계에 디스크 기반 영구 저장소를 도입했습니다. - 수집(Intake) 직후 데이터를 복제된 저장소에 즉시 기록함으로써, 후속 처리 시스템이 정체되거나 노드가 유실되더라도 데이터 손실 없이 재처리가 가능하도록 설계했습니다. - 이를 통해 네트워크 지연이나 하위 시스템의 과부하 상황에서도 데이터 수집 단계에서의 안정성을 확보했습니다. 모든 장애를 차단하려는 시도보다는, 장애 상황에서도 시스템이 어떻게 부분적으로나마 작동할 수 있을지를 설계 단계부터 고민해야 합니다. 대규모 분산 시스템을 운영한다면 데이터의 완전성(Completeness)과 가용성(Availability) 사이의 균형을 재검토하고, 최악의 순간에도 사용자에게 최소한의 가시성을 제공할 수 있는 복구 탄력성을 구축하는 것이 권장됩니다.

datadog

Failure is inevitable: Learning from a large outage, and building for reliability in depth at Datadog (새 탭에서 열림)

2023년 3월에 발생한 대규모 장애를 계기로 데이터독(Datadog)은 시스템 가용성에 대한 근본적인 철학을 재정립했습니다. 당시 인프라의 50~60%가 작동 불능 상태에 빠지자 플랫폼 전체가 완전히 멈춘 것처럼 보이는 '정사각형 파형(Square-wave) 실패' 패턴이 나타났으며, 이는 완벽한 데이터 정확성에만 집착하던 기존 설계의 한계를 드러냈습니다. 이에 데이터독은 모든 장애를 막으려는 시도 대신, 극단적인 상황에서도 일부 기능을 유지하며 가치를 제공하는 '우아한 성능 저하(Graceful Degradation)'를 핵심 전략으로 채택했습니다. ### 장애의 교훈: 정사각형 파형 실패의 발견 * **이진법적 실패:** 2023년 3월, 글로벌 보안 업데이트 과정에서 쿠버네티스 노드의 약 절반이 연결을 소실했습니다. 인프라의 절반은 여전히 작동 중이었음에도 불구하고, 사용자 입장에서는 서비스가 아예 응답하지 않거나 데이터가 전혀 보이지 않는 '전부 아니면 전무(All-or-Nothing)' 식의 장애가 발생했습니다. * **정확성 편향의 부작용:** 기존 시스템은 데이터의 정확성을 보장하기 위해 모든 태그와 메트릭이 완전히 처리될 때까지 쿼리 결과 표시를 대기하도록 설계되었습니다. 평상시에는 올바른 선택이지만, 대규모 장애 시에는 일부 데이터 누락이 전체 시스템의 데이터 가독성을 차단하는 결과를 초래했습니다. * **사후 분석의 한계:** 단순히 장애의 트리거(레거시 업데이트 메커니즘)를 제거하는 것만으로는 충분하지 않았습니다. 인증서 만료, 윤초, 설정 오류 등 장애의 원인은 무한하기 때문에, 원인 차단보다는 장애 발생 시 시스템이 어떻게 반응하느냐가 더 중요하다는 점을 깨달았습니다. ### 실패를 위한 설계: 우아한 성능 저하의 원칙 * **복구력 중심의 사고 전환:** 절대 실패하지 않는(Never-fail) 아키텍처는 불가능하다는 것을 인정하고, '더 잘 실패하는(Failing better)' 시스템을 구축하는 데 집중하기 시작했습니다. * **우선순위의 재정립:** 장애 상황에서도 고객의 비즈니스 연속성을 보장하기 위해 세 가지 원칙을 세웠습니다. ① 데이터는 늦더라도 절대 유실되지 않아야 한다. ② 가용한 자원은 실시간 데이터 처리에 우선 할당한다. ③ 아무것도 보여주지 않는 것보다 부정확하더라도 부분적인 결과를 보여주는 것이 낫다. ### 데이터 유실 방지를 위한 영구 흡수 저장소(Persistent Intake) * **메모리 기반 버퍼의 위험성:** 분석 결과, 초기 데이터 흡수(Intake) 단계에서 데이터가 메모리나 로컬 디스크에만 머물러 있다가 노드 장애 시 복구 불가능하게 유실되는 문제가 확인되었습니다. * **디스크 기반 영구 저장:** 데이터 처리 파이프라인의 가장 앞단에 디스크 기반의 복제 저장소를 도입했습니다. 이를 통해 수집 노드가 중단되더라도 데이터가 유실되지 않도록 보장하며, 다운스트림 시스템이 마비되었을 때도 버퍼 역할을 수행하여 데이터 에이전트의 재시도 실패를 방지합니다. * **지연 시간과 안정성의 균형:** 응답 속도를 위해 최적화되었던 기존 방식에서 벗어나, 데이터 수신 확인(Acknowledgment)을 보내기 전에 복제된 저장소에 안전하게 기록하는 구조로 변경하여 신뢰성을 높였습니다. ### 실용적인 결론 및 제언 대규모 시스템을 운영하는 엔지니어링 팀은 시스템의 **신뢰성(Reliability)**을 단순히 '장애가 없는 상태'로 정의해서는 안 됩니다. 시스템의 일부가 마비되더라도 핵심적인 기능은 작동을 멈추지 않도록 설계해야 합니다. 특히 데이터 정확성과 가용성 사이의 트레이드오프를 재검토하여, 장애 시나리오에서는 '완벽한 데이터'보다 '부분적이지만 즉각적인 가시성'을 제공하는 것이 비즈니스 관점에서 훨씬 유리할 수 있음을 명심해야 합니다.

datadog

How we tracked down a Go 1.24 memory regression across hundreds of pods (새 탭에서 열림)

Go 1.24로의 업그레이드 이후, 새로운 맵 구현인 스위스 테이블(Swiss Tables)에 대한 기대와 달리 일부 서비스에서 메모리 사용량(RSS)이 약 20% 증가하는 현상이 발견되었습니다. 조사 결과, Go 런타임 내부의 메모리 관리 지표는 안정적이었으나 시스템 레벨의 실제 물리 메모리 점유가 늘어난 것으로 확인되었습니다. 이는 Go 1.24에서 진행된 `mallocgc` 함수의 리팩토링 과정에서 발생한 미묘한 메모리 할당자 회귀(Regression) 현상이 원인이었습니다. ### 런타임 지표와 시스템 지표의 불일치 * Go 1.24 업그레이드 후 데이터 처리 서비스의 RSS(Resident Set Size)가 눈에 띄게 증가했으나, Go 런타임 지표와 힙 프로파일상에는 아무런 변화가 기록되지 않았습니다. * 이는 Go 런타임 입장에서는 메모리를 더 사용하고 있지 않다고 판단하지만, 운영체제(Linux) 입장에서는 프로세스가 더 많은 물리 메모리를 점유하고 있는 상태임을 의미합니다. * Kubernetes의 메모리 제한(Limit)이나 OOM 킬러는 시스템 지표인 RSS를 기준으로 작동하기 때문에, 런타임 지표에 나타나지 않는 이러한 증가는 서비스 안정성에 치명적일 수 있습니다. ### 주요 변경 사항에 대한 가설 검증 * 먼저 Go 1.24의 핵심 변화인 '스위스 테이블'과 '스핀 비트 뮤텍스(Spin bit mutex)'를 원인으로 의심하고 실험을 진행했습니다. * `GOEXPERIMENT=noswissmap` 및 `GOEXPERIMENT=nospinbitmutex` 플래그를 사용하여 해당 기능들을 각각 비활성화한 후 빌드하여 배포했으나, 메모리 증가 현상은 해결되지 않았습니다. * 이를 통해 이번 문제는 새로운 기능 자체가 아니라, 런타임의 더 깊은 곳에서 발생한 변화 때문임을 확인했습니다. ### 가상 메모리와 물리 메모리의 매핑 분석 * 리눅스의 `/proc/[pid]/smaps` 파일을 분석하여 프로세스의 메모리 영역별 가상 메모리(Size)와 물리 메모리(RSS)의 차이를 추적했습니다. * 분석 결과, Go 1.23에서는 힙 영역의 RSS가 가상 메모리 크기보다 약 300 MiB 낮게 유지되었으나, Go 1.24에서는 가상 메모리 크기와 RSS가 거의 일치하는 현상이 발견되었습니다. * 결과적으로 Go 1.24의 런타임이 이전 버전보다 가상 메모리를 실제 물리 RAM에 더 공격적으로 할당(Commit)하고 있다는 사실을 밝혀냈습니다. ### mallocgc 리팩토링과 할당자 이슈 * Go 1.24 변경 로그를 정밀 분석한 결과, 메모리 할당의 핵심 로직인 `mallocgc` 함수에 대대적인 리팩토링이 있었음을 확인했습니다. * 이 과정에서 발생한 의도치 않은 로직 변화가 할당된 메모리를 실제 물리적 공간에 매핑하는 방식에 영향을 주어 RSS 상승을 유도한 것으로 파악되었습니다. * 작성자는 이 문제를 Go 개발 팀과 공유하여 원인을 확인했으며, 이는 런타임 리팩토링으로 인한 성능 회귀의 일종으로 결론지어졌습니다. Go 1.24 업그레이드를 고려 중인 팀은 런타임 내부 지표(Heap usage)뿐만 아니라 시스템 레벨의 RSS 지표를 면밀히 모니터링해야 합니다. 비록 메모리 할당자에서 미묘한 RSS 증가가 관측되었지만, 동시에 도입된 스위스 테이블은 대규모 인메모리 맵을 사용하는 서비스에서 수백 기가바이트의 메모리를 절약할 수 있는 잠재력을 가지고 있으므로 서비스 특성에 따른 비교 분석이 필요합니다.

datadog

Achieving relentless Kafka reliability at scale with the Streaming Platform (새 탭에서 열림)

데이터독(Datadog)은 매일 수백 조 건의 이벤트를 처리하기 위해 수천 개의 토픽과 수백 개의 아파치 카프카(Apache Kafka) 클러스터를 운영하고 있습니다. 기존의 정적인 카프카 설정으로는 대규모 환경에서 발생하는 하드웨어 장애나 트래픽 변동에 유연하게 대응하기 어렵기 때문에, 데이터독은 카프카 인프라를 추상화한 '스트리밍 플랫폼(Streaming Platform)'이라는 제어 계층을 구축했습니다. 이를 통해 애플리케이션의 재설정이나 배포 없이도 실시간으로 트래픽을 리디렉션하고 클러스터를 관리함으로써 시스템의 복원력과 확장성을 극대화했습니다. ### 스트림(Streams)을 통한 파이프라인 복원력 강화 - **논리적 추상화**: 물리적인 카프카 토픽 대신 '스트림'이라는 추상화된 단위를 사용합니다. 스트림은 여러 클러스터와 가용 영역(AZ)에 걸쳐 존재할 수 있으며, 생산자와 소비자는 실제 카프카 토폴로지를 알 필요 없이 안정적인 식별자를 통해 데이터에 접근합니다. - **인프라 디커플링**: 애플리케이션이 특정 카프카 리소스에 종속되지 않기 때문에, 인프라 구성을 실시간으로 변경하거나 트래픽을 새로운 토픽/클러스터로 원활하게 재라우팅할 수 있습니다. ### 실시간 트래픽 페일오버 및 리밸런싱 - **무중단 전환**: 특정 클러스터에 문제가 발생하면 제어 계층이 즉시 새로운 토픽을 생성하고 트래픽을 리디렉션합니다. 생산자는 즉시 새 토픽으로 데이터를 보내고, 소비자는 기존 토픽의 잔량을 처리한 후 새 토픽으로 넘어가는 방식을 통해 데이터 유실 없이 전환이 이루어집니다. - **유연한 운영**: 장애 대응뿐만 아니라 클러스터 폐기, 파티션 수 조정, 부하 분산 등의 작업을 애플리케이션 수정 없이 수 초 내에 수행할 수 있습니다. ### 대규모 환경에 최적화된 Assigner와 소비자 모델 - **자체 코디네이터 개발**: 카프카의 기본 그룹 코디네이터는 세션 타임아웃에 의존하여 반응이 느리다는 단점이 있습니다. 이를 대체하기 위해 개발된 'Assigner'는 클러스터 상태와 CPU 부하 등의 메트릭을 실시간으로 모니터링하여 수 초 내에 워크로드를 재분배합니다. - **병렬 처리 극대화**: 엄격한 순서 보장보다는 '최소 한 번(at-least-once)' 전달 모델을 채택하고 소비 단계에서의 순서 제약을 완화했습니다. 이를 통해 대규모 병렬 처리를 구현하고, 순서 보장이 필요한 경우 이벤트 저장소 하단에서 처리하도록 설계했습니다. ### Head-of-line Blocking 문제 해결 및 고급 커밋 로그 - **스트림 레인(Stream Lanes)**: 서비스 품질(QoS)에 따라 트래픽을 독립적인 '레인'으로 분리합니다. 우선순위가 높은 실시간 데이터가 일시적인 트래픽 급증이나 낮은 우선순위 데이터로 인해 지연되는 것을 방지합니다. - **Dead-letter Queue(DLQ)**: 특정 이벤트(Poison Pill)가 처리를 방해할 경우 이를 별도의 DLQ로 격리하여 파티션 전체가 멈추는 현상을 방지합니다. - **메타데이터 기반 커밋**: 카프카의 단일 포인터 오프셋 커밋 방식에서 벗어나, 커밋 메타데이터 공간을 활용해 파티션 내 여러 오프셋 범위를 동시에 추적합니다. 이를 통해 소비자가 이전 데이터를 재처리하는 동안에도 최신 트래픽을 동시에 처리할 수 있는 유연성을 확보했습니다. 카프카를 대규모로 운영할 때는 인프라를 고정된 자산이 아닌 '교체 가능한 소모품'으로 취급하는 제어 계층이 필수적입니다. 데이터독의 사례처럼 물리적 인프라와 논리적 데이터 흐름을 분리하는 추상화 계층을 구축함으로써, 운영 복잡성을 낮추고 대규모 장애 상황에서도 시스템의 연속성을 보장할 수 있습니다.

datadog

Unraveling a Postgres segfault that uncovered an Arm64 JIT compiler bug (새 탭에서 열림)

Postgres 서버에서 발생한 'Segmentation fault(signal 11)' 오류의 원인을 추적하여, 이것이 Postgres 자체의 결함이 아니라 Arm64 아키텍처 환경에서 작동하는 LLVM(JIT 컴파일러)의 버그임을 밝혀낸 과정을 다루고 있습니다. 대규모 파티션 테이블을 조회할 때 JIT가 활성화되면서 크래시가 발생했으며, 이를 통해 업스트림 LLVM의 문제를 해결하는 성과를 거두었습니다. ## JIT 컴파일과 크래시의 상관관계 * **세그멘테이션 폴트 발생**: 최신 버전의 Postgres를 사용 중임에도 특정 쿼리(죽음의 쿼리)를 실행하면 서버가 즉시 종료되는 현상이 발생했습니다. * **스택 오염 확인**: 코어 덤프 분석 결과, 호출 스택(Backtrace)이 비정상적으로 짧고 깨져 있었으며, 이는 JIT 실행 함수인 `ExecRunCompiledExpr` 부근에서 문제가 발생했음을 시사했습니다. * **트리거 조건**: 64개의 파티션과 160만 개 이상의 행을 가진 대규모 테이블을 스캔할 때, Postgres의 비용 기반 휴리스틱에 의해 JIT 컴파일이 활성화되면서 오류가 유발되었습니다. ## Postgres JIT와 LLVM의 역할 * **성능 최적화**: Postgres는 반복적인 SQL 표현식 평가 오버헤드를 줄이기 위해 LLVM을 사용하여 런타임에 네이티브 머신 코드를 생성합니다. * **튜플 디포밍(Tuple Deforming)**: 디스크상의 데이터를 메모리 표현으로 변환하는 과정을 네이티브 코드로 컴파일하여 처리 효율을 극대화합니다. * **컴파일 오버헤드**: JIT는 실행 속도를 높이지만 컴파일 시간이 추가되므로, Postgres는 실행 비용이 높은 쿼리에 대해서만 선택적으로 JIT를 적용합니다. ## 문제 해결 및 근본 원인 파악 * **임시 조치**: `SET jit = off;` 설정을 통해 JIT 기능을 비활성화함으로써 쿼리 지연 시간의 큰 손해 없이 프로덕션 환경의 크래시를 즉시 중단시켰습니다. * **디버깅 결과**: 데이터 복제 및 로컬 환경 재현을 통해 분석한 결과, 특정 조건에서 LLVM이 Arm64 아키텍처용 머신 코드를 잘못 생성하는 버그가 있음을 확인했습니다. * **업스트림 기여**: 이 조사는 단순히 설정을 변경하는 것에 그치지 않고, 어셈블리 수준의 분석을 통해 LLVM 프로젝트의 코드 수정까지 이끌어내는 계기가 되었습니다. ## 권장 사항 Arm64 기반 클라우드 환경에서 Postgres를 운영 중인데 원인을 알 수 없는 Segmentation fault가 발생한다면, 우선적으로 JIT를 비활성화하여 안정성을 확보하십시오. 이후 시스템의 LLVM 라이브러리 버전을 확인하고 관련 아키텍처 패치가 적용되었는지 점검하는 것이 필요합니다.

datadog

Engineering VP spotlight: Ivo Dimitrov (새 탭에서 열림)

데이터독(Datadog)의 엔지니어링 VP 이보 디미트로프(Ivo Dimitrov)는 30년 이상의 경력을 가진 베테랑으로서, 고성능 저수준 시스템 개발자에서 대규모 분산 시스템을 총괄하는 리더로 성장해 온 인물입니다. 그는 마이크로소프트와 링크드인에서 쌓은 대규모 스토리지 인프라 구축 경험을 바탕으로, 현재 데이터독에서 메트릭과 이벤트 플랫폼의 기술적 혁신을 이끌고 있습니다. 기술적 깊이와 조직적 비전 사이의 균형을 강조하는 그의 여정은 복잡한 데이터 시스템을 다루는 엔지니어와 관리자들에게 중요한 통찰을 제공합니다. ### 저수준 시스템 개발에서 엔지니어링 리더십으로의 전환 * 전기 공학 전공 중 실시간 운영체제(RTOS) 커널 기여를 통해 소프트웨어 개발에 입문했으며, 이후 10년간 C/C++ 기반의 고성능 시스템 프로그래밍에 집중했습니다. * 마이크로소프트의 Azure Blob Storage 초기 팀에서 근무하던 중 조직 개편을 계기로 관리직을 맡게 되었으며, 현장에서의 실무 교육과 멘토링을 통해 리더십 역량을 쌓았습니다. * 자신의 업무에만 집중하는 단계를 넘어 타인의 성장을 촉진하고 조직 간의 경계를 조율하는 '오너십(Ownership)'의 가치를 발견하며 매니지먼트의 매력을 느꼈습니다. ### 대규모 분산 스토리지 플랫폼 구축 경험 * 링크드인 재직 당시, 현재까지 전체 데이터셋의 95% 이상을 처리하는 독점 키-값(Key-Value) 저장소인 'Espresso'를 초기 단계에서 성숙한 플랫폼으로 성장시켰습니다. * 파생 데이터 서빙을 위한 'Venice', 오픈소스 블록 스토리지인 'Ambry', 클러스터 관리자인 'Helix' 등 인터넷 규모의 스토리지 인프라 프로젝트들을 주도했습니다. * 이러한 경험을 통해 대규모 레거시 환경의 제약에서 벗어나, 기술적 위험을 감수하고 빠르게 혁신할 수 있는 문화적 유연성의 중요성을 깨달았습니다. ### 데이터독의 분산 데이터 시스템과 기술적 지향점 * 현재 데이터독에서 메트릭(Metrics), 이벤트(Events), 로그 및 트레이스 등 반정형 데이터를 처리하는 분산 데이터 시스템 조직을 총괄하고 있습니다. * 온라인 분석 워크로드에 최적화된 특수 메인 메모리 데이터베이스인 'Driveline'을 통해 시계열 데이터 처리의 효율성을 극대화하고 있습니다. * 서로 다른 도메인별 API를 통합하는 '교차 플랫폼 쿼리(Cross-Platform Queries)' 팀을 운영하여, 고객과 엔지니어 모두가 통일된 인터페이스로 데이터에 접근할 수 있도록 추상화 계층을 구축 중입니다. * 전체 쿼리의 80% 이상을 차지하는 알람(Alerts) 플랫폼을 메트릭 및 이벤트 플랫폼과 통합하여 시스템의 일관성을 높이고 있습니다. **실용적인 제언** 개인 기여자(IC)에서 관리자로 전환할 때는 기술적 전문성을 포기하는 것이 아니라, 그 전문성을 바탕으로 조직의 비전을 설계하고 팀원들이 역량을 발휘할 수 있는 환경을 조성하는 데 집중해야 합니다. 특히 데이터독의 사례처럼 쿠버네티스(Kubernetes) 기반의 현대적 인프라와 실험을 장려하는 문화를 결합할 때, 기술적 부채를 최소화하면서도 폭발적인 성장을 뒷받침하는 시스템을 구축할 수 있습니다.

datadog

2023-03-08 incident: A deep dive into the platform-level recovery | Datadog (새 탭에서 열림)

2023년 3월 발생한 대규모 장애 당시 Datadog은 전체 컴퓨팅 용량의 60%를 상실했으며, 이를 복구하기 위해 계층화된 쿠버네티스 구조에 따른 체계적인 재부팅 전략을 수행했습니다. EU1 리전의 복구 과정에서 팀은 단순한 노드 재가동을 넘어 클라우드 제공업체의 피어링 그룹 제한과 서브넷 IP 고갈이라는 예상치 못한 인프라 한계에 직면했습니다. 이 글은 대규모 인프라 장애 시 제어 평면(Control Plane)의 복구 순서와 백로그 처리를 위한 과도한 스케일 아웃이 유발하는 2차 병목 현상을 상세히 다룹니다. **계층적 쿠버네티스 구조와 복구 전략** * Datadog은 관리 효율성을 위해 '부모(Parent)-자식(Child)' 형태의 계층적 클러스터 구조를 사용합니다. 부모 클러스터는 자식 클러스터의 제어 평면을 포드(Pod) 형태로 호스팅하며, 자식 클러스터는 실제 애플리케이션 워크로드를 실행합니다. * 장애의 원인이 된 시스템 패치(Ubuntu 22.04의 systemd-networkd 관련 이슈)로 인해 네트워크 연결이 끊긴 노드들을 복구하기 위해 엄격한 순서에 따른 재부팅을 진행했습니다. * 복구는 (1) 부모 클러스터 제어 평면 노드 재시작, (2) 부모 노드 위에서 실행되는 자식 클러스터 제어 평면 포드 복구, (3) 수천 개의 자식 클러스터 애플리케이션 노드 재시작 순으로 이루어졌습니다. * 특히 제어 평면에 과부하가 걸리지 않도록 노드 재시작 속도를 조절했으며, 워크로드의 중요도에 따라 클러스터별 복구 우선순위를 설정했습니다. **인프라 확장 제한으로 인한 복구 지연** * 모든 컴퓨팅 용량을 복구한 후, 장애 동안 쌓인 대규모 데이터 백로그를 처리하기 위해 급격한 스케일 아웃(Scale-out)을 시도하는 과정에서 예상치 못한 제한에 부딪혔습니다. * **GCP 네트워크 피어링 제한:** EU1 리전 내 인스턴스 수가 15,500개에 도달하며 구글 클라우드의 네트워크 피어링 그룹 제한에 걸려 약 4시간 동안 추가 인스턴스 생성이 차단되었습니다. 이는 구글 측과의 긴급 협력을 통해 한도를 증설하여 해결했습니다. * **서브넷 IP 주소 고갈:** 로그 및 트레이스 처리를 담당하는 특정 클러스터들이 평상시보다 2배 이상 스케일 아웃을 시도하면서 서브넷 내 사용 가능한 IP 주소가 바닥났습니다. * 평소 IP 사용률을 66% 이하로 유지하도록 모니터링해왔으나, 백로그 처리를 위한 폭발적인 수요는 평상시 변동 폭을 훨씬 상회하는 수준이었습니다. 결과적으로 특정 클러스터들은 약 6시간 동안 최적의 속도로 데이터를 처리하지 못했습니다. **교훈 및 실용적 권장사항** 복구 계획을 세울 때는 단순히 시스템을 정상화하는 것을 넘어, 장애 이후 발생할 '데이터 백로그 처리'를 위한 초과 용량 확보 시나리오를 반드시 고려해야 합니다. 클라우드 제공업체의 하드웨어 리소스 한계뿐만 아니라 네트워크 피어링, 서브넷 IP 할당 범위와 같은 소프트웨어적/구성적 제한 사항을 사전에 파악하고, 극단적인 스케일링 상황에서도 유연하게 대처할 수 있는 여유 용량(Headroom) 설계가 필수적입니다.

datadog

2023-03-08 incident: A deep dive into the platform-level recovery (새 탭에서 열림)

Datadog은 2023년 3월 시스템 패치 오류로 인해 전체 컴퓨팅 용량의 60%를 상실하는 대규모 장애를 겪었으며, 이를 해결하기 위해 EU1 리전을 중심으로 계층적 클러스터 복구 전략을 실행했습니다. 복구 과정에서 쿠버네티스의 부모-자식(Parent-Child) 구조를 활용한 순차적 재부팅을 통해 제어 평면과 워크로드를 정상화했으나, 이후 데이터 백로그 처리를 위한 급격한 확장 단계에서 클라우드 인프라의 물리적 한계에 부딪히기도 했습니다. 결과적으로 이번 사례는 복구 우선순위 설정과 클라우드 공급자의 서비스 임계치 이해가 대규모 인프라 운영에 얼마나 중요한지를 보여줍니다. ## 쿠버네티스 클러스터 계층 구조와 복구 전략 Datadog은 관리 효율성을 위해 쿠버네티스 클러스터 간의 엄격한 계층 구조를 운영하고 있으며, 이는 복구 순서를 결정하는 핵심 요인이 되었습니다. * **부모(Parent) 클러스터**: 각 리전에 존재하며, 다른 클러스터(자식)의 제어 평면(Control Plane) 구성 요소를 파드(Pod) 형태로 호스팅합니다. 부모 클러스터 자체의 제어 평면은 가상 머신(VM)에서 직접 실행됩니다. * **자식(Child) 클러스터**: 실제 Datadog 애플리케이션 워크로드가 실행되는 곳이며, 이들의 제어 평면은 부모 클러스터의 워커 노드 위에서 돌아갑니다. * **복구 메커니즘**: Ubuntu 22.04 패치로 인해 네트워크가 단절된 노드들은 재부팅을 통해 복구가 가능했습니다. 하지만 제어 평면에 접근할 수 없는 상태였기에 가시성 확보와 복구 작업에 초기 난항을 겪었습니다. ## 단계별 클러스터 복구 프로세스 인프라의 의존성을 고려하여 부모 클러스터에서 자식 클러스터 순으로 엄격한 순서에 따라 복구가 진행되었습니다. * **부모 제어 평면 복구 (08:45 UTC 완료)**: 가장 먼저 부모 클러스터의 제어 평면 노드들을 재부팅하여 시스템의 뿌리를 정상화했습니다. * **자식 제어 평면 복구 (09:30 UTC 완료)**: 부모 클러스터 노드 위에서 실행 중인 자식 클러스터용 제어 평면 서비스들을 복구하여 애플리케이션 노드들을 관리할 수 있는 상태로 만들었습니다. * **애플리케이션 노드 복구 (12:05 UTC 완료)**: 수십 개의 클러스터에 퍼져 있는 수천 개의 인스턴스를 재부팅했습니다. 제어 평면의 과부하를 방지하기 위해 워크로드의 중요도에 따라 순차적으로 진행되었습니다. ## 확장 단계에서의 기술적 제약 사항 클러스터 자체는 복구되었으나, 장애 기간 동안 쌓인 데이터 백로그를 처리하기 위해 인프라를 확장하는 과정에서 예상치 못한 한계에 직면했습니다. * **GCP 피어링 그룹 인스턴스 제한**: 백로그 처리를 위해 인스턴스를 늘리던 중, 구글 클라우드(GCP)의 VPC 피어링 그룹당 최대 인스턴스 제한인 15,500개에 도달하여 확장이 중단되었습니다. 이는 문서화된 제한이었으나 극한의 상황에서 임계치에 도달하며 복구를 지연시켰습니다. * **서브넷 IP 주소 고갈**: 로그 및 트레이스 처리를 담당하는 특정 클러스터들이 평상시의 2배 이상으로 오토스케일링을 시도하면서 할당된 서브넷의 IP 주소가 모두 소진되었습니다. * **대응 결과**: Google Cloud 팀의 긴급 지원을 통해 피어링 제한을 상향 조정하고, 리소스 우선순위를 재조정함으로써 대규모 백로그 처리 능력을 확보할 수 있었습니다. 대규모 인프라 장애 복구 시에는 구성 요소 간의 의존성을 명확히 파악하여 복구 순서를 정의하는 것이 필수적입니다. 또한, 평상시에는 도달하기 어려운 클라우드 서비스의 논리적/물리적 임계치(Quota)를 재해 복구 시나리오에 포함하여 확장성 계획을 수립해야 합니다.

datadog

2023-03-08 incident: A deep dive into our incident response (새 탭에서 열림)

2023년 3월 발생한 Datadog의 사상 첫 글로벌 장애는 대규모 복합 시스템을 운영하는 조직에 있어 장애는 '발생 여부'가 아닌 '발생 시기'의 문제임을 다시 한번 각인시켰습니다. Datadog은 수백 명의 엔지니어가 투입된 이 전례 없는 위기 상황에서 '직접 만든 사람이 직접 운영한다(You build it, you own it)'는 원칙과 체계적인 사고 대응(Incident Response) 프로세스를 통해 시스템을 복구할 수 있었습니다. 이번 장애 대응 과정은 기술적 해결을 넘어, 유연한 조직 구조와 비난 없는 문화(Blameless Culture)가 복잡한 시스템의 장애를 해결하는 데 얼마나 결정적인 역할을 하는지 증명했습니다. ### 데이터독의 상시 모니터링 및 대응 체계 * **다중 모니터링 전략:** 서비스 내부 모니터링뿐만 아니라, 플랫폼 전체가 중단된 상황에서도 작동할 수 있도록 외부 인프라에서 독립적으로 구동되는 '아웃 오브 밴드(Out-of-band)' 모니터링을 운영합니다. * **소유권 중심 모델:** 엔지니어가 자신이 구축한 서비스의 온콜(On-call) 업무를 직접 담당하며, 장애 발생 시 수 분 이내에 응답하는 것을 원칙으로 합니다. * **자동화된 협업 환경:** 장애가 선포되면 Slack 앱이 자동으로 전용 채널을 생성하고 상황을 공유하여, 직접 호출되지 않은 엔지니어도 자발적으로 참여할 수 있는 환경을 제공합니다. ### 고난도 장애를 위한 지휘 체계와 역할 분담 * **인시던트 커맨더(Incident Commander, IC):** 고객 영향도가 크거나 여러 팀의 협력이 필요한 고차원 장애 시, 숙련된 시니어 엔지니어가 IC 역할을 맡아 전체 대응을 진두지휘합니다. * **전담 커뮤니케이션 관리:** IC는 복구 작업에 집중하고, 별도의 커뮤니케이션 리드와 고객 연락 담당자(Customer Liaison)가 내부 상황 전파 및 대외 공지를 전담하여 혼선을 방지합니다. * **경영진의 참여:** 심각한 장애 시에는 엔지니어링 임원이 참여하여 비즈니스 맥락에 따른 의사결정을 지원하고 필요한 자원을 즉각 투입합니다. ### 훈련을 통한 숙련도 향상과 자율성 보장 * **낮은 장애 선포 장벽:** 평소 아주 작은 문제라도 장애로 규정하고 대응 프로세스를 가동함으로써, 엔지니어들이 도구와 절차에 익숙해지도록 유도합니다. * **정기적인 온콜 교육:** 모든 엔지니어는 6개월마다 온콜 교육을 이수해야 하며, 여기에는 기술적 절차뿐만 아니라 비난 없는 조사 방식에 대한 교육이 포함됩니다. * **사람 중심의 프로세스:** 미리 정의된 딱딱한 복구 절차(Runbook)에 의존하기보다, 시스템을 가장 잘 아는 엔지니어가 현장에서 최선의 판단을 내릴 수 있도록 자율성을 부여합니다. ### 3월 8일 글로벌 장애의 기술적 분석 및 교훈 * **장애 원인:** `systemd` 업그레이드 과정에서 발생한 예기치 못한 문제가 '무인 업그레이드(Unattended upgrades)'를 통해 확산되며 쿠버네티스 클러스터 실패를 유발했습니다. * **신속한 초기 대응:** 장애 발생 3분 만에 이상이 감지되었고, 30분 이내에 글로벌 장애로 진단되어 대응 체계가 가동되었습니다. * **심리적 안전감의 중요성:** 극심한 스트레스가 동반되는 글로벌 장애 상황에서 비난 없는 문화는 엔지니어들이 위축되지 않고 창의적인 해결책을 찾는 토대가 되었습니다. **실용적인 결론** 대규모 시스템의 장애는 완벽히 막을 수 없으므로, 조직은 **'사람과 문화'**에 투자해야 합니다. 기술적 자동화도 중요하지만, 장애 상황에서 유연하게 대처할 수 있는 숙련된 엔지니어를 양성하고 이들이 비난받을 두려움 없이 복구에 전념할 수 있는 환경을 조성하는 것이 가장 효과적인 재난 대비책입니다. 또한, 평상시 아주 작은 장애라도 공식 프로세스를 거쳐 대응하고 사후 분석(Postmortem)을 작성하는 습관을 통해 조직 전체의 복원력을 높여야 합니다.

datadog

2023-03-08 incident: A deep dive into our incident response | Datadog (새 탭에서 열림)

Datadog은 2023년 3월 발생한 사상 첫 글로벌 서비스 장애를 겪으며 자사의 장애 대응(Incident Response) 프로세스와 문화를 실전에서 검증했습니다. 수백 명의 엔지니어가 투입된 이번 사태를 통해 Datadog은 "직접 만든 사람이 직접 운영한다(You build it, you own it)"는 원칙과 비난 없는 사후 분석(Blameless Postmortem)의 중요성을 다시 한번 확인했습니다. 이 글은 전례 없는 대규모 장애 상황에서 유연한 의사결정과 체계적인 협업 시스템이 어떻게 복구를 견인했는지에 대한 기술적 기록을 담고 있습니다. **Datadog의 장애 모니터링 및 대응 체계** * **소유권 기반 모델:** 모든 엔지니어링 팀은 자신이 구축한 서비스의 운영을 직접 책임지며, 24시간 모니터링 경보에 몇 분 내로 응답해야 하는 "You build it, you own it" 모델을 따릅니다. * **대역 외(Out-of-band) 모니터링:** 플랫폼 자체가 중단될 경우를 대비해 인프라 외부에서 API를 호출하여 사용자 관점에서 상태를 체크하는 별도의 독립적인 모니터링 시스템을 운영합니다. * **Slack 기반 협업:** 장애 발생 시 전용 앱이 Slack 채널을 자동으로 생성하며, 관련 없는 엔지니어도 자유롭게 참여하여 도움을 줄 수 있는 개방적인 환경을 조성합니다. **고심도 장애(High-Severity) 관리 및 역할 분담** * **장애 지휘관(Incident Commander):** 대규모 장애 시 숙련된 시니어 엔지니어가 투입되어 전체 대응을 진두지휘하며, 복구 전략과 커뮤니케이션을 총괄합니다. * **전담 커뮤니케이션 팀:** 고객 지원 매니저와 경영진이 포함된 별도 팀이 구성되어 외부 고객 및 비즈니스 이해관계자에게 정확한 상태 정보를 전달합니다. * **지속적인 훈련:** 장애 선언 문턱을 낮게 설정하여 일상적으로 장애 대응 프로세스를 연습하며, 모든 엔지니어는 6개월마다 필수 리프레시 교육을 이수해야 합니다. **자율성과 비난 없는 조직 문화** * **절차보다 사람 우선:** 고정된 복구 매뉴얼은 복잡한 시스템의 변화 속도를 따라갈 수 없으므로, 엔지니어가 현장에서 상황에 맞는 최선의 판단을 내릴 수 있도록 자율권을 부여합니다. * **비난 없는 문화(Blameless Culture):** 장애의 원인을 개인의 실수가 아닌 시스템의 결함으로 간주하여, 엔지니어가 압박감 속에서도 창의적인 해결책을 찾을 수 있도록 지원합니다. * **강화된 사후 분석:** 모든 고심도 장애 이후에는 자동화된 알림을 통해 상세한 포스트모템 작성을 독려하며, 이를 통해 유사 장애의 재발을 방지합니다. **3월 8일 글로벌 장애 타임라인 및 초기 진단** * **장애 트리거(06:00 UTC):** systemd 업데이트가 시작되면서 예상치 못한 인프라 연쇄 반응이 발생했습니다. * **신속한 감지(06:03~06:18 UTC):** 장애 발생 3분 만에 모니터링 시스템이 문제를 감지했고, 15분 이내에 고심도 장애로 격상되었습니다. * **원인 파악(07:20~11:36 UTC):** 쿠버네티스(Kubernetes) 노드 실패가 글로벌 장애의 핵심 원인임을 식별했으며, 최종적으로 '무인 업데이트(Unattended upgrades)'가 트리거였음을 밝혀냈습니다. * **인프라 복구(12:05~19:00 UTC):** EU1 및 US1 리전의 컴퓨팅 용량을 순차적으로 복구하고 재발 방지를 위한 완화 조치를 적용하여 전체 인프라를 정상화했습니다. 대규모 시스템을 운영하는 조직이라면 고정된 대응 매뉴얼에 의존하기보다 엔지니어의 자율성을 존중하고, 장애를 학습의 기회로 삼는 비난 없는 문화를 구축하는 것이 중요합니다. 특히 플랫폼 전체가 마비되는 최악의 상황을 대비해 인프라 외부에서 독립적으로 작동하는 '대역 외 모니터링' 체계를 반드시 갖출 것을 추천합니다.

datadog

2023-03-08 incident: A deep dive into the platform-level impact (새 탭에서 열림)

이 글은 2023년 3월 8일 발생한 Datadog의 대규모 서비스 장애 원인을 분석하고 있습니다. 장애의 근본 원인은 Ubuntu 22.04에 포함된 **systemd-networkd의 기본 동작 변경**과 **자동 보안 업데이트(unattended-upgrades)**가 결합되어, 전 세계 모든 리전의 호스트에서 네트워크 라우팅 규칙이 동시에 삭제되었기 때문입니다. 결과적으로 리전 간 격리 원칙에도 불구하고 클라우드 제공업체와 무관하게 전사적인 네트워크 마비가 발생했습니다. ### systemd-networkd의 동작 변경과 잠복된 위험 * **새로운 기본값 도입:** systemd v248부터 `systemd-networkd`가 시작될 때 자신이 인식하지 못하는 모든 IP 규칙(IP rules)을 삭제(flush)하는 동작이 추가되었습니다. * **버전별 차이:** 이전 LTS 버전인 Ubuntu 20.04(systemd v245)에서는 이 문제가 없었으나, Datadog이 도입한 **Ubuntu 22.04(systemd v249)**는 이 새로운 동작이 기본값으로 설정되어 있었습니다. * **발견 지연의 이유:** 이 현상은 호스트가 처음 생성될 때가 아니라, 실행 중인 상태에서 `systemd-networkd`가 **재시작**될 때만 발생합니다. 평상시에는 재시작할 일이 거의 없었기 때문에 대규모 배포 과정에서도 위험이 감지되지 않았습니다. ### 자동 업데이트(Unattended Upgrades)와 트리거 * **보안 패치의 배포:** 2023년 3월 7일, systemd의 CVE 취약점 해결을 위한 패치가 Ubuntu 저장소에 배포되었습니다. * **자동 업데이트의 동작:** Datadog 서버들은 Ubuntu 기본 설정에 따라 `unattended-upgrades`가 활성화되어 있었으며, 매일 정해진 시간(06:00~07:00 UTC 사이)에 보안 업데이트를 수행하도록 설정되어 있었습니다. * **네트워크 규칙 삭제:** 보안 패치가 설치되면서 `systemd-networkd` 서비스가 재시작되었고, 이 과정에서 Kubernetes 네트워킹 등에 필요한 커스텀 IP 라우팅 규칙들이 "알 수 없는 규칙"으로 간주되어 모두 삭제되었습니다. ### 전 리전 동시 장애 발생 원인 * **일관된 구성의 역설:** 모든 리전이 동일하게 Ubuntu 22.04를 사용하고 동일한 업데이트 타이머 설정을 가지고 있었기 때문에, 리전 간의 물리적 격리에도 불구하고 업데이트와 그에 따른 네트워크 마비가 전 세계적으로 거의 동시에 일어났습니다. * **점진적 배포의 한계:** Datadog은 평소 인프라 변경 시 리전별로 단계적 배포를 수행하지만, OS 패키지 저장소에서 직접 내려받는 자동 보안 업데이트는 이러한 통제된 배포 프로세스를 우회하여 직접 호스트에 적용되었습니다. 이 사건은 인프라의 안정성을 위해 도입한 **자동 보안 패치**가 오히려 시스템의 기저 동작(low-level behavior) 변경과 맞물려 거대한 단일 장애점(Single Point of Failure)이 될 수 있음을 시사합니다. 운영 환경에서는 OS 패키지 업데이트를 포함한 모든 변경 사항이 통제된 파이프라인과 단계적 배포 전략을 거치도록 관리하는 것이 중요합니다.

datadog

2023-03-08 incident: A deep dive into the platform-level impact | Datadog (새 탭에서 열림)

2023년 3월 8일 발생한 Datadog의 전사적 서비스 장애는 시스템 관리 데몬인 systemd의 동작 변경과 자동 보안 업데이트 설정이 결합되어 발생한 이례적인 사건입니다. Ubuntu 22.04 환경에서 systemd-networkd가 재시작될 때 기존 IP 라우팅 규칙을 모두 삭제하는 새로운 기본 동작이 활성화되었고, 이것이 전 지역 노드에 동시다발적인 자동 패치로 실행되면서 대규모 네트워크 중단으로 이어졌습니다. 이 사고는 인프라 전반에 걸친 자동화된 변경 관리와 점진적 배포 원칙이 보안 패치라는 예외 상황에서 어떻게 무력화될 수 있는지를 보여줍니다. **systemd-networkd의 IP 규칙 삭제 동작** * 2020년 12월 배포된 systemd v248부터 `systemd-networkd`는 시작 시 자신이 파악하지 못한 모든 IP 규칙(IP rules)을 삭제(flush)하는 동작을 도입했습니다. * 이후 v249에서 `ManageForeignRoutingPolicyRules` 설정을 통해 이 동작을 거부할 수 있는 옵션이 추가되었으나, 기본값은 여전히 기존 규칙을 삭제하는 방식이었습니다. * Datadog이 마이그레이션 중이던 Ubuntu 22.04는 이 위험한 기본 설정이 포함된 systemd v249를 사용하고 있었습니다. **보안 패치와 자동 업데이트의 결합** * 2023년 3월 7일, systemd의 CVE 취약점을 해결하기 위한 보안 패치가 Ubuntu 저장소에 업데이트되었습니다. * Datadog의 서버들은 Ubuntu의 기본 설정인 `unattended-upgrades`를 사용하고 있었으며, 이는 매일 특정 시간(06:00 UTC)에 보안 업데이트를 자동으로 수행하도록 설정되어 있었습니다. * 이 보안 패치가 설치되면서 `systemd-networkd` 서비스가 재시작되었고, 그 즉시 노드의 핵심적인 네트워크 라우팅 규칙들이 모두 삭제되었습니다. **점진적 배포 전략의 무력화** * Datadog은 평소 새로운 OS나 설정을 도입할 때 실험용 클러스터부터 시작해 스테이징, 소규모 리전, 대규모 리전 순으로 수주에 걸쳐 점진적으로 배포하는 엄격한 프로세스를 따릅니다. * 하지만 시스템 레벨의 자동 업데이트(unattended-upgrades)는 이러한 점진적 배포 통제를 우회하여 전 세계 모든 리전의 노드에 거의 동시에 적용되었습니다. * 결과적으로 전체 서버의 90% 이상을 차지하던 Ubuntu 22.04 노드들이 동시다발적으로 네트워크 불능 상태에 빠지게 되었습니다. **실용적인 교훈과 권장사항** 운영 환경에서 OS 배포판을 업그레이드할 때는 시스템 구성 요소(특히 systemd와 같은 핵심 데몬)의 기본 동작 변경 사항을 상세히 검토해야 합니다. 또한, 보안을 위한 자동 업데이트라 할지라도 인프라 전체에 동시에 적용되는 방식은 위험할 수 있으므로, 업데이트 주기를 리전별로 분산하거나 자체적인 패키지 미러를 통해 보안 패치 역시 점진적 배포 파이프라인의 통제하에 두는 것이 권장됩니다.

datadog

Engineering Spotlight: Tay Nishimura (새 탭에서 열림)

데이터독(Datadog)의 인프라 엔지니어 테이 니시무라(Tay Nishimura)의 커리어 여정은 자신만의 사고방식에 적합한 직무를 찾는 과정의 중요성을 보여줍니다. 수학 전공자이자 시각적 사고를 선호하는 그녀는 일반적인 소프트웨어 개발 속도 경쟁에서 어려움을 겪었으나, 네트워크 시뮬레이터 'ToyNet' 개발을 통해 자신의 강점을 증명하며 SRE(Site Reliability Engineering)로 성공적으로 전향했습니다. 이 글은 전형적인 엔지니어의 틀에 갇히지 않고 자신의 고유한 특성을 기술적 자산으로 승화시킨 과정을 다룹니다. **학계와 실무 사이의 괴리와 시각적 사고** * 수학 전공자로서 증명 위주의 엄격한 사고에 익숙했던 테이는 효율과 속도를 중시하는 애자일 개발 환경에서 초기에 성능 피드백 문제로 어려움을 겪었습니다. * 코드를 바로 작성하기보다 코드를 그림으로 변환하여 논리를 검증한 뒤 다시 코드로 옮기는 '시각적 사고' 방식을 고수했는데, 이는 신중함을 더해주었지만 작업 속도를 늦추는 요인이 되기도 했습니다. * 일반적인 개발 직무에서는 속도 저하로 평가받았던 그녀의 신중함과 모든 실패 모드를 고려하는 태도가, 오히려 시스템의 안정성을 책임지는 SRE 직무에는 핵심적인 역량이 될 수 있음을 깨달았습니다. **ToyNet 개발과 SRE로의 전환** * 팬데믹 기간 중 해고를 겪었으나 이를 계기 삼아 평소 관심 있던 네트워크 기술을 공부하며, 수감자와 베테랑을 위한 교육 프로그램 'Project Reclass'를 시작했습니다. * 인터넷 사용이 제한된 교도소 환경에서도 네트워크 실습이 가능하도록 React, Flask, Mininet을 활용해 컨테이너 기반 네트워크 에뮬레이션 플랫폼인 'ToyNet'을 설계했습니다. * ToyNet은 테이의 클라우드 배포 역량과 기술적 깊이를 증명하는 강력한 포트폴리오가 되었으며, 이는 데이터독에 SRE로 합류하는 결정적인 발판이 되었습니다. **데이터독에서의 적응과 시각적 분석의 힘** * 데이터독 합류 후 Kubernetes, 카오스 엔지니어링, Go 언어 등 생소한 기술 스택을 빠르게 습득하며 인프라 엔지니어로서 전문성을 쌓았습니다. * 데이터독의 카오스 자동화 도구인 'Chaos Controller'를 오픈소스화하는 과정에서, 복잡한 코드베이스를 상자와 화살표로 시각화하여 구조를 파악하는 자신만의 분석 방식을 적극적으로 활용했습니다. * 과거에는 약점으로 치부되었던 '꼼꼼하고 신중한 속도'가 이제는 대규모 시스템의 신뢰성을 보장하고 복잡한 기술 문제를 해결하는 강력한 무기가 되었습니다. 자신이 업계의 전형적인 틀(Cookie-cutter shape)에 맞지 않는다고 느낄 때, 포기하기보다는 자신의 독특한 사고방식이 빛을 발할 수 있는 세부 분야를 찾는 것이 중요합니다. 테이 니시무라의 사례처럼 사이드 프로젝트를 통해 실질적인 기술력을 증명하고 이를 직무 전환의 교두보로 활용하는 전략은 커리어 고민을 겪는 엔지니어들에게 실질적인 영감을 줍니다.