Перейти к основному содержимому
Версия: 2.0.x

Compaction для cluster с общими данными

В этом разделе описывается, как управлять compaction в cluster Selena с общими данными.

Обзор

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

Показатель Compaction Score

Обзор

Compaction Score отражает состояние слияния файлов данных в партиции. Более высокий показатель указывает на меньший прогресс слияния, что означает, что партиция имеет больше несмерженных версий файлов данных. FE поддерживает информацию о Compaction Score для каждой партиции, включая Max Compaction Score (наивысший показатель среди всех tablet в партиции).

Если Max Compaction Score партиции ниже параметра FE lake_compaction_score_selector_min_score (по умолчанию: 10), compaction для этой партиции считается завершённым. Max Compaction Score, превышающий 100, указывает на нездоровое состояние compaction. Когда показатель превышает параметр FE lake_ingest_slowdown_threshold (по умолчанию: 100), система замедляет фиксацию транзакций загрузки данных для партиции. Если он превышает lake_compaction_score_upper_bound (по умолчанию: 2000), система отклоняет транзакции импорта для партиции.

Правила расчёта

Обычно каждый файл данных добавляет 1 к Compaction Score. Например, если партиция имеет один tablet и 10 файлов данных, сгенерированных при первой операции загрузки, Max Compaction Score партиции равен 10. Все файлы данных, сгенерированные транзакцией в пределах tablet, группируются как Rowset.

При расчёте показателя Rowset tablet группируются по размеру, и группа с наибольшим количеством файлов определяет Compaction Score tablet.

Например, tablet проходит 7 операций загрузки, генерируя Rowset с размерами: 100 МБ, 100 МБ, 100 МБ, 10 МБ, 10 МБ, 10 МБ и 10 МБ. При расчёте система объединит три Rowset по 100 МБ в одну группу и четыре Rowset по 10 МБ в другую. Compaction Score рассчитывается на основе группы с большим количеством файлов. В этом случае вторая группа имеет больший compaction score. Compaction приоритизирует группу с более высоким показателем, поэтому после первого compaction распределение Rowset будет: 100 МБ, 100 МБ, 100 МБ и 40 МБ.

Рабочий процесс Compaction

Для cluster с общими данными Selena представляет новый механизм compaction, управляемый FE:

  1. Расчёт показателя: Leader FE рассчитывает и сохраняет Compaction Score для партиций на основе результатов публикации транзакций.
  2. Выбор кандидатов: FE выбирает партиции с наивысшими Max Compaction Score в качестве кандидатов на compaction.
  3. Генерация задач: FE инициирует транзакции compaction для выбранных партиций, генерирует подзадачи уровня tablet и отправляет их на Compute Node (CN) до достижения лимита, установленного параметром FE lake_compaction_max_tasks.
  4. Выполнение подзадач: CN выполняют подзадачи compaction в фоновом режиме. Количество одновременных подзадач на CN контролируется параметром CN compact_threads.
  5. Сбор результатов: FE агрегирует результаты подзадач и фиксирует транзакцию compaction.
  6. Публикация: FE публикует успешно зафиксированную транзакцию compaction.

Управление compaction

Просмотр показателей compaction

  • Вы можете просмотреть показатели compaction партиций в определённой таблице с помощью выражения SHOW PROC. Обычно вам нужно обращать внимание только на поле MaxCS. Если MaxCS ниже 10, compaction считается завершённым. Если MaxCS выше 100, Compaction Score относительно высок. Если MaxCS превышает 500, Compaction Score очень высок и может потребоваться ручное вмешательство.

    SHOW PARTITIONS FROM <table_name>
    SHOW PROC '/dbs/<database_name>/<table_name>/partitions'

    Пример:

    mysql> SHOW PROC '/dbs/load_benchmark/store_sales/partitions';
    +-------------+---------------+----------------+----------------+-------------+--------+--------------+-------+------------------------------+---------+----------+-----------+----------+------------+-------+-------+-------+
    | PartitionId | PartitionName | CompactVersion | VisibleVersion | NextVersion | State | PartitionKey | Range | DistributionKey | Buckets | DataSize | RowCount | CacheTTL | AsyncWrite | AvgCS | P50CS | MaxCS |
    +-------------+---------------+----------------+----------------+-------------+--------+--------------+-------+------------------------------+---------+----------+-----------+----------+------------+-------+-------+-------+
    | 38028 | store_sales | 913 | 921 | 923 | NORMAL | | | ss_item_sk, ss_ticket_number | 64 | 15.6GB | 273857126 | 2592000 | false | 10.00 | 10.00 | 10.00 |
    +-------------+---------------+----------------+----------------+-------------+--------+--------------+-------+------------------------------+---------+----------+-----------+----------+------------+-------+-------+-------+
    1 row in set (0.20 sec)
  • Вы также можете просмотреть показатели compaction партиций, запросив системное представление information_schema.partitions_meta.

    Пример:

    mysql> SELECT * FROM information_schema.partitions_meta ORDER BY Max_CS LIMIT 10;
    +--------------+----------------------------+----------------------------+--------------+-----------------+-----------------+----------------------+--------------+---------------+-----------------+-----------------------------------------+---------+-----------------+----------------+---------------------+-----------------------------+--------------+---------+-----------+------------+------------------+----------+--------+--------+-------------------------------------------------------------------+
    | DB_NAME | TABLE_NAME | PARTITION_NAME | PARTITION_ID | COMPACT_VERSION | VISIBLE_VERSION | VISIBLE_VERSION_TIME | NEXT_VERSION | PARTITION_KEY | PARTITION_VALUE | DISTRIBUTION_KEY | BUCKETS | REPLICATION_NUM | STORAGE_MEDIUM | COOLDOWN_TIME | LAST_CONSISTENCY_CHECK_TIME | IS_IN_MEMORY | IS_TEMP | DATA_SIZE | ROW_COUNT | ENABLE_DATACACHE | AVG_CS | P50_CS | MAX_CS | STORAGE_PATH |
    +--------------+----------------------------+----------------------------+--------------+-----------------+-----------------+----------------------+--------------+---------------+-----------------+-----------------------------------------+---------+-----------------+----------------+---------------------+-----------------------------+--------------+---------+-----------+------------+------------------+----------+--------+--------+-------------------------------------------------------------------+
    | tpcds_1t | call_center | call_center | 11905 | 0 | 2 | 2024-03-17 08:30:47 | 3 | | | cc_call_center_sk | 1 | 1 | HDD | 9999-12-31 23:59:59 | NULL | 0 | 0 | 12.3KB | 42 | 0 | 0 | 0 | 0 | s3://XXX/536a3c77-52c3-485a-8217-781734a970b1/db10328/11906/11905 |
    ...

Просмотр задач compaction

По мере загрузки новых данных в систему FE постоянно планирует задачи compaction для выполнения на различных узлах CN. Сначала вы можете просмотреть общий статус задач compaction на FE, а затем просмотреть детали выполнения каждой задачи на CN.

Просмотр общего статуса задач compaction

Вы можете просмотреть общий статус задач compaction с помощью выражения SHOW PROC.

SHOW PROC '/compactions';

Пример:

mysql> SHOW PROC '/compactions';
+---------------------+-------+---------------------+---------------------+---------------------+-------+----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+
| Partition | TxnID | StartTime | CommitTime | FinishTime | Error | Profile |
+---------------------+-------+---------------------+---------------------+---------------------+-------+----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+
| ssb.lineorder.10081 | 15 | 2026-01-10 03:29:07 | 2026-01-10 03:29:11 | 2026-01-10 03:29:12 | NULL | {"sub_task_count":12,"read_local_sec":0,"read_local_mb":218,"read_remote_sec":0,"read_remote_mb":0,"read_segment_count":120,"write_segment_count":12,"write_segment_mb":219,"write_remote_sec":4,"in_queue_sec":18} |
...

Возвращаются следующие поля:

  • Partition: Партиция, к которой принадлежит задача compaction.
  • TxnID: Идентификатор транзакции, назначенный задаче compaction.
  • StartTime: Время начала задачи compaction. NULL означает, что задача ещё не инициирована.
  • CommitTime: Время фиксации данных задачи compaction. NULL означает, что данные ещё не зафиксированы.
  • FinishTime: Время публикации данных задачи compaction. NULL означает, что данные ещё не опубликованы.
  • Error: Сообщение об ошибке (если есть) задачи compaction.
  • Profile: (поддерживается с v1.5.2) Профиль задачи compaction после завершения.
    • sub_task_count: Количество подзадач (эквивалентно tablet) в партиции.
    • read_local_sec: Общее время чтения данных из локального кэша всеми подзадачами. Единица: секунды.
    • read_local_mb: Общий размер данных, прочитанных из локального кэша всеми подзадачами. Единица: МБ.
    • read_remote_sec: Общее время чтения данных из удалённого хранилища всеми подзадачами. Единица: секунды.
    • read_remote_mb: Общий размер данных, прочитанных из удалённого хранилища всеми подзадачами. Единица: МБ.
    • read_segment_count: Общее количество файлов, прочитанных всеми подзадачами.
    • write_segment_count: Общее количество новых файлов, сгенерированных всеми подзадачами.
    • write_segment_mb: Общий размер новых файлов, сгенерированных всеми подзадачами. Единица: МБ.
    • write_remote_sec: Общее время записи данных в удалённое хранилище всеми подзадачами. Единица: секунды.
    • in_queue_sec: Общее время нахождения всех подзадач в очереди. Единица: секунды.

Просмотр деталей выполнения задач compaction

Каждая задача compaction делится на несколько подзадач, каждая из которых соответствует tablet. Вы можете просмотреть детали выполнения каждой подзадачи, запросив системное представление information_schema.be_cloud_native_compactions.

Пример:

mysql> SELECT * FROM information_schema.be_cloud_native_compactions;
+-------+--------+-----------+---------+---------+------+---------------------+-------------+----------+--------+-------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+
| BE_ID | TXN_ID | TABLET_ID | VERSION | SKIPPED | RUNS | START_TIME | FINISH_TIME | PROGRESS | STATUS | PROFILE |
+-------+--------+-----------+---------+---------+------+---------------------+-------------+----------+--------+-------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+
| 10001 | 51047 | 43034 | 12 | 0 | 1 | 2024-09-24 19:15:15 | NULL | 82 | | {"read_local_sec":0,"read_local_mb":31,"read_remote_sec":0,"read_remote_mb":0,"read_remote_count":0,"read_local_count":1900,"segment_init_sec":0,"column_iterator_init_sec":0,"in_queue_sec":0} |
...

Возвращаются следующие поля:

  • BE_ID: Идентификатор CN.
  • TXN_ID: Идентификатор транзакции, к которой принадлежит подзадача.
  • TABLET_ID: Идентификатор tablet, к которому принадлежит подзадача.
  • VERSION: Версия tablet.
  • RUNS: Количество выполнений подзадачи.
  • START_TIME: Время начала подзадачи.
  • FINISH_TIME: Время завершения подзадачи.
  • PROGRESS: Прогресс compaction tablet в процентах.
  • STATUS: Статус подзадачи. Сообщения об ошибках будут возвращены в этом поле, если есть ошибка.
  • PROFILE: (поддерживается с v1.5.2) Профиль выполнения подзадачи.
    • read_local_sec: Время чтения данных из локального кэша подзадачей. Единица: секунды.
    • read_local_mb: Размер данных, прочитанных из локального кэша подзадачей. Единица: МБ.
    • read_remote_sec: Время чтения данных из удалённого хранилища подзадачей. Единица: секунды.
    • read_remote_mb: Размер данных, прочитанных из удалённого хранилища подзадачей. Единица: МБ.
    • read_local_count: Количество чтений данных из локального кэша подзадачей.
    • read_remote_count: Количество чтений данных из удалённого хранилища подзадачей.
    • in_queue_sec: Время нахождения подзадачи в очереди. Единица: секунды.

Настройка задач compaction

Вы можете настроить задачи compaction с помощью следующих параметров FE и CN (BE).

Параметры FE

Вы можете динамически настроить следующий параметр FE.

ADMIN SET FRONTEND CONFIG ("lake_compaction_max_tasks" = "-1");
lake_compaction_max_tasks
  • По умолчанию: -1
  • Тип: Int
  • Единица: -
  • Изменяемый: Да
  • Описание: Максимальное количество одновременных задач Compaction, разрешённых в cluster с общими данными. Установка этого элемента в -1 означает расчёт количества одновременных задач адаптивным способом, то есть количество активных узлов CN, умноженное на 16. Установка этого значения в 0 отключит compaction.
  • Введён в: v1.5.2
ADMIN SET FRONTEND CONFIG ("lake_compaction_disable_tables" = "11111;22222");
lake_compaction_disable_tables
  • По умолчанию: ""
  • Тип: String
  • Единица: -
  • Изменяемый: Да
  • Описание: Отключение compaction для определённых таблиц. Это не повлияет на уже начавшийся compaction. Значение этого элемента — идентификатор таблицы. Несколько значений разделяются ;.
  • Введён в: v1.5.2

Параметры CN

Вы можете динамически настроить следующий параметр CN.

UPDATE information_schema.be_configs SET VALUE = 8
WHERE name = "compact_threads";
compact_threads
  • По умолчанию: 4
  • Тип: Int
  • Единица: -
  • Изменяемый: Да
  • Описание: Максимальное количество потоков, используемых для одновременных задач compaction. Эта конфигурация стала динамической начиная с v1.5.2.
  • Введён в: v1.5.2

ПРИМЕЧАНИЕ

В продакшене рекомендуется устанавливать compact_threads на 25% от количества ядер CPU BE/CN.

max_cumulative_compaction_num_singleton_deltas
  • По умолчанию: 500
  • Тип: Int
  • Единица: -
  • Изменяемый: Да
  • Описание: Максимальное количество сегментов, которые могут быть объединены в одном Cumulative Compaction. Вы можете уменьшить это значение, если во время compaction происходит OOM.
  • Введён в: -

ПРИМЕЧАНИЕ

В продакшене рекомендуется устанавливать max_cumulative_compaction_num_singleton_deltas на 100 для ускорения задач compaction и снижения потребления ресурсов.

lake_pk_compaction_max_input_rowsets
  • По умолчанию: 500
  • Тип: Int
  • Единица: -
  • Изменяемый: Да
  • Описание: Максимальное количество входных rowset, разрешённых в задаче compaction таблицы с первичным ключом в cluster с общими данными. Значение по умолчанию этого параметра было изменено с 5 на 1000 с v1.5.2. После включения политики Sized-tiered Compaction для таблиц с первичным ключом (путём установки enable_pk_size_tiered_compaction_strategy в true) Selena не нужно ограничивать количество rowset для каждого compaction, чтобы уменьшить амплификацию записи. Поэтому значение по умолчанию этого параметра было увеличено.
  • Введён в: v1.5.2

ПРИМЕЧАНИЕ

В продакшене рекомендуется устанавливать max_cumulative_compaction_num_singleton_deltas на 100 для ускорения задач Compaction и снижения потребления ресурсов.

Ручной запуск задач compaction

-- Запуск compaction для всей таблицы.
ALTER TABLE <table_name> COMPACT;
-- Запуск compaction для определённой партиции.
ALTER TABLE <table_name> COMPACT <partition_name>;
-- Запуск compaction для нескольких партиций.
ALTER TABLE <table_name> COMPACT (<partition_name>, <partition_name>, ...);

Отмена задач compaction

Вы можете вручную отменить задачу compaction, используя идентификатор транзакции задачи.

CANCEL COMPACTION WHERE TXN_ID = <TXN_ID>;

ПРИМЕЧАНИЕ

  • Выражение CANCEL COMPACTION должно быть отправлено с узла Leader FE.
  • Выражение CANCEL COMPACTION применяется только к транзакциям, которые не были зафиксированы, то есть CommitTime равен NULL в результате SHOW PROC '/compactions'.
  • CANCEL COMPACTION — это асинхронный процесс. Вы можете проверить, была ли задача отменена, выполнив SHOW PROC '/compactions'.

Лучшие практики

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

  • Старайтесь увеличивать интервал между загрузками (избегайте сценариев с интервалами менее 10 секунд) и увеличивать размер пакета на загрузку (избегайте размеров пакетов менее 100 строк данных).
  • Настройте количество параллельных рабочих потоков compaction на CN для ускорения выполнения задач. В продакшене рекомендуется устанавливать compact_threads на 25% от количества ядер CPU BE/CN.
  • Отслеживайте статус задач Compaction с помощью show proc '/compactions' и select * from information_schema.be_cloud_native_compactions;.
  • Отслеживайте Compaction Score и настройте оповещения на его основе. Встроенный шаблон мониторинга Grafana Selena включает эту метрику.
  • Обращайте внимание на потребление ресурсов во время compaction, особенно на использование памяти. Шаблон мониторинга Grafana также включает эту метрику.

Устранение неполадок

Медленные запросы

Чтобы определить медленные запросы, вызванные несвоевременным Compaction, вы можете проверить в SQL Profile значение SegmentsReadCount, делённое на TabletCount в пределах одного Fragment. Если это большое значение, например, десятки или более, несвоевременный Compaction может быть причиной медленного запроса.

Высокий Max Compaction Score в cluster

  1. Проверьте, находятся ли параметры, связанные с Compaction, в разумных диапазонах, используя ADMIN SHOW FRONTEND CONFIG LIKE "%lake_compaction%" и SELECT * FROM information_schema.be_configs WHERE name = "compact_threads".
  2. Проверьте, не застрял ли Compaction, используя SHOW PROC '/compactions':
    • Если CommitTime остаётся NULL, проверьте системное представление information_schema.be_cloud_native_compactions для выяснения причины застревания Compaction.
    • Если FinishTime остаётся NULL, найдите причину сбоя публикации в журнале Leader FE, используя TxnID.
  3. Проверьте, работает ли compaction медленно, используя SHOW PROC '/compactions':
    • Если sub_task_count слишком большой (проверьте размер каждого tablet в этой партиции с помощью SHOW PARTITIONS), таблица может быть создана неправильно.
    • Если read_remote_mb слишком большой (более 30% от общего объёма прочитанных данных), проверьте размер диска сервера, а также квоту кэша через SHOW BACKENDS для поля DataCacheMetrics.
    • Если write_remote_sec слишком большой (более 90% от общего времени Compaction), запись в удалённое хранилище может быть слишком медленной. Это можно проверить, проверив метрики мониторинга, специфичные для общих данных, с ключевыми словами single upload latency и multi upload latency.
    • Если in_queue_sec слишком большой (среднее время ожидания на tablet превышает 60 секунд), настройки параметров могут быть неразумными или другие запущенные Compaction слишком медленные.