Datadog / database-design

5 개의 포스트

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) 설계가 필수적입니다.

Our journey taking Kubernetes state metrics to the next level | Datadog (새 탭에서 열림)

Datadog은 대규모 Kubernetes 환경에서 오픈소스 도구인 kube-state-metrics(KSM)를 운영하며 겪은 확장성 문제를 해결하기 위해 오픈소스 커뮤니티에 직접 기여하여 성능을 대폭 개선했습니다. 기존 KSM은 수천 개의 노드와 수만 개의 포드가 있는 환경에서 지표 수집 시간이 수십 초에 달하고 데이터 용량이 비대해지는 성능 저하 문제를 안고 있었습니다. 이를 해결하기 위해 KSM v2 개발 과정에 참여하여 지표 생성 프로세스를 최적화함으로써 수집 속도를 15배 향상하고 대규모 클러스터에서도 고해상도 데이터를 안정적으로 확보할 수 있게 되었습니다. **KSM의 작동 원리와 기존의 한계** * KSM은 Kubernetes API 서버를 리스닝하며 객체의 상태 지표를 생성하는 서비스로, 인포머(Informer) 패턴을 사용해 클러스터 수준의 메타데이터를 OpenMetrics 형식으로 노출합니다. * Datadog 에이전트는 15초마다 `/metrics` 엔드포인트를 크롤링하여 데이터를 수집하며, 필요에 따라 `label_joins` 설정을 통해 메타데이터를 결합해 지표의 가독성을 높입니다. * 하지만 기존 구조에서는 쿼리 시점에 대량의 데이터가 한꺼번에 덤프되고, 지표 생성 과정에 개입할 수 있는 훅(hook)이 부족하여 성능 확장에 제약이 있었습니다. **대규모 환경에서의 확장성 병목 현상** * 리소스당 지표 생성량을 분석한 결과 노드는 약 9개, 포드는 약 40개의 지표를 생성하며, 수만 개의 포드가 있는 환경에서는 매 수집 주기마다 수백만 개의 지표를 처리해야 합니다. * 이로 인해 네트워크 호출 시간이 수십 초로 늘어나고 데이터 크기가 수십 메가바이트에 달하게 되어, 지표의 정밀도를 낮추거나 수집 주기를 강제로 늦춰야 하는 상황이 발생했습니다. * Datadog은 이를 해결하기 위해 포드, 노드, 기타 리소스별로 KSM 배포를 물리적으로 분리하는 전략을 사용했으나 이는 임시방편에 불과했습니다. **오픈소스 기여를 통한 성능 최적화** * Datadog 팀은 내부적인 수정을 넘어 KSM v2.0.0의 메인 커뮤니티와 협력하여 지표 생성 로직과 빌더(Builder) 구조를 근본적으로 개선했습니다. * 결과적으로 지표 수집 프로세스 소요 시간을 기존 대비 15배 단축하는 성과를 거두었으며, 이는 대규모 인프라 운영의 핵심적인 전환점이 되었습니다. * 이러한 경험은 오픈소스 커뮤니티에 기여하는 것이 개별 기업의 인프라 문제를 해결함과 동시에 기술적 생태계 전체의 성능을 끌어올리는 가장 효과적인 방법임을 시사합니다. **실용적인 결론 및 추천** 대규모 Kubernetes 클러스터를 운영 중이라면 KSM v2 이상의 버전을 채택하여 최적화된 지표 수집 성능을 확보하는 것이 필수적입니다. 또한 단일 KSM 배포에서 성능 저하가 발생할 경우, 본문에서 언급된 것처럼 리소스 유형별(Collectors)로 배포를 분리하여 부하를 분산하는 전략을 검토해 보시기 바랍니다.

What product designers can learn from explanatory journalism | Datadog (새 탭에서 열림)

훌륭한 제품 디자이너가 되기 위해서는 단순히 결과물을 만드는 것을 넘어, 디자인의 배경과 맥락을 효과적으로 전달하는 '설명가'의 역량이 필요합니다. 이는 단편적인 사실 보도를 넘어 복잡한 사건의 맥락을 짚어주는 '해설 저널리즘(Explanatory Journalism)'과 맥을 같이 하며, 디자이너는 파편화된 정보를 통합하여 이해관계자들에게 올바른 맥락을 제공해야 합니다. 결과적으로 철저한 기록을 통해 구축한 '페이퍼 트레일(Papertrail)'은 디자인 의사결정의 강력한 근거가 되며 팀 전체의 이해도를 높이는 핵심 자산이 됩니다. ## 최신 정보보다 중요한 가치에 집중하기 * 뉴스 피드나 소셜 미디어처럼 실시간으로 쏟아지는 정보(CS 티켓, 회의록, 고객 통화 등)는 '최신성'을 이유로 판단력을 흐리게 만들 수 있습니다. * 디자이너는 이러한 파편화된 피드백을 한데 모으고 출처를 명확히 함으로써, 단순한 최신 요청이 아닌 비즈니스 가치가 높은 '중요한 문제'를 식별해야 합니다. * 다수의 사용자가 공통으로 요청하는 사항을 수치화하고 우선순위를 정하는 과정을 통해, 근거 없는 편향에 빠지지 않고 객관적인 의사결정을 내릴 수 있습니다. ## 맥락의 붕괴(Context Collapse) 방지 * '맥락의 붕괴'는 소셜 미디어처럼 다양한 청중이 하나의 메시지를 각기 다른 맥락으로 받아들일 때 발생하며, 이는 기업 내 협업 과정에서도 빈번하게 나타납니다. * 고객 지원 팀의 티켓, 영업 팀의 요구사항, 연구원의 인터뷰 노트, 경영진의 목표 등 서로 다른 맥락의 정보들을 한곳에 수집하고 통합하는 작업이 선행되어야 합니다. * 디자인 리뷰 시 단순히 결과물만 보여주는 것이 아니라, 수집된 다양한 요구사항들이 최종 솔루션에 어떻게 반영되었는지 각 이해관계자의 언어와 맥락에 맞춰 설명해야 합니다. ## 페이퍼 트레일(Papertrail)을 통한 정보의 확장과 수축 * 디자인 프로세스는 방대한 리서치와 데이터를 수집하는 '확장' 단계와 이를 핵심 요구사항으로 정제하는 '수축' 단계로 나뉩니다. * 인터뷰 기록, 리서치 테마 등을 문서화한 '페이퍼 트레일'을 구축하면 문제 정의가 명확해질 뿐만 아니라, 솔루션의 제약 조건을 설정하는 데 큰 도움이 됩니다. * 풍부한 배경 자료를 스스로 잘 이해하고 있을 때 비로소 타인을 위한 간결하고 효과적인 요약이 가능해지며, 필요시 상세 근거로 바로 연결할 수 있는 신뢰성을 확보하게 됩니다. ## 제품 디자이너와 PM의 역할 협업 * 제품 디자이너는 워크플로우, 인터랙션 디자인, 기능의 세부적인 사용성(Usability)에 집중하여 맥락을 구축해야 합니다. * 이는 제품 관리자(PM)가 수익 모델, 개발 비용, 비즈니스 우선순위 등 사업적 측면에 집중할 수 있도록 돕는 역할을 합니다. * 사용자 경험(UX)의 소유권을 가진 디자이너라면 리서치부터 사후 관리까지 모든 과정의 '맥락'을 관리하는 책임감을 가져야 합니다. 성공적인 디자인을 위해서는 리서치 단계에서부터 인터뷰 대상자의 배경, 핵심 인사이트, 후속 조치 등을 꼼꼼히 기록하는 습관을 들여야 합니다. 이러한 '기록의 흔적'은 본인뿐만 아니라 팀원들에게도 디자인 결정의 타당성을 증명하는 가장 강력한 도구가 될 것입니다.

How Datadog uses Datadog to gain visibility into the Datadog user experience | Datadog (새 탭에서 열림)

Datadog의 프로덕트 디자이너들은 사용자 경험을 개선하기 위해 인터뷰와 같은 정성적 조사뿐만 아니라, 자사 도구를 직접 활용하는 '도그푸딩(Dogfooding)'을 통해 정량적 데이터를 수집합니다. RUM(Real User Monitoring)과 로그 분석을 통해 실제 사용자의 행동 패턴을 파악함으로써, 디자인 가설을 검증하고 데이터에 기반한 의사결정을 내리고 있습니다. 이러한 접근 방식은 사용자 입장에서 제품을 이해하고 협업 효율을 높이는 데 큰 기여를 합니다. ## 데이터 기반의 고정폭 글꼴(Monospace Font) 선정 * 로그, 스택 트레이스, 소스 코드 등 정보 밀도가 높은 데이터를 일관되게 보여주기 위해 특정 고정폭 글꼴을 도입할 필요성이 제기되었습니다. * 기존에는 시스템 폰트에 의존했기 때문에, 새로운 폰트 도입 시 발생할 수 있는 레이아웃의 시각적 변화를 최소화하고자 사용자들이 현재 가장 많이 보고 있는 폰트가 무엇인지 파악해야 했습니다. * CSS Font Loading API와 Datadog RUM을 결합하여 사용자의 브라우저에 실제 로드된 폰트 정보를 수집하고 대시보드화했습니다. * 분석 결과 'Roboto Mono'를 최종 후보로 선정하여 앱 전체에 적용했으며, 배포 후에도 RUM을 통해 의도한 대로 폰트가 출력되는지 성공적으로 검증했습니다. ## 사용자 인터랙션 분석을 통한 컴포넌트 간소화 * 패널 크기를 조절하는 'DraggablePane' 컴포넌트의 핸들이 너무 좁아 다양한 기능을 담기에 UI가 복잡해지는 문제가 있었습니다. * 어떤 기능이 실제로 사용되는지 확인하기 위해 커스텀 로거를 심어 각 버튼(최소화, 최대화 등)의 클릭 빈도를 추적했습니다. * 로그 분석 결과 최소화 및 최대화 버튼의 사용량이 거의 없다는 사실을 발견하고, 해당 버튼들을 제거하는 대신 핸들 더블 클릭 이벤트로 기능을 대체하여 UI를 간소화했습니다. ## 입력 오류 데이터 분석을 통한 구문 지원 확장 * 사용자가 자유롭게 시간 범위를 텍스트로 입력할 수 있는 'DateRangePicker'를 개발했으나, 초기에는 지원하는 구문이 한정적이어서 사용자 의도를 정확히 파악하지 못하는 경우가 많았습니다. * 시스템이 해석하지 못한 '잘못된 입력(invalid input)' 데이터와 해당 입력이 발생한 페이지, 국가 등의 정보를 로그로 수집하여 패턴을 분석했습니다. * 분석 결과 다수의 사용자가 'weeks'라는 키워드를 포함한 구문(예: last 1 week)을 입력하고 있음을 확인했습니다. * 해당 키워드를 지원하도록 구문 분석 로직을 업데이트한 결과, 입력 에러율이 기존 10%에서 5~6%로 즉각 감소하는 성과를 거두었습니다. 사용자 경험(UX) 디자인 과정에서 데이터 모니터링 도구를 활용하는 것은 단순히 수치를 확인하는 것을 넘어, 디자이너가 개발자와 같은 언어로 소통하고 객관적인 근거로 제품을 개선할 수 있게 해줍니다. 특히 실시간 로그와 에러 데이터를 추적하는 환경을 구축하면 사용자 피드백을 기다리지 않고도 제품의 미비점을 선제적으로 발견하여 수정할 수 있습니다.

Performance improvements in the Datadog Agent metrics pipeline | Datadog (새 탭에서 열림)

Datadog은 에이전트가 더 적은 CPU를 사용하면서도 더 많은 데이터를 빠르게 처리할 수 있도록 메트릭 식별 키(Metric Context) 생성 알고리즘을 최적화했습니다. Go 언어의 프로파일링 도구를 활용해 병목 지점인 태그 정렬 과정을 찾아냈으며, 특수화된 알고리즘과 해시 전략 수정을 통해 처리량을 대폭 개선했습니다. 결과적으로 동일한 리소스 내에서 더 많은 DogStatsD 메트릭을 수집하고 처리할 수 있는 성능 효율성을 달성했습니다. ## CPU 프로파일링을 통한 병목 지점 파악 * Go 언어의 런타임 도구와 플레임그래프(Flamegraph)를 사용하여 고부하 상황에서의 CPU 사용량을 분석했습니다. * 분석 결과, DogStatsD 서버가 샘플을 수신할 때 호출되는 `addSample`과 `trackContext` 함수가 가장 많은 CPU를 점유하고 있음을 확인했습니다. * 구체적으로 메트릭의 고유성을 보장하기 위해 수행하는 태그 정렬 알고리즘(`util.SortUniqInPlace`)이 전체 성능의 주요 병목 원인으로 지목되었습니다. ## 기존 메트릭 컨텍스트 생성 방식의 한계 * 메트릭 컨텍스트는 메트릭 이름과 태그 조합을 해시화하여 RAM 내 저장소의 키로 사용하며, 동일한 메트릭은 항상 같은 키를 생성해야 합니다. * 일관된 해시 생성을 위해 모든 태그를 정렬하고 중복을 제거하는 과정을 거치는데, 이 정렬 작업의 비용이 메트릭 양에 비례해 급격히 증가합니다. * 해시 충돌을 방지하면서도 수천 개의 메트릭을 초당 처리할 수 있을 만큼 알고리즘의 원시 성능이 매우 중요한 구조였습니다. ## 성능 향상을 위한 단계적 최적화 전략 * **코드 특수화(Specialization):** 태그의 개수에 따라 서로 다른 정렬 알고리즘을 적용하도록 최적화하여, 가장 빈번하게 발생하는 케이스에 대해 최상의 성능을 내도록 개선했습니다. * **해시 알고리즘 교체:** 마이크로 벤치마크를 통해 속도와 고유성이 뛰어난 **Murmur3** 알고리즘을 채택했습니다. * **Go 런타임 최적화 활용:** 기존 128비트 해시 대신 64비트 메트릭 컨텍스트를 사용하도록 변경했습니다. 이를 통해 Go 런타임의 최적화된 맵 접근 함수(`mapassign_fast64`, `mapaccess2_fast64`)가 작동하게 되어 맵 조작 속도를 높였습니다. * **근본적인 디자인 재설계:** 정렬이 성능의 가장 큰 장애물임을 인지하고, 정렬과 중복 제거에 의존하던 기존 알고리즘을 완전히 대체하는 새로운 설계 방식을 도입했습니다. 성능 최적화를 위해서는 단순히 하드웨어 사양을 높이는 대신, Go의 `pprof`와 같은 도구로 핫 패스(Hot path)를 정확히 진단하는 것이 우선입니다. 특히 대규모 데이터를 처리하는 시스템이라면 언어 런타임이 제공하는 하위 수준의 최적화(예: 특정 비트 수에 따른 맵 최적화)를 적극적으로 활용하고, 당연하게 여겨지던 정렬과 같은 알고리즘을 의심하여 재설계하는 과정이 필요합니다.