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

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

В предыдущих сериях: лето 2020

PostgreSQL wire protocol Geographical dictionaries Data coarsening with TTL expressions Parallel calculation of FINAL Insertion into ODBC and JDBC Cassandra dictionary source Dictionary layout for SSD Settings for data formats in dictionaries Support for Distributed over Distributed queries Query metrics from PMU GROUP BY optimization on sorted data Apache Arrow import/export MsgPack format "direct" dictionary source

Запрос EXPLAIN

EXPLAIN [AST|SYNTAX|PLAN|PIPELINE] SELECT ...

EXPLAIN PLAN header = 0, description = 1, actions = 0, optimize = 1 SELECT ...

EXPLAIN PIPELINE header = 0, graph = 1, compact = 1 SELECT ...

Доступно с версии 20.6. Разработчик — Николай Кочетов.

WITH subqueries (CTE)

— для подзапросов:

WITH a AS (SELECT ...), b AS (SELECT ...), c AS (SELECT ...) SELECT * FROM a, b WHERE x IN c

— глобальный scope:

WITH a AS (SELECT ...) SELECT * FROM (SELECT * FROM a)

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

LDAP аутентификация

— для аутентификации уже заданных пользователей (20.7);

— LDAP в качестве справочника пользователей (20.11);

— LDAP в качестве справочника ролей;

— Kerberos аутентификация;

Разработчики — Денис Глазачев, Виталий Баранов.

Atomic Database

— запросы DROP TABLE, RENAME TABLE теперь неблокирующие;

— запрос EXCHANGE TABLES;

Разработчик — Александр Токмаков.
По-умолчанию с версии 20.10. Обратная совместимость с версии 20.4.

Улучшение репликации

— отказ от выбора лидера (20.5);

— параллельная вставка с кворумом (20.10);

— возможность повторной вставки на разные реплики (20.10);

— запрос ALTER DROP/DETACH PART (20.12);

Разработчики:
Алексей Миловидов, Александра Латышева, Александр Сапин, Николае Вартоломей.

Новый формат данных в 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.12 — testing.

20.11 — prestable.

20.10 — stable.

20.9 — stable.

20.8 — LTS until 2021-09-30.

20.7 ... 20.4 — obsolete.

20.3 — LTS until 2021-03-12.

...

19.14 — obsolete.

Что ещё?

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

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

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

Форматы 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 задач с подробным описанием — зависимости, исполнители...

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

— ожидается в конце ноября.

.