ClickHouse/docs/ru/operations/settings/merge-tree-settings.md
Ivan Blinkov d91c97d15d
[docs] replace underscores with hyphens (#10606)
* Replace underscores with hyphens

* remove temporary code

* fix style check

* fix collapse
2020-04-30 21:19:18 +03:00

6.7 KiB
Raw Blame History

Настройки MergeTree таблиц

Значения настроек merge-tree (для всех MergeTree таблиц) можно посмотреть в таблице system.merge_tree_settings, их можно переопределить в config.xml в секции merge_tree, или задать в секции SETTINGS у каждой таблицы.

Пример переопределения в config.xml:

<merge_tree>
    <max_suspicious_broken_parts>5</max_suspicious_broken_parts>
</merge_tree>

Пример для определения в SETTINGS у конкретной таблицы:

CREATE TABLE foo
(
    `A` Int64
)
ENGINE = MergeTree
ORDER BY tuple()
SETTINGS max_suspicious_broken_parts = 500;

Пример изменения настроек у конкретной таблицы командой ALTER TABLE ... MODIFY SETTING:

ALTER TABLE foo
    MODIFY SETTING max_suspicious_broken_parts = 100;

parts_to_throw_insert

Eсли число кусков в партиции превышает значение parts_to_throw_insert, INSERT прерывается с исключением Too many parts (N). Merges are processing significantly slower than inserts.

Возможные значения:

  • Положительное целое число.

Значение по умолчанию: 300.

Для достижения максимальной производительности запросов SELECT необходимо минимизировать количество обрабатываемых кусков, см. Дизайн MergeTree.

Можно установить большее значение 600 (1200), это уменьшит вероятность возникновения ошибки Too many parts, но в тоже время вы позже обнаружите возможную проблему со слияниями (например, из-за недостатка места на диске) и деградацию производительности SELECT.

parts_to_delay_insert

Eсли число кусков в партиции превышает значение parts_to_delay_insert, INSERT искусственно замедляется.

Возможные значения:

  • Положительное целое число.

Значение по умолчанию: 150.

ClickHouse искусственно выполняет INSERT дольше (добавляет sleep), чтобы фоновый механизм слияния успевал слиять куски быстрее, чем они добавляются.

max_delay_to_insert

Величина в секундах, которая используется для расчета задержки INSERT, если число кусков в партиции превышает значение parts_to_delay_insert.

Возможные значения:

  • Положительное целое число.

Значение по умолчанию: 1.

Величина задержи (в миллисекундах) для INSERT вычисляется по формуле:

max_k = parts_to_throw_insert - parts_to_delay_insert
k = 1 + parts_count_in_partition - parts_to_delay_insert
delay_milliseconds = pow(max_delay_to_insert * 1000, k / max_k)

Т.е. если в партиции уже 299 кусков и parts_to_throw_insert = 300, parts_to_delay_insert = 150, max_delay_to_insert = 1, INSERT замедлится на pow( 1 * 1000, (1 + 299 - 150) / (300 - 150) ) = 1000 миллисекунд.

old_parts_lifetime

Время (в секундах) хранения неактивных кусков, для защиты от потери данных при спонтанной перезагрузке сервера или О.С.

Возможные значения:

  • Положительное целое число.

Значение по умолчанию: 480.

После слияния нескольких кусков в новый кусок, ClickHouse помечает исходные куски как неактивные и удаляет их после old_parts_lifetime секунд. Неактивные куски удаляются, если они не используются в текущих запросах, т.е. если счетчик ссылок куска refcount равен нулю.

Неактивные куски удаляются не сразу, потому что при записи нового куска не вызывается fsync, т.е. некоторое время новый кусок находится только в оперативной памяти сервера (кеше О.С.). Т.о. при спонтанной перезагрузке сервера новый (смерженный) кусок может быть потерян или испорчен. В этом случае ClickHouse в процессе старта при проверке целостности кусков обнаружит проблему, вернет неактивные куски в список активных и позже заново их смержит. Сломанный кусок в этом случае переименовывается (добавляется префикс broken_) и перемещается в папку detached. Если проверка целостности не обнаруживает проблем в смерженном куске, то исходные неактивные куски переименовываются (добавляется префикс ignored_) и перемещаются в папку detached.

Стандартное значение Linux dirty_expire_centisecs - 30 секунд (максимальное время, которое записанные данные хранятся только в оперативной памяти), но при больших нагрузках на дисковую систему, данные могут быть записаны намного позже. Экспериментально было найдено время - 480 секунд, за которое гарантированно новый кусок будет записан на диск.

Оригинальная статья