Ken
직접 개발을 진행하고 있는 ClickHouse의 Refreshable Materialized View를 활용한 셀프서비스 옵저버빌리티 스크립트로 ClickStack을 활용해서 입수 현황을 관제할 수 있습니다.
- 들어가며
- 왜 CH2OTEL이 필요한가?
- ClickHouse Cloud 모니터링의 현실
- OpenTelemetry 표준의 가치
- 셀프서비스 접근 방식
- 아키텍처 및 데이터 흐름
- 전체 데이터 파이프라인
- Refreshable Materialized View의 활용
- OTEL 표준 스키마 설계
- 시스템 로그 파이프라인
- 데이터 변환 로직
- 설치 및 구성
- 대화형 설치 프로세스
- 운영 도구
- 활용 사례 및 통합
- HyperDX 통합
- 데이터 파이프라인 모니터링
- 비용 최적화 인사이트
- 기술적 고려사항 및 제한사항
- 현재 버전의 제한사항
- Lookback Interval 설계
- 성능 및 리소스 고려사항
- 로드맵
- v1.1 계획
- v2.0 비전
- 마치며
들어가며
현대 분산 시스템 환경에서 옵저버빌리티(Observability)는 더 이상 선택이 아닌 필수가 되었습니다. 시스템이 점점 더 복잡해지면서, 단순히 "무엇이 잘못되었는가"를 아는 것만으로는 충분하지 않습니다. 우리는 "왜 잘못되었는가"를 이해해야 하며, 이를 위해서는 로그, 메트릭, 트레이스라는 세 가지 옵저버빌리티 신호(Signal)를 통합적으로 수집하고 분석할 수 있어야 합니다.
OpenTelemetry(OTel)는 CNCF(Cloud Native Computing Foundation)에서 관리하는 오픈소스 프로젝트로, 이러한 옵저버빌리티 데이터를 생성, 수집, 처리, 내보내기 위한 표준화된 프레임워크를 제공합니다. 벤더에 종속되지 않으면서도 다양한 백엔드 시스템과 호환되는 OTel은 이미 업계 표준으로 자리잡았습니다.
ClickHouse Cloud를 운영하면서 한 가지 과제에 직면했습니다. ClickHouse는 풍부한 시스템 테이블을 통해 내부 동작에 대한 상세한 정보를 제공하지만, 이 데이터를 외부 옵저버빌리티 도구와 통합하려면 별도의 Collector나 Agent를 구성해야 했습니다. 이는 추가적인 인프라 비용과 운영 복잡성을 의미했습니다.
CH2OTEL은 이 문제를 해결하기 위해 탄생했습니다. ClickHouse의 Refreshable Materialized View(RMV)를 활용하여, 외부 컴포넌트 없이 ClickHouse Cloud 내부에서 시스템 메트릭과 로그를 OpenTelemetry 표준 형식으로 자동 변환하는 셀프서비스 옵저버빌리티 솔루션입니다.
왜 CH2OTEL이 필요한가?
ClickHouse Cloud 모니터링의 현실
ClickHouse Cloud는 system.* 테이블을 통해 쿼리 로그, 파트 이벤트, 메트릭 등 다양한 운영 데이터를 제공합니다. 그러나 이 데이터를 활용하는 데는 몇 가지 제약이 있습니다.
첫째, 시스템 테이블은 ClickHouse 고유의 스키마를 사용합니다. HyperDX, Grafana, Datadog과 같은 외부 옵저버빌리티 도구와 통합하려면 데이터 형식 변환이 필요합니다. 둘째, 기존 모니터링 접근 방식은 외부 Agent가 주기적으로 ClickHouse에 쿼리를 실행하는 방식으로 동작합니다. 이는 ClickHouse Cloud의 비용 최적화 유휴(idle) 동작과 충돌하며, 인스턴스가 절대 idle 상태로 전환되지 않아 불필요한 비용이 발생할 수 있습니다.
OpenTelemetry 표준의 가치
OpenTelemetry는 로그, 트레이스, 메트릭이라는 세 가지 옵저버빌리티 신호를 정의합니다. 이 표준을 채택함으로써 얻을 수 있는 이점은 분명합니다.
로그는 타임스탬프가 포함된 이벤트 기록으로, 시스템에서 발생한 일을 설명합니다. 트레이스는 분산 시스템에서 요청이 이동하는 경로를 추적하여, 여러 서비스에 걸친 작업의 흐름을 파악할 수 있게 합니다. 메트릭은 시스템 성능을 나타내는 정량적 데이터로, 시간에 따른 추세 분석과 알림 설정에 활용됩니다.
OTel의 핵심 강점은 상관관계(Correlation)입니다. TraceId와 SpanId를 통해 로그, 트레이스, 메트릭을 연결할 수 있어, 문제 발생 시 신속하게 근본 원인을 파악할 수 있습니다.
셀프서비스 접근 방식
CH2OTEL의 핵심 철학은 "셀프서비스"입니다. 외부 Collector나 Agent 없이 ClickHouse Cloud 내부에서 모든 처리가 이루어집니다.
이 접근 방식은 추가 인프라 불필요, 보안 경계 유지, 실시간에 가까운 데이터 변환이라는 이점을 제공합니다. ClickHouse의 강력한 쿼리 엔진을 활용하여 시스템 테이블 데이터를 OTel 형식으로 변환하고, 이를 별도의 테이블에 저장합니다. 결과적으로 HyperDX와 같은 OTel 호환 도구에서 바로 조회할 수 있는 표준화된 옵저버빌리티 데이터가 생성됩니다.
아키텍처 및 데이터 흐름
전체 데이터 파이프라인
CH2OTEL의 데이터 흐름은 다음 다이어그램과 같이 5단계로 구성됩니다.
데이터 흐름 단계 설명:
- 📊 System Tables (소스): ClickHouse의 시스템 테이블에서 원본 데이터 수집
- ⚙️ RMV (수집): Refreshable Materialized View가 주기적으로 데이터 추출
- 🔄 Transformation (변환): OTEL 표준 형식으로 스키마 변환
- 📁 OTEL Tables (저장): 표준화된 데이터를 OTEL 테이블에 저장
- 🔍 Observability Tools (소비): HyperDX, Grafana 등에서 데이터 조회 및 분석
Refreshable Materialized View의 활용
CH2OTEL의 핵심 기술은 ClickHouse의 Refreshable Materialized View(RMV)입니다. RMV는 ClickHouse 23.12 버전에서 도입되어 24.10 버전에서 프로덕션 준비 완료(Production Ready)로 선언된 기능입니다.
전통적인 ClickHouse의 Incremental Materialized View는 데이터가 삽입될 때 트리거되어 증분 방식으로 집계를 수행합니다. 이는 실시간 처리에 탁월하지만, 복잡한 JOIN이나 전체 데이터셋에 대한 재계산이 필요한 경우에는 적합하지 않습니다.
RMV는 다른 접근 방식을 취합니다. 정의된 주기에 따라 전체 쿼리를 재실행하고, 결과를 대상 테이블에 저장합니다. 이는 전통적인 OLTP 데이터베이스의 Materialized View와 개념적으로 유사합니다.
RMV의 핵심 특징으로는 주기적 실행을 들 수 있습니다. REFRESH EVERY N MINUTE 구문으로 실행 간격을 지정할 수 있으며, APPEND 모드를 통해 기존 데이터를 대체하는 대신 새 데이터를 추가할 수 있습니다. 또한 DEPENDS ON 절을 통해 뷰 간 의존성을 정의하여 복잡한 워크플로우를 구성할 수 있습니다.
OTEL 표준 스키마 설계
CH2OTEL은 OpenTelemetry 사양을 충실히 따르는 테이블 스키마를 제공합니다. 로그 테이블인 otel_logs의 핵심 컬럼들은 TraceId와 SpanId를 통해 트레이스와의 상관관계를 지원합니다. SeverityText와 SeverityNumber는 로그 레벨을 표준화된 방식으로 표현합니다. ResourceAttributes, ScopeAttributes, LogAttributes는 Map 타입으로 구현되어 유연한 메타데이터 저장이 가능합니다.
테이블 설계에서 주목할 만한 최적화 요소들이 있습니다. 모든 컬럼에 ZSTD 압축이 적용되어 스토리지 비용을 절감합니다. 일별 파티셔닝을 통해 데이터 관리와 쿼리 성능을 최적화합니다. TTL 정책으로 보관 기간이 지난 데이터를 자동 삭제합니다. Bloom Filter 인덱스를 통해 고카디널리티 속성의 검색 성능을 향상시킵니다.
시스템 로그 파이프라인
CH2OTEL v1.0은 세 가지 핵심 시스템 로그를 OTEL 형식으로 변환합니다.
첫 번째로, rmv_part_logs는 system.part_log 테이블에서 NewPart와 MergeParts 이벤트를 수집합니다. 이를 통해 파티션 생성, 데이터 병합, 저장소 활동을 모니터링할 수 있습니다. 이벤트 유형, 처리된 행 수, 소요 시간, 메모리 사용량 등의 정보가 LogAttributes에 포함됩니다.
두 번째로, rmv_mview_logs는 system.query_views_log 테이블에서 Materialized View 실행 로그를 수집합니다. MView의 실행 상태, 성능 메트릭, 오류 정보를 추적할 수 있습니다. 이는 데이터 파이프라인의 건강 상태를 모니터링하는 데 필수적입니다.
세 번째로, rmv_status_logs는 system.view_refreshes 테이블에서 RMV 자체의 상태를 모니터링합니다. 각 RMV의 실행 상태, 마지막 성공 시간, 다음 예정 실행 시간, 오류 정보를 추적합니다. 이는 CH2OTEL 파이프라인 자체의 건강 상태를 확인하는 데 사용됩니다.
데이터 변환 로직
시스템 테이블 데이터를 OTEL 형식으로 변환하는 과정에서 몇 가지 설계 결정이 필요했습니다.
ServiceName 매핑의 경우, ClickHouse의 database.table 조합을 OTel의 ServiceName으로 사용합니다. 이를 통해 테이블 단위의 모니터링이 가능해집니다.
TraceId 생성과 관련하여, 시스템 테이블의 query_id를 TraceId로 활용하거나, 고유한 식별자가 없는 경우 MD5 해시를 통해 결정론적 TraceId를 생성합니다.
Severity 매핑에서는 이벤트 상태에 따라 적절한 로그 레벨을 할당합니다. 정상 완료는 INFO(9), 경고 상태는 WARN(13), 오류는 ERROR(17)로 매핑됩니다.
Resource Attributes 표준화에서, OTel 시맨틱 컨벤션을 따르는 속성들이 포함됩니다. service.name, deployment.environment, ClickHouse 특화 속성인 clickhouse.service_id, clickhouse.replica, clickhouse.hostname 등이 이에 해당합니다.
설치 및 구성
대화형 설치 프로세스
CH2OTEL은 사용자 친화적인 대화형 설치 스크립트를 제공합니다. 설치 과정에서 ClickHouse Cloud 연결 정보 입력, 데이터베이스 이름 설정(기본값: ch2otel), 수집 간격 설정(기본값: 10분), 데이터 보관 기간 설정(기본값: 30일)이 이루어집니다.
보안을 고려하여 인증 정보는 .credentials 파일에 별도 저장되며, .gitignore에 자동으로 추가됩니다.
운영 도구
CH2OTEL은 일상적인 운영을 위한 스크립트를 제공합니다. status.sh는 현재 테이블 상태, RMV 실행 상태, 최근 24시간 데이터 카운트를 표시합니다. refresh.sh는 모든 RMV를 수동으로 새로고침하여 필요 시 즉시 데이터를 갱신할 수 있습니다.
활용 사례 및 통합
HyperDX 통합
ClickHouse의 공식 옵저버빌리티 솔루션인 ClickStack/HyperDX와의 통합이 CH2OTEL의 주요 사용 사례입니다. HyperDX는 OTEL 스키마를 네이티브로 지원하므로, CH2OTEL이 생성한 테이블을 직접 조회할 수 있습니다.
HyperDX의 Lucene 스타일 쿼리 문법을 사용하여 로그를 검색하거나, Chart Explorer를 통해 커스텀 시각화를 생성할 수 있습니다. 특히 rum.sessionId 속성을 활용한 세션 기반 분석이 가능합니다.
데이터 파이프라인 모니터링
CH2OTEL은 ClickHouse 기반 데이터 파이프라인의 건강 상태를 모니터링하는 데 특히 유용합니다. Materialized View 실행 현황을 통해 MView별 실행 성공률, 평균 처리 시간, 오류 패턴을 분석할 수 있습니다. 데이터 적재 모니터링을 통해 파티션 생성 빈도, 병합 활동, 스토리지 사용량 추세를 파악할 수 있습니다. 파이프라인 이상 탐지를 통해 예상치 못한 지연, 오류 급증, 리소스 사용량 이상을 감지할 수 있습니다.
비용 최적화 인사이트
CH2OTEL 데이터를 분석하여 비용 최적화 기회를 발견할 수 있습니다. 과도하게 빈번한 파트 생성, 비효율적인 MView 실행 패턴, 최적화가 필요한 테이블 등을 식별할 수 있습니다.
기술적 고려사항 및 제한사항
현재 버전의 제한사항
CH2OTEL v1.0은 몇 가지 제한사항이 있습니다.
셀프서비스 전용이라는 점에서, 현재 ClickHouse Cloud 서비스만 모니터링할 수 있습니다. 같은 Organization 내의 다른 서비스는 지원하지 않습니다. 또한 ClickHouse Cloud에 최적화된 설계로 인해 자체 호스팅 ClickHouse 환경에서는 일부 기능이 제한될 수 있습니다.
Lookback Interval 설계
RMV의 REFRESH EVERY N MINUTE 설정과 함께, 소스 쿼리의 시간 범위를 결정하는 Lookback Interval 설계가 중요합니다. CH2OTEL은 Refresh Interval에 5분의 버퍼를 더한 값을 Lookback Interval로 사용합니다. 이는 타이밍 이슈로 인한 데이터 누락을 방지합니다.
APPEND 모드를 사용하므로 동일 이벤트가 중복 삽입될 가능성이 있습니다. 이는 OTEL 로그의 특성상 큰 문제가 되지 않으며, 필요시 쿼리 레벨에서 중복 제거가 가능합니다.
성능 및 리소스 고려사항
RMV 실행은 ClickHouse의 리소스를 사용합니다. 너무 짧은 Refresh Interval(예: 1분 미만)은 시스템에 부하를 줄 수 있으므로, 5분 이상의 간격을 권장합니다.
시스템 테이블 조회는 일반적으로 경량 작업이지만, 대규모 클러스터에서는 쿼리 실행 시간을 모니터링하는 것이 좋습니다.
로드맵
v1.1 계획
다음 버전에서는 Traces RMV, Metrics RMVs(gauge, sum, histogram), Sessions RMV 등 추가적인 파이프라인을 구현할 예정입니다.
v2.0 비전
장기적으로는 멀티 서비스 모니터링을 지원하는 Collector 기반 구현을 계획하고 있습니다. 이를 통해 Organization 내 여러 ClickHouse Cloud 서비스를 중앙에서 모니터링할 수 있게 됩니다. Alert 기능도 추가하여 이상 상황 발생 시 즉각적인 알림을 받을 수 있도록 할 예정입니다.
마치며
CH2OTEL은 ClickHouse Cloud 사용자가 OpenTelemetry 생태계의 이점을 누리면서도, 추가적인 인프라 복잡성 없이 시스템 옵저버빌리티를 확보할 수 있게 해줍니다. Refreshable Materialized View라는 ClickHouse의 강력한 기능을 활용하여, 데이터 변환 파이프라인을 데이터베이스 내부에서 완전히 자동화했습니다.
이 프로젝트가 ClickHouse Cloud 운영자들의 옵저버빌리티 여정에 도움이 되기를 바랍니다. 피드백과 기여는 언제나 환영합니다.
프로젝트 정보
- 버전: 1.0.0
- 라이선스: MIT
- 최종 업데이트: 2025-12-08
참고 자료
- OpenTelemetry Specification
- ClickHouse Refreshable Materialized Views
- ClickHouse System Tables
- ClickStack Observability