41TB 로그를 20초 만에? 카카오페이증권의 ClickHouse 기반 로그 시스템 구축기
OpenSearch 기반 기존 로깅 시스템의 비용 증가 및 성능 저하 문제를 해결하기 위해 ClickHouse 기반의 새로운 아키텍처를 설계
OpenTelemetry, ClickHouse, HyperDX를 활용한 ClickStack을 구축하여 로그 지연 시간 20초 이내로 단축
Filebeat에서 OpenTelemetry로 수집기 전환, Kafka Topic 통합, Fluentd에서 OpenTelemetry로 처리기 전환 등 7단계 개선을 통해 시스템 전반의 성능 향상
비용 85.6% 절감 및 초당 83만 건의 로그 처리, 운영 복잡도 감소 등 획기적인 성과 달성
Amazon S3 아카이빙(ssak3)을 통해 장기 보관 비용 절감 및 ClickHouse S3 Engine을 활용한 효율적인 장기 로그 조회 환경 구축
OpenTelemetry를 활용한 로그 수집 파이프라인 개선
기존 Filebeat는 JSON 형식으로 로그를 전송하여 JSON 오버헤드(JSON Overhead)로 인해 전송량 및 Kafka CPU 사용량이 높았다. OpenTelemetry Collector는 OTLP Proto 인코딩(OTLP Proto Encoding)과 배치 전송(Batching)을 통해 이 문제를 해결했다.
OTLP Proto: 필드명 대신 숫자 태그를 사용하여 데이터 용량 40~60% 절감
배치 전송: 여러 로그를 묶어 전송하여 Kafka Produce Request 횟수 감소
결과적으로 배치 전송만으로 처리량이 18배 향상되었으며, Kafka CPU 사용량도 2배 이상 감소했다. 이러한 개선은 로그 수집 파이프라인의 효율성을 크게 향상시켰다.
Kafka Topic 통합 및 파티션 전략
기존 서비스별 Fluentd Deployment로 인해 300개 이상의 Kafka Topic이 존재하여 리소스 낭비 및 관리 복잡성이 높았다. OpenTelemetry Collector와 ClickHouse의 성능 테스트를 통해 Topic 통합 가능성을 확인하고, 로그 타입(std/nginx/transaction) 기반으로 18개 Topic으로 축소했다.
파티션 수: Topic당 최대 150개 파티션으로 설정
컨슈머 수: 파티션 수와 공약수 관계로 설정하여 트래픽 스파이크에 유연하게 대응
증권업 특성상 트래픽 변동성이 크므로, 20%의 자원 손실을 감수하고 장애 대응 유연성을 확보했다.
ClickHouse를 활용한 로그 저장소 아키텍처
OpenSearch의 낮은 압축률, 대용량 집계 비효율, 컬럼 검색 취약성 등의 문제를 해결하기 위해 ClickHouse를 선택했다. ClickHouse는 컬럼형 저장(Column-oriented Storage), ZSTD 압축(ZSTD Compression), 벡터화 실행(Vectorized Execution)을 통해 높은 압축률과 빠른 집계 성능을 제공한다.
Shard: 6개 샤드(Shard)로 수평 분할
Replica: 샤드당 2개 레플리카(Replica) 구성
Partition: 시간 단위 파티션(Hourly Partition), TTL(Time To Live) 설정을 통해 데이터 보존 및 삭제 관리
이러한 설계를 통해 OpenSearch 대비 78%의 비용 절감을 달성했다.
ClickHouse 테이블 엔진 및 데이터 흐름
ClickHouse는 용도별 특화된 테이블 엔진을 제공하며, 이를 조합하여 각 역할에 최적화된 구조를 만들었다. Buffer, ReplicatedMergeTree, Distributed, View 엔진을 조합하여 실시간 처리, 데이터 저장, 분산 쿼리, 통합 조회를 구현했다.
Buffer 테이블: 메모리 버퍼링(Memory Buffering)을 통해 INSERT 빈도 감소, 1GB 도달 시 또는 30초마다 flush
ReplicatedMergeTree: 컬럼형 저장(Column-oriented Storage), 자동 Merge, 샤드 간 복제
Store 테이블: ReplicatedMergeTree를 사용하여 데이터 유실 방지 및 고가용성 확보
Buffer 테이블의 장애를 대비하여 Kafka를 앞단에 두고, Store 테이블은 서로 다른 Zone에 Replica를 배치했다.
ssak3를 활용한 S3 아카이빙 및 장기 보관
실시간 로그 처리 시스템 안정화 후, 장기 보관을 위해 Amazon S3로 아카이빙하는 ssak3를 개발했다. 기존 Fluentd S3 Output의 IAM Role Anywhere 미지원, 느린 처리 속도, 중복 파싱 등의 문제를 해결하기 위해 Python 기반으로 자체 개발했다.
아카이빙 주기: 3일 지연 (Parts Merge 완료 + 재처리 여유)
데이터 형식: Parquet + ZSTD 압축
S3 Engine: ClickHouse S3 Engine을 활용하여 S3에 저장된 Parquet 파일을 직접 조회
ssak3는 워터마크 테이블을 통해 아카이빙 작업의 진행 상태를 추적하고, 실패 시 자동 재시도를 지원하여 데이터 유실을 방지한다.
HyperDX를 활용한 로그 조회 UI
기존 Signoz의 테이블 구조 고정, attributes Map 접근 제한, 커스터마이징 한계 등의 문제로 인해 ClickHouse를 직접 쿼리하는 HyperDX를 선택했다. HyperDX는 컬럼 기반 필터(Column-based Filtering)를 지원하여 빠른 검색을 가능하게 하며, 우리가 설계한 테이블 구조의 장점을 최대한 활용할 수 있다.
컬럼 검색: ServiceName:payment와 같이 특정 컬럼만 스캔하여 검색 속도 향상
타임라인 뷰, 세션 추적, 대시보드, 알람 기능 제공
HyperDX와 Grafana를 병행하여 로그 검색 및 시스템 메트릭 모니터링을 수행하며, 개발 생산성을 향상시켰다.