Яндекс.Метрика, сервис веб-аналитики, обрабатывает огромные объемы данных для оценки посещаемости сайтов и анализа поведения пользователей. Для ускорения этих процессов Яндекс разработал собственную СУБД — ClickHouse. Это аналитическая, столбцовая (колоночная) СУБД с открытым исходным кодом (Open Source), распространяемая под лицензией Apache 2.0.
Модели организации данных в СУБД
СУБД классифицируются по различным признакам, например, по модели организации данных:
- Реляционные (SQL): Организуют данные в виде двухмерных таблиц со множеством строк. Примеры: MySQL, PostgreSQL, Oracle. Информация вносится построчно, между таблицами устанавливаются связи, а для работы используется SQL-синтаксис.
- Нереляционные (NoSQL): Представляют данные в виде графов, пар «ключ-значение» или файлов.
ClickHouse относится к реляционным СУБД, но данные в ней хранятся по столбцам, а не по строкам.
Строковые и колоночные СУБД
Рассмотрим разницу на примере таблицы со столбцами Type, Style, Color и Method.
В строковых СУБД данные хранятся построчно. Запрос SELECT * FROM table WHERE Color = 542 требует проверки значения столбца Color в каждой строке, что медленно на больших таблицах. Невозможно пропустить ненужные для анализа столбцы.
В колоночных СУБД, таких как ClickHouse, данные хранятся по столбцам, каждый из которых представляет собой отдельную таблицу. Для того же запроса достаточно проверить только столбец Color, что значительно ускоряет обработку. Кроме того, данные обычно отсортированы внутри каждого столбца. Например, столбец Style может хранить значения 4, 6, 10, а каждому значению сопоставлен номер записи. Это позволяет эффективно выполнять запросы с несколькими условиями, например: SELECT * FROM table WHERE Type = 5 AND Style = 6 AND Color = 5235. СУБД выполнит всего три операции поиска по отсортированным данным. Структура хранения данных похожа на индекс в обычных базах данных, но между столбцами нет физической связи.
Преимущества ClickHouse
- Высокая скорость обработки запросов: ClickHouse обрабатывает 100 миллионов записей за 1 секунду, в то время как MySQL — за 823 секунды.
- Эффективная компрессия: Хранение каждой колонки в отдельном файле обеспечивает более высокую степень сжатия данных по сравнению со строковыми СУБД.
- Сэмплирование: Возможность запуска запросов на подмножестве данных для быстрого получения приблизительной аналитики.
- Линейная масштабируемость: Производительность растёт пропорционально количеству реплик.
- Использование SQL: ClickHouse использует диалект SQL, похожий на классический, но с дополнительными возможностями для работы с массивами и внешними базами данных.
Сферы применения
ClickHouse эффективен в задачах с постоянным потоком событий и аналитикой в реальном времени:
- Аналитика проектов и мобильных приложений
- Рекламные сети и Real-Time Bidding
- Телекоммуникации
- Электронная коммерция и финансы
- Информационная безопасность
- Бизнес-аналитика
- Онлайн-игры
- Интернет вещей
Особенности работы
- Масштабируемость: Линейная масштабируемость при репликации данных.
- Интерфейсы: CLI, TCP, HTTP. Существует веб-версия на JavaScript.
- Отсутствие первичного ключа: Вместо него используется столбец, по которому происходит сортировка (например, дата или ID пользователя).
- Отсутствие команд UPDATE и DELETE: Обновление и удаление данных возможны, но реализованы иначе.
- Асинхронность: ClickHouse не гарантирует порядок поступления данных при репликации.
Когда использовать ClickHouse?
ClickHouse оптимален для проектов с:
- Большим объемом данных (петабайты).
- Преобладанием операций чтения и агрегации данных.
- Минимальным количеством операций удаления данных.
- Большим количеством типов данных в столбцах.
- Допустимостью небольших периодических потерь данных из-за асинхронности.
Сложности использования
- Отсутствие транзакций и блокировок: Это может быть критично для некоторых проектов (например, биллинговых систем).
- Сложность точечной работы: Поиск, обновление или удаление отдельных строк может быть неэффективным.
- Высокие требования к оперативной памяти: Для быстрой работы необходим большой объем оперативной памяти (рекомендуется не менее 4 ГБ).
- Риски безопасности при использовании HTTP-протокола: Необходимо обеспечить безопасность хранения и передачи данных.
Полезные практики
- Вставляйте данные большими блоками, а не по одной строке.
- Читайте данные большими блоками, а не по одной строке.
- Выбирайте только необходимые столбцы при запросах.
- Агрегируйте данные на стороне ClickHouse.
- Используйте правильные типы данных для столбцов.
ClickHouse — мощная СУБД для аналитики и обработки больших данных в режиме реального времени. Она подходит для проектов с постоянным потоком данных и высокой интенсивностью запросов. Однако, из-за отсутствия некоторых функций (транзакции, блокировки), а также высоких требований к ресурсам, ClickHouse не является универсальным решением и подходит не для всех задач. Выбор СУБД зависит от конкретных требований проекта.