컴퓨팅 성능의 발전은 데이터 처리 패러다임의 변화를 이끌고 있습니다. 전통적인 ETL(Extract, Transform, Load) 방식에서, 데이터를 먼저 적재한 후 필요에 따라 변환하는 ELT(Extract, Load, Transform) 방식으로의 전환이 가속화되고 있죠. 이러한 변화 속에서 Apache Iceberg와 같은 오픈 테이블 형식과 스키마 진화(Schema Evolution) 기술이 등장했으며, 대규모 데이터를 빠르고 유연하게 분석할 수 있는 고성능 OLAP(Online Analytical Processing) 엔진의 중요성은 그 어느 때보다 커졌습니다.
이러한 배경 속에서 최근 주목받고 있는 데이터베이스가 바로 StarRocks입니다. 이 글에서는 StarRocks가 왜 현대 데이터 아키텍처에 필요한지, 그 내부 구조는 어떻게 동작하는지, 그리고 실제 운영 환경에서 성능을 극대화하기 위한 최적화 전략은 무엇인지 깊이 있게 살펴보겠습니다.
과거 빅데이터 분석 환경에서는 모든 데이터를 하나의 거대한 테이블에 미리 가공하여 넣는 플랫 테이블(Flat Table) 구조가 일반적이었습니다. 하지만 거버넌스 환경으로의 전환이 가속화되면서, 데이터가 목적에 맞게 잘게 분리되어 유통되는 경우가 많아졌습니다. 이로 인해 여러 데이터 소스를 유연하게 JOIN하여 분석하는 능력의 중요성이 커졌습니다.
또한, 고성능 OLAP 데이터베이스를 도입하면, 데이터베이스 내에서 직접 중간 및 최종 집계 데이터를 생성(롤업)하고, 세분화된 원본 데이터를 다양하게 변환하는 작업이 가능해집니다. 이는 데이터 파이프라인의 복잡성을 줄이고, 분석 속도를 높이는 데 큰 이점을 제공합니다.
◼️ OLAP 엔진 플랫폼 비교: StarRocks vs. ClickHouse
고성능 OLAP 엔진의 대표 주자로는 StarRocks와 ClickHouse가 있습니다. 두 데이터베이스는 여러 공통점을 가지지만, 핵심적인 차이점도 존재합니다.
특징 | ClickHouse | StarRocks |
---|---|---|
데이터 변환 | 다양한 테이블 엔진과 Materialized View를 통해 지원 (주로 Transform-After-Load). | Generated Column과 Materialized View를 통해 지원 (Generated Column을 통해 일부 Transform-Before-Load 가능). |
Materialized View 업데이트 | 원본 데이터 INSERT 시 트리거되는 실시간(Near-Realtime) 방식. | 사용자의 명령(수동 실행) 또는 내장 스케줄러를 통해 기본 테이블 기반으로 비동기 업데이트. |
스토리지 구조 | LSM-Tree 기반 스토리지. | LSM-Tree 기반 네이티브 스토리지 + 클라우드 분산 스토리지(S3 등) 직접 지원 (연산/스토리지 분리 가능). |
JOIN 기능 | JOIN 기능이 상대적으로 제한적이며, 대규모 테이블 간의 복잡한 조인에는 한계가 있을 수 있음. | 뛰어난 JOIN 성능을 제공하여, 분리된 다양한 데이터를 유연하게 조합 가능. |
데이터 거버넌스 적합성 | JOIN 능력의 한계로 인해, 잘게 분리된 데이터를 통합 분석해야 하는 환경에서는 부적합할 수 있음. | 뛰어난 JOIN 성능 덕분에, 다양한 거버넌스 환경에서 분산된 데이터를 통합 분석하는 데 매우 적합. |
쿼리 엔진 | 최적화된 MPP(Massively Parallel Processing) 아키텍처로 대규모 데이터 고속 처리 가능. | 최적화된 벡터화(Vectorized) 실행 엔진과 MPP 아키텍처로 대규모 데이터 고속 처리 가능. |
GROUP BY 성능 | 우수하지만, StarRocks 대비 전반적인 GROUP BY 성능은 다소 뒤처질 수 있음. | 테스트 전반에 걸쳐 ClickHouse 대비 우수한 GROUP BY 성능을 보임 (특히 데이터 양이 많을수록 격차 증가). |
◼️ StarRocks의 주요 강점 요약
산업계 동향: StarRocks는 WeChat, Trip.com, Tencent Games, Lenovo, Airbnb 등 다양한 글로벌 기업의 대규모 데이터 분석 플랫폼에 적용되어 그 성능과 안정성을 입증받고 있습니다. 또한, 풍부한 커넥터 생태계를 통해 다양한 데이터 소스 및 BI 도구와 손쉽게 연동할 수 있습니다.
StarRocks는 크게 프런트엔드(Frontend, FE)와 백엔드(Backend, BE/CN) 노드로 구성된 MPP(Massively Parallel Processing) 아키텍처를 가집니다.
◼️ Shared-nothing vs. Shared-data 구조
StarRocks는 배포 시나리오에 따라 두 가지 주요 아키텍처를 선택할 수 있습니다.
🤔 꼬리 질문: Shared-nothing과 Shared-data 아키텍처는 각각 어떤 장단점을 가질까요? 어떤 비즈니스 요구사항이나 운영 환경에서 각 아키텍처가 더 유리할지 논의해 볼 수 있을까요?
StarRocks의 뛰어난 성능은 내부적으로 효율적인 스토리지 엔진과 데이터 레이아웃 설계에 기인합니다.
◼️ LSM-Tree 기반 스토리지 엔진
StarRocks는 LSM-Tree(Log-Structured Merge Tree) 기반의 스토리지 엔진을 사용합니다.
SELECT
쿼리의 WHERE
조건절에 정렬 키 컬럼이 포함되면 필요한 데이터 범위만 빠르게 스캔하여 성능을 크게 향상시킬 수 있습니다. (Predicate Pushdown) 따라서 자주 사용되는 필터링 조건을 고려하여 정렬 키를 신중하게 선택하는 것이 매우 중요합니다.◼️ 정렬 키와 Prefix 인덱스
StarRocks는 정렬된 데이터에서 특정 데이터를 빠르게 찾기 위해, 일정한 간격으로 '값:위치' 형식의 稀疏索引(Sparse Index)을 생성합니다. 정렬 키는 여러 컬럼의 조합으로 생성될 수 있으며, 이 조합의 앞부분을 사용한 Prefix 인덱스로 데이터의 위치를 표현합니다.
CHAR
, VARCHAR
, STRING
과 같은 문자열 타입은 한 번만, 그리고 조합의 마지막에만 사용할 수 있습니다.◼️ 데이터 레이아웃: 파티셔닝과 버킷팅(샤딩)
StarRocks 테이블의 데이터는 파티셔닝(Partitioning)과 버킷팅(Bucketing, 다른 시스템의 샤딩과 유사)을 통해 여러 노드에 분산되어 저장 및 처리됩니다.
🤔 꼬리 질문: 파티셔닝과 버킷팅은 어떤 차이가 있을까요? 만약 버킷팅 키를 잘못 선택하여 데이터가 특정 노드로 쏠리는 '데이터 스큐(Data Skew)' 현상이 발생하면, 쿼리 성능에 어떤 영향을 미치며 이를 어떻게 해결할 수 있을까요?
StarRocks의 성능을 최대한으로 끌어올리기 위해서는 다음과 같은 전략들을 종합적으로 고려해야 합니다.
SELECT
쿼리 조건에 맞는 정렬 키를 설정하여 데이터 프루닝 효과를 극대화합니다.WHERE
절에서 범위 조건으로 자주 사용되는 날짜 컬럼 등을 사용하여 파티션 프루닝이 효과적으로 일어나도록 설계합니다.WHERE
절의 필터링 조건과 일치시켜, 필요한 데이터 블록만 읽도록 설정하여 I/O를 최소화합니다.SHOW PARTITIONS
및 SHOW TABLETS
명령어를 통해 각 파티션과 태블릿(버킷의 실제 저장 단위)에 저장된 데이터의 크기와 행 수를 주기적으로 확인합니다.Windows
함수 등 일부 제약 존재)'잘' 운영하기 위해서는 다양한 기술적 선택지 중에서 서비스의 요구사항과 특성에 맞는 최선의 선택을 내리는 것이 중요합니다. 데이터베이스 기술은 본격적으로 클라우드 환경에 맞춰 진화하고 있으며, 단순히 기존의 온프레미스(On-premise) 구조를 클라우드로 옮기는 것을 넘어, 클라우드 네이티브 환경에서 새롭게 개발되고 있습니다.
StarRocks 역시 동적 스케일링, 오브젝트 스토리지를 활용한 연산/스토리지 분리 등 클라우드 환경에 최적화된 기능들을 지속적으로 발전시키고 있습니다. Kubernetes 환경에서는 Operator를 활용하여 배포 및 관리를 자동화할 수 있지만, 그만큼 업그레이드나 장애 발생 시 대응 방안을 사전에 철저히 수립하는 고민이 필요합니다.
이 글이 고성능 OLAP 엔진, 특히 StarRocks를 이해하고 실제 시스템에 도입하여 성능을 최적화하는 데 도움이 되었기를 바랍니다.
참고:
- LSM-Tree (Log-Structured Merge Tree): '흩어져 있는 데이터 변경 사항을 메모리에서 정렬한 후, 이를 디스크에 순차적으로 기록하고, 백그라운드에서 여러 개의 작은 파일들을 하나의 큰 정렬된 파일로 병합하는 기술'로, 쓰기 성능을 극대화하기 위해 많은 현대 데이터베이스(ClickHouse, RocksDB, HBase, Cassandra 등)에서 사용되는 핵심 스토리지 엔진 구조입니다.
- CBO (Cost-Based Optimizer): 데이터에 대한 통계 정보(테이블 크기, 카디널리티, 데이터 분포 등)를 기반으로 여러 가능한 쿼리 실행 계획들의 비용을 예측하고, 가장 비용이 적게 드는 최적의 실행 계획을 선택하는 쿼리 옵티마이저입니다. StarRocks는 강력한 CBO 성능을 주요 특징 중 하나로 내세우고 있습니다.