Datadog

91 개의 포스트

www.datadoghq.com/blog/engineering

태그로 필터

datadog

런타임 보안을 위한 e (새 탭에서 열림)

대규모 분산 시스템에서 발생하는 초당 수백만 건의 커널 이벤트를 실시간으로 처리하기 위해선 기존의 사용자 공간 필터링 방식으로는 성능적 한계가 명확합니다. 이 글은 eBPF(Extended Berkeley Packet Filter)를 활용하여 이벤트가 발생하는 커널 내부에서 불필요한 데이터를 직접 필터링함으로써 시스템 부하를 최소화하는 아키텍처를 제안합니다. 이를 통해 CPU 사용량을 최적화하고 데이터 유실 없는 안정적인 대규모 파일 모니터링 시스템을 구축한 기술적 성과를 다룹니다. ### 기존 모니터링 방식의 병목 현상 * 수십억 개의 파일 이벤트를 사용자 공간(User-space)으로 모두 전송한 뒤 필터링하는 방식은 과도한 컨텍스트 스위칭과 데이터 복사 비용을 발생시킵니다. * 커널에서 사용자 공간으로 데이터를 넘겨주는 버퍼가 가득 찰 경우, 처리 속도가 발생 속도를 따라가지 못해 중요한 보안 또는 운영 이벤트가 누락되는 문제가 발생합니다. * 특정 프로세스의 반복적인 작업이나 무의미한 임시 파일 생성과 같은 '노이즈'가 전체 시스템 리소스의 대부분을 점유하여 모니터링 효율을 저해합니다. ### eBPF 기반의 인-커널(In-Kernel) 필터링 * eBPF를 사용하여 파일 시스템 관련 시스템 콜(open, read, write 등)이 호출되는 즉시 커널 내에서 필터링 로직을 실행합니다. * 사용자 공간의 제어부(Control Plane)가 모니터링 대상 경로(Allowlist)나 제외 대상(Denylist) 정보를 eBPF Map에 저장하면, 커널 내 eBPF 프로그램이 이 맵을 참조해 데이터를 즉시 선별합니다. * 유의미한 이벤트만 선별하여 전송하기 때문에 사용자 공간으로 전달되는 데이터의 양을 90% 이상 획기적으로 줄일 수 있습니다. ### LPM Trie를 활용한 경로 매칭 최적화 * 파일 경로는 단순 문자열 비교로 처리하기에 복잡하므로, 가장 긴 접두사 일치(LPM, Longest Prefix Match) Trie 구조를 사용하여 필터링 효율을 높입니다. * 특정 디렉토리 하위의 모든 파일이나 특정 패턴을 포함하는 경로를 효율적으로 식별하며, 규칙이 늘어나도 $O(L)$(L은 경로 깊이)의 일정한 검색 속도를 보장합니다. * 이 방식을 통해 수천 개의 복잡한 필터링 규칙이 적용된 환경에서도 커널 성능 저하 없이 실시간 매칭이 가능해집니다. ### Ring Buffer를 통한 안정적인 데이터 전달 * 기존의 Perf Buffer 방식 대신 최신 커널의 BPF Ring Buffer를 활용하여 메모리 효율성과 데이터 공유 성능을 극대화했습니다. * Ring Buffer는 여러 CPU 코어에서 동시에 발생하는 이벤트를 안전하게 처리하며, 메모리 경합을 줄이고 사용자 공간과의 통신 오버헤드를 최소화합니다. * 특히 가변 길이의 파일 경로 데이터를 처리할 때 메모리 할당 효율이 뛰어나 데이터 유실 가능성을 크게 낮춥니다. 실시간 대규모 모니터링을 설계할 때 가장 중요한 것은 '데이터 처리의 위치'입니다. eBPF를 통해 데이터의 발생지인 커널에 가깝게 필터링 로직을 전진 배치함으로써 인프라 비용을 절감하고 시스템 관측성을 높일 수 있습니다. 성능 저하 없는 정밀한 보안 감시나 실시간 파일 추적이 필요한 환경이라면 eBPF 기반의 조기 필터링 아키텍처 도입을 적극 권장합니다.

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) 사이의 균형을 재검토하고, 최악의 순간에도 사용자에게 최소한의 가시성을 제공할 수 있는 복구 탄력성을 구축하는 것이 권장됩니다.