Написать пост

ClickHouse: как обрабатывать big data в 800 раз быстрее

Аватарка пользователя Kozhin Dev

Рассказываем о ClickHouse — инструменте, который позволяет в 800 раз быстрее оценивать big data в метрике сайтов.

Российский сервис «Яндекс.Метрика» используется для веб-аналитики. Он обрабатывает большое количество информации, чтобы предприниматели оценивали посещаемость сайтов, изучали поведение пользователей. Чтобы эти процессы не занимали много времени, разработчики Яндекс создали собственную СУБД: информация в ней представлена в виде столбцов, а не строк. Мы в KozhinDev использовали ClickHouse для проектов, и в этой статье рассказываем о ее преимуществах и особенностях.

ClickHouse: как обрабатывать big data в 800 раз быстрее 1

Чем ClickHouse отличается от других популярных СУБД

Классифицировать СУБД можно по нескольким признакам, например, по модели организации данных: реляционные SQL и нереляционные NoSQL. Первые организуют данные в виде двумерных таблиц с большим количеством строк, вторые представляют их в виде графов, пар «ключ-значение», колонок в таблицах.

Из нереляционных СУБД часто используются Redis и MongoDB. Они менее универсальны, подходят не для любых типов данных. Например, Redis стоит выбрать, если необходим скоростной доступ к данным — загрузка из кэша. А MongoDB подойдет для приложения, которое работает с документами.

Реляционные базы более распространены. Яркие представители — MySQL, PostgreSQL, Oracle и другие. Информация в них вносится в строки таблиц, колонки которых соответствуют типам данных. Между строками можно настроить связи, а для работы с базой данных использовать SQL-синтаксис.

ClickHouse тоже относится к реляционным СУБД, но данные в ней вносятся не в строки, а в колонки двумерной таблицы: такой способ хранения повышает производительность веб-сервисов. Ее профиль — обработка большого объема аналитических запросов. Разработка ClickHouse началась в 2009 году с внутренней системы управления данными Яндекса — OLAP. С 2016 года СУБД доступна как открытое программное обеспечение по лицензии Apache 2.0. Технологию нельзя назвать абсолютно уникальной: у нее достаточно аналогов, систем управления большими данными. Например, Paracell, Vertica, Sybase IQ, InfiniDB.

В 2017 году Яндекс.Метрика использовала ClickHouse, и для этого было задействовано:

  • 3 петабайта данных;
  • 412 серверов;
  • 6 дата-центров.

За 4 года работы даунтайм системы составил всего несколько часов.

Почему ClickHouse работает так быстро

ClickHouse, как и другие реляционные системы, использует синтаксис SQL, его диалект. Он похож на классический SQL, но имеет дополнительные возможности — например, для работы с массивами данных или внешними базами «ключ-значение». Тем не менее, если разработчик уже имел дело с SQL-системами, разобраться с CLickHouse ему будет нетрудно.

Чтобы понять, почему ClickHouse показывает намного большую производительность, чем строковые СУБД, сравним принцип их работы. Если нужно читать по big data, то в строковой системе, например, PostgreSQL, строки всегда читаются полностью. Только проходя через колонку, можно определить ее имя и необходимость для текущей задачи. Пропустить колонки, которые не нужны для анализа, невозможно.

В столбцовой СУБД проходить все строки не обязательно: она использует только те колонки, которые участвуют в запросе. Каждая колонка столбцовой системы хранится в отдельном файле, а в строковой вся таблица распределяется по 2 — 3 файлам. Поэтому обратиться к конкретному столбцу ClickHouse может намного быстрее.

На сайте производителя системы есть сравнение скорости обработки запросов. Для получения 100 миллионов записей ClickHouse требуется всего одна секунда, а строковой СУБД MySQL — 823,64.

Также благодаря хранению каждой колонки данных в отдельном файле базу проще сжимать. В обычных строковых СУБД файлы содержат в себе разные типы данных, и сжать их оптимально не выйдет. При этом чем меньше размер базы данных, тем быстрее происходит поиск, запрос требует меньше операций ввода-вывода.

В ClickHouse доступно семплирование: например, если нужно проверить запрос, можно запустить его на части данных, без обработки всего массива. Это позволяет получить приблизительную аналитическую картину за более короткий срок.

Особенности работы с ClickHouse

Разработчики Яндекса не включили в систему возможности транзакций и блокировок. Если для продукта важны эти функции, например — для биллинга, лучше выбрать другую СУБД. Но для статистических данных как в Яндекс.Метрике не важен порядок, в котором приходят данные. Поэтому изначально при создании ClickHouse упор делался на производительность: в процессе разработки ставились бенчмарки, каждое нововведение проходило тесты на скорость обработки информации. Это нужно, чтобы весь функционал СУБД работал одинаково быстро, не появлялось «узких мест».

Отсюда вытекает принцип «когда-нибудь»: СУБД не гарантирует, что данные придут в заданном порядке, что при репликации данные сразу же появятся в новом месте. Информация поступает в базу асинхронно, и предсказать, когда это случится, невозможно — «когда-нибудь» дойдет.

ClickHouse масштабируется линейно: то есть, при репликации данных производительность всегда растет. Для других СУБД это может быть не так: у некоторых скорость работы может не измениться или и вовсе упасть.

СУБД от Яндекса вдобавок к интерфейсам CLI и TCP имеет HTTP-протокол для отправки и получения данных. Также у системы есть веб-версия, написанная на JavaScript, которая обращается к базе данных с помощью этого протокола.

Забавный факт: так как ClickHouse создали российские разработчики, она поймет вас, даже если вы забыли переключить раскладку. Так, вместо «exit» можно написать «учше», и выйти из системы.

При этом в ClickHouse нет привычного Primary Key — в качестве него обычно используется показатель, по которому происходит сортировка. Например, это может быть дата события или User ID. Для этого используется команда OrderBy.

Также отсутствуют команды UPDATE и DELETE, которые есть в других СУБД. Несмотря на это, удалять и обновлять данные в ClickHouse можно.

В ClickHouse существуют движки таблиц, определяющие:

  • место хранения данных, их запись и чтение;
  • поддерживаемые запросы;
  • способы доступа к данным;
  • использование индексов;
  • многопоточное выведение запроса;
  • параметры репликации данных.

Распространенный движок — MergeTree, объединение в фоновом режиме. Его разновидности:

  • ReplacingMergeTree — удаление дубликатов. С помощью этого движка можно удалить данные, предварительно создав дубликат с другой подписью, противоположным знаком. Например, если в таблице есть строки со значениями 1 и —1, ReplacingMergeTree найдет их и «схлопнет». Но некоторое время в базе будет находиться лишняя строка. Чтобы получить верный результат в этом случае, нужно учесть подписи при суммировании.
  • SummingMergeTree — суммирование всех числовых столбцов по ключу.
  • AggregatingMergeTree — нахождение среднего.
  • CollapsingMergeTree — удаление.
  • VersionedCollapsingMergeTree — более «умная» версия CollapsingMergeTree, в которой можно задать параметры, например, Timestump.
  • GraphiteMergeTree — подготовка данных для Graphite, интерфейса для отображения данных.

Также для ClickHouse есть отдельные движки по логам, движки для интеграций, например, с Kafka или другими СУБД — MySQL, PostgreSQL, MongoDB.

Когда стоит выбрать ClickHouse

По словам разработчиков, ClickHouse создан для работы с непрекращающимся потоком данных в режиме реального времени. В этом его преимущество перед другими базами и причина, почему он не нужен в каждом проекте. Выбирать эту СУБД стоит, если в проекте:

  • нужна работа с объемной базой: большое количество строк, петабайты данных;
  • заложено много анализа данных: запросы, чтение, суммирование и другие действия;
  • данные не нужно удалять, или удалений мало;
  • много типов данных — колонок: в обычной строковой базе таблица с большим их количеством становится тяжеловесной;
  • для вас не страшны небольшие периодические потери данных из-за асинхронности работы ClickHouse и принципа «когда-нибудь».

Мы использовали ClickHouse при разработке приложения для грузовых перевозок. Данные поступают в базу от GPS-трекеров, считываются раз в несколько секунд. То есть на сервер приходит огромное количество сообщений, которые нужно быстро обрабатывать.

Расчеты в приложении происходят по различным формулам, в итоге мы получаем оценку качества работы водителей, состояния транспортных средств. Также на основе данных, которые находятся в базе, рассчитываются штрафы для работников. Они позволяют сформировать рейтинг вождения. Анализ результатов позволяет находить слабые места, корректировать их через водителей и стремиться к бережному отношению к технике. Так машины прослужат дольше, меньше средств уйдет на ремонт и замену.

Сложности использования ClickHouse

Как и другие СУБД, ClickHouse имеет и преимущества, и недостатки, подходит не для всех проектов. Вот некоторые сложности, с которыми может столкнуться разработчик при использовании СУБД от Яндекс:

  • Отсутствие транзакций. ClickHouse создавался для обработки статистических данных, поэтому «заточен» в основном под считывание информации из таблиц. Произвести последовательный ряд операций — транзакционный сценарий в этой СУБД невозможно.
  • Сложность «точечной» работы. ClickHouse оперирует большими массивами данных, поэтому найти одну конкретную строку, обновить ее или удалить невозможно или нецелесообразно.
  • Высокие требования к оперативной памяти сервера. Чтобы операции с базой данной производились действительно быстро, не появлялись проблемы, нужен большой объем RAM. Для некоторых запросов промежуточные данные должны помещаться в оперативную память полностью. Производители советуют выделять для ClickHouse не менее 4 гигабайтов RAM.
  • Возможность атак при передаче данных по HTTP-протоколу. Злоумышленники могут похитить данные, сделать SQL-инъекцию, получить доступ к управлению базой данных. Эти риски необходимо учитывать при использовании ClickHouse, делать больший акцент на безопасность хранения и передачи информации.

Полезные практики в работе с ClickHouse

Не вставляйте по одной строке

Время вставки одной строки и 10 000 строк в ClickHouse одинаково. Поэтому если вы собираетесь добавить в него 10 000 строк по одной, то выполнение займет в 10 000 раз больше времени, чем вставка большого массива за один раз.

Не читайте по одной строке

В обычной СУБД можно найти конкретную строку по Primary Key, но ClickHouse не рассчитана на такой прицельный поиск, он займет много времени. Используйте систему, когда нужно работать с большим количеством строк, выводить статистику.

Выбирайте только нужные столбцы

Если вы каждый раз будете проводить анализ по всем колонкам, то производительность ClickHouse станет ближе к обычным реляционным СУБД. При формировании запроса выбирайте только те параметры, которые действительно нужны в данный момент.

Агрегируйте данные на стороне ClickHouse

Производители рекомендуют проводить все вычисления на стороне ClickHouse, а не на бэкенде. В этом случае вы передаете меньше данных по сети и увеличиваете скорость обработки.

Подбирайте правильные типы данных

Чем более точно вы подберете типы данных для колонок, тем легче будет сжать базу. Она будет занимать меньше места на диске и поиск будет выполняться быстрее.

Подведем итог

ClickHouse — СУБД, которая подходит для аналитики, статистических исследований, обработки большого количества данных и запросов в реальном времени. Если проект подразумевает работу с петабайтами информации, множеством сообщений, приходящих постоянно, то ClickHouse будет хорошим выбором благодаря:

  • колоночной структуре и возможностям для оптимального сжатия;
  • высокой производительности;
  • линейной масштабируемости.

Поиск и обработка информации в этой СУБД от Яндекс производятся в сотни раз быстрее, чем, например, в PostgreSQL. Но если сервису не требуются такие скорости, то можно обратиться к привычным строковым СУБД — MySQL, PostgreSQL и другим. Выбор в итоге зависит от потребностей проекта.

Следите за новыми постами
Следите за новыми постами по любимым темам
7К открытий8К показов