Перейти к основному содержимому
Перейти к основному содержимому

Асинхронные вставки (async_insert)

Асинхронные вставки в ClickHouse предоставляют мощную альтернативу, когда пакетирование на стороне клиента невозможно. Это особенно полезно в рабочих нагрузках наблюдаемости, когда сотни или тысячи агентов непрерывно отправляют данные - логи, метрики, трассировки - часто в небольших, реальных нагрузках. Буферизация данных на стороне клиента в этих условиях увеличивает сложность, требуя центральной очереди для обеспечения возможности отправки достаточно крупных пакетов.

примечание

Отправка множества небольших пакетов в синхронном режиме не рекомендуется, так как это приведет к созданию множества частей. Это приведет к ухудшению производительности запросов и ошибкам "слишком много частей".

Асинхронные вставки переносят ответственность за пакетирование с клиента на сервер, записывая входящие данные в буфер в памяти, а затем сбрасывая их на хранение на основе настраиваемых пороговых значений. Этот подход значительно снижает накладные расходы на создание частей, уменьшает использование CPU и обеспечивает эффективность приема - даже при высокой конкурентной загрузке.

Основное поведение контролируется с помощью настройки async_insert.

Асинхронные вставки

Когда включено (1), вставки буферизуются и записываются на диск только после того, как выполнено одно из условий сброса:

(1) буфер достигает указанного размера (async_insert_max_data_size) (2) истекает временной порог (async_insert_busy_timeout_ms) или (3) накапливается максимальное количество запросов вставки (async_insert_max_query_number).

Этот процесс пакетирования невидим для клиентов и помогает ClickHouse эффективно объединять вставочный трафик из нескольких источников. Тем не менее, до выполнения сброса данные нельзя запрашивать. Важно, что существует несколько буферов на комбинацию формы и настроек вставки, а в кластерах буферы поддерживаются на каждом узле - что позволяет осуществлять детальный контроль в многопользовательских средах. Механика вставки в остальном идентична описанной для синхронных вставок.

Выбор режима возврата

Поведение асинхронных вставок дополнительно уточняется с помощью настройки 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 должен замедлить записи и создать некоторое обратное давление для обеспечения надежности сервиса.

Дедупликация и надежность

По умолчанию ClickHouse выполняет автоматическую дедупликацию для синхронных вставок, что делает повторные попытки безопасными в сценариях сбоев. Однако это отключено для асинхронных вставок, если не будет явно включено (это не следует включать, если у вас есть зависимые материализованные представления - см. проблему).

На практике, если дедупликация включена и та же вставка повторяется - например, из-за таймаута или сетевого разрыва - ClickHouse может безопасно игнорировать дубликат. Это помогает поддерживать идемпотентность и избегать двойной записи данных. Тем не менее, стоит отметить, что проверка вставки и парсинг схемы происходят только во время сброса буфера - поэтому ошибки (например, несовпадение типов) появятся только в этот момент.

Включение асинхронных вставок

Асинхронные вставки могут быть включены для конкретного пользователя или для конкретного запроса:

  • Включение асинхронных вставок на уровне пользователя. В этом примере используется пользователь default, если вы создаете другого пользователя, замените это имя:
ALTER USER default SETTINGS async_insert = 1
  • Вы можете указать настройки асинхронной вставки, используя оператор SETTINGS в запросах вставки:
INSERT INTO YourTable SETTINGS async_insert=1, wait_for_async_insert=1 VALUES (...)
  • Вы также можете указать настройки асинхронной вставки в качестве параметров соединения, используя клиент программного языка ClickHouse.

    Например, так вы можете сделать это в строке подключения JDBC, когда вы используете драйвер ClickHouse Java JDBC для подключения к ClickHouse Cloud:

"jdbc:ch://HOST.clickhouse.cloud:8443/?user=default&password=PASSWORD&ssl=true&custom_http_params=async_insert=1,wait_for_async_insert=1"