Snuba 아키텍처 분석: Sentry의 실시간 데이터 처리 엔진

Snuba는 ClickHouse 기반의 분산 데이터 플랫폼으로, Kafka에서 직접 데이터를 수집하고 최적화된 쿼리를 제공하는 서비스입니다. Sentry의 에러 추적 및 성능 모니터링 기능을 지원하는 핵심 인프라입니다.

핵심 역할

Snuba는 기존 Postgres와 Redis 조합을 대체하여 설계되었으며, 현재는 Sentry의 대부분의 시계열 기능을 담당하고 있습니다.

주요 기능

  • ClickHouse 클러스터에 대한 추상화된 데이터베이스 접근 계층
  • SnQL(Snuba Query Language)을 통한 선언적 데이터 모델 쿼리
  • 다중 데이터셋 지원 및 규칙 기반 쿼리 최적화
  • 분산 환경에서의 DDL 마이그레이션 관리
  • Kafka 스트림 실시간 수집
  • 즉시 쿼리와 지속적 쿼리(Subscription) 모두 지원

Sentry 내 활용 데이터셋

데이터셋지원 기능특징
eventsIssue Page, 에러 검색집계 함수 및 검색 지원
discoverPerformance Monitoring성능 지표 분석
sessionsReleases, Release Health사전 집계로 대용량 데이터 고속 처리
outcomesStats 대시보드통계 데이터 제공

개발 환경 구축

필수 의존성

  • ClickHouse 서버 (기본: localhost)
  • Redis 인스턴스 (기본: localhost:6379)

Snuba를 제외한 Sentry 서비스 실행:

sentry devservices up --exclude=snuba

시간대는 반드시 UTC로 설정해야 하며, 그렇지 않으면 데이터 불일치가 발생할 수 있습니다.

Sentry 연동 설정

~/.sentry/sentry.conf.py 파일 수정:

SENTRY_SEARCH = 'sentry.search.snuba.EventsDatasetSnubaSearchBackend'
SENTRY_TSDB = 'sentry.tsdb.redissnuba.RedisSnubaTSDB'
SENTRY_EVENTSTREAM = 'sentry.eventstream.snuba.SnubaEventStream'

전체 서비스 기동:

sentry devservices up

ClickHouse 클라이언트 접속:

docker exec -it sentry_clickhouse clickhouse-client

sentry_local 테이블 데이터 확인:

SELECT count() FROM sentry_local;

핵심 설정 항목

  • CLUSTERS: 호스트, 포트, 스토리지 세트, 로컬/분산 모드 설정
  • REDIS_HOST: Redis 연결 정보

내부 아키텍처

스토리지 설계

ClickHouse를 백엔드로 채택한 이유는 실시간 성능, 분산 및 복제 기능, 스토리지 엔진 유연성, 일관성 보장 사이의 균형 때문입니다. 데이터는 테이블과 물화 뷰(Materialized View)에 저장되며, 용도에 따라 다양한 ClickHouse 엔진이 활용됩니다.

데이터셋은 독립적인 논리적 파티션으로 구성되며, 각각 별도의 스키마와 접근 패턴을 가집니다.

데이터 수집 파이프라인

Snuba는 직접적인 INSERT API를 제공하지 않습니다. 대신 Kafka 픽에서 소비자(Consumer)가 데이터를 가져와 ClickHouse에 기록하는 방식입니다.

소비자는 하나 이상의 토픽을 구독하고 하나 이상의 테이블에 쓰며, 동일 테이블에 여러 소비자가 쓰는 경우는 없습니다. 이 구조는 데이터 일관성 보장의 기반이 됩니다.

배치 처리를 통해 Kafka와 ClickHouse 간의 효율성을 극대화하며, 최소 한 번(At-least-once) 전달을 보장합니다. ClickHouse의 테이블 엔진 특성을 활용한 중복 제거로, 최종적 일관성 하에서 정확히 한 번(Exactly-once) 의미론을 달성합니다.

쿼리 처리 방식

즉시 쿼리 (Ad-hoc Query)

SnQL로 작성된 쿼리를 HTTP POST로 전송하면, 쿼리 엔진이 이를 ClickHouse 쿼리로 변환하여 실행합니다.

지속적 쿼리 (Streaming Query / Subscription)

클라이언트가 HTTP 엔드포인트로 스트리밍 쿼리를 등록하면, 구독 소비자가 관련 Kafka 토픽의 변경 사항을 모니터링합니다. 주기적으로 쿼리를 실행하고 결과를 결과 토픽에 발행하여 푸시 방식으로 전달합니다.

일관성 모델

모델특징적용 방식
최종적 일관성 (기본)단조 읽장 보장 없음, 복제본 상태 불확실별도 설정 없음
순차적 일관성단일 리더처럼 동작, 강한 일관성FINAL 키워드 + 특정 복제본 강제 지정

Sentry 배포 환경에서의 데이터 흐름

Errors 및 Transactions 파이프라인

events 토픽이 errors와 transactions를 공유합니다. 이 토픽은 에러 메시지와 트랜잭션 메시지를 모두 포함합니다.

Errors 처리 흐름

  1. Errors Consumer가 events 토피에서 메시지를 가져와 ClickHouse errors 테이블에 기록
  2. 커밋 후 snuba-commit-log 토픽에 기록 발행
  3. Errors Subscription Consumer가 events 토피과 snuba-commit-log 토픽을 동시에 소비하여 동기화
  4. 알람 조건 충족 시 ClickHouse 쿼리 실행 및 result 토픽에 결과 발행
  5. Sentry가 events 토픽에 변형 이벤트(병합/해제/재처리 등) 발행
  6. Errors Consumer가 replacements 토픽으로 전달
  7. Replacement Consumer가 실제 적용

events 토픽은 Sentry project id 기준으로 의미적 파티셔닝이 필요하며, 이는 알람과 replacements의 순차 처리를 위한 필수 조건입니다.

Transactions 처리 흐름

Errors와 동일한 패턴으로 독립적인 파이프라인에서 처리됩니다.

Sessions 및 Outcomes 파이프라인

더 단순한 구조로, 각각 독립적인 Kafka 토픽과 Consumer를 가지고 ClickHouse의 전용 테이블에 기록됩니다.

  • Sessions: Release Health 기능 지원, 사전 집계로 대량 데이터 른 조회
  • Outcomes: Sentry 통계 페이지 데이터 제공

CDC(Change Data Capture) 파이프라인

cdc 토피을 활용하여 ClickHouse의 두 개별 테이블을 갱신하는 파이프라인으로, 현재 개발 진행 중입니다.

태그: snuba Sentry ClickHouse kafka 데이터 파이프라인

7월 17일 16:42에 게시됨