0

Clickhouse

26.04.2022

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

  1. Обработка транзакций, т. е. связанных между собой операций с данными. Классический пример — банковский перевод, при котором в БД одновременно изменяются записи о количестве денег на двух счетах.
  2. Обработка аналитических запросов (online analytical processing, OLAP). В этом случае требуется быстро извлечь из БД сведения.

Например, если у вас есть мобильное приложение, то вас интересуют его продуктовые метрики: количество уникальных пользователей, среднее время нахождения на экране, среднее время, необходимое, чтобы выполнить последовательность действий… Вы отслеживаете, как меняются метрики, и решаете, как развивать приложение. Если метрики хранятся в большой БД, а запросы к ней выполняются медленно, то анализ метрик тоже станет весьма небыстрым.Как правило, при OLAP-сценариях:

  • данные в базе не изменяются или изменяются редко (нет команд модификации существующих данных типа UPDATE или REPLACE);
  • данные добавляются в базу крупными порциями (командой INSERT);
  • большинство запросов — это операции чтения;
  • данные читаются из большого количества строк и небольшого количества столбцов;
  • на выходе данные фильтруют или агрегируют, поэтому результат выполнения запроса гораздо меньше исходных данных;
  • нет транзакций;
  • нет строгих требований к консистентности данных.

Классические реляционные БД не всегда удобно использовать для задач, в которых к большому массиву данных идут частые и сложные запросы. Для решения таких задач разработаны столбцовые (колоночные) БД. О них мы кратко говорили раньше.Строковые и столбцовые БД обрабатывают аналитические запросы по-разному. Предположим, для выполнения запроса нужны данные из трёх  столбцов БД. В строковой придётся полностью прочитать несколько десятков или сотен тысяч строк со всеми столбцами, а в столбцовой — только данные из этих трёх столбцов.Посмотрите на различие в обработке запросов в строковых и столбцовых БД:

Более того, в столбцовой БД эти данные физически хранятся вместе, что ещё больше ускоряет ответ.

ClickHouse

ClickHouse — одна из популярных столбцовых БД с открытым исходным кодом. Яндекс создал ClickHouse, когда понадобилось быстро обрабатывать аналитические онлайн-запросы к Яндекс.Метрике.

Метрика — это одна из крупнейших систем веб-аналитики. Она установлена более чем на миллионе сайтов и каждый день собирает больше 20 миллиардов событий (посещений сайтов, кликов, переходов со страницы на страницу и т. д.). Объём данных превышает 3,5 петабайта (13 триллионов записей) и постоянно увеличивается, к этим данным обращаются сотни тысяч раз в день. Чтобы такая система работала стабильно, в Яндексе создали ClickHouse — распределённую столбцовую СУБД, оптимизированную для быстрого выполнения большого числа аналитических запросов к огромному объёму данных.

ClickHouse работает на любой операционной системе Linux, FreeBSD или macOS, а также доступна в виде сервиса управляемой БД в Yandex.Cloud.ClickHouse позволяет создавать БД и таблицы, загружать в них данные из разных источников и выполнять к данным запросы. Эту СУБД можно интегрировать с Apache Kafka, а также с внешними источниками данных, включая БД MySQL и PostgreSQL.Высокая скорость работы ClickHouse достигается за счёт:

  • Шардирования. Вы можете разделить данные на шарды (т. е. части) и хранить их на одном или нескольких хостах-репликах. Кроме того, шардирование повышает доступность БД.
  • Автоматического распараллеливания запросов на несколько процессорных ядер одного сервера и распределённых вычислений на шардированном кластере.
  • Возможности приближенных вычислений. Система способна выполнять запросы на основе части данных (выборки). Можно агрегировать данные не по всем ключам, а по некоторым. Иногда это помогает получить довольно точный результат, задействовав меньше ресурсов.
  • Других архитектурных особенностей: индекса (первичного ключа), физической сортировки данных по первичному ключу с помощью merge дерева, хранения данных в сжатом виде и т. д.

ClickHouse поддерживает только добавление и чтение данных, так как предназначена прежде всего для работы с аналитическими запросами. Если вам нужны транзакционная целостность и построчная выборка данных по ключу — применяйте другие БД, например MySQL или PostgreSQL.ClickHouse используют, чтобы анализировать логи (и мгновенно получать полную информацию об инцидентах в системе); чтобы отслеживать метрики поведения пользователей на сайтах (например, переходы на страницы, клики) или в онлайн-играх; как аналитический инструмент, когда данные в него копируются из основной БД (например, PostgreSQL или Oracle), которая медленно обрабатывает аналитические запросы.Если вам интересны подробности о том, как устроена ClickHouse и что у неё под капотом, посмотрите доклады разработчиков:

Свежие комментарии

Подписка

Лучшие статьи


Fatal error: Uncaught Error: Call to a member function have_posts() on null in /home/host1867038/the-devops.ru/htdocs/www/wp-content/themes/fox/inc/blog.php:380 Stack trace: #0 /home/host1867038/the-devops.ru/htdocs/www/wp-content/themes/fox/widgets/latest-posts/widget.php(257): fox56_blog_grid(NULL, Array) #1 /home/host1867038/the-devops.ru/htdocs/www/wp-content/themes/fox/widgets/latest-posts/register.php(33): include('/home/host18670...') #2 /home/host1867038/the-devops.ru/htdocs/www/wp-includes/class-wp-widget.php(394): Wi_Widget_Latest_Posts->widget(Array, Array) #3 /home/host1867038/the-devops.ru/htdocs/www/wp-includes/widgets.php(837): WP_Widget->display_callback(Array, Array) #4 /home/host1867038/the-devops.ru/htdocs/www/wp-content/themes/fox/inc/single.php(417): dynamic_sidebar('sidebar') #5 /home/host1867038/the-devops.ru/htdocs/www/wp-content/themes/fox/inc/single.php(136): fox56_single_sidebar() #6 /home/host1867038/the-devops.ru/htdocs/www/wp-content/themes/fox/inc/single.php(7): fox56_single_inner() #7 /home/host1867038/the-devops.ru/htdocs/www/wp-content/themes/fox/single.php(23): fox56_single() #8 /home/host1867038/the-devops.ru/htdocs/www/wp-includes/template-loader.php(106): include('/home/host18670...') #9 /home/host1867038/the-devops.ru/htdocs/www/wp-blog-header.php(19): require_once('/home/host18670...') #10 /home/host1867038/the-devops.ru/htdocs/www/index.php(17): require('/home/host18670...') #11 {main} thrown in /home/host1867038/the-devops.ru/htdocs/www/wp-content/themes/fox/inc/blog.php on line 380