ClickHouse 오픈소스 10년

3 hours ago 2
  • ClickHouse는 2016년 6월 15일 공개된 뒤 10년 동안 2,000명 이상이 기여하며 오픈소스 분석 데이터베이스의 대표 프로젝트로 성장함
  • 단순 코드 공개가 아니라 기여 가이드, 코드 리뷰, 로드맵, CI, 릴리스, 문서까지 공개하는 Level 3 오픈소스를 지향함
  • 출발점은 MySQL 기반 웹 분석 시스템의 한계였고, OLAPServer와 Metrage의 경험이 컬럼 지향 처리와 MergeTree 설계로 이어짐
  • ClickHouse는 기존 DBMS 위의 확장이 아니라 2009년부터 컬럼 표현, 집계 함수, 테이블 엔진, 압축, SQL 파서, 서버·클라이언트, ReplicatedMergeTree를 단계적으로 만든 처음부터 구현한 DBMS
  • 2014년 사내 프로덕션에서 매일 수천억 레코드를 처리한 뒤, 2015년 공개 글과 내부 승인 과정을 거쳐 2016년 전 세계에 공개됨

오픈소스 공개 10년

  • ClickHouse는 2016년 6월 15일 오픈소스로 공개됨
  • 이후 2,000명 이상이 기여했고, “가장 인기 있는 오픈소스 분석 데이터베이스”가 됨
  • 프로젝트의 핵심 목표는 코드만 공개하는 데 그치지 않고 개발 과정과 기여 과정을 최대한 공개하는 것임

ClickHouse가 지향하는 오픈소스 수준

  • 오픈소스에는 여러 수준이 있음
    • Level 0: 코드를 읽을 수 있게 공개하지만 그 이상은 없음. Doom, MS-DOS 같은 보관·박물관식 공개가 예시임
    • Level 1: 공개 저장소에서 커밋으로 갱신되지만, 기여를 반드시 받지는 않음. SQLite, Ladybird가 예시임
    • Level 2: 기여는 받지만 개발 과정이 투명하고 공개적이지는 않음. 대부분의 활발한 오픈소스 프로젝트가 여기에 속함
    • Level 3: 기여 가이드, 작업 추적, 코드 리뷰, 개발 로드맵, 테스트와 CI, 릴리스 주기, 사용자 지원, 문서를 갖춤
  • ClickHouse는 Level 3 오픈소스를 지향함
  • 새 데이터베이스를 만들려는 개발자가 참고할 수 있는 코드와 개발 관행의 예시가 되는 것도 목표임
    • 코드는 모듈형, 직교적, 문서화된 형태를 지향함
    • 복잡한 개념이 필요할 때는 주석에서 처음부터 설명해 독자가 교과서, Wikipedia, AI를 참조하지 않아도 되도록 함

C++ 개발과 성능 실험의 장

  • ClickHouse는 인기 있는 C++ 오픈소스 저장소 중 하나로, C++23 같은 최신 언어 기능과 빌드 시스템, 지속적 통합·테스트, 코드 리뷰 관행 같은 기반 작업을 함께 배울 수 있는 장소를 지향함
  • 데이터 구조와 성능 최적화 실험도 중요한 사용 방식임
    • 병합을 목표로 하지 않는 실험적 Pull Request도 프로덕션 릴리스와 같은 수준으로 테스트됨
    • 새 메모리 할당기, 압축 라이브러리, 해시 테이블, 데이터 포맷, 정렬 알고리듬 같은 실험을 ClickHouse에서 검증할 수 있음
  • 로드맵에는 실험적이고 이상하며 심지어 우스꽝스러운 항목도 포함됨
  • 모든 기여자는 CHANGELOG와 데이터베이스 내부 system.contributors 테이블에서 크레딧을 받음
  • 초기 구현이 불완전한 기능도 함께 완성하는 사례가 많고, 코드 전체를 다시 작성해야 해도 초기 작성자의 의도와 사용 사례를 인정함

ClickHouse 이전의 문제와 프로토타입

  • ClickHouse의 첫 커밋은 2009년 5월 29일 만들어졌고, localtime, mktime, gmtime 같은 libc 함수가 너무 느려 프로파일러에 나타나는 문제를 줄이기 위한 성능 최적화였음
  • 출발점은 웹 분석 시스템의 데이터 처리 실험이었음
    • 시스템은 Google Analytics와 비슷하게 웹사이트에서 전송된 페이지뷰 로그를 받음
    • MySQL, C++ 데이터 처리, MySQL로 충분하지 않은 영역의 커스텀 C++ 데이터 구조를 함께 사용함
    • MySQL 데이터베이스는 고객용 사전 집계 리포트를 저장했고, 커스텀 데이터 구조는 사용자 세션과 사용자 히스토리 계산에 쓰임
  • 데이터는 계속 늘고 새 로그는 실시간으로 들어왔으며, 5분 단위 로그를 5분 안에 처리하지 못하면 지연이 계속 쌓였음
  • 여러 데이터베이스와 라이브러리도 시도함
    • TokuDB, LMDB, Judy Arrays, Hadoop, LZO, QuickLZ, HyperLogLog, 데이터 압축 자료, 이벤트 루프 서버 문서 등을 검토함
  • 사용자가 임의의 리포트를 구성하게 하려는 요구가 사전 집계 리포트의 한계를 드러냈고, 컬럼 지향 데이터베이스 검토로 이어짐

OLAPServer와 Metrage

  • 컬럼 지향 접근은 비집계 구조화 로그를 저장한 뒤, 고객이 페이지 로드를 기다리는 동안 즉석에서 집계하는 방식이었음
  • MySQL 확장인 Infobright, InfiniDB와 독립 분석 데이터베이스인 Vertica, MonetDB, LucidDB를 테스트했지만, 하루 1,000억 레코드와 500개 컬럼 로딩 조건에서는 동작하지 않았음
  • 첫 커스텀 프로토타입은 OLAPServer였음
    • 2008년 12월 구현되고 2009년 1월 배포됨
    • 모든 컬럼을 하루·웹사이트별 단일 바이너리 파일에 저장함
    • 문자열 대신 해시를 쓰고, 정수 타입만 지원함
    • 가벼운 압축을 사용하고, 하루 한 번 몇 시간 지연을 두고 갱신됨
    • 그룹화 컬럼, 집계 함수, 필터, 정렬을 지정하는 API를 제공했고 쿼리는 XML로 지정됨
    • 과거 MySQL 집계 데이터를 “비집계화”해 동일한 결과가 나오도록 채우는 작업은 Evgenii Gatov가 해결함
  • OLAPServer는 전사 인터넷 데이터를 단일 웹사이트가 아니라 전체적으로 분석하는 엔드포인트에서도 작동했고, 사내 분석가들이 내부 MapReduce 대신 사용할 만큼 즉시 응답했음
  • 두 번째 프로토타입은 Metrage였음
    • MySQL에 약 50TB 데이터가 50개 샤드로 쌓였고, 많은 커스텀 데이터 구조가 BLOB로 저장됨
    • 집계 시 프로그램이 BLOB를 읽고 커스텀 코드를 적용한 뒤 다시 삽입해야 했음
    • MySQL 데이터는 압축되지 않았고, 도착 순서와 쿼리 범위 순서가 맞지 않아 읽기도 느렸음
    • Metrage는 백그라운드 병합을 사용하는 증분 집계용 커스텀 데이터 구조였고, 각 레코드는 add, update, merge, serializeText/Binary, deserializeText/Binary 메서드를 가진 C++ 구조체로 정의됨
  • OLAPServer는 비집계 컬럼 지향 구조였고, Metrage는 임의 CRDT를 가진 실시간 행 지향 구조였음
  • ClickHouse는 컬럼 지향 집계 속도와 merge tree 기반 실시간 갱신·데이터 지역성을 결합하고, 실제 쿼리 언어와 데이터 타입을 지원하도록 일반화하면서 시작됨

처음부터 만든 DBMS

  • ClickHouse는 기존 데이터베이스 기반이 아니라 처음부터 구현된 드문 DBMS 사례임
  • 2009년 초기 커밋은 같은 모노리포지터리 안의 다른 데이터 구조 최적화와 관련된 것이며, 오픈소스 공개 과정에서 히스토리를 보존해 저장소를 분리했기 때문에 남아 있음
  • 새 DBMS 구현의 첫 단계는 메모리 내 컬럼 구현이었고, 오늘날에도 익숙한 IColumn과 Field 클래스가 등장함
    • Apache Arrow와 비슷해 보일 수 있지만, 당시 Apache Arrow는 존재하지 않았음
    • RCFile, Trevni, ORC, Parquet 같은 다른 컬럼 지향 포맷도 당시에는 존재하지 않았음
  • 이후 집계 함수가 도입됐고, 현재도 ClickHouse의 가장 중요한 부분 중 하나임
  • 테이블 엔진도 도입됨
    • 처음에는 “primary key”라는 이름을 며칠간 사용함
    • 디스크에서 컬럼을 읽고 쓰는 기능을 가능하게 함
    • 첫 테이블 엔진은 오늘날까지 존재하는 TinyLog와 비슷했음
  • 압축은 처음에 QuickLZ를 사용했지만, Yann Collet의 블로그를 읽은 뒤 LZ4로 교체됨

쿼리 파이프라인과 SQL 구현

  • block streams는 컬럼 청크를 스트리밍 형태로 생산, 소비, 변환하는 데이터 처리 파이프라인 컴포넌트였음
    • 현재는 Processors로 대체됨
    • 결과 포맷팅과 테이블 쿼리 구현의 기반이 됨
  • 같은 커밋에서 StorageSystemNumbers가 테스트용으로 추가됐고, 오늘날의 system.numbers 테이블로 남아 있음
  • 첫 쿼리 파이프라인은 TSV로 숫자를 출력하는 것이었고, 첫 관계형 연산자는 LIMIT이었음
  • SQL 파서는 처음 boost::spirit을 시도했지만 실패했고, 이후 재귀 하강 파서를 만들었음
  • 초기에 도입했다가 제거되거나 나중에 다시 도입된 아이디어도 있음
    • 가변 길이 인코딩 숫자 컬럼은 느려서 제거됐고, 훨씬 나중에 컬럼과 독립된 커스텀 압축 코덱이 도입됨
    • 임의 필드 값을 담는 Variant 컬럼 타입도 느려 제거됐고, 더 나은 Variant는 2025년에 추가됨
    • 고정 크기 배열 타입은 필요성이 낮아 제거됐고, 현재 다시 추가가 검토되고 있음
  • 불필요한 코드를 제거하는 것이 새 코드를 추가하는 것보다 중요하다는 개발 원칙이 드러남

프로덕션 배포와 ReplicatedMergeTree

  • ClickHouse에서 테스트된 첫 실제 테이블 구조는 hits 테이블이며, 오늘날 ClickBench에서도 볼 수 있음
  • 이 테이블을 읽고 쓰는 과정에서 C++ iostreams가 느리다는 점이 드러났고, WriteBuffer와 ReadBuffer가 도입되어 현재도 사용됨
  • SQL의 첫 함수는 산술 연산자였고, 이를 통해 첫 SELECT 쿼리 인터프리터가 구현됨
  • ClickHouse 서버는 2012년 3월 9일, clickhouse-client는 2012년 3월 25일 도입됨
  • Log, TinyLog, Merge, Distributed, Memory 테이블 엔진과 함께 프로덕션 배포가 가능해짐
    • 첫 프로덕션 용도는 추가 처리를 위한 로그 청크 저장과 원시 로그 위의 전역 쿼리였음
    • SQL 쿼리가 가능한 영속 로그 큐처럼 사용됐음
  • 이후 MergeTree가 추가됨
    • 데이터가 시간순으로 들어와도 백그라운드에서 증분 정렬을 수행함
    • 단일 웹사이트에 대한 범위 쿼리를 빠르게 처리할 수 있게 함
    • OLAPServer와 Metrage를 대체하는 프로덕션 배포가 가능해짐
  • 2012년 Michael Kolupaev가 팀의 두 번째 직원으로 합류했고, ReplicatedMergeTree 구현에 참여함
  • 프로덕션은 여러 지역 데이터센터에 배포됐고, 인프라 팀은 한 달에 한 번 데이터센터를 한 시간 동안 끄는 “drills”를 수행함
    • 모든 프로덕션 서비스는 다중 데이터센터 복제를 갖춰야 했음
    • 초기에는 단순 double-write와 다운타임 이후 backfill을 사용함
    • 100% 일관성과 자동 복구를 위해 분산 합의가 필요했음
    • ZooKeeper를 메타데이터 계층으로 사용한 ReplicatedMergeTree가 구현됨
  • ReplicatedMergeTree는 2014년 사용자 대면 쿼리를 위한 ClickHouse 프로덕션 배포를 가능하게 함

오픈소스 공개까지의 과정

  • 2014년 ClickHouse는 프로덕션에서 매일 수천억 레코드를 저장하고 고객의 실시간 쿼리에 응답함
  • 회사 내부 데이터 과학자들은 ClickHouse로 인터넷 트렌드를 계산했고, 단순한 사용 문서도 공개됨
  • 광고, 이커머스, 인프라, 비즈니스 분석 같은 다른 부서도 ClickHouse를 시도했고, 내부 MapReduce, MySQL, Postgres에서 일부 사용 사례를 이전함
  • 2014년 말 ClickHouse는 한 회사 안에서 널리 쓰였고, 예외적으로 CERNLHCb experiment 협력 과정에서 배포함
  • 다른 회사 엔지니어들도 기존 데이터베이스가 사용 사례를 잘 처리하지 못해 OLAPServer나 Metrage와 비슷한 것을 만들고 있다는 점이 확인됨
  • 2015년 ClickHouse에 대한 글과 번역이 공개되면서 관심이 더 확인됨
  • 공개 전에는 회사 경영진을 설득하기 위해 잠재적 장점과 위험 목록을 준비함
  • 승인을 받은 뒤 릴리스 계획, 첫 로고, 첫 웹사이트, 블로그 글, Debian 저장소가 준비됐고, ClickHouse는 2016년 6월 15일 전 세계에 공개됨
  • 현재 ClickHouse는 전 세계 대기업들이 사용하는 인기 있는 분석 데이터베이스가 됨
Read Entire Article