Асинхронные вставки (async_insert)
Асинхронные вставки в ClickHouse предоставляют мощную альтернативу в случаях, когда пакетирование на стороне клиента невозможно. Это особенно ценно в нагрузках по наблюдаемости (observability), где сотни или тысячи агентов непрерывно отправляют данные — логи, метрики, трейсы — часто небольшими порциями в режиме реального времени. Буферизация данных на стороне клиента в таких средах повышает сложность и требует централизованной очереди, чтобы обеспечивать отправку достаточно крупных пакетов.
Отправка множества маленьких батчей в синхронном режиме не рекомендуется, поскольку приводит к созданию большого количества кусков (parts). Это ухудшит производительность запросов и приведёт к ошибкам "too many part".
Асинхронные вставки переносят ответственность за пакетирование с клиента на сервер, записывая входящие данные в буфер в памяти, а затем сбрасывая их в хранилище при достижении настраиваемых порогов. Такой подход существенно снижает накладные расходы на создание кусков, уменьшает использование CPU и обеспечивает эффективную ингестию даже при высокой степени параллелизма.
Базовое поведение управляется настройкой async_insert.

При значении 1 вставки буферизуются и записываются на диск только после выполнения одного из условий сброса:
(1) буфер достигает заданного размера (async_insert_max_data_size) (2) истекает порог времени (async_insert_busy_timeout_ms) или (3) накапливается максимальное число запросов вставки (async_insert_max_query_number).
Этот процесс пакетирования прозрачен для клиентов и помогает ClickHouse эффективно объединять трафик вставок из нескольких источников. Однако до момента сброса данные недоступны для запросов. Важно, что существует несколько буферов для каждой комбинации типа вставки (insert shape) и настроек, а в кластерах буферы поддерживаются на каждом узле — это обеспечивает тонкий контроль в многопользовательских средах. Механика вставок в остальном идентична описанной для синхронных вставок.
Выбор режима возврата
Поведение асинхронных вставок дополнительно уточняется с помощью настройки wait_for_async_insert.
При значении 1 (по умолчанию) ClickHouse подтверждает вставку только после того, как данные успешно сброшены на диск. Это обеспечивает сильные гарантии надёжного сохранения данных и упрощает обработку ошибок: если что-то идёт не так во время сброса, ошибка возвращается клиенту. Этот режим рекомендуется для большинства продукционных сценариев, особенно когда отказы вставок должны надёжно отслеживаться.
Результаты бенчмарков показывают, что он хорошо масштабируется при высокой конкурентности — независимо от того, запускаете ли вы 200 или 500 клиентов — благодаря адаптивным вставкам и стабильному поведению по созданию кусков.
Установка wait_for_async_insert = 0 включает режим "fire-and-forget". В этом случае сервер подтверждает вставку сразу после буферизации данных, не дожидаясь их записи в хранилище.
Это обеспечивает вставки с ультранизкой задержкой и максимальную пропускную способность, что идеально для данных с высокой скоростью поступления и низкой критичностью. Однако это сопряжено с компромиссами: нет гарантии, что данные будут сохранены, ошибки могут проявиться только во время сброса, и сложно отследить неудачные вставки. Используйте этот режим только если ваша нагрузка допускает потерю данных.
Бенчмарки также демонстрируют значительное сокращение числа кусков и снижение использования CPU при редких сбросах буфера (например, каждые 30 секунд), но риск «тихих» сбоев при этом сохраняется.
Мы настоятельно рекомендуем использовать async_insert=1,wait_for_async_insert=1, если вы применяете асинхронные вставки. Использование wait_for_async_insert=0 очень рискованно, поскольку ваш клиент INSERT может не узнать о возникших ошибках, а также может привести к потенциальной перегрузке, если клиент продолжит быстро записывать данные в ситуации, когда сервер ClickHouse должен замедлить запись и создать некоторое обратное давление (backpressure), чтобы обеспечить надёжность сервиса.
Дедупликация и надёжность
По умолчанию ClickHouse выполняет автоматическую дедупликацию для синхронных вставок, что делает повторные попытки безопасными в случае сбоев. Однако для асинхронных вставок она отключена, если только не включена явно (её не следует включать, если у вас есть зависимые материализованные представления — см. issue).
На практике, если дедупликация включена и одна и та же вставка повторяется — например, из-за тайм-аута или обрыва сети — ClickHouse может безопасно проигнорировать дубликат. Это помогает сохранять идемпотентность и избегать повторной записи данных. Тем не менее стоит учитывать, что проверка вставок и разбор схемы выполняются только во время сброса буфера — поэтому ошибки (например, несоответствие типов) проявятся только в этот момент.
Включение асинхронных вставок
Асинхронные вставки можно включить для конкретного пользователя или для определённого запроса:
-
Включение асинхронных вставок на уровне пользователя. В этом примере используется пользователь
default; если вы создадите другого пользователя, подставьте его имя: -
Вы можете задать параметры асинхронной вставки, используя предложение SETTINGS в запросах INSERT:
-
Вы также можете указать параметры асинхронной вставки как параметры подключения при использовании клиентской библиотеки ClickHouse для выбранного языка программирования.
В качестве примера ниже показано, как это можно сделать в строке подключения JDBC при использовании ClickHouse Java JDBC-драйвера для подключения к ClickHouse Cloud: