ClickHouse стал опенсорсным 15 июня 2016 года — ровно десять лет назад. С тех пор это самая популярная open source аналитическая база данных с более чем 2000 контрибьюторов.
Автор делит открытость на уровни. Нулевой — просто выложить код для чтения, как Doom или MS-DOS. Первый — публичные коммиты, но без приёма контрибьюторов (SQLite, Ladybird). Второй — приём правок, но непрозрачный процесс (большинство проектов). Третий — полная прозрачность: гайды, трекер задач, код-ревью, CI, релизный цикл, поддержка, документация. ClickHouse целится в максимум.
Проект задуман как лучший пример постройки базы данных с нуля. Код модульный, ортогональный, хорошо задокументирован — сложные концепции объясняются с нуля, чтобы читателю не пришлось лезть в учебники. ClickHouse стал одним из самых популярных C++ репозиториев: там учат и C++23, и скучные вещи вроде билд-системы, CI, практик код-ревью и AI. Это полигон для экспериментов: принёс новый аллокатор памяти, библиотеку сжатия, хеш-таблицу или сортировку — ClickHouse проверит это вдоль и поперёк, даже если PR не планируется мержить. Дорожная карта включает раздел для экспериментальных, странных и даже смешных вещей. Каждый контрибьютор попадает в changelog и в таблицу system.contributors внутри базы — это источник гордости.
Первый коммит в репозитории датирован 29 мая 2009 года и касался замены медленных функций libc (localtime, mktime, gmtime). Но ClickHouse как таковой появился позже. Автор работал над веб-аналитикой, похожей на Google Analytics: логи просмотров страниц, MySQL для преагрегированных отчётов и кастомные структуры на C++ для сессий и истории пользователей. Объёмы росли, данные приходили в реальном времени — если пятиминутный кусок логов не обрабатывался за пять минут, возникала задержка. Приходилось искать любые решения: TokuDB, LMDB, Judy Arrays, Hadoop, LZO, QuickLZ, HyperLogLog в BLOB-ах MySQL, читать книжки по сжатию данных и event-loop серверам.
Автор хотел дать пользователям возможность строить любые отчёты, а не только фиксированные. Он изучал колоночные базы: Infobright, InfiniDB, Vertica, MonetDB, LucidDB. Ни одна не справлялась со 100 миллиардами записей в день и 500 колонками. Тогда он сделал простой прототип (OLAPServer, декабрь 2008, запущен в январе 2009): каждая колонка — только целые числа с хэшами вместо строк, для каждого дня и сайта — отдельный бинарный файл, лёгкое сжатие, обновление раз в сутки с задержкой в часы, запросы через XML. Самое сложное было «разагрегировать» исторические данные из MySQL — это помог коллега Евгений Гатов. Прототип сработал: аналитики предпочли его внутреннему MapReduce, потому что ответы приходили мгновенно.
Затем автор решил заменить агрегированные отчёты в MySQL (около 50 ТБ данных на 50 шардах). Он изобрёл Metrage — кастомную структуру для инкрементальной агрегации с фоновыми слияниями, где каждый элемент — CRDT с методами add, update, merge, serialize/deserialize. Эта структура работала и для уникальных пользователей по регионам, и для карты кликов по странице.
В итоге получилось две кастомные системы: колоночная для неагрегированных данных (OLAPServer) и строчная с CRDT для реального времени (Metrage). Автор задумался: а что, если объединить колоночный подход для скорости агрегации и merge tree для реалтайма и локальности данных? И добавить настоящий язык запросов и типы данных. Так появился ClickHouse.
Это редкий пример базы, написанной с нуля, не на основе Postgres, Datafusion или даже самого ClickHouse. Первые коммиты 2009 года — оптимизации в монорепозитории. Первый коммит, где начал вырисовываться новый DBMS — реализация колонок в памяти: уже узнаваемые классы IColumn и Field. Apache Arrow тогда не существовало (как и RCFile, Trevni, ORC, Parquet). Потом появились агрегатные функции, затем табличные движки (смешно, их сначала называли «primary key», но всего на несколько дней). Первый движок был похож на TinyLog. Добавили сжатие: сначала QuickLZ, потом LZ4 после прочтения блога Янна Колле.
Появились block streams (позже заменённые на Processors). В том же коммите добавили StorageSystemNumbers — сегодня это любимая таблица system.numbers. Первый конвейер запросов просто выводил числа в TSV. Первым реляционным оператором стал LIMIT. SQL-парсер сначала пытались сделать на boost::spirit, но провалились, потом написали рекурсивный спуск.
Некоторые идеи отвергались: колонка с числами переменной длины (убрана из-за медлительности, позже добавили кастомные codec'и), тип Variant (тоже медленный, лучшую версию добавят в 2025), фиксированные массивы (только сейчас думают вернуть). Автор считает, что удалять код важнее, чем добавлять, и в истории полно коммитов с названием «remove trash».
Первая реальная таблица в ClickHouse — hits, её до сих пор используют в ClickBench. C++ iostream'ы оказались медленными — появились WriteBuffer и ReadBuffer, живые до сих пор. Первые SQL-функции — арифметические операторы. Сервер ClickHouse появился 9 марта 2012 года, клиент — 25 марта. Вместе с движками Log, TinyLog, Merge, Distributed и Memory этого хватило для продакшна. Первое применение — очередь логов с SQL сверху: данные приходят, кладутся (Merge/Distributed), запросы — поверх.
Главное нововведение — MergeTree, который сортировал данные инкрементально в фоне. Так запросы по диапазонам для одного сайта работали быстро. Это заменило оба прототипа, OLAPServer и Metrage. В первой версии была ночная агрессивная мерж фаз, что любопытно.
В 2012 году автор нанял первого сотрудника — Михаила Колупаева, работающего с ним до сих пор. Продакшн был развёрнут в нескольких дата-центрах, и инфра-команда раз в месяц на час выключала один ДЦ (учения), чтобы все учились строить отказоустойчивые мульти-DC сервисы. Поначалу использовали double-write, затем — ZooKeeper для распределённого консенсуса, и Михаил реализовал ReplicatedMergeTree. К 2014 году ClickHouse уже отвечал на пользовательские запросы в реальном времени, храня сотни миллиардов записей в день. Им пользовались data scientists, а потом и другие департаменты компании, мигрируя с внутреннего MapReduce на текстовых логах с Perl, с MySQL и Postgres.
Единственная внешняя инстанция на тот момент — CERN, для эксперимента LHCb. Автор выступал на конференциях, читал блоги и видел, что инженеры в других компаниях пилят похожие велосипеды — OLAPServer или Metrage. Он опубликовал статью о ClickHouse в 2015 году (и перевод), что подтвердило интерес. Он убедил менеджмент открыть код: подготовил список рисков и преимуществ, дизайнеры сделали первый логотип, автор — первый сайт, с помощью инфра-команды — Debian-репозиторий. 15 июня 2016 года проект стал доступен всему миру.
Автор надеется, что эта история вдохновит инженеров открывать свой код: в худшем случае ничего не выйдет, но есть шанс повлиять на поколения. И не надо стесняться своего кода — он сам показал пятнадцатилетней давности код, который выглядит забавно. Сегодня ClickHouse — самая популярная аналитическая база данных, используемая крупнейшими компаниями мира.