Ещё более новые возможности ClickHouse

ClickHouse Meetup онлайн

YouTube трансляция: https://www.youtube.com/c/ClickHouseDB

Telegram chat: https://telegram.me/clickhouse_ru, clickhouse_en

Футболки за вопросы!

Если вы задали вопрос через Zoom
— напишите после мероприятия мне в Telegram в личку:
свой вопрос, размер футболки и адрес для доставки курьером.

Ещё более новые возможности ClickHouse

Новый формат данных в MergeTree

— Компактные куски данных (с версии 20.3).

— Куски данных в оперативной памяти (с версии 20.6).

— Write-Ahead Log (с версии 20.6).

— Настройки durability (с версии 20.10).

Разработчик — Антон Попов.

Три формата кусков данных

1. Wide — классический формат.

2. Compact — все столбцы в одном файле.

3. Memory — данные в оперативке.

Три формата кусков данных

Регулируется настройками:

min_bytes_for_wide_part,
min_rows_for_wide_part:

  если размер больше — использовать wide формат.

min_bytes_for_compact_part,
min_rows_for_compact_part:

  если размер больше — использовать compact формат,
  если меньше — использовать memory формат.

Wide > Compact > Memory

Wide куски

Классический формат.

Каждый столбец и индекс в отдельном файле.

Оптимален для чтения данных с дисков, в том числе медленных.

Дешёвый ALTER добавления или удаления столбца.

Compact куски

Все столбцы в одном файле.

Оптимален для вставки новых данных.
Особенно на медленных файловых системах.

Менее оптимален для чтения.

Рекомендуется для кусков данных небольшого размера.

Не рекомендуется использовать для всех кусков.

Доступен с версии 20.3, но выключен по-умолчанию.
С версии 20.10 будет использоваться для кусков до 10 МБ.

In-Memory куски

Данные в оперативной памяти.

+ Write-Ahead Log, отключаемый.

— in_memory_parts_enable_wal;
— write_ahead_log_max_bytes.

Ещё более оптимален для вставки новых данных...
... если выключить write-ahead log.

Более эффективен для чтения...
... но данные в оперативной памяти несжатые.

Все куски реплицируются так же, как обычно.

Экспериментальная возможность.

Durability

Если все ваши данные расположены на одном сервере...

Если вы не используете репликацию...

Если репликация есть, но в пределах одного региона...

— надо просто вызывать fsync до ответа на INSERT?

Durability

Eat My Data (2007):
https://www.youtube.com/watch?v=LMe7hf2G1po

Files Are Hard (2015):
https://danluu.com/file-consistency/

PostgreSQL "Fsyncgate" (2018):
https://lwn.net/Articles/752063/

Durability

Если все ваши данные расположены на одном сервере...
Если вы не используете репликацию...
Если репликация есть, но в пределах одного региона...

Тогда вот:

— min_rows_to_fsync_after_merge;
— min_compressed_bytes_to_fsync_after_merge;
— min_compressed_bytes_to_fsync_after_fetch;
— fsync_after_insert;
— fsync_part_directory;
— write_ahead_log_bytes_to_fsync;
— write_ahead_log_interval_ms_to_fsync;
— in_memory_parts_insert_sync.

Нормализация и обфускация запросов

Функции normalizeQuery, normalizedQueryHash.

SELECT normalizeQuery(query) FROM system.query_log

— замена литералов на ?

— замена списков литералов на ?..

— замена сложных алиасов на `?`

Доступно с версии 20.8.

Обфускация запросов

У одного моего друга тормозил запрос...
... но он не хотел его показывать.

Решение:

clickhouse-format --obfuscate < query.sql

Доступно с версии 20.10.

Обфускация данных: https://www.youtube.com/watch?v=2iR7i4akL44

 

Пережатие старых данных

CREATE TABLE hits ( event_time DateTime, ... ) ENGINE MergeTree ORDER BY ... TTL event_time + INTERVAL 1 MONTH RECOMPRESS CODEC(ZSTD(1)), event_time + INTERVAL 1 YEAR RECOMPRESS CODEC(ZSTD(6))

Разработчик — Александр Сапин. Доступно с версии 20.10.

Мелочи для ALTER

CREATE TABLE hits ( event_time DateTime CODEC(Delta, Default), ... ) ENGINE MergeTree ORDER BY ... ALTER TABLE hits MODIFY COLUMN c REMOVE COMMENT|CODEC|TTL |DEFAULT|MATERIALIZED|ALIAS

Разработчик — Александр Сапин. Доступно с версии 20.10.

Преобразования списка столбцов

SELECT * EXCEPT(secret_column) FROM table; SELECT table.* REPLACE( (URL LIKE '%yandex%' ? '' : URL) AS URL) FROM table; SELECT COLUMNS('^packet_') FROM table; SELECT t.* APPLY(sum) FROM table AS t; SELECT COLUMNS(x, y, z) APPLY(sum) FROM table;

Разработчик — Amos Bird, mfridental. Доступно с версии 20.10.

COLUMNS('regexp'): разработчик — mfridental. Доступно с версии 19.12.

Новые версии ClickHouse

20.10 — testing.

20.9 — stable.

20.8 — LTS until 2021-09-30.

20.7 — stable.

20.6 ... 20.4 — obsolete.

20.3 — LTS until 2021-03-12.

...

19.14 — obsolete.

Что ещё?

Импорт данных из RabbitMQ.

Kerberos аутентификация для Kafka.

Бета unlimited storage в Яндекс.Облаке.

WITH для подзапросов и с глобальным scope.

Форматы Regexp, RawBLOB, JSONAsString, LinesAsString.

Запуск clickhouse без пакетов и конфигурации.

Таблица system.crash_log, Sentry.

Вычисление корелляции рангов.

256bit Decimal.

Что дальше?

Бэкапы.

Проекции.

Отказ от ZooKeeper.

Поддержка OpenTracing.

Хеджирование запросов.

Чтение срезов столбцов.

Функции анализа геоданных.

Анализ полудубликатов текстов.

Публичный roadmap 2020.

https://clickhouse.tech/docs/ru/whats-new/extended-roadmap/

~ 500 задач с подробным описанием — зависимости, исполнители...

.