Настройки MergeTree таблиц
Значения настроек всех MergeTree таблиц собраны в таблице system.merge_tree_settings
. Их можно переопределить в разделе merge_tree
файла config.xml
или задать в секции 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’) так, чтобы куски сливались в фоновом процессе быстрее, чем добавляются.
inactive_parts_to_throw_insert
Если число неактивных кусков в партиции больше значения inactive_parts_to_throw_insert
, то INSERT
прерывается с исключением Too many inactive parts (N). Parts cleaning are processing significantly slower than inserts
.
Возможные значения:
- Положительное целое число.
Значение по умолчанию: 0 (без ограничений).
inactive_parts_to_delay_insert
Если число неактивных кусков в партиции больше или равно значению inactive_parts_to_delay_insert
, то INSERT
искусственно замедляется. Это помогает, когда сервер не может быстро очистить неактивные куски.
Возможные значения:
- Положительное целое число.
Значение по умолчанию: 0 (без ограничений).
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
миллисекунд.
max_parts_in_total
Eсли суммарное число активных кусков во всех партициях таблицы больше значения max_parts_in_total
, то INSERT прерывается с исключением Too many parts (N)
.
Возможные значения:
- Положительное целое число.
Значение по умолчанию: 100000.
С большим числом кусков в таблице производительность запросов ClickHouse снижается, а время старта ClickHouse — увеличивается. Чаще всего это следствие неправильного дизайна (ошибки выбора стратегии партиционирования, например, слишком мелкие партиции).
replicated_deduplication_window
Количество хеш-сумм последних вставленных блоков, которые хранятся в Zookeeper.
Возможные значения:
- Положительное целое число.
- 0 (без ограничений).
Значение по умолчанию: 1000.
Команда Insert
создает один или несколько блоков (кусков). При вставке в Replicated таблицы ClickHouse для дедупликации вставок записывает в Zookeeper хеш-суммы созданных кусков. Но хранятся только последние replicated_deduplication_window
хеш-сумм. Самые старые хеш-суммы удаляются из Zookeeper.
Большое значение replicated_deduplication_window
замедляет Insert
, так как приходится сравнивать большее количество хеш-сумм.
Хеш-сумма рассчитывается по названиям и типам полей, а также по данным вставленного куска (потока байт).
non_replicated_deduplication_window
Количество последних вставленных блоков в нереплицированной MergeTree таблице, для которых хранятся хеш-суммы для проверки дубликатов.
Возможные значения:
- Положительное целое число.
- 0 (де дупликация отключена).
Значение по умолчанию: 0.
Используется механизм дедупликации, аналогичный реплицированным таблицам (см. описание настройки replicated_deduplication_window). Хеш-суммы вставленных кусков записываются в локальный файл на диске.
replicated_deduplication_window_seconds
Время хранения (в секундах) хеш-сумм вставленных блоков в Zookeeper. По истечении этого времени хеш-суммы удаляются.
Возможные значения:
- Положительное целое число.
Значение по умолчанию: 604800 (1 неделя).
Аналогично replicated_deduplication_window, настройка replicated_deduplication_window_seconds
задает время хранения хеш-сумм блоков для дедупликции Insert
. Хеш-суммы старше значения replicated_deduplication_window_seconds
удаляются из Zookeeper, даже если количество оставшихся хеш-сумм станет меньше чем replicated_deduplication_window
.
old_parts_lifetime
Время (в секундах) хранения неактивных кусков для защиты от потери данных при спонтанной перезагрузке сервера.
Возможные значения:
- Положительное целое число.
Значение по умолчанию: 480.
После объединения нескольких кусков в один новый ClickHouse помечает исходные куски как неактивные и удаляет их по прошествии old_parts_lifetime
секунд.
Неактивные куски удаляются, если они не нужны для текущих запросов, т.е. если счетчик ссылок куска refcount
имеет нулевое значение.
При записи нового куска fsync
не вызывается, поэтому неактивные куски удаляются позже. Это значит, что некоторое время новый кусок находится только в оперативной памяти сервера (кеш ОС). Если сервер перезагрузится спонтанно, новый слитый кусок может испортиться или потеряться.
Во время запуска сервер ClickHouse проверяет целостность кусков.
Если новый (слитый) кусок поврежден, ClickHouse возвращает неактивные куски в список активных и позже снова выполняет слияние. В этом случае испорченный кусок получает новое имя (добавляется префикс broken_
) и попадает в каталог detached
.
Если проверка целостн ости не выявляет проблем в слитом куске, то исходные неактивные куски переименовываются (добавляется префикс ignored_
) и перемещаются в каталог detached
.
Стандартное для Linux значение dirty_expire_centisecs
— 30 секунд. Это максимальное время, в течение которого записанные данные хранятся только в оперативной памяти. Если нагрузка на дисковую систему большая, то данные записываются намного позже. Значение 480 секунд подобрали экспериментальным путем — это время, за которое новый кусок гарантированно запишется на диск.
replicated_fetches_http_connection_timeout
Тайм-аут HTTP-соединения (в секундах) для запросов на скачивание кусков. Наследуется из профиля по умолчанию http_connection_timeout, если не задан явно.
Возможные значения:
- 0 - используется значение
http_connection_timeout
. - Любое положительное целое число.
Значение по умолчанию: 0
.
replicated_fetches_http_send_timeout
Тайм-аут (в секундах) для отправки HTTP-запросов на скачивание кусков. Наследуется из профиля по умолчанию http_send_timeout, если не задан явно.
Возможные значения:
- 0 - используется значение
http_send_timeout
. - Любое положительное целое число.
Значение по умолчанию: 0
.
replicated_fetches_http_receive_timeout
Тайм-аут (в секундах) для получения HTTP-запросов на скачивание кусков. Наследуется из профиля по умолчанию http_receive_timeout, если не задан явно.
Возможные значения:
- 0 - используется значение
http_receive_timeout
. - Любое положительное целое число.
Значение по умолчанию: 0
.
max_replicated_fetches_network_bandwidth
Ограничивает максимальную скорость скачивания данных в сети (в байтах в секунду) для синхронизаций между репликами. Настройка применяется к конкретной таблице, в отличие от max_replicated_fetches_network_bandwidth_for_server, которая применяется к серверу.
Можно ограничить скорость обмена данными как для всего сервера, так и для конкретной таблицы, но для этого значение табличной настройки должно быть меньше серверной. Иначе сервер будет учитывать только настройку max_replicated_fetches_network_bandwidth_for_server
.
Настройка соблюдается неточно.
Возможные значения:
- Любое целое положительное число.
- 0 — Скорость не ограничена.
Значение по умолчанию: 0
.
Использование
Может быть использована для ограничения скорости передачи данных при репликации данных для добавления или замены новых узлов.
max_replicated_sends_network_bandwidth
Ограничивает максимальную скорость отправки данных по сети (в байтах в секунду) для синхронизации между репликами. Настройка применяется к конкретной таблице, в отличие от max_replicated_sends_network_bandwidth_for_server, которая применяется к серверу.
Можно ограничить скорость обмена данными как для всего сервера, так и для конкретной таблицы, но для этого значение табличной настройки должно быть меньше серверной. Иначе сервер будет учитывать только настройку max_replicated_sends_network_bandwidth_for_server
.
Настройка следуется неточно.
Возможные значения:
- Любое целое положительное число.
- 0 — Скорость не ограничена.
Значение по умолчанию: 0
.
Использование
Может быть использована для ограничения скорости сети при репликации данных для добавления или замены новых узлов.