ClickHouse/docs/ru/operations/settings/merge_tree_settings.md
2020-04-10 10:48:53 -03:00

6.6 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 секунд, за которое гарантированно новый кусок будет записан на диск.

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