데이터베이스 설계

191 개의 포스트

datadog원문

Datadog의 3세대 이벤트 스토어, Husky를 소개합니다 (새 탭에서 열림)

데이터독(Datadog)은 폭발적인 데이터 증가와 다양한 제품군의 요구사항을 충족하기 위해 새로운 이벤트 저장 시스템인 '허스키(Husky)'를 구축했습니다. 기존 시스템은 대규모 멀티테넌트 환경에서 발생하는 성능 간섭과 고비용 구조, 데이터 삭제의 어려움이라는 한계에 봉착했으며, 이를 해결하기 위해 저장소와 클러스터링을 분리하고 효율성을 극대화한 새로운 아키텍처가 필요했습니다. 결과적으로 허스키는 로그, RUM, 보안 데이터 등 다양한 고카디널리티(High-cardinality) 이벤트를 경제적이고 안정적으로 처리할 수 있는 기반이 되었습니다. ### 메트릭과 로그의 기술적 차이 * **메트릭의 효율성:** 메트릭 시스템은 데이터를 `<timeseries_id, timestamp, float64>` 형태의 튜플로 사전 집계하여 저장합니다. '델타-오브-델타(delta-of-delta)' 인코딩을 통해 16바이트 데이터를 2바이트 미만으로 압축할 수 있어 매우 효율적이지만, 태그 카디널리티에 제한이 있습니다. * **로그의 복잡성:** 로그는 이벤트당 킬로바이트(KB) 단위의 크기를 가지며, UUID나 스택 트래적(stack traces)과 같은 고카디널리티 데이터를 포함해야 합니다. 로그 시스템은 모든 문맥(context)을 보존하면서 쿼리 시점에 임의의 차원으로 집계할 수 있는 능력이 필수적입니다. ### 초기 아키텍처의 한계와 클러스터링 개선 * **초기 버전의 문제:** 멀티테넌트 클러스터 내에서 단일 노드의 장애나 특정 테넌트의 과부하가 전체 클러스터의 가용성을 떨어뜨리는 '노이즈 네이버(Noisy Neighbor)' 문제가 빈번했습니다. * **저장소와 클러스터링 분리:** 두 번째 버전에서는 저장 엔진과 클러스터링 로직을 분리했습니다. '샤드 라우터(Shard Router)'가 카프카(Kafka)를 통해 데이터를 샤드 단위로 정리하고, 각 노드는 독립적인 유닛으로 동작하게 하여 장애 전파를 차단했습니다. * **커스텀 쿼리 엔진:** 여러 샤드에 분산된 데이터를 쿼리하고 부분 집계 결과를 병합하는 전용 엔진을 도입하여 신뢰성을 높였습니다. ### 플랫폼 급성장과 새로운 요구사항의 등장 * **제품군의 확장:** 로그뿐만 아니라 네트워크 성능 모니터링(NPM), 실제 사용자 모니터링(RUM), 프로파일러 등 다양한 제품이 출시되면서 저장해야 할 이벤트의 양과 종류가 급증했습니다. * **장기 보관 비용 문제:** 가끔 쿼리하지만 장기간 보관이 필요한 데이터를 기존 아키텍처에서 운영하는 것은 비용 효율성이 낮았습니다. * **데이터 관리 편의성:** GDPR 대응을 위한 특정 데이터의 정밀한 삭제 기능과 테넌트 간의 완전한 자원 격리에 대한 요구가 강해졌습니다. ### 허스키(Husky)의 설계 방향 * **범용 이벤트 저장소:** 로그와 유사한 구조를 가진 모든 유형의 데이터를 수용할 수 있는 유연한 스키마 구조를 지향합니다. * **비용 효율적인 확장:** 스토리지 계층화를 통해 자주 사용되지 않는 데이터는 저렴한 저장소에 보관하면서도 즉시 쿼리가 가능한 구조를 구축했습니다. * **격리 및 제어권 강화:** 특정 테넌트의 트래픽 급증이 다른 테넌트의 쿼리 성능에 영향을 주지 않도록 정교한 할당량(Quota) 관리와 격리 메커니즘을 포함했습니다. 시스템을 설계할 때 단순히 현재의 성능 개선에만 집중하는 것이 아니라, 향후 데이터의 기하급수적인 증가와 다양한 제품 요구사항(비용, 삭제, 격리)을 수용할 수 있는 아키텍처 유연성을 확보하는 것이 중요합니다. 특히 대규모 멀티테넌트 환경에서는 '폭포수 장애'를 방지하기 위해 각 구성 요소를 최대한 독립적으로 격리하는 설계가 필수적입니다.

datadog원문

Datadog IT 팀이 계정 비활성화와 SaaS 지출 관리를 자동화한 방법 (새 탭에서 열림)

데이터독(Datadog)은 급격히 증가하는 SaaS 라이선스 비용을 최적화하고 보안 리스크를 줄이기 위해 기존의 내부 도구인 'Clarity'를 'Clarity License Manager(CLM)'로 확장했습니다. 이 시스템은 여러 SaaS 애플리케이션의 사용자 활동을 자동으로 모니터링하여 비활성 계정을 식별하고, 사용자 알림 및 자동 비활성화 프로세스를 통해 운영 효율성을 극대화합니다. 결과적으로 데이터독은 불필요한 비용 지출을 막는 동시에, 미사용 계정으로 인한 보안 위협을 효과적으로 제거하고 직원들에게는 원활한 계정 복구 경험을 제공하고 있습니다. ### 기존 라이선스 관리의 문제점 * 과거 IT 지원 팀은 분기별로 수동 감사를 수행하여 라이선스 사용 현황을 파악했으나, 이는 매우 비효율적이고 지루한 작업이었습니다. * IT 직원이 사용자에게 일일이 연락해 계정 유지 여부를 확인해야 했기 때문에 직원들의 업무 흐름을 방해하는 등 사용자 경험이 저하되었습니다. * 실시간 데이터에 기반한 인사이트가 부족하여 소프트웨어 구매 시 데이터에 기반한 의사결정을 내리기 어려웠습니다. ### 자동화된 라이선스 최적화 워크플로우 * 개별 SaaS API와 Google Workspace SAML 감사 로그를 결합하여 사용자 활동 데이터를 유연하고 보안상 안전한 방식으로 수집합니다. * 특정 기간(기본 90일) 동안 앱을 사용하지 않은 사용자에게 Slack과 이메일로 자동 알림을 발송하여 활성 상태 유지에 필요한 구체적인 행동을 안내합니다. * 사용자가 안내된 조치를 취하지 않을 경우 CLM이 해당 SaaS 계정을 자동으로 비활성화하며, 이 데이터는 Amazon RDS(Postgres)에 저장되어 관리됩니다. * 재접속이 필요한 직원을 위해 티켓 시스템(Freshservice)과 연동된 자동 복구 워크플로우를 구축하여, 단 몇 초 만에 이전 권한 그대로 계정을 복구할 수 있게 했습니다. ### 마이크로서비스 및 어댑터 기반 아키텍처 * Python과 AWS Lambda를 기반으로 한 마이크로서비스 구조를 채택하여 SaaS 환경의 확장에 유연하게 대응하고 시스템 회복 탄력성을 높였습니다. * 각 SaaS 애플리케이션의 고유한 로직을 처리하기 위해 '애플리케이션별 어댑터(Adapter)' 패턴을 도입했습니다. * 어댑터는 사용자 조회, 로그인 데이터 획득, 활성화/비활성화 등 공통 인터페이스를 제공하여 메인 마이크로서비스 로직과 개별 앱의 복잡한 API 통신 로직을 분리합니다. * 이러한 설계는 단일 책임 원칙(Single Responsibility)을 준수하며 코드의 재사용성을 높이고, 새로운 SaaS 도구를 시스템에 빠르게 통합할 수 있게 합니다. 기업의 규모가 커질수록 수동 라이선스 관리는 비용 누수와 보안 취약점을 야기하는 큰 부담이 됩니다. Datadog의 CLM 사례처럼 사용자 활동 데이터를 기반으로 비활성 계정을 자동 관리하고, 셀프 서비스 형태의 복구 프로세스를 갖추는 것은 비용 절감과 보안 강화라는 두 마리 토끼를 잡을 수 있는 실무적인 해법이 될 수 있습니다.

datadog원문

언제나 DNS 문제다… 그렇지 않은 경우를 제외하면: gRPC, Kubernetes, AWS 네트워킹 심층 분석 (새 탭에서 열림)

데이터독(Datadog)의 엔지니어들이 서비스 업데이트 중 발생한 원인 불명의 DNS 에러를 추적하며, 쿠버네티스 네트워킹과 AWS VPC 환경의 복잡한 상호작용을 해결해 나가는 과정을 다룬 글입니다. 로그상으로는 단순한 DNS 문제처럼 보였으나, 실제 원인은 AWS VPC의 연결 추적(conntrack) 한계와 하위 네트워크 레이어의 패킷 드랍에 있었습니다. 이 글은 고도화된 인프라 환경에서 단순히 리소스를 증설하는 것보다 커널 수준의 메트릭과 VPC 플로우 로그를 통한 심층 분석이 왜 중요한지를 잘 보여줍니다. **DNS 오류의 표면적 원인과 NodeLocal DNSCache** * 서비스 배포 시마다 DNS 에러가 발생하여 쿼리 지연과 모니터링 성능 저하가 나타났습니다. * 쿠버네티스의 `node-local-dns`가 메모리 부족(OOM) 및 최대 동시 요청 수(`max_concurrent`) 제한인 1,000개에 도달하여 요청을 거부하는 현상이 발견되었습니다. * 하지만 실제 초당 쿼리 수(QPS)는 예상 용량보다 훨씬 낮았으며, 이는 상위 DNS 리졸버와의 TCP 연결 실패로 인해 타임아웃이 발생하면서 동시 요청 슬롯이 빠르게 점유되었기 때문임이 밝혀졌습니다. **AWS VPC 연결 추적(conntrack)과 패킷 드랍** * 네트워크 성능을 정밀하게 확인하기 위해 AWS ENA(Elastic Network Adapter) 메트릭을 분석한 결과, `conntrack_allowance_exceeded` 수치가 급증한 것을 확인했습니다. * VPC 수준의 연결 추적 테이블(Hypervisor 레벨)이 포화 상태에 도달하면 보안 그룹 등의 상태 저장을 위한 연결 생성이 불가능해져 패킷이 드랍됩니다. * 특이하게도 인스턴스 내부의 리눅스 conntrack 엔트리는 6만 개 미만으로 안정적이었으나, VPC 레벨의 conntrack은 이미 한계에 도달하여 두 레이어 간의 가시성 차이가 존재함을 발견했습니다. **VPC 플로우 로그를 통한 심층 분석** * 인스턴스 유형을 상위 모델로 변경하여 임시적으로 문제를 해결할 수 있었으나, 근본 원인 파악을 위해 VPC 플로우 로그 분석을 병행했습니다. * Cilium, 쿠버네티스, AWS 네트워킹이 결합된 환경에서는 역경로 필터링(Reverse Path Filtering)이 정상적인 패킷을 'Martian packet'(출처가 불분명한 패킷)으로 오인하여 드랍하는 등 복잡한 문제가 발생할 수 있음을 시사했습니다. * DNS 전파 시간과 네트워크 마이크로버스트(Traffic Spikes) 역시 이러한 연결 추적 테이블 포화에 기여하는 핵심 요소임을 확인했습니다. **실용적인 결론** 단순히 로그에 나타나는 "DNS 에러"에만 집중하기보다, AWS ENA 메트릭의 `conntrack_allowance_exceeded`나 VPC 플로우 로그와 같은 하위 레이어의 지표를 함께 모니터링해야 합니다. 특히 대규모 쿠버네티스 클러스터를 운영한다면, 인스턴스 크기에 따른 VPC 수준의 conntrack 제한 수치를 미리 파악하고 적절한 인프라 사이징과 네트워크 정책 설정을 검토해야 합니다.

datadog원문

Datadog이 Datadog을 사용해 Datadog 사용자 경험에 대한 가시성을 확보하는 방법 (새 탭에서 열림)

Datadog은 정성적인 사용자 인터뷰를 보완하기 위해 자사의 모니터링 도구인 RUM(Real User Monitoring)과 로그를 직접 활용하여 디자인 의사결정에 필요한 정량적 데이터를 확보합니다. 이른바 '개밥 먹기(Dogfooding)' 전략을 통해 디자이너들은 실제 사용자의 행동 패턴을 정밀하게 분석하고, 이를 바탕으로 UI/UX의 복잡성을 줄이거나 기능을 고도화합니다. 결과적으로 자사 제품을 디자인 도구로 활용함으로써 데이터에 기반한 효율적인 개선과 팀 간의 원활한 협업을 이끌어내고 있습니다. ## 고정폭 글꼴(Monospace Font) 최적화 로그, 소스 코드 등 구조화된 데이터를 표시할 때 글자 폭이 일정한 고정폭 글꼴은 가독성과 레이아웃 예측 가능성 측면에서 매우 중요합니다. * 기존에는 사용자의 시스템 폰트에 의존했으나, 복잡한 테이블 구조에서 레이아웃 깨짐을 방지하기 위해 표준 폰트 도입이 필요했습니다. * Web API의 `Document.font` 인터페이스와 CSS Font Loading API를 활용하여 사용자의 브라우저에 실제로 로드된 폰트 데이터를 RUM으로 수집했습니다. * 수집된 데이터를 분석하여 가장 많은 사용자가 보고 있는 폰트와 유사한 시각적 크기를 가진 'Roboto Mono'를 최종 선정했습니다. * 배포 후에도 RUM 대시보드를 통해 모든 사용자에게 의도한 폰트가 정상적으로 적용되는지 검증했습니다. ## 사용자 상호작용 데이터를 통한 DraggablePane 단순화 패널 크기를 조절하는 DraggablePane 컴포넌트의 핸들은 크기가 작음에도 불구하고 너무 많은 제어 기능이 포함되어 사용자에게 혼란을 줄 우려가 있었습니다. * 어떤 기능이 실제로 유용한지 판단하기 위해 컴포넌트 내부에 커스텀 로거를 설치하여 개별 클릭 이벤트를 추적했습니다. * 데이터 분석 결과, 핸들에 위치한 최소화 및 최대화 버튼의 사용률이 극히 저조하다는 사실을 발견했습니다. * 시각적 노이즈를 줄이기 위해 해당 버튼들을 제거하는 대신, 핸들을 더블 클릭하면 동일한 기능이 수행되도록 상호작용 방식을 개선했습니다. ## 입력 오류 분석을 통한 시간 범위 구문 확장 사용자가 직접 텍스트를 입력해 시간 범위를 설정하는 기능에서, 시스템이 해석하지 못하는 구문을 파악하여 사용자 편의성을 높이고자 했습니다. * Datadog Logs를 사용하여 사용자가 입력한 구문 중 시스템이 해석에 실패한 '유효하지 않은 입력' 데이터를 전수 조사했습니다. * 데이터 분석을 통해 많은 사용자가 당시 지원되지 않던 "weeks" 키워드(예: last 1 week)를 빈번하게 입력하고 있음을 식별했습니다. * 분석된 패턴을 바탕으로 구문 해석 로직을 업데이트한 결과, 기능 출시 초기 약 10%에 달했던 입력 오류율을 5~6% 수준으로 즉시 낮추는 성과를 거두었습니다. 실제 사용자 데이터를 기반으로 한 디자인은 추측이 아닌 확신을 제공합니다. 디자이너가 직접 모니터링 도구를 활용해 사용자 피드백의 빈틈을 정량적으로 메우고, 이를 대시보드로 공유하여 엔지니어와 소통하는 프로세스는 제품의 완성도를 높이는 가장 강력한 방법 중 하나입니다.

datadog원문

Datadog이 Dat (새 탭에서 열림)

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) 디자인 과정에서 데이터 모니터링 도구를 활용하는 것은 단순히 수치를 확인하는 것을 넘어, 디자이너가 개발자와 같은 언어로 소통하고 객관적인 근거로 제품을 개선할 수 있게 해줍니다. 특히 실시간 로그와 에러 데이터를 추적하는 환경을 구축하면 사용자 피드백을 기다리지 않고도 제품의 미비점을 선제적으로 발견하여 수정할 수 있습니다.

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)로 배포를 분리하여 부하를 분산하는 전략을 검토해 보시기 바랍니다.

datadog원문

Kubernetes 상태 메트릭을 한 단계 끌어올린 우리의 여정 (새 탭에서 열림)

Datadog은 대규모 쿠버네티스 환경에서 `kube-state-metrics`(KSM)를 운영하며 발생한 성능 병목 현상을 해결하기 위해 오픈소스 커뮤니티에 직접 기여했습니다. 기존의 텍스트 기반 엔드포인트 스크래핑 방식은 수백만 개의 메트릭을 처리할 때 심각한 네트워크 부하와 지연 시간을 유발했으나, 이번 개선을 통해 메트릭 수집 속도를 기존 대비 15배 향상시키는 성과를 거두었습니다. 결과적으로 대규모 클러스터에서도 데이터의 정밀도를 유지하며 안정적인 관측성을 확보할 수 있게 되었습니다. ### KSM의 기본 작동 원리와 메트릭 수집 - KSM은 인포머(Informer) 패턴을 활용하여 쿠버네티스 API 서버의 객체 상태 변화를 관찰하고 이를 Openmetrics 형식의 텍스트로 노출합니다. - Datadog 에이전트는 15초 주기로 KSM의 `/metrics` 엔드포인트를 크롤링하여 데이터를 수집하며, 이 과정에서 `label_joins` 설정을 통해 메타데이터 레이블을 결합하여 분석 가치를 높입니다. - 예를 들어, 특정 배포(Deployment)의 레이블 정보를 다른 관련 메트릭에 태그로 추가하여 다각적인 모니터링이 가능하도록 지원합니다. ### 대규모 인프라에서의 확장성 병목 현상 - 클러스터 규모가 수천 개의 노드와 수만 개의 파드로 커지면, 한 번의 수집 주기마다 처리해야 할 메트릭이 수백만 개에 달하게 됩니다. - 파드 하나당 약 40개의 메트릭이 생성되는데, 이로 인해 네트워크 호출 시 전송되는 데이터 양이 수십 메가바이트에 달하고 크롤링 시간은 수십 초까지 늘어납니다. - 이러한 지연 시간 때문에 수집 주기를 억지로 늘려야 했고, 이는 데이터의 세밀함(granularity)을 떨어뜨려 내부 사용자들의 경험을 저해하는 결과를 초래했습니다. ### 오픈소스 기여를 통한 KSM 구조 개선 - Datadog 팀은 내부적인 임시방편을 만드는 대신 KSM v2.0 릴리스 시점에 맞춰 업스트림 소스 코드에 직접 기여하는 방식을 택했습니다. - 기존 KSM v1은 빌더(Builder)가 스토어를 관리하며 쿼리 시점에 데이터를 한꺼번에 덤프하는 구조였으나, 이를 개선하여 메트릭 생성 과정에 직접 개입(Hook)할 수 있는 유연성을 확보했습니다. - 리소스 유형별로 KSM 배포를 분리(Pods, Nodes, 기타 리소스 등)하는 전략과 함께, 메트릭 생성 로직 자체를 최적화하여 대규모 데이터 처리 효율을 극대화했습니다. 대규모 쿠버네티스 환경을 운영하는 조직이라면 KSM v2.0 이상의 개선된 구조를 적극적으로 도입하고, 리소스의 양에 따라 KSM 배포를 적절히 분할하여 메트릭 수집 지연 시간을 최소화할 것을 권장합니다.

datadog원문

Datadog의 Continuous Profiler를 사용해 Akka 애플리케이션을 최적화한 방법 (새 탭에서 열림)

Datadog은 Akka 프레임워크 기반 서비스에서 예상치 못한 20~30%의 CPU 과점유 문제를 발견했으며, 이는 성능 프로파일링 도구를 통해 `ForkJoinPool` 내부의 비효율성 때문인 것으로 밝혀졌습니다. 불규칙한 작업 부하를 가진 액터가 기본 디스패처에서 실행될 때, 스레드의 빈번한 생성과 정지(`park`/`unpark`)가 반복되면서 과도한 네이티브 호출 오버헤드가 발생한 것이 원인이었습니다. 이를 안정적인 작업 흐름을 가진 전용 디스패처로 분리함으로써 시스템 전반의 CPU 효율을 획기적으로 개선할 수 있었습니다. **성능 병목 현상의 발견과 프로파일링** * 로그 파싱 알고리즘을 최적화했음에도 불구하고 CPU 사용량이 줄어들지 않고 오히려 성능이 저하되는 기현상이 발생했습니다. * Datadog Continuous Profiler의 플레임 그래프 분석 결과, 예상 밖으로 `ForkJoinPool.scan()` 및 `Unsafe.park()` 메서드에서 전체 CPU의 상당 부분이 소모되고 있었습니다. * 상세 분석 결과, 특정 작업 풀(Work pool)이 아닌 Akka의 기본 디스패처(Default Dispatcher) 소속 스레드들이 대부분의 CPU 시간을 점유하고 있었으며, 이는 주로 지표를 보고하는 `LatencyReportActor`와 연관되어 있었습니다. **ForkJoinPool 오버헤드의 근본 원인** * `ForkJoinPool`은 대기 중인 작업량에 따라 내부 워커 스레드를 동적으로 추가하거나 `Unsafe.park()`/`unpark()`를 호출하여 스레드를 일시 중지 및 재개합니다. * 문제가 된 액터는 매초 수백 개의 이벤트를 순식간에 처리한 뒤 다음 배치가 올 때까지 대기하는 불규칙한(Irregular) 작업 흐름을 가지고 있었습니다. * 이로 인해 매초 가용한 모든 코어(예: 32코어)만큼의 스레드가 동시에 깨어났다가 작업 완료 후 즉시 잠드는 과정이 반복되었고, 이 과정에서 발생하는 네이티브 호출 비용이 실제 작업 비용보다 커지는 결과가 초래되었습니다. **디스패처 분리를 통한 문제 해결** * 불규칙한 부하를 가진 액터를 기본 디스패처에서 분리하여, 부하가 일정하게 유지되는 메인 "work" 디스패처로 이동시키는 단 한 줄의 설정 변경을 적용했습니다. * 수정 후 서비스 전체 CPU 사용량이 평균 30% 감소했으며, 프로파일링 결과 `ForkJoinPool.scan()`에서 소모되던 시간이 거의 사라진 것을 확인했습니다. * 기본 디스패처의 스레드 풀 크기가 32개에서 2개로 줄어들며 스레드 관리 효율이 극대화되었습니다. **안정적인 성능 유지를 위한 권장 사항** * `ForkJoinPool.scan()` 메서드의 CPU 점유율이 10~15%를 초과한다면 스레드 풀 설정과 부하의 안정성을 반드시 점검해야 합니다. * Akka 사용 시 액터 인스턴스 수를 제한하거나 스레드 풀의 최대 크기를 적절히 설정하여 무분별한 스레드 확장을 방지해야 합니다. * 작업 큐를 활용해 급격한 작업 스파이크를 완만하게 조절하거나, 사용되는 스레드 풀의 수를 줄여 부하 밀집도를 높임으로써 활성 스레드 수를 일정하게 유지하는 것이 중요합니다.

datadog원문

Datadog IT 팀이 서드파티 계정 모니터링을 자동화한 방법 (새 탭에서 열림)

현대 기업이 사용하는 수많은 SaaS 애플리케이션의 계정을 수동으로 관리하는 것은 보안 위협과 비용 낭비를 초래할 수 있는 매우 어렵고 비효율적인 작업입니다. Datadog은 이를 해결하기 위해 사내 인사 관리 시스템(HRIS)인 Workday를 단일 진실 공급원(Single Source of Truth)으로 삼아 SaaS 계정을 자동으로 전수 조사하는 자체 도구 'Clarity'를 구축했습니다. 이 시스템은 정기적인 감사를 통해 퇴사자나 미승인 계정을 실시간으로 탐지하고, 티켓팅 및 알림 시스템과 연동하여 즉각적인 조치를 가능하게 함으로써 기업의 보안 거버넌스를 강화합니다. **SaaS 계정 감사의 필요성과 요구사항** * **보안 및 비용 관리:** 관리되지 않는 유령 계정은 민감 데이터 유출의 통로가 될 수 있으며, 불필요한 라이선스 비용을 발생시키므로 정기적이고 자동화된 감사가 필수적입니다. * **신뢰할 수 있는 데이터원 확보:** 모든 직원의 상태를 정확히 반영하는 Workday(또는 Okta, ADP 등)를 기준으로 삼아 SaaS 앱의 사용자 목록과 대조해야 합니다. * **운영 효율성:** 감사는 수시로 자동 실행될 수 있어야 하며, 필요에 따라 수동 실행도 가능해야 합니다. 또한 기존 업무 흐름을 방해하지 않도록 사내에서 이미 사용 중인 도구들과 긴밀하게 통합되어야 합니다. **Clarity의 작동 아키텍처 및 프로세스** * **자동 실행 및 데이터 수집:** AWS CloudWatch Event Rule을 통해 매일 정해진 시간에 실행되며, AWS Lambda를 사용하여 Workday와 주요 SaaS(Slack, GitHub, Zoom 등)의 활성 사용자 명단을 동시에 가져옵니다. * **교차 검증(Auditing):** SaaS 앱의 이메일 주소 목록을 Workday의 현직자 명단과 비교하여, 일치하는 기록이 없는 계정을 즉시 식별합니다. * **데이터 이력 관리:** 감사 결과 발견된 비정상 계정 정보는 추후 추적 및 분석을 위해 DynamoDB 테이블에 기록됩니다. **로깅, 알림 및 사후 조치 통합** * **Datadog 메트릭 활용:** 탐지된 각 계정 정보는 Datadog Metrics API를 통해 전송됩니다. 이때 'gauge' 타입을 사용하여 시간 경과에 따른 비정상 계정 추이를 시각화합니다. * **태그 기반의 상세 분석:** 메트릭 전송 시 환경(prod/dev), 담당 팀, 해당 SaaS 서비스명, 사용자 이메일 등을 태그로 포함하여 문제 발생 시 즉각적인 식별이 가능하도록 합니다. * **워크플로우 연동:** 감사가 완료되면 Freshservice를 통해 자동으로 조치 티켓을 생성하고, Slack으로 요약 보고서를 발송하여 담당 팀이 Datadog 로그 링크를 통해 즉시 상세 내용을 확인할 수 있게 합니다. SaaS 환경이 확장됨에 따라 수동 감사는 한계에 부딪힐 수밖에 없습니다. Datadog의 사례처럼 인사 시스템을 API로 연결하고 기존의 모니터링 및 알림 도구(Slack, Jira 등)를 통합한 자동화 파이프라인을 구축한다면, 최소한의 운영 리소스로도 기업 전체의 SaaS 보안 가시성을 획기적으로 높일 수 있습니다.

datadog원문

우리 작업 시스템에서 쿠버네티스 오버헤드를 최소화한 방법 (새 탭에서 열림)

Datadog은 기존 작업 시스템을 Kubernetes로 이전하는 과정에서 CPU 사용량은 증가하고 작업 처리 속도는 40-50% 저하되는 성능 퇴행 문제를 겪었습니다. 이를 해결하기 위해 VM과 Kubernetes 간의 정밀한 비교 실험을 설계하고, 지표 측정 방식과 리소스 할당(Resource Requests) 설정을 최적화하여 성능을 이전 수준으로 복구했습니다. 본 분석을 통해 Kubernetes 오버헤드의 실체를 파악하고, 고성능 워크로드를 위한 포드 배치 전략을 도출했습니다. ### 실험 환경의 통제와 정렬 * **환경 변수 통일**: 성능 차이의 원인을 정확히 규명하기 위해 VM과 Kubernetes 클러스터의 인스턴스 유형(c5.2xlarge), 커널 버전(3.13.0-141), 실행 스크립트를 동일하게 맞추어 비교 대상을 단일화했습니다. * **배치 구조 최적화**: 기존 VM 방식과 유사하게 하나의 포드 내에 하나의 부모 프로세스와 그 자식 워커들을 배치하여, 노드당 부모 프로세스 수와 포드 수가 일치하도록 구성했습니다. ### 측정 지표의 재정의: Idle CPU의 중요성 * **Load Average의 한계**: Kubernetes에서는 상태 확인 등을 위한 배경 프로세스가 빈번하게 실행되는데, 이는 실제 CPU 사용량과 무관하게 Load Average 수치를 비정상적으로 높여 시스템이 바쁜 것처럼 오해하게 만듭니다. * **Idle CPU 활용**: 프로세스 개수가 아닌 '실제 CPU가 일하지 않는 시간'을 측정하는 Idle CPU 지표를 선택함으로써, 시스템의 남은 용량을 더 정확하게 파악하고 성능 분석의 신뢰도를 높였습니다. * **처리량(Throughput) 중심**: 배치 작업의 특성에 맞춰 지연 시간(Latency)보다는 30초당 완료된 작업 수라는 처리량 지표를 핵심 성능 지표로 설정했습니다. ### 리소스 요청(Resource Requests) 및 스케줄링 튜닝 * **스케줄링 병목 해결**: 초기에 각 포드가 1 Core CPU를 요청하도록 설정했을 때, 노드당 4개의 포드만 배치되는 과소 활용 문제가 발생했습니다. 목표치인 노드당 6개 포드 배치를 위해 CPU 요청을 100m으로, 메모리 요청을 500MB로 대폭 낮췄습니다. * **단일 리소스 기준 권장**: 여러 리소스(CPU, 메모리 등)의 요청 값을 모두 엄격하게 잡으면 스케줄링이 복잡해지므로, 하나의 주된 리소스를 기준으로 배치를 유도하고 나머지는 실제 필요량에 가깝게 설정하는 것이 효율적임을 확인했습니다. * **Request와 Limit의 구분**: `request`는 스케줄링을 위한 최소 보장치이며, 실제 실행 중의 제약은 `limit`이 담당하므로 `request`를 낮추는 것이 실행 성능에 부정적인 영향을 주지 않는다는 점을 활용했습니다. ### 포드별 오버헤드의 실체 분석 * **프로세스 구조**: `pstree`를 통해 분석한 결과, 포드당 오버헤드는 주로 컨테이너 런타임인 `containerd-shim`에서 발생했습니다. * **CPU 및 메모리 비용**: 실험 결과 포드당 CPU 오버헤드는 무시할 수 있는 수준이었으며, 메모리는 포드당 약 24MB(containerd-shim 및 pause 컨테이너 포함) 수준으로 측정되었습니다. * **결론적 선택**: 오버헤드가 크지 않기 때문에, 관리 효율성을 위해 포드 하나에 여러 부모 프로세스를 억지로 집어넣기보다 '포드당 1 부모 프로세스' 구조를 유지하는 것이 더 유리하다는 결론을 내렸습니다. Kubernetes로 이전 시 발생하는 성능 저하는 플랫폼 자체의 문제라기보다 잘못된 리소스 요청 설정과 지표 해석에서 기인하는 경우가 많습니다. 노드당 포드 밀도를 최적화하기 위해 `Resource Requests`를 전략적으로 낮게 설정하고, 시스템의 부하를 판단할 때는 Load Average 대신 Idle CPU를 관찰함으로써 VM에 근접한 성능을 확보할 수 있습니다.

datadog원문

엔지니어링 스포트라이트: 마엘 니송 (새 탭에서 열림)

인도양의 작은 섬 레위니옹에서 시작해 자바스크립트 생태계의 핵심 도구인 Yarn의 메인 유지보수자가 되기까지, Maël Nison의 여정은 끊임없는 호기심과 오픈소스에 대한 열정으로 가득 차 있습니다. 그는 페이스북 부트캠프를 통해 Yarn 프로젝트에 합류한 뒤, 단순한 기여자를 넘어 프로젝트를 TypeScript 기반의 모듈형 구조로 재설계하고 커뮤니티 주도형 프로젝트로 탈바꿈시키는 데 결정적인 역할을 했습니다. 현재 Datadog의 프론트엔드 플랫폼 팀에서 근무하면서도 Yarn의 비전과 로드맵을 이끄는 그는, 기술적 해결책을 모두와 공유하는 오픈소스 정신이 개인과 공동체를 어떻게 성장시키는지 잘 보여줍니다. **Yarn의 진화와 다각적인 리더십** * 페이스북 입사 초기, 신규 입사자 교육 프로그램인 '부트캠프'를 통해 Yarn 프로젝트를 접하고 업무 시간의 상당 부분을 오픈소스 기여에 투입하기 시작했습니다. * 초기 내부 도구 성격이 강했던 Yarn을 TypeScript로 완전히 재작성하고 아키텍처를 모듈화하여, 특정 기업에 종속되지 않는 진정한 커뮤니티 오픈소스 프로젝트로 발전시켰습니다. * 프로젝트를 관리하며 개발자 역할을 넘어 제품 매니저, 팀 리드, 고객 지원, 인프라 설계, 웹 디자인 등 다방면의 역할을 수행하며 '1인 CEO'와 같은 경험을 쌓았습니다. **DarkBASIC에서 시작된 프로그래밍의 기초** * 프랑스 툴루즈의 중학교 시절, 점심시간마다 모이던 프로그래밍 클럽에서 DarkBASIC이라는 게임 제작 언어를 배우며 개발의 세계에 입문했습니다. * 화면 위에서 물고기가 움직이고 거품을 쏘는 간단한 2D 게임을 만들며, 코드를 수정하면 즉시 결과가 바뀌는 논리적인 과정에 매료되어 평생의 직업으로 삼기로 결심했습니다. * 2000년대 초반 3G 네트워크와 펜티엄 III 프로세서가 표준이던 시절부터 PHP 웹사이트를 구축하고 SQL 취약점을 직접 경험하며 실전 기술을 익혔습니다. **워크플로우 최적화와 실용적 교육** * 깃허브(GitHub)가 없던 시절, 포럼을 통해 소스 코드를 공유하며 누구나 필요한 해결책을 사용할 수 있게 하는 오픈소스의 본질을 체득했습니다. * 기존 CMS(콘텐츠 관리 시스템)들의 복잡한 관리 페이지 구조에 의문을 품고, 게시물을 클릭해 즉시 수정하는 직관적인 워크플로우를 고민하며 '사용자 경험 최적화'에 대한 철학을 세웠습니다. * 이론보다 실무 중심의 프로젝트와 동료 평가를 중시하는 프랑스의 교육 기관 EPITECH에서 수학하며, 자기 주도적 학습 역량과 실용적인 엔지니어링 기술을 연마했습니다. Maël Nison의 사례는 단순히 기술적인 숙련도를 높이는 것을 넘어, 자신이 마주한 불편함을 해결하고 그 결과물을 커뮤니티와 공유하는 습관이 어떻게 세계적인 오픈소스 리더로 성장하는 밑거름이 되는지 보여줍니다. 새로운 기술을 익힐 때 단순히 사용법을 익히는 데 그치지 않고, 오픈소스 프로젝트에 작은 기여부터 시작해 보는 것은 커리어 개발과 기술적 통찰력을 동시에 얻을 수 있는 가장 확실한 방법입니다.

datadog원문

PHP 8: 옵저버빌리티가 기본으로 내장되다 (새 탭에서 열림)

PHP의 Zend Engine은 버전 7과 8을 거치며 비약적인 성능 향상을 이루었으나, 이를 모니터링하는 관측성(Observability) 도구들은 오랫동안 노후화된 메커니즘에 의존하여 성능 저하와 불안정성 문제를 겪어왔습니다. PHP 8은 이러한 한계를 극복하기 위해 현대적인 **Observer API**를 도입하였으며, 이를 통해 JIT 컴파일러와 호환되면서도 시스템 부하를 최소화하는 새로운 모니터링 표준을 제시합니다. ## 기존 zend_execute_ex 훅의 한계 가장 널리 사용되던 `zend_execute_ex` 방식은 가상 머신의 함수 실행 포인터를 직접 재정의하는 구조로 인해 여러 심각한 부작용을 야기했습니다. * **스택 오버플로 및 충돌:** PHP의 유연한 콜 스택을 제한적인 네이티브 C 스택으로 강제 전환시켜, 함수 호출이 깊어질 경우 시스템 제한(`ulimit -s`)을 초과하여 프로세스가 충돌하는 현상이 발생합니다. * **과도한 실행 오버헤드:** 관찰이 필요한 특정 함수뿐만 아니라 모든 사용자 정의 함수 호출을 가로채기 때문에, 호출이 빈번한 스크립트에서 성능이 크게 저하됩니다. * **컴파일러 최적화 방해:** 컴파일러가 사용자 함수(DO_UCALL)와 내부 함수(DO_ICALL)를 구분하여 최적화하는 과정을 방해하여 런타임 효율성을 떨어뜨립니다. * **JIT 및 확장 프로그램 호환성 결여:** PHP 8의 핵심 기능인 JIT와 호환되지 않으며, 여러 확장 프로그램이 동일한 훅을 사용할 경우 서로 간섭하거나 충돌하는 "Noisy Neighbor" 문제가 빈번했습니다. ## 커스텀 Opcode 핸들러의 문제점 일부 도구들은 스택 폭발 문제를 피하고자 특정 실행 코드(Opcode)에 커스텀 핸들러를 등록하는 방식을 사용했으나, 이 역시 완벽한 대안이 되지 못했습니다. * **핸들러 전달 실패:** 여러 확장 프로그램이 설치된 경우, 이전 핸들러의 정보를 다음 프로그램으로 제대로 전달하지 않아 기능이 오작동하는 경우가 많았습니다. * **VM 상태 변조의 위험성:** 실행 중 가상 머신의 상태를 임의로 변경하여 원본 Opcode 실행을 건너뛸 수 있는데, 이는 여러 도구가 동시에 작동할 때 예측 불가능한 결과를 초래합니다. * **기술적 제약:** PHP 제너레이터(Generators)의 구조적 특성상 완전한 계측이 불가능하며, 역시 PHP 8의 JIT 환경을 지원하지 못합니다. ## Zend 확장 훅과 AST 주입 방식의 시도 성능과 정밀도를 높이기 위한 다른 시도들도 있었으나 운영 환경에서 사용하기에는 효율성이 떨어졌습니다. * **Zend Extension Hooks:** 함수 호출 전후에 핸들러를 배치할 수 있지만, 모든 호출마다 추가적인 Opcode(`EXT_FCALL_BEGIN/END`)를 생성하도록 강제하여 성능 부하가 매우 큽니다. * **AST(추상 구문 트리) 주입:** 컴파일 단계에서 관측용 노드를 직접 삽입하는 방식이 연구되었으나, 결과적으로 Zend 확장 방식과 유사한 수준의 높은 오버헤드가 발생하여 실용화에 어려움이 있었습니다. ## 결론 및 제언 PHP 8 이전의 관측성 도구들은 성능 최적화와 안정적인 모니터링 사이에서 큰 기술적 부채를 안고 있었습니다. PHP 8에서 도입된 **Observer API**는 이러한 구형 훅들의 고질적인 문제였던 스택 충돌과 JIT 비호환성을 해결하므로, 성능에 민감한 운영 환경에서 PHP 애플리케이션을 운용한다면 해당 API를 지원하는 최신 트레이싱 도구와 PHP 8 이상의 환경을 적극적으로 도입할 것을 권장합니다.

datadog원문

Glommio 소개: Rust와 Linux를 위한 코어당 스레드 크레이트 (새 탭에서 열림)

현대적인 클라우드 비용 절감과 성능 최적화를 위해서는 단순히 코드의 병목점을 찾는 것을 넘어, 하드웨어 성능을 극대화할 수 있는 '코어당 스레드(thread-per-core)' 아키텍처로의 전환이 필요합니다. 이 아키텍처는 애플리케이션의 꼬리 지연 시간(tail latency)을 최대 71%까지 개선할 수 있지만, 구현이 복잡하고 개발 생산성을 떨어뜨릴 수 있다는 단점이 있습니다. Datadog은 이러한 문제를 해결하기 위해 Rust 개발자들이 코어당 스레드 모델을 쉽게 구현할 수 있도록 돕는 오픈소스 라이브러리 'Glommio'를 제안합니다. **기존 멀티스레드 모델의 한계와 비용** * 전통적인 멀티스레딩 방식은 여러 스레드가 동일한 데이터에 접근할 때 데이터 정합성을 보장하기 위해 락(Lock)을 사용하며, 이는 실행을 멈추고 대기하는 시간을 발생시켜 비용을 증가시킨다. * 스레드 간 컨텍스트 스위칭(Context Switching)은 약 5마이크로초의 비용이 드는데, 이는 io_uring과 같은 최신 커널 인프라의 I/O 처리 시간(4마이크로초 미만)보다 길다. 즉, 스레드 전환 비용이 실제 I/O 작업보다 비싸지는 역전 현상이 발생한다. * 기존의 비동기 프로그래밍 방식 또한 파일 I/O 등을 처리할 때 내부적으로 스레드 풀을 사용해야 하는 경우가 많아 완전한 효율성을 달성하기 어렵다. **코어당 스레드(Thread-per-core)의 동작 원리** * 각 CPU 코어에 단 하나의 스레드만 할당하고 이를 특정 코어에 고정(Pinning)함으로써, OS 스케줄러에 의한 스레드 이동과 컨텍스트 스위칭을 원천적으로 차단한다. * 하드웨어 인터럽트나 시스템 에이전트와 같은 외부 작업을 위해 특정 코어를 전용으로 분리하고, 나머지 코어를 애플리케이션 스레드에 할당하여 간섭을 최소화한다. * 모든 작업은 협력적 스케줄링(Cooperative Scheduling) 방식으로 동작하며, 실행 중인 작업이 명시적으로 제어권을 양보하거나 완료될 때까지 CPU를 점유하여 선점형 스케줄링의 오버헤드를 없앤다. **데이터 샤딩을 통한 락 프리(Lock-free) 구현** * 각 스레드가 전체 데이터의 특정 부분집합(Shard)만을 담당하도록 설계하여, 서로 다른 스레드가 동일한 데이터에 접근할 가능성을 차단한다. * 예를 들어 특정 카프카 파티션이나 데이터베이스 키 범위별로 담당 스레드를 지정함으로써, 스레드 간의 데이터 공유를 최소화한다. * 데이터 업데이트 작업이 해당 스레드 내에서 자연스럽게 직렬화(Serialized)되므로, 복잡하고 비용이 큰 락(Lock) 메커니즘 없이도 안전하게 데이터를 조작할 수 있다. **Glommio를 통한 Rust 애플리케이션 최적화** * Glommio는 C++의 Seastar 프레임워크와 유사한 철학을 Rust 환경에 가져와, 개발자가 코어당 스레드 아키텍처의 복잡한 세부 사항을 직접 다루지 않고도 고성능 애플리케이션을 작성할 수 있게 한다. * 성능 민감도가 높은 대규모 데이터 스토어(Datastores)나 고처리량 메트릭 수집 시스템을 운영하는 팀에게 Glommio는 하드웨어 효율성과 개발 편의성을 동시에 잡을 수 있는 실질적인 대안이 된다.

datadog원문

옛 데이터독과 바다 (새 탭에서 열림)

데이터 전문가인 저자가 자신의 요트 '세컨드 윈드(Second Wind)'를 스마트하게 개조하기 위해 파편화된 항해 기기들을 NMEA 2000 표준 프로토콜로 통합한 과정과 그 성과를 다룹니다. 저자는 데이터 분석을 통해 더 나은 항해사가 되겠다는 목표로, 기존의 아날로그 및 노후 기기들을 네트워크로 연결하여 선박의 상태와 환경 데이터를 한곳으로 모으는 데 성공했습니다. 결과적으로 이 프로젝트는 단순한 기기 설치를 넘어, 데이터 통합을 통해 항해 안전성과 선박 운영의 효율성을 동시에 확보하는 엔지니어링 사례를 보여줍니다. ## NMEA 2000 프로토콜을 이용한 네트워크 통합 * **표준 프로토콜 채택**: 자동차의 CAN 버스와 유사한 NMEA 2000 프로토콜을 기반으로 선박 내 데이터 백본(Backbone)을 구축했습니다. 이 표준은 하나의 케이블로 데이터와 전원을 동시에 공급하며 250 kbit/s의 속도로 기기 간 통신을 지원합니다. * **호환성 문제 해결**: 레이마린(RayMarine)사의 독자 규격인 'SeatalkNG'가 NMEA 2000과 물리적 커넥터만 다를 뿐 호환된다는 점을 이용해 어댑터로 연결했습니다. * **노후 장비 교체**: NMEA 0183이라는 구형 프로토콜을 사용하는 기존 수심계와 속도계는 컨버터를 쓰는 대신 최신 NMEA 2000 지원 장비로 교체하여 시스템의 단순함과 일관성을 유지했습니다. ## AIS 도입을 통한 항해 안전성 강화 * **AIS(자동 식별 장치) 설치**: VHF 라디오를 통해 주변 선박의 이름, ID, 속도, 방향, 좌표 데이터를 주고받는 AIS 트랜스폰더를 도입했습니다. * **충돌 방지 및 가시성 확보**: 레이더보다 저렴한 비용으로 시야 내의 다른 선박 정보를 차트플로터(지도 표시 장치)에 시각화하여 충돌 위험을 줄였습니다. * **데이터 독립성**: 내장 GPS 모듈이 포함된 AIS 장치를 설치함으로써, 외부 장치에 의존하지 않고도 정확한 위치 데이터를 NMEA 2000 버스에 공급할 수 있게 되었습니다. ## 풍향 및 풍속 데이터의 정밀 측정 * **아날로그에서 디지털로**: 단순히 돛대 끝의 풍향계를 눈으로 확인하던 방식에서 벗어나, 풍향과 풍속을 동시에 측정할 수 있는 풍향풍속 센서(Transducer)를 설치했습니다. * **데이터 기반 세일링**: 측정된 풍속 데이터를 콕핏(조종석) 디스플레이로 실시간 확인하고 네트워크에 공유함으로써, 바람의 세기에 맞춘 정밀한 돛 조절(Trim)이 가능해졌습니다. * **물리적 설치의 도전**: 센서 설치를 위해 돛대 꼭대기에 구멍을 뚫고 배 내부로 배선을 연결하는 하드웨어 작업 과정을 거쳐 시스템 통합을 완성했습니다. ## 실용적인 결론 이 글은 파편화된 하드웨어를 표준 프로토콜로 통합하는 것이 데이터 분석의 첫걸음임을 강조합니다. 선박과 같은 복잡한 환경에서도 표준 규격(NMEA 2000)을 준수하면 서로 다른 제조사의 장비들을 효과적으로 연결할 수 있으며, 이렇게 수집된 데이터는 안전 항행뿐만 아니라 향후 성능 최적화를 위한 귀중한 자산이 됩니다.

datadog원문

TUF와 in-toto를 활용한 Datadog Agent 통합 기능의 안전한 배포 (새 탭에서 열림)

Datadog은 에이전트 통합 기능의 배포 주기를 에이전트 본체와 분리하여 자동화하는 동시에, 전체 공급망의 보안을 보장하기 위해 TUF(The Update Framework)와 in-toto를 도입했습니다. 기존의 TLS나 GPG 방식이 해결하지 못하는 인프라 침해 공격에 대응하기 위해, 개발자의 코드 커밋부터 최종 사용자의 설치 단계까지 모든 과정을 검증 가능한 구조로 설계했습니다. 이를 통해 Datadog은 자동화된 배포의 효율성과 '침해 저항성(Compromise-resilience)'을 갖춘 강력한 보안을 동시에 달성했습니다. ## 자동 배포의 필요성과 보안 과제 * **배포 주기 분리:** 수백 개의 통합 패키지를 에이전트 릴리스와 분리하여 독립적으로 업데이트함으로써 사용자에게 최신 기능을 신속하게 제공하고자 했습니다. * **기존 보안의 한계:** TLS 암호화나 단순 GPG 서명은 중간자 공격(MitM)은 방어할 수 있지만, 개발자와 사용자 사이의 인프라가 침해되어 코드가 변조되는 상황에는 취약합니다. * **침해 저항 시스템 구축:** 인프라의 일부가 장악되더라도 소프트웨어의 진본성과 무결성을 보호할 수 있는 CI/CD 시스템이 필요했습니다. ## in-toto를 통한 소프트웨어 공급망 검증 * **단계별 무결성 보장:** 소프트웨어 공급망을 코드 작성, 패키징(Wheel 파일 생성), 서명 등 일련의 고정된 단계로 정의하고 각 단계마다 입력과 출력에 대한 서명된 메타데이터를 생성합니다. * **최종 검증 과정:** Datadog 에이전트는 설치 시 서명된 메타데이터를 검사하여, 해당 패키지가 지정된 담당자에 의해 정의된 절차대로 생성되었는지 확인합니다. * **4단계 워크플로우:** 1. 개발자가 Python 소스 코드와 YAML 설정 파일을 작성합니다. 2. CI/CD 시스템이 소스 코드를 수신하여 Python Wheel(ZIP 파일)로 패키징합니다. 3. CI/CD 시스템이 동일한 Wheel 파일들에 대해 TUF 서명을 수행합니다. 4. 에이전트가 파일을 다운로드하여 개발자가 서명한 코드와 정확히 일치하는지 최종 확인합니다. ## TUF를 활용한 안전한 키 관리 및 전송 * **신뢰의 뿌리(Root of Trust):** in-toto가 공급망 단계를 검증한다면, TUF는 검증에 사용되는 공개키를 안전하게 배포, 취소, 교체하는 역할을 담당합니다. * **공격 방어:** 메타데이터의 일관성과 진본성을 보장하며, 공격자가 이전 버전으로 되돌리는 롤백(Rollback) 공격이나 무한 재생(Replay) 공격을 방지합니다. * **오프라인 부트스트래핑:** TUF를 통해 신뢰를 오프라인에서 구축하고 하드웨어 키로 개발자 서명 키를 보호함으로써 in-toto의 보안 보장을 더욱 공고히 합니다. ## Yubikey 기반의 하드웨어 보안 서명 * **키 유출 방지:** 개발자는 GPG 서명 키를 생성하고 저장할 수 있는 하드웨어 키(Yubikey)를 사용하며, 키는 장치 외부로 내보낼 수 없습니다. * **다중 보호 계층:** 서명 작업을 승인하기 위해서는 비밀번호(PIN) 입력과 장치에 대한 물리적인 터치가 반드시 필요합니다. * **사용 편의성:** CLI 도구를 통해 in-toto와 GPG 호출 과정을 투명하게 처리하여, 개발자의 업무 흐름을 방해하지 않으면서도 키 침해 위험을 최소화했습니다. ## 사용자 경험과 실용적 결론 * **투명한 보안:** 사용자는 평소와 다름없이 에이전트를 통해 통합 기능을 설치하지만, TUF나 in-toto가 공격을 감지하면 즉시 설치를 차단하고 상세한 오류 메시지를 표시합니다. * **업계 표준 지향:** Datadog은 이처럼 두 기술을 밀접하게 통합함으로써 보안 소프트웨어 배포가 단순히 '선택 사항'이 아닌 업계의 '표준'이 되도록 기여하고 있습니다. * **추천 사항:** 자동화된 CI/CD 환경에서 보안을 강화하려는 조직은 소프트웨어 공급망의 각 단계를 투명하게 기록하는 in-toto와 키 관리 체계를 담당하는 TUF의 조합을 검토할 필요가 있습니다.