מאָווינג צו קליקכאָוסע: 3 יאָר שפּעטער

Три года назад Виктор Тарнавский и Алексей Миловидов из Яндекса на сцене HighLoad++ דערציילט, какой ClickHouse хороший, и как он не тормозит. А на соседней сцене был אלעקסאנדער זייצעוו с באַריכט о переезде на קליקקכאַוס с другой аналитической СУБД и с выводом, что קליקקכאַוס, конечно, хороший, но не очень удобный. Когда в 2016 году компания ליפסטריט, в которой тогда работал Александр, переводила мультипетабайтовую аналитическую систему на קליקקכאַוס, это была увлекательная «дорога из желтого кирпича», полная неведомых опасностей — קליקקכאַוס тогда напоминал минное поле.

דריי יאר שפּעטער קליקקכאַוס стал гораздо лучше — за это время Александр основал компанию Altinity, которая не только помогает переезжать на קליקקכאַוס десяткам проектов, но и совершенствует сам продукт вместе с коллегами из Яндекса. Сейчас קליקקכאַוס все еще не беззаботная прогулка, но уже и не минное поле.

Александр занимается распределенными системами с 2003 года, разрабатывал крупные проекты на MySQL, Oracle и ווערטיקאַ. На прошедшей HighLoad++ 2019 Александр, один из пионеров использования קליקקכאַוס, рассказал, что сейчас из себя представляет эта СУБД. Мы узнаем про основные особенности קליקקכאַוס: чем он отличается от других систем и в каких случаях его эффективнее использовать. На примерах рассмотрим свежие и проверенные проектами практики по построению систем на קליקקכאַוס.


Ретроспектива: что было 3 года назад

Три года назад мы переводили компанию ליפסטריט אויף קליקקכאַוס с другой аналитической базы данных, и миграция аналитики рекламной сети выглядела так:

  • Июнь 2016. В אָפֿן מקור ארויס קליקקכאַוס и стартовал наш проект;
  • Август. דערווייַז פון באַגריף: большая рекламная сеть, инфраструктура и 200-300 терабайт данных;
  • Октябрь. Первые продакшн-данные;
  • Декабрь. Полная продуктовая нагрузка — 10-50 миллиардов событий в день.
  • Июнь 2017. Успешный переезд пользователей на קליקקכאַוס, 2,5 петабайт данных на кластере из 60-ти серверов.

В процессе миграции росло понимание, что קליקקכאַוס — это хорошая система, с которой приятно работать, но это внутренний проект компании Яндекс. Поэтому есть нюансы: Яндекс сначала будет заниматься собственными внутренними заказчиками и только потом — сообществом и нуждами внешних пользователей, а ClickHouse не дотягивал тогда до уровня энтерпрайза по многим функциональным областям. Поэтому в марте 2017 года мы основали компанию Altinity, чтобы сделать קליקקכאַוס ещё быстрее и удобнее не только для Яндекса, но и для других пользователей. И теперь мы:

  • Обучаем и помогаем строить решения на קליקקכאַוס так, чтобы заказчики не набивали шишки, и чтобы решение в итоге работало;
  • Обеспечиваем 24/7 поддержку קליקקכאַוס-инсталляций;
  • Разрабатываем собственные экосистемные проекты;
  • Активно коммитим в сам קליקקכאַוס, отвечая на запросы пользователей, которые хотят видеть те или иные фичи.

И конечно, мы помогаем с переездом на קליקקכאַוס с מיסקל, ווערטיקאַ, אָראַקל, גרינפּלום, Redshift и других систем. Мы участвовали в самых разных переездах, и они все были успешными.

מאָווינג צו קליקכאָוסע: 3 יאָר שפּעטער

Зачем вообще переезжать на קליקקכאַוס

ניט פּאַמעלעך אַראָפּ! Это главная причина. קליקקכאַוס — очень быстрая база данных для разных сценариев:

מאָווינג צו קליקכאָוסע: 3 יאָר שפּעטער

Случайные цитаты людей, которые долго работают с קליקקכאַוס.

סקאַלאַביליטי. На какой-то другой БД можно добиться неплохой производительности на одной железке, но קליקקכאַוס можно масштабировать не только вертикально, но и горизонтально, просто добавляя сервера. Все работает не так гладко, как хотелось бы, но работает. Можно наращивать систему вместе с ростом бизнеса. Это важно, что мы не ограничены решением сейчас и всегда есть потенциал для развития.

Портируемость. Нет привязки к чему-то одному. Например, с אַמאַזאָן רעדשיפט тяжело куда-то переехать. А קליקקכאַוס можно поставить себе на ноутбук, сервер, задеплоить в облако, уйти в Kubernetes — нет ограничений на эксплуатацию инфраструктуры. Это удобно для всех, и это большое преимущество, которым не могут похвастаться многие другие похожие БД.

בייגיקייַט. קליקקכאַוס не останавливается на чем-то одном, например, на Яндекс.Метрике, а развивается и используется во всё большем и большем количестве разных проектов и индустрий. Его можно расширять, добавляя новые возможности для решения новых задач. Например, считается, что хранить логи в БД — моветон, поэтому для этого придумали עלאַסטיקסאַרטש. Но, благодаря гибкости קליקקכאַוס, в нём тоже можно хранить логи, и часто это даже лучше, чем в עלאַסטיקסאַרטש - בייַ קליקקכאַוס для этого требуется в 10 раз меньше железа.

פרייַ עפענען מקור. Не нужно ни за что платить. Не нужно договариваться о разрешении поставить систему себе на ноутбук или сервер. Нет скрытых платежей. При этом никакая другая Open Source технология баз данных не может конкурировать по скорости с קליקקכאַוס. MySQL, MariaDB, Greenplum — все они гораздо медленнее.

Сообщество, драйв и פאַרווייַלונג... האָבן קליקקכאַוס отличное сообщество: митапы, чаты и Алексей Миловидов, который нас всех заряжает своей энергией и оптимизмом.

Переезд на ClickHouse

Чтобы переходить на קליקקכאַוס с чего-то, нужны всего лишь три вещи:

  • Понимать ограничения קליקקכאַוס и для чего он не подходит.
  • Использовать преимущества технологии и ее самые сильные стороны.
  • Экспериментировать. Даже понимая как работает קליקקכאַוס, не всегда возможно предугадать, когда он будет быстрее, когда медленней, когда лучше, а когда хуже. Поэтому пробуйте.

Проблема переезда

Есть только одно «но»: если переезжаете на קליקקכאַוס с чего-то другого, то обычно что-то идет не так. Мы привыкли к каким-то практикам и вещам, которые работают в любимой БД. Например, любой человек, работающий с SQL-базами данных, считает обязательными такой набор функций:

  • транзакции;
  • констрейнты;
  • קאָנסיסטענסי;
  • индексы;
  • UPDATE/DELETE;
  • NULLs;
  • миллисекунды;
  • автоматические приведения типов;
  • множественные джойны;
  • произвольные партиции;
  • средства управления кластером.

Набор-то обязательный, но три года назад в קליקקכאַוס не было ни одной из этих функций! Сейчас из нереализованного осталось меньше половины: транзакции, констрейнты, Consistency, миллисекунды и приведение типов.

И главное — то, что в קליקקכאַוס некоторые стандартные практики и подходы не работают или работают не так, как мы привыкли. Всё, что появляется в קליקקכאַוס, соответствует «ClickHouse way», т.е. функции отличаются от других БД. Например:

  • Индексы не выбирают, а пропускают.
  • UPDATE/DELETE не синхронные, а асинхронные.
  • Множественные джойны есть, но планировщика запросов нет. Как они тогда выполняются, вообще не очень понятно людям из мира БД.

Сценарии ClickHouse

В 1960 году американский математик венгерского происхождения Wigner E. P. написал статью «The unreasonable effectiveness of mathematics in the natural sciences» («Непостижимая эффективность математики в естественных науках») о том, что окружающий мир почему-то хорошо описывается математическими законами. Математика — абстрактная наука, а физические законы, выраженные в математической форме не тривиальны, и Wigner E. P. подчеркнул, что это очень странно.

С моей точки зрения, קליקקכאַוס — такая же странность. Переформулируя Вигнера, можно сказать так: поразительна непостижимая эффективность קליקקכאַוס в самых разнообразных аналитических приложениях!

מאָווינג צו קליקכאָוסע: 3 יאָר שפּעטער

Например, возьмем Real-Time Data Warehouse, в который данные грузятся практически непрерывно. Мы хотим получать от него запросы с секундной задержкой. Пожалуйста — используем קליקקכאַוס, потому что для этого сценария он и был разработан. קליקקכאַוס именно так и используется не только в веб, но и в маркетинговой и финансовой аналитике, AdTech, а также в Fraud detection. В Real-time Data Warehouse используется сложная структурированная схема типа «звезда» или «снежинка», много таблиц с פאַרבינדן (иногда множественными), а данные обычно хранятся и меняются в каких-то системах.

Возьмем другой сценарий — צייט סעריעס: мониторинг устройств, сетей, статистика использования, интернет вещей. Здесь мы встречаемся с упорядоченными по времени достаточно простыми событиями. קליקקכאַוס для этого не был изначально разработан, но хорошо себя показал, поэтому крупные компании используют קליקקכאַוס как хранилище для мониторинговой информации. Чтобы изучить, подходит ли קליקקכאַוס для time-series, мы сделали бенчмарк на основе подхода и результатах InfluxDB и TimescaleDB — специализированных time-series баз данных. עס פארקערט אויסאַז קליקקכאַוס, даже без оптимизации под такие задачи, выигрывает и на чужом поле:

מאָווינג צו קליקכאָוסע: 3 יאָר שפּעטער

В time-series обычно используется узкая таблица — несколько маленьких колонок. С мониторинга может приходить очень много данных, — миллионы записей в секунду, — и обычно они поступают маленькими вставками (פאַקטיש-צייַט стримингом). Поэтому нужен другой сценарий вставки, а сами запросы — со своей некоторой спецификой.

קלאָץ מאַנאַגעמענט. Сбор логов в БД — это обычно плохо, но в קליקקכאַוס это можно делать с некоторыми комментариями, как описано выше. Многие компании используют קליקקכאַוס именно для этого. В этом случае используется плоская широкая таблица, где мы храним логи целиком (например, в виде דזשסאָן), либо нарезаем на части. Данные загружаются обычно большими батчами (файлами), а ищем по какому-нибудь полю.

Для каждой из этих функций обычно используются специализированные БД. קליקקכאַוס один может делать это всё и настолько хорошо, что обгоняет их по производительности. Давайте теперь подробно рассмотрим time-series сценарий, и как правильно «готовить» קליקקכאַוס под этот сценарий.

Time-Series

В настоящий момент это основной сценарий, для которого קליקקכאַוס считается стандартным решением. צייט-סעריע — это набор упорядоченных во времени событий, представляющих изменения какого-то процесса во времени. Например, это может быть частота сердцебиений за день или количество процессов в системе. Всё, что дает временные тики с какими-то измерениями – это time-series:

מאָווינג צו קליקכאָוסע: 3 יאָר שפּעטער

Больше всего такого рода событий приходит из мониторинга. Это может быть не только мониторинг веба, но и реальных устройств: автомобилей, промышленных систем, יאָט, производств или беспилотных такси, в багажник которых Яндекс уже сейчас кладет קליקקכאַוס-сервер.

Например, есть компании, которые собирают данные с судов. Каждые несколько секунд датчики с контейнеровоза отправляют сотни различных измерений. Инженеры их изучают, строят модели и пытаются понять, насколько эффективно используется судно, потому что контейнеровоз не должен простаивать ни секунды. Любой простой — это потеря денег, поэтому важно спрогнозировать маршрут так, чтобы стоянки были минимальными.

Сейчас наблюдается рост специализированных БД, которые измеряют time-series. אויף דעם פּלאַץ דב-ענגינעס каким-то образом ранжируются разные базы данных, и их можно посмотреть по типам:

מאָווינג צו קליקכאָוסע: 3 יאָר שפּעטער

Самый быстрорастущий тип — time-series. Также растут графовые БД, но time-series растут быстрее последние несколько лет. Типичные представители БД этого семейства — это InfluxDB, פּראָמעטהעוס, KDB, TimescaleDB (построенная на פּאָסטגרעסקל), решения от אַמאַזאָן. קליקקכאַוס здесь тоже может быть использован, и он используется. Приведу несколько публичных примеров.

Один из пионеров — компания CloudFlare (קדן-провайдер). Они мониторят свой קדן דורך קליקקכאַוס (דנס-запросы, הטטפּ-запросы) с громадной нагрузкой — 6 миллионов событий в секунду. Все идет через קאַפקאַ, отправляется в קליקקכאַוס, который предоставляет возможность в реальном времени видеть дашборды событий в системе.

קאָמקאַסט — один из лидеров телекоммуникаций в США: интернет, цифровое телевидение, телефония. Они создали аналогичную систему управления קדן ין עפענען מקור די פּרויעקט Apache Traffic Control для работы со своими огромными данными. קליקקכאַוס используется как бэкенд для аналитики.

פּערקאָנאַ встроили קליקקכאַוס внутрь своего PMM, чтобы хранить мониторинг различных מיסקל.

Специфические требования

К time-series базам данных есть свои специфические требования.

  • Быстрая вставка со многих агентов. Мы должны очень быстро вставить данные со многих потоков. קליקקכאַוס хорошо это делает, потому что у него все вставки не блокирующие. Любой טאָן — это новый файл на диске, а маленькие вставки можно буферизовать тем или иным способом. В קליקקכאַוס лучше вставлять данные большими пакетами, а не по одной строчке.
  • Гибкая схема. די time-series мы обычно не знаем структуру данных до конца. Можно построить систему мониторинга для конкретного приложения, но тогда ее трудно использовать для другого приложения. Для этого нужна более гибкая схема. קליקקכאַוס, позволяет это сделать, даже несмотря на то, что это строго типизированная база.
  • Эффективное хранение и «забывание» данных. Обычно в time-series гигантский объем данных, поэтому их надо хранить максимально эффективно. Например, у InfluxDB хорошая компрессия — это его основная фишка. Но кроме хранения, нужно еще уметь и «забывать» старые данные и делать какой-нибудь downsampling — автоматический подсчет агрегатов.
  • Быстрые запросы агрегированных данных. Иногда интересно посмотреть последние 5 минут с точностью до миллисекунд, но на месячных данных минутная или секундная гранулярность может быть не нужна — достаточно общей статистики. Поддержка такого рода необходима, иначе запрос за 3 месяца будет выполняться очень долго даже в קליקקכאַוס.
  • Запросы типа «last point, as of». Это типичные для time-series запросы: смотрим последнее измерение или состояние системы в момент времени t. Для БД это не очень приятные запросы, но их тоже надо уметь выполнять.
  • «Склеивание» временных рядов. צייט-סעריע — это временной ряд. Если есть два временных ряда, то их часто нужно соединять и коррелировать. Не на всех БД это удобно делать, особенно, с невыравненными временными рядами: здесь — одни временные засечки, там — другие. Можно считать средние, но вдруг там все равно будет дырка, поэтому непонятно.

Давайте посмотрим, как эти требования выполняются в קליקקכאַוס.

סכעמע

В קליקקכאַוס схему для time-series можно сделать разными способами, в зависимости от степени регулярности данных. Можно построить систему на регулярных данных, когда мы знаем все метрики заранее. Например, так сделал CloudFlare с мониторингом קדן — это хорошо оптимизированная система. Можно построить более общую систему, которая мониторит всю инфраструктуру, разные сервисы. В случае нерегулярных данных, мы не знаем заранее, что мониторим — и, наверное, это наболее общий случай.

Регулярные данные. Колонки. Схема простая – колонки с нужными типами:

CREATE TABLE cpu (
  created_date Date DEFAULT today(),  
  created_at DateTime DEFAULT now(),  
  time String,  
  tags_id UInt32,  /* join to dim_tag */
  usage_user Float64,  
  usage_system Float64,  
  usage_idle Float64,  
  usage_nice Float64,  
  usage_iowait Float64,  
  usage_irq Float64,  
  usage_softirq Float64,  
  usage_steal Float64,  
  usage_guest Float64,  
  usage_guest_nice Float64
) ENGINE = MergeTree(created_date, (tags_id, created_at), 8192);

Это обычная таблица, которая мониторит какую-то активность по загрузке системы (באַניצער, סיסטעמע, ליידיק, ליב). Просто и удобно, но не гибко. Если хотим более гибкую схему, то можно использовать массивы.

Нерегулярные данные. Массивы:

CREATE TABLE cpu_alc (
  created_date Date,  
  created_at DateTime,  
  time String,  
  tags_id UInt32,  
  metrics Nested(
    name LowCardinality(String),  
    value Float64
  )
) ENGINE = MergeTree(created_date, (tags_id, created_at), 8192);

SELECT max(metrics.value[indexOf(metrics.name,'usage_user')]) FROM ...

ביניען נעסטעד — это два массива: metrics.name и metrics.value. Здесь можно хранить такие произвольные мониторинговые данные, как массив названий и массив измерений при каждом событии. Для дальнейшей оптимизации вместо одной такой структуры можно сделать несколько. Например, одну — для לאָזנ שווימען-значение, другую — для ינט-значение, потому что ינט хочется хранить эффективнее.

Но к такой структуре сложнее обращаться. Придется использовать специальную конструкцию, через специальные функции вытаскивать значения сначала индекса, а потом массива:

SELECT max(metrics.value[indexOf(metrics.name,'usage_user')]) FROM ...

Но это все равно работает достаточно быстро. Другой способ хранения нерегулярных данных – по строкам.

Нерегулярные данные. Строки. В этом традиционном способе без массивов хранятся сразу названия и значения. Если с одного устройства приходит сразу 5 000 измерений — генерируется 5 000 строк в БД:

CREATE TABLE cpu_rlc (
  created_date Date,  
  created_at DateTime,  
  time String,  
  tags_id UInt32,  
  metric_name LowCardinality(String),  
  metric_value Float64
) ENGINE = MergeTree(created_date, (metric_name, tags_id, created_at), 8192);


SELECT 
    maxIf(metric_value, metric_name = 'usage_user'),
    ... 
FROM cpu_r
WHERE metric_name IN ('usage_user', ...)

קליקקכאַוס с этим справляется — у него есть специальные расширения קליקקכאַוס סקל. למשל, maxIf — специальная функция, которая считает максимум по метрике при выполнении какого-то условия. Можно в одном запросе написать несколько таких выражений и сразу посчитать значение для нескольких метрик.

Сравним три подхода:

מאָווינג צו קליקכאָוסע: 3 יאָר שפּעטער

פרטים

Здесь я добавил «Размер данных на диске» для некоторого тестового набора данных. В случае с колонками у нас самый маленький размер данных: максимальное сжатие, максимальная скорость запросов, но мы платим тем, что должны все сразу зафиксировать.

В случае с массивами всё чуть хуже. Данные все равно хорошо сжимаются, и можно хранить нерегулярную схему. Но קליקקכאַוס — колоночная база данных, а когда мы начинаем хранить все в массиве, то она превращается в строковую, и мы платим за гибкость эффективностью. На любую операцию придется прочитать весь массив в память, после этого найти в нем нужный элемент — а если массив растет, то скорость деградирует.

В одной из компаний, которая использует такой подход (например, ובער), массивы нарезаются на кусочки из 128 элементов. Данные нескольких тысяч метрик объемом в 200 ТБ данных/в день хранятся не в одном массиве, а в из 10 или 30 массивах со специальной логикой для хранения.

Максимально простой подход — со строками. Но данные плохо сжимаются, размер таблицы получается большой, да ещё когда запросы идут по нескольким метрикам, то ClickHouse работает неоптимально.

Гибридная схема

Предположим, что мы выбрали схему с массивом. Но если мы знаем, что большинство наших дашбордов показывают только метрики user и system, мы можем дополнительно из массива на уровне таблицы материализовать эти метрики в колонки таким образом:

CREATE TABLE cpu_alc (
  created_date Date,  
  created_at DateTime,  
  time String,  
  tags_id UInt32,  
  metrics Nested(
    name LowCardinality(String),  
    value Float64
  ),
  usage_user Float64 
             MATERIALIZED metrics.value[indexOf(metrics.name,'usage_user')],
  usage_system Float64 
             MATERIALIZED metrics.value[indexOf(metrics.name,'usage_system')]
) ENGINE = MergeTree(created_date, (tags_id, created_at), 8192);

При вставке קליקקכאַוס автоматически их посчитает. Так можно совместить приятное с полезным: схема гибкая и общая, но самые часто используемые колонки мы вытащили. Замечу, что это не потребовало менять вставку и עטל, который продолжает вставлять в таблицу массивы. Мы просто сделали ALTER TABLE, добавили пару колонок и получилась гибридная и более быстрая схема, которой можно сразу начинать пользоваться.

Кодеки и компрессия

פאַר time-series важно, насколько хорошо вы упаковываете данные, потому что массив информации может быть очень большой. В קליקקכאַוס есть набор средств для достижения эффекта компрессии 1:10, 1:20, а иногда и больше. Это значит, что неупакованные данные объемом 1 ТБ на диске занимают 50-100 ГБ. Меньший размер — это хорошо, данные быстрее можно прочитать и обработать.

Для достижения высокого уровня компрессии, קליקקכאַוס поддерживает следующие кодеки:

מאָווינג צו קליקכאָוסע: 3 יאָר שפּעטער

בייַשפּיל טיש:

CREATE TABLE benchmark.cpu_codecs_lz4 (
    created_date Date DEFAULT today(), 
    created_at DateTime DEFAULT now() Codec(DoubleDelta, LZ4), 
    tags_id UInt32, 
    usage_user Float64 Codec(Gorilla, LZ4), 
    usage_system Float64 Codec(Gorilla, LZ4), 
    usage_idle Float64 Codec(Gorilla, LZ4), 
    usage_nice Float64 Codec(Gorilla, LZ4), 
    usage_iowait Float64 Codec(Gorilla, LZ4), 
    usage_irq Float64 Codec(Gorilla, LZ4), 
    usage_softirq Float64 Codec(Gorilla, LZ4), 
    usage_steal Float64 Codec(Gorilla, LZ4), 
    usage_guest Float64 Codec(Gorilla, LZ4), 
    usage_guest_nice Float64 Codec(Gorilla, LZ4), 
    additional_tags String DEFAULT ''
)
ENGINE = MergeTree(created_date, (tags_id, created_at), 8192);

Здесь мы определяем кодек DoubleDelta в одном случае, во втором — גערילאַ, и обязательно добавляем еще לזקסנומקס компрессию. В результате размер данных на диске сильно уменьшается:

מאָווינג צו קליקכאָוסע: 3 יאָר שפּעטער

Здесь показано, сколько места занимают одни и те же данные, но при использовании разных кодеков и компрессий:

  • в GZIP’ованном файле на диске;
  • в ClickHouse без кодеков, но с ZSTD-компрессией;
  • в ClickHouse c кодеками и компрессией LZ4 и ZSTD.

Видно, что таблицы с кодеками занимают гораздо меньше места.

Size matters

ניט ווייניקער וויכטיק צו קלייַבן правильный тип данных:

מאָווינג צו קליקכאָוסע: 3 יאָר שפּעטער

Во всех примерах выше я использовал פלאָוט64. Но если бы мы выбрали פלאָוט32, то это было бы даже лучше. Это хорошо продемонстрировали ребята из Перконы в статье по ссылке выше. Важно использовать максимально компактный тип, подходящий под задачу: даже в меньшей степени для размера на диске, чем для скорости запросов. קליקקכאַוס очень к этому чувствителен.

Если вы можете использовать ינטקסנומקס אַנשטאָט פון ינטקסנומקס, то ожидайте почти двукратное увеличение производительности. Данные занимают меньше памяти, и вся «арифметика» работает гораздо быстрее. קליקקכאַוס внутри себя — очень строго типизированная система, он максимально использует все возможности, которые предоставляют современные системы.

Агрегация и Materialized Views

Агрегация и материализованные представления позволяют сделать агрегаты на разные случаи жизни:

מאָווינג צו קליקכאָוסע: 3 יאָר שפּעטער

Например, у вас могут быть не агрегированные исходные данные, и на них можно навесить различные материализованные представления с автоматическим суммированием через специальный движок SummingMergeTree (SMT). סמט — это специальная агрегирующая структура данных, которая считает агрегаты автоматически. В базу данных вставляются сырые данные, они автоматически агрегируются, и сразу по ним можно использовать дашборды.

טטל — «забываем» старые данные

Как «забывать» данные, которые больше не нужны? קליקקכאַוס умеет это. При создании таблиц можно указать טטל выражения: например, что минутные данные храним один день, дневные — 30 дней, а недельные или месячные не трогаем никогда:

CREATE TABLE aggr_by_minute
…
TTL time + interval 1 day

CREATE TABLE aggr_by_day
…
TTL time + interval 30 day

CREATE TABLE aggr_by_week
…
/* no TTL */

Multi-tier — разделяем данные по дискам

Развивая эту идею, данные можно хранить в קליקקכאַוס в разных местах. Предположим, горячие данные за последнюю неделю хотим хранить на очень быстром локальном ססד, а более исторические данные складываем в другое место. В קליקקכאַוס сейчас это возможно:

מאָווינג צו קליקכאָוסע: 3 יאָר שפּעטער

Можно сконфигурировать политику хранения (storage policy) так, что קליקקכאַוס будет автоматически перекладывать данные по достижению некоторых условий в другое хранилище.

Но и это еще не все. На уровне конкретной таблицы можно определить правила, когда именно по времени данные переходят на холодное хранение. Например, 7 дней данные лежат на очень быстром диске, а все, что старше, переносится на медленный. Это хорошо тем, что позволяет систему держать на максимальной производительности, при этом контролируя расходы и не тратя средства на холодные данные:

CREATE TABLE 
... 
TTL date + INTERVAL 7 DAY TO VOLUME 'cold_volume', 
    date + INTERVAL 180 DAY DELETE

יינציק אַפּערטונאַטיז קליקקכאַוס

Почти во всём в קליקקכאַוס есть такие «изюминки», но они нивелируются эксклюзивом — тем, чего нет в других БД. Например, вот некоторые из уникальных функций קליקקכאַוס:

  • Arrays. די קליקקכאַוס очень хорошая поддержка для массивов, а также возможность выполнять на них сложные вычисления.
  • Агрегирующие структуры данных. Это одна из «киллер-фич» קליקקכאַוס. Несмотря на то, что ребята из Яндекса говорят, что мы не хотим агрегировать данные, все агрегируют в קליקקכאַוס, потому что это быстро и удобно.
  • Материализованные представления. Вместе с агрегирующими структурами данных материализованные представления позволяют делать удобную פאַקטיש-צייַט агрегацию.
  • ClickHouse SQL. Это расширение языка סקל с некоторыми дополнительными и эксклюзивными фичами, которые есть только в קליקקכאַוס. Раньше это было как бы с одной стороны расширение, а с другой стороны — недостаток. Сейчас почти все недостатки по сравнению с SQL 92 мы убрали, теперь это только расширение.
  • לאַמבדאַ–выражения. Есть ли они ещё в какой-нибудь базе данных?
  • ML-поддержка. Это есть в разных БД, в каких-то лучше, в каких-то хуже.
  • אָפֿן מקור. Мы можем расширять קליקקכאַוס вместе. Сейчас в קליקקכאַוס около 500 контрибьюторов, и это число постоянно растет.

Хитрые запросы

В קליקקכאַוס есть много различных способов сделать одно и то же. Например, можно тремя различными способами вернуть последнее значение из таблицы для קפּו (есть еще и четвертый, но он ещё экзотичнее).

Первый показывает, как удобно делать в קליקקכאַוס запросы, когда вы хотите проверять, что טופּלע содержится в подзапросе. Это то, чего мне лично очень не хватало в других БД. Если я хочу что-то сравнить с подзапросом, то в других БД с ним можно сравнивать только скаляр, а для нескольких колонок надо писать פאַרבינדן. די קליקקכאַוס можно использовать tuple:

SELECT *
  FROM cpu 
 WHERE (tags_id, created_at) IN 
    (SELECT tags_id, max(created_at)
        FROM cpu 
        GROUP BY tags_id)

Второй способ делает то же самое, но использует агрегатную функцию argMax:

SELECT 
    argMax(usage_user), created_at),
    argMax(usage_system), created_at),
...
 FROM cpu 

В קליקקכאַוס есть несколько десятков агрегатных функций, а если использовать комбинаторы, то по законам комбинаторики их получится около тысячи. ArgMax — одна из функций, которая считает максимальное значение: запрос возвращает значение usage_user, на котором достигается максимальное значение created_at:

SELECT now() as created_at,
       cpu.*
  FROM (SELECT DISTINCT tags_id from cpu) base 
  ASOF LEFT JOIN cpu USING (tags_id, created_at)

ASOF JOIN — «склеивание» рядов c разным временем. Это уникальная функция для баз данных, которая есть ещё только в kdb+. Если есть два временных ряда с разным временем, ASOF JOIN позволяет их сместить и склеить в одном запросе. Для каждого значения в одном временном ряду находится ближайшее значение в другом, и они возвращаются на одной строчек:

מאָווינג צו קליקכאָוסע: 3 יאָר שפּעטער

Аналитические функции

נאָרמאַל SQL-2003 можно писать так:

SELECT origin,
       timestamp,
       timestamp -LAG(timestamp, 1) OVER (PARTITION BY origin ORDER BY timestamp) AS duration,
       timestamp -MIN(timestamp) OVER (PARTITION BY origin ORDER BY timestamp) AS startseq_duration,
       ROW_NUMBER() OVER (PARTITION BY origin ORDER BY timestamp) AS sequence,
       COUNT() OVER (PARTITION BY origin ORDER BY timestamp) AS nb
  FROM mytable
ORDER BY origin, timestamp;

В קליקקכאַוס так нельзя — он не поддерживает стандарт SQL-2003 и, наверное, никогда не будет это делать. Вместо этого в קליקקכאַוס принято писать так:

מאָווינג צו קליקכאָוסע: 3 יאָר שפּעטער

Я обещал лямбды – вот они!

Это аналог аналитического запроса в стандарте SQL-2003: он считает разницу между двумя timestamp, duration, порядковый номер — всё, что обычно мы считаем аналитическими функциями. В קליקקכאַוס мы их считаем через массивы: сначала сворачиваем данные в массив, после этого на массиве делаем всё, что хотим, а потом разворачиваем обратно. Это не очень удобно, требует любви к функциональному программированию, как минимум, но это очень гибко.

Специальные функции

Кроме того в קליקקכאַוס много специализированных функций. Например, как определить, сколько сессий проходит одновременно? Типичная задача для мониторинга – определить максимальную загрузку одним запросом. В קליקקכאַוס есть специальная функция для этой цели:

מאָווינג צו קליקכאָוסע: 3 יאָר שפּעטער

Вообще, для многих целей в ClickHouse есть специальные функции:

  • runningDifference, runningAccumulate, neighbor;
  • sumMap(key, value);
  • timeSeriesGroupSum(uid, timestamp, value);
  • timeSeriesGroupRateSum(uid, timestamp, value);
  • skewPop, skewSamp, kurtPop, kurtSamp;
  • WITH FILL / WITH TIES;
  • simpleLinearRegression, stochasticLinearRegression.

Это не полный список функций, всего их 500-600. Хинт: все функции в קליקקכאַוס есть в системной таблице (не все документированы, но все интересны):

select * from system.functions order by name

קליקקכאַוס сам в себе хранит много информации о себе, в том числе log tables, query_log, лог трассировки, лог операции с блоками данных (part_log), лог метрик, и системный лог, который он обычно пишет на диск. Лог метрик – это time-series в קליקקכאַוס на самом קליקקכאַוס: БД сама для себя может играть роль time-series баз данных, таким образом «пожирая» самого себя.

מאָווינג צו קליקכאָוסע: 3 יאָר שפּעטער

Это тоже уникальная вещь — раз мы хорошо делаем работу для time-series, почему не можем сами в себе хранить всё, что нужно? Нам не нужен פּראָמעטהעוס, мы храним всё в себе. Подключили גראפאנא и сами себя мониторим. Однако, если קליקקכאַוס упадет, то мы не увидим, — почему, — поэтому обычно так не делают.

Большой кластер или много маленьких קליקקכאַוס

Что лучше — один большой кластер или много маленьких ClickHouse? Традиционный подход к DWH — это большой кластер, в котором выделяются схемы под каждое приложение. Мы пришли к администратору БД — дайте нам схему, и нам её выдали:

מאָווינג צו קליקכאָוסע: 3 יאָר שפּעטער

В קליקקכאַוס можно сделать это по-другому. Можно каждому приложению сделать свой собственный קליקקכאַוס:

מאָווינג צו קליקכאָוסע: 3 יאָר שפּעטער

Нам больше не нужен большой монструозный DWH и несговорчивые админы. Мы можем каждому приложению выдать свой собственный קליקקכאַוס, и разработчик может это сделать сам, так как קליקקכאַוס очень просто устанавливается и не требует сложного администрирования:

מאָווינג צו קליקכאָוסע: 3 יאָר שפּעטער

Но если у нас много קליקקכאַוס, и надо часто его ставить, то хочется этот процесс автоматизировать. Для этого можно, например, используем Kubernetes и קליקכאָוסע-оператор. В Kubernetes ClickHouse можно поставить «по щелчку»: я могу нажать кнопку, запустить манифест и база готова. Можно сразу же создать схему, начать туда грузить метрики, и через 5 минут у меня уже готов дашборд גראפאנא. Настолько все просто!

דער רעזולטאַט?

אזוי, קליקקכאַוס — דאס:

  • שנעל. Это всем известно.
  • פשוט. Немного спорно, но я считаю, что тяжело в учении, легко в бою. Если понять, как קליקקכאַוס работает, дальше все очень просто.
  • וניווערסאַל. Он подходит для разных сценариев: DWH, Time Series, Log Storage. Но это не OLTP база данных, поэтому не пытайтесь сделать там короткие вставки и чтения.
  • ינטערעסטינגלי. Наверное, тот, кто работает с קליקקכאַוס, пережил много интересных минут в хорошем и плохом смысле. Например, вышел новый релиз, все перестало работать. Или когда вы бились над задачей два дня, но после вопроса в Телеграм-чате задача решилась за две минуты. Или как на конференции на докладе Леши Миловидова скриншот из קליקקכאַוס сломал трансляцию HighLoad++. Такого рода вещи происходят постоянно и делают нашу жизнь с קליקקכאַוס яркой и интересной!

Презетацию можно посмотреть דאָ.

מאָווינג צו קליקכאָוסע: 3 יאָר שפּעטער

Долгожданная встреча разработчиков высоконагруженных систем на HighLoad++ состоится 9 и 10 ноября в Сколково. Наконец это будет офлайн-конференция (хоть и с соблюдением всех мер предосторожности), так как энергию HighLoad++ невозможно упаковать в онлайн.

Для конференции мы находим и показываем вам кейсы о максимальных возможностях технологий: HighLoad++ был, есть и будет единственным местом, где можно за два дня узнать, как устроены Facebook, Яндекс, ВКонтакте, Google и Amazon.

Проводя наши встречи без перерыва с 2007 года, в этом году мы встретимся в 14-й раз. За это время конференция выросла в 10 раз, в прошлом году ключевое событие отрасли собрало 3339 участника, 165 спикеров докладов и митапов, а одновременно шло 16 треков.
В прошлом году для вас было 20 автобусов, 5280 литров чая и кофе, 1650 литров морсов и 10200 бутылочек воды. А ещё 2640 килограммов еды, 16 000 тарелок и 25 000 стаканчиков. Кстати, на деньги, вырученные от переработанной бумаги, мы посадили 100 саженцев дуба 🙂

Билеты купить можно דאָ, получить новости о конференции — דאָ, а поговорить — во всех соцсетях: טעלעגראַם, facebook, ווקאָנטאַקטע и טוויטטער.

מקור: www.habr.com

לייגן אַ באַמערקונג