ClickHouse: как обрабатывать big data в 800 раз быстрее
Рассказываем о ClickHouse — инструменте, который позволяет в 800 раз быстрее оценивать big data в метрике сайтов.
9К открытий11К показов
Российский сервис «Яндекс.Метрика» используется для веб-аналитики. Он обрабатывает большое количество информации, чтобы предприниматели оценивали посещаемость сайтов, изучали поведение пользователей. Чтобы эти процессы не занимали много времени, разработчики Яндекс создали собственную СУБД: информация в ней представлена в виде столбцов, а не строк. Мы в KozhinDev использовали ClickHouse для проектов, и в этой статье рассказываем о ее преимуществах и особенностях.
Чем 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 и другим. Выбор в итоге зависит от потребностей проекта.
9К открытий11К показов