Асинхронные вставки (async_insert)
Вставка данных в ClickHouse большими партиями является лучшей практикой. Это экономит вычислительные циклы и диск I/O, и, следовательно, экономит деньги. Если ваш случай использования позволяет вам пакетировать вставки вне ClickHouse, это один из вариантов. Если вы хотите, чтобы ClickHouse формировал пакеты, вы можете использовать режим асинхронной ВСТАВКИ, описанный здесь.
Используйте асинхронные вставки в качестве альтернативы как пакетированию данных на стороне клиента, так и поддержанию скорости вставки на уровне одного запроса вставки в секунду, включив настройку async_insert. Это заставляет ClickHouse обрабатывать пакетирование на стороне сервера.
По умолчанию ClickHouse записывает данные синхронно. Каждая вставка, отправленная в ClickHouse, немедленно вызывает создание части, содержащей данные вставки. Это стандартное поведение, когда настройка async_insert установлена в свое значение по умолчанию — 0:

Установив async_insert в 1, ClickHouse сначала сохраняет поступающие вставки в буфер в памяти, а затем регулярно сбрасывает их на диск.
Существуют два возможных условия, которые могут вызвать сброс буфера ClickHouse на диск:
- размер буфера достиг N байт (N можно настроить с помощью async_insert_max_data_size)
- прошло не менее N мс с момента последнего сброса буфера (N можно настроить с помощью async_insert_busy_timeout_max_ms)
В любое время, когда выполняется одно из условий выше, ClickHouse сбрасывает свой буфер в памяти на диск.
Ваши данные становятся доступными для запросов на чтение после того, как данные записаны в часть на хранилище. Помните об этом, когда вы хотите изменить async_insert_busy_timeout_ms
(по умолчанию установлено в 1 секунду) или настройки async_insert_max_data_size
(по умолчанию установлено в 10 MiB).
С настройкой wait_for_async_insert вы можете настроить, хотите ли вы, чтобы оператор вставки возвращал подтверждение либо сразу после вставки данных в буфер (wait_for_async_insert = 0), либо по умолчанию, после записи данных в часть после сброса из буфера (wait_for_async_insert = 1).
Следующие две диаграммы иллюстрируют две настройки для async_insert и wait_for_async_insert:


Включение асинхронных вставок
Асинхронные вставки можно включить для конкретного пользователя или для конкретного запроса:
-
Включение асинхронных вставок на уровне пользователя. Этот пример использует пользователя
default
, если вы создаете другого пользователя, замените имя пользователя: -
Вы можете указать настройки асинхронной вставки, используя клаузу SETTINGS запросов вставки:
-
Вы также можете указать настройки асинхронной вставки как параметры соединения при использовании клиента ClickHouse на языке программирования.
В качестве примера, вот как вы можете сделать это в строке подключения JDBC, когда используете драйвер ClickHouse Java JDBC для подключения к ClickHouse Cloud :
Наша настоятельная рекомендация — использовать async_insert=1, wait_for_async_insert=1 при использовании асинхронных вставок. Использование wait_for_async_insert=0 очень рискованно, потому что ваш клиент INSERT может не быть в курсе ошибок, а также может привести к потенциальной перегрузке, если ваш клиент продолжит быстро записывать в ситуации, когда сервер ClickHouse должен замедлить записи и создать обратное давление, чтобы обеспечить надежность сервиса.
Ручное пакетирование (см. bulk insert)) имеет преимущество в том, что оно поддерживает встроенную автоматическую дедупликацию данных таблицы, если (именно) один и тот же оператор вставки отправляется несколько раз в ClickHouse Cloud, например, из-за автоматической попытки повторной отправки в клиентском программном обеспечении из-за временных проблем с сетевым подключением.