ClickHouse의 독특한 기능
ClickHouse의 독특한 기능 (Distinctive Features of ClickHouse)
ClickHouse가 다른 데이터베이스와 구별되는 핵심 기능들을 살펴봐요. 진정한 컬럼 지향 저장, 데이터 압축, 벡터 연산 엔진, 분산 처리 등 ClickHouse의 강력함을 만들어 내는 요소들을 차례대로 다룹니다.
출처: 문서
본문
진정한 컬럼 지향 데이터베이스 관리 시스템 (True column-oriented database management system)
진짜 컬럼 지향 DBMS에서는 값과 함께 추가 데이터가 저장되지 않습니다. 즉, 값 옆에 길이 "숫자"를 저장하지 않으려면 고정 길이 값을 지원해야 합니다. 예를 들어 10억 개의 UInt8 타입 값은 압축되지 않은 상태에서 약 1 GB를 차지해야 하며, 이는 CPU 사용에 큰 영향을 줍니다. 데이터를 (어떤 "쓰레기"도 없이) 압축 없이도 빡빡하게 저장하는 것이 필수적입니다. 왜냐하면 압축 해제 속도(CPU 사용)는 주로 압축되지 않은 데이터의 양에 달려 있기 때문입니다.
이것은 다른 시나리오에 최적화되어 컬럼을 분리해 저장할 수 있지만 분석 쿼리를 효과적으로 처리하지 못하는 HBase, Bigtable, Cassandra, Hypertable 같은 시스템과 대조적입니다. 이러한 시스템에서는 초당 약 십만 행의 처리량을 얻지만, 초당 수억 행은 얻지 못합니다.
마지막으로, ClickHouse는 단일 데이터베이스가 아니라 데이터베이스 관리 시스템입니다. 서버를 재구성하거나 재시작하지 않고도 런타임에 테이블과 데이터베이스를 만들고, 데이터를 로드하고, 쿼리를 실행할 수 있게 해 줍니다.
데이터 압축 (Data compression)
일부 컬럼 지향 DBMS는 데이터 압축을 사용하지 않습니다. 하지만 데이터 압축은 탁월한 성능을 달성하는 데 핵심적인 역할을 합니다.
디스크 공간과 CPU 소비 간에 다양한 트레이드오프를 가진 효율적인 범용 압축 코덱에 더해, ClickHouse는 특정 종류의 데이터를 위한 특수 코덱을 제공합니다. 이를 통해 ClickHouse는 시계열 데이터베이스 같은 더 틈새적인 데이터베이스와 경쟁하고 능가할 수 있습니다.
데이터의 디스크 저장 (Disk storage of data)
데이터를 primary key로 물리적으로 정렬해 두면 특정 값이나 값 범위를 기준으로 수십 밀리초 미만의 저지연으로 데이터를 추출할 수 있습니다. SAP HANA, Google PowerDrill 같은 일부 컬럼 지향 DBMS는 RAM에서만 동작할 수 있습니다. 이 방식은 실시간 분석에 필요한 것보다 더 큰 하드웨어 예산을 할당해야 합니다.
ClickHouse는 일반 하드 드라이브에서 동작하도록 설계되어 데이터 저장 비용(GB당)이 낮지만, SSD와 추가 RAM도 사용 가능하다면 완전히 활용합니다.
다중 코어에서의 병렬 처리 (Parallel processing on multiple cores)
대규모 쿼리는 자연스럽게 병렬화되어 현재 서버에서 사용 가능한 모든 필요한 리소스를 활용합니다.
다중 서버에서의 분산 처리 (Distributed processing on multiple servers)
위에서 언급한 컬럼형 DBMS 중 거의 대부분이 분산 쿼리 처리를 지원하지 않습니다.
ClickHouse에서 데이터는 서로 다른 샤드(shard)에 상주할 수 있습니다. 각 샤드는 내결함성을 위한 복제본 그룹이 될 수 있어요. 모든 샤드는 사용자에게 투명하게 쿼리를 병렬 실행하는 데 사용됩니다.
SQL 지원 (SQL support)
ClickHouse는 대부분 ANSI SQL 표준과 호환되는 SQL 기반의 선언적 쿼리 언어를 지원합니다.
지원되는 쿼리에는 GROUP BY, ORDER BY, FROM의 서브쿼리, JOIN 절, IN 연산자, 윈도우 함수, 스칼라 서브쿼리가 포함됩니다.
상관(의존) 서브쿼리는 작성 시점 기준으로 지원되지 않지만 미래에 가능해질 수 있습니다.
벡터 연산 엔진 (Vector computation engine)
데이터는 컬럼으로만 저장되는 것이 아니라 벡터(컬럼의 일부)로 처리되어 높은 CPU 효율을 달성할 수 있습니다.
실시간 데이터 삽입 (Real-time data inserts)
ClickHouse는 primary key가 있는 테이블을 지원합니다. primary key 범위에 대한 쿼리를 빠르게 수행하기 위해 데이터는 merge tree를 사용해 점진적으로 정렬됩니다. 이 덕분에 데이터를 테이블에 계속 추가할 수 있습니다. 새 데이터 수집 시 잠금(lock)은 걸리지 않습니다.
기본 인덱스 (Primary indexes)
데이터를 primary key로 물리적으로 정렬해 두면 특정 값이나 값 범위를 기반으로 수십 밀리초 미만의 저지연으로 데이터를 추출할 수 있습니다.
보조 인덱스 (Secondary indexes)
다른 데이터베이스 관리 시스템과 달리 ClickHouse의 보조 인덱스는 특정 행이나 행 범위를 가리키지 않습니다. 대신, 일부 데이터 파츠의 모든 행이 쿼리 필터링 조건과 일치하지 않는다는 것을 데이터베이스가 미리 알게 해 주어 전혀 읽지 않도록 합니다. 그래서 데이터 스킵 인덱스(data skipping indexes)라고 부릅니다.
온라인 쿼리에 적합 (Suitable for online queries)
대부분의 OLAP 데이터베이스 관리 시스템은 1초 미만 지연 시간의 온라인 쿼리를 목표로 하지 않습니다. 다른 시스템에서는 리포트 생성에 수십 초나 심지어 수 분이 걸리는 것을 종종 허용 가능하다고 간주합니다. 때로는 그보다 더 오래 걸려 리포트를 오프라인으로 준비해야 합니다(미리 준비하거나 "나중에 다시 오세요"라고 응답).
ClickHouse에서 "낮은 지연 시간"은 쿼리가 지연 없이, 답을 미리 준비하려고 하지 않고, 사용자 인터페이스 페이지가 로딩되는 바로 그 순간에 처리될 수 있다는 것을 의미합니다—즉, 온라인이라는 뜻입니다.
근사 계산 지원 (Support for approximated calculations)
ClickHouse는 정확성과 성능을 교환하는 다양한 방법을 제공합니다:
- 고유 값 개수, 중앙값, 분위수의 근사 계산을 위한 집계 함수.
- 데이터의 일부(SAMPLE)를 기반으로 쿼리를 실행해 근사 결과 얻기. 이 경우 디스크에서 비례적으로 적은 데이터가 검색됩니다.
- 모든 키 대신 제한된 수의 임의 키에 대해 집계 실행. 데이터의 키 분포에 대한 특정 조건 하에서 이는 더 적은 리소스를 사용하면서도 상당히 정확한 결과를 제공합니다.
적응형 조인 알고리즘 (Adaptive join algorithm)
ClickHouse는 여러 테이블을 JOIN하는 방법을 적응적으로 선택합니다. 해시 조인을 선호하고 큰 테이블이 두 개 이상이면 merge join으로 대체합니다.
데이터 복제와 무결성 지원 (Data replication and data integrity support)
ClickHouse는 비동기 멀티-마스터 복제를 사용합니다. 사용 가능한 어떤 복제본에든 기록된 후, 나머지 모든 복제본은 백그라운드에서 자신의 사본을 가져옵니다. 시스템은 서로 다른 복제본에 동일한 데이터를 유지합니다. 대부분의 실패로부터의 복구는 자동으로, 복잡한 경우에는 반자동으로 수행됩니다.
자세한 내용은 데이터 복제 섹션을 참고하세요.
역할 기반 접근 제어 (Role-Based Access Control)
ClickHouse는 SQL 쿼리로 사용자 계정 관리를 구현하고, ANSI SQL 표준과 인기 있는 관계형 데이터베이스 관리 시스템에서 볼 수 있는 것과 유사한 역할 기반 접근 제어 구성을 허용합니다.
단점으로 간주될 수 있는 기능 (Features that can be considered disadvantages)
- 완전한 트랜잭션(full-fledged transactions)이 없습니다.
- 높은 비율과 낮은 지연 시간으로 이미 삽입된 데이터를 수정하거나 삭제할 수 없습니다. 데이터 정리나 수정을 위한 배치 삭제와 업데이트가 있습니다(예: GDPR 준수).
- 희소 인덱스(sparse index) 때문에 ClickHouse는 키로 단일 행을 검색하는 포인트 쿼리에 그다지 효율적이지 않습니다.