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

Предварительные требования

Для примеров в этой статье вам понадобятся:
  • запущенный экземпляр сервера ClickHouse
  • установленный curl. В Ubuntu или Debian выполните sudo apt install curl или обратитесь к этой документации за инструкциями по установке.

Обзор

HTTP-интерфейс позволяет использовать ClickHouse на любой платформе из любого языка программирования в формате REST API. HTTP-интерфейс более ограничен, чем native interface, но обеспечивает лучшую поддержку языков программирования. По умолчанию clickhouse-server прослушивает следующие порты:
  • порт 8123 для HTTP
  • можно включить порт 8443 для HTTPS
Если выполнить запрос GET / без каких-либо параметров, будет возвращён код ответа 200 вместе со строкой “Ok.”:
“Ok.” — это значение по умолчанию, заданное в http_server_default_response; при необходимости его можно изменить. См. также: особенности кодов HTTP-ответов.

Веб-интерфейс

В ClickHouse есть веб-интерфейс, доступный по следующему адресу:
Веб-интерфейс поддерживает отображение прогресса во время выполнения запроса, отмену запроса и потоковую передачу результатов. В нём есть скрытая возможность для отображения диаграмм и графиков конвейеров выполнения запросов. После успешного выполнения запроса появляется кнопка загрузки, позволяющая скачать результаты запроса в различных форматах, включая CSV, TSV, JSON, JSONLines, Parquet, Markdown или любой другой пользовательский формат, поддерживаемый ClickHouse. Возможность загрузки использует кэш запросов, чтобы эффективно получать результаты без повторного выполнения запроса. Будет загружен полный результирующий набор, даже если в интерфейсе отображалась только одна страница из многих. Веб-интерфейс создан для таких профессионалов, как вы. В скриптах проверки работоспособности используйте запрос GET /ping. Этот обработчик всегда возвращает “Ok.” (с символом перевода строки в конце). Доступно начиная с версии 18.12.13. См. также /replicas_status, чтобы проверить задержку реплики.

Выполнение запросов по HTTP/HTTPS

Для выполнения запросов по HTTP/HTTPS есть три варианта:
  • передать запрос в параметре URL ‘query’
  • использовать метод POST.
  • Передать начало запроса в параметре ‘query’, а остальную часть — через POST
По умолчанию размер URL ограничен 1 MiB, это можно изменить с помощью настройки http_max_uri_size.
В случае успеха вы получите код ответа 200 и результат в теле ответа. Если произойдет ошибка, вы получите код ответа 500 и текстовое описание ошибки в теле ответа. Запросы, отправляемые с помощью GET, доступны ‘только для чтения’. Это означает, что для запросов, изменяющих данные, можно использовать только метод POST. Сам запрос можно передать либо в теле POST, либо в параметре URL. Рассмотрим несколько примеров. В примере ниже для отправки запроса SELECT 1 используется curl. Обратите внимание на URL-кодирование пробела: %20.
command
Response
В этом примере wget используется с параметрами -nv (без подробного вывода) и -O- для вывода результата в терминал. В этом случае URL-кодирование пробела не требуется:
command
В этом примере мы отправляем необработанный HTTP-запрос через netcat:
command
response
Как видите, команда curl не очень удобна, поскольку пробелы в URL нужно экранировать. Хотя wget сам экранирует всё, мы не рекомендуем его использовать, потому что он плохо работает по HTTP 1.1 с keep-alive и Transfer-Encoding: chunked.
Если часть запроса передаётся в параметре, а часть — в теле POST-запроса, между этими двумя частями данных вставляется символ перевода строки. Например, это не сработает:
По умолчанию данные возвращаются в формате TabSeparated. Предложение FORMAT используется в запросе для указания любого другого формата. Например:
command
Response
Вы можете использовать URL-параметр default_format или заголовок X-ClickHouse-Format, чтобы задать формат по умолчанию вместо TabSeparated.
Вы можете использовать метод POST с параметризованными запросами. Параметры указываются в фигурных скобках с именем параметра и его типом, например {name:Type}. Значения параметров передаются через param_name:

INSERT-запросы через HTTP/HTTPS

Для INSERT-запросов необходим метод передачи данных POST. В этом случае начало запроса можно указать в параметре URL, а сами данные для вставки передать через POST. Данными для вставки может быть, например, дамп из MySQL с полями, разделёнными табуляцией. Таким образом, запрос INSERT заменяет команду LOAD DATA LOCAL INFILE из MySQL.

Примеры

Чтобы создать таблицу:
Чтобы использовать привычный запрос INSERT для вставки данных:
Чтобы отправить данные отдельно от запроса:
Можно указать любой формат данных. Например, можно указать формат ‘Values’ — тот же формат, который используется при выполнении INSERT INTO t VALUES:
Чтобы вставить данные из дампа, где значения разделены табуляцией, укажите соответствующий формат:
Чтобы посмотреть содержимое таблицы:
Данные выводятся в случайном порядке из-за параллельной обработки запроса
Чтобы удалить таблицу:
Для успешных запросов, которые не возвращают таблицу с данными, тело ответа будет пустым.

Сжатие

Сжатие можно использовать для уменьшения сетевого трафика при передаче больших объёмов данных или для создания дампов, которые сразу записываются в сжатом виде. При передаче данных можно использовать внутренний формат сжатия ClickHouse. Сжатые данные имеют нестандартный формат, и для работы с ними требуется программа clickhouse-compressor. Она по умолчанию устанавливается вместе с пакетом clickhouse-client. Чтобы повысить эффективность вставки данных, отключите проверку контрольных сумм на стороне сервера с помощью настройки http_native_compression_disable_checksumming_on_decompress. Если указать compress=1 в URL, сервер будет сжимать отправляемые вам данные. Если указать decompress=1 в URL, сервер будет распаковывать данные, которые вы передаёте методом POST. Вы также можете использовать HTTP-сжатие. ClickHouse поддерживает следующие методы сжатия:
  • gzip
  • br
  • deflate
  • xz
  • zstd
  • lz4
  • bz2
  • snappy
Чтобы отправить сжатый запрос POST, добавьте заголовок запроса Content-Encoding: compression_method. Чтобы ClickHouse сжимал ответ, добавьте в запрос заголовок Accept-Encoding: compression_method. Уровень сжатия данных для всех методов сжатия можно настроить с помощью параметра http_zlib_compression_level.
Некоторые HTTP-клиенты по умолчанию могут распаковывать данные, полученные от сервера (для gzip и deflate), поэтому вы можете получить уже распакованные данные, даже если правильно используете настройки сжатия.

Примеры

Чтобы отправить сжатые данные на сервер:
Чтобы получить с сервера архив со сжатыми данными:
Чтобы получить сжатые данные с сервера, используйте gunzip для распаковки данных:

База данных по умолчанию

Вы можете использовать параметр URL database или заголовок X-ClickHouse-Database, чтобы задать базу данных по умолчанию.
По умолчанию используется база данных, указанная в настройках сервера. Изначально это база данных default. При необходимости вы всегда можете явно указать базу данных, поставив точку перед именем таблицы.

Аутентификация

Имя пользователя и пароль можно указать одним из трёх способов:
  1. С помощью базовой HTTP-аутентификации.
Например:
  1. В URL-параметрах user и password
Мы не рекомендуем использовать этот способ, так как параметр может быть записан в журнале веб-прокси и кэшироваться в браузере
Например:
  1. Использование header ‘X-ClickHouse-User’ и ‘X-ClickHouse-Key’
Например:
Если имя пользователя не указано, используется имя default. Если пароль не указан, используется пустой пароль. Вы также можете использовать параметры URL, чтобы задать любые настройки для обработки отдельного запроса или целых профилей настроек. Например:
Дополнительную информацию см.:

Использование сеансов ClickHouse в HTTP-протоколе

Сеансы ClickHouse также можно использовать в HTTP-протоколе. Для этого добавьте к запросу GET-параметр session_id. В качестве идентификатора сеанса можно использовать любую строку. По умолчанию сеанс завершается после 60 секунд бездействия. Чтобы изменить этот тайм-аут (в секундах), измените настройку default_session_timeout в конфигурации сервера или добавьте к запросу GET-параметр session_timeout. Чтобы проверить состояние сеанса, используйте параметр session_check=1. В одном сеансе одновременно может выполняться только один запрос. Информацию о прогрессе выполнения запроса можно получить из заголовков ответа X-ClickHouse-Progress. Для этого включите send_progress_in_http_headers. Ниже приведен пример последовательности заголовков:
Возможны следующие поля заголовка:
Поле заголовкаОписание
read_rowsКоличество прочитанных строк.
read_bytesОбъём прочитанных данных в байтах.
total_rows_to_readОбщее количество строк для чтения.
written_rowsКоличество записанных строк.
written_bytesОбъём записанных данных в байтах.
elapsed_nsВремя выполнения запроса в наносекундах.
memory_usageОбъём памяти в байтах, использованный запросом. (Доступно с v25.11)
Выполняющиеся запросы не останавливаются автоматически при потере HTTP-соединения. Парсинг и форматирование данных выполняются на стороне сервера, поэтому передача по сети может быть неэффективной. Существуют следующие необязательные параметры:
ПараметрыОписание
query_id (optional)Можно передать как идентификатор запроса (любая строка). replace_running_query
quota_key (optional)Можно передать как ключ квоты (любая строка). “Квоты”
HTTP-интерфейс позволяет передавать внешние данные (внешние временные таблицы) для выполнения запросов. Подробнее см. в разделе “Внешние данные для обработки запросов”.

Буферизация ответа

Буферизацию ответа можно включить на стороне сервера. Для этого предусмотрены следующие URL-параметры:
  • buffer_size
  • wait_end_of_query
Также можно использовать следующие настройки: buffer_size определяет количество байтов результата, которое нужно буферизовать в памяти сервера. Если тело результата превышает этот порог, буфер записывается в HTTP-канал, а оставшиеся данные отправляются в HTTP-канал напрямую. Чтобы буферизовать ответ целиком, установите wait_end_of_query=1. В этом случае данные, которые не помещаются в памяти, будут буферизоваться во временном файле сервера. Например:
Используйте буферизацию, чтобы избежать ситуаций, когда ошибка при обработке запроса возникает уже после того, как клиенту были отправлены код ответа и HTTP-заголовки. В таком случае сообщение об ошибке записывается в конец тела ответа, и на стороне клиента её можно обнаружить только на этапе разбора.

Установка роли с помощью параметров запроса

Эта возможность была добавлена в ClickHouse 24.4. В некоторых случаях перед выполнением самого оператора может потребоваться сначала установить назначенную роль. Однако отправить SET ROLE и сам оператор вместе невозможно, так как мультиоператоры не поддерживаются:
Приведённая выше команда вызывает ошибку:
Чтобы обойти это ограничение, используйте параметр запроса role:
Это равносильно выполнению SET ROLE my_role перед оператором. Кроме того, можно указать несколько параметров запроса role:
В этом случае ?role=my_role&role=my_other_role эквивалентно выполнению SET ROLE my_role, my_other_role перед выполнением оператора.

Нюансы кодов HTTP-ответов

Из-за ограничений HTTP-протокола код ответа HTTP 200 не гарантирует, что запрос был выполнен успешно. Вот пример:
Причина такого поведения заключается в особенностях HTTP-протокола. Сначала отправляется HTTP-заголовок с HTTP-кодом 200, затем — HTTP-тело, а после этого ошибка вставляется в тело в виде обычного текста. Это поведение не зависит от используемого формата, будь то Native, TSV или JSON; сообщение об ошибке всегда будет находиться в середине потока ответа. Вы можете частично решить эту проблему, включив wait_end_of_query=1 (Буферизация ответа). В этом случае отправка HTTP-заголовка откладывается до тех пор, пока запрос не будет полностью обработан. Однако это не устраняет проблему полностью, поскольку результат по-прежнему должен помещаться в http_response_buffer_size, а другие настройки, такие как send_progress_in_http_headers, могут помешать задержке заголовка.
Единственный способ перехватить все ошибки — проанализировать HTTP-тело перед тем, как разбирать его в нужном формате.
Такие исключения в ClickHouse имеют единообразный формат, как показано ниже, независимо от того, какой формат используется (например, Native, TSV, JSON и т. д.), если http_write_exception_in_output_format=0 (по умолчанию). Это упрощает разбор и извлечение сообщений об ошибках на стороне клиента.
Где <TAG> — это случайный тег длиной 16 байт, то есть тот же тег, который отправляется в заголовке ответа X-ClickHouse-Exception-Tag. <error message> — это фактическое сообщение об исключении (точную длину можно найти в <message_length>). Весь описанный выше блок исключения может иметь размер до 16 КиБ. Вот пример в формате JSON
Вот аналогичный пример, но в формате CSV

Запросы с параметрами

Вы можете создать запрос с параметрами и передать их значения через соответствующие параметры HTTP-запроса. Подробнее см. в разделе Запросы с параметрами для CLI.

Пример

Табуляции в параметрах URL

Параметры запроса разбираются из формата “escaped”. У этого есть некоторые преимущества, например возможность однозначно разбирать значения NULL как \N. Это означает, что символ табуляции должен быть закодирован как \t (или как \ и символ табуляции). Например, ниже между abc и 123 стоит настоящий символ табуляции, а входная строка разбивается на два значения:
Однако, если вы попытаетесь закодировать настоящий символ табуляции как %09 в параметре URL, он не будет корректно разобран:
Если вы используете URL-параметры, потребуется закодировать \t как %5C%09. Например:

Предопределённый HTTP-интерфейс

ClickHouse поддерживает выполнение определённых запросов через HTTP-интерфейс. Например, записать данные в таблицу можно следующим образом:
ClickHouse также поддерживает предопределённый HTTP-интерфейс, который упрощает интеграцию со сторонними инструментами, такими как Prometheus exporter. Давайте рассмотрим пример. Прежде всего, добавьте этот раздел в файл конфигурации сервера. http_handlers настраивается так, чтобы содержать несколько rule. ClickHouse сопоставляет полученные HTTP-запросы с предопределённым типом в rule, и первое совпавшее rule запускает обработчик. Затем ClickHouse выполнит соответствующий предопределённый запрос, если сопоставление прошло успешно.
config.xml
Теперь вы можете напрямую запросить этот URL, чтобы получить данные в формате Prometheus:
Параметры конфигурации для http_handlers работают следующим образом. В rule можно настроить следующие параметры:
  • method
  • headers
  • url
  • full_url
  • handler
Каждый из них описан ниже:
  • method отвечает за сопоставление части HTTP-запроса, содержащей метод. method полностью соответствует определению [method] (https://developer.mozilla.org/en-US/docs/Web/HTTP/Methods) в HTTP-протоколе. Это необязательный параметр конфигурации. Если он не задан в конфигурационном файле, сопоставление по части HTTP-запроса, содержащей метод, не выполняется.
  • url отвечает за сопоставление части URL (пути и строки запроса) HTTP-запроса. Если url имеет префикс regex:, ожидается регулярное выражение в формате RE2. Это необязательный параметр конфигурации. Если он не задан в конфигурационном файле, сопоставление по части URL HTTP-запроса не выполняется.
  • full_url — то же, что и url, но включает полный URL, то есть schema://host:port/path?query_string. Обратите внимание: ClickHouse не поддерживает “virtual hosts”, поэтому host — это IP-адрес (а не значение заголовка Host).
  • empty_query_string — гарантирует, что в запросе отсутствует строка запроса (?query_string)
  • headers отвечают за сопоставление заголовков HTTP-запроса. Поддерживаются регулярные выражения RE2. Это необязательный параметр конфигурации. Если они не заданы в конфигурационном файле, сопоставление по заголовкам HTTP-запроса не выполняется.
  • handler содержит основную логику обработки. Он может иметь следующий type: И следующие параметры:
    • query — используется с типом predefined_query_handler, выполняет запрос при вызове обработчика.
    • query_param_name — используется с типом dynamic_query_handler, извлекает и выполняет значение, соответствующее значению query_param_name в параметрах HTTP-запроса.
    • status — используется с типом static, код состояния ответа.
    • content_type — используется с любым типом, content-type ответа.
    • http_response_headers — используется с любым типом, набор заголовков ответа. Также может использоваться для задания типа содержимого.
    • response_content — используется с типом static, содержимое ответа, отправляемое клиенту; при использовании префикса ‘file://’ или ‘config://’ содержимое берется из файла или конфигурации и отправляется клиенту.
    • user - пользователь, от имени которого выполняется запрос (пользователь по умолчанию — default). Примечание: для этого пользователя не нужно указывать пароль.
Далее рассматриваются способы настройки для разных type.

predefined_query_handler

predefined_query_handler поддерживает установку значений Settings и query_params. Вы можете настроить query для типа predefined_query_handler. Значение query — это предопределённый запрос для predefined_query_handler, который ClickHouse выполняет при совпадении с HTTP-запросом; в ответ возвращается результат этого запроса. Это обязательный параметр конфигурации. В следующем примере задаются значения настроек max_threads и max_final_threads, после чего выполняется запрос к системной таблице, чтобы проверить, были ли эти настройки успешно установлены.
Чтобы сохранить обработчики handlers по умолчанию, такие как query, play, ping, добавьте правило <defaults/>.
Например:

Виртуальный параметр _request_body

Помимо параметров URL, заголовков и параметров запроса, predefined_query_handler поддерживает специальный виртуальный параметр _request_body. Он содержит необработанное тело HTTP-запроса в виде строки. Это позволяет создавать гибкие REST API, способные принимать данные в произвольных форматах и обрабатывать их в запросах. Например, _request_body можно использовать для создания REST-конечной точки, которая принимает JSON-данные в POST-запросе и вставляет их в таблицу:
Затем вы можете отправлять данные на эту конечную точку:
В одном predefined_query_handler поддерживается только один запрос.

dynamic_query_handler

В dynamic_query_handler запрос передаётся в виде параметра HTTP-запроса. Отличие состоит в том, что в predefined_query_handler запрос записывается в файле конфигурации. В dynamic_query_handler можно настроить query_param_name. ClickHouse извлекает и выполняет значение, соответствующее query_param_name в URL HTTP-запроса. Значение query_param_name по умолчанию — /query. Это необязательный параметр конфигурации. Если в файле конфигурации он не определён, параметр не передаётся. Чтобы поэкспериментировать с этой функциональностью, в следующем примере задаются значения max_threads и max_final_threads, а с помощью queries проверяется, были ли эти настройки успешно установлены. Пример:

static

static может возвращать content_type, status и response_content. response_content позволяет возвращать указанное содержимое. Например, чтобы вернуть сообщение “Say Hi!”:
http_response_headers можно использовать, чтобы задать тип содержимого вместо content_type.
Найдите в конфигурации содержимое, отправляемое клиенту.
Чтобы получить содержимое файла, отправьте клиенту:

redirect

redirect выполняет перенаправление 302 на location Например, вот как можно автоматически добавить параметр set user в play для ClickHouse play:

HTTP-заголовки ответа

ClickHouse позволяет настраивать пользовательские HTTP-заголовки ответа, которые можно применять к любому настраиваемому типу обработчика. Эти заголовки можно задать с помощью настройки http_response_headers, которая принимает пары ключ-значение, содержащие имена заголовков и их значения. Эта возможность особенно полезна для настройки пользовательских заголовков безопасности, политик CORS и любых других требований к HTTP-заголовкам в HTTP-интерфейсе ClickHouse. Например, можно настроить заголовки для:
  • Обычных эндпоинтов запросов
  • Веб-интерфейса
  • Проверки работоспособности.
Также можно указать common_http_response_headers. Они будут применяться ко всем HTTP-обработчикам, определённым в конфигурации. Эти заголовки будут включаться в HTTP-ответ для каждого настроенного обработчика. В примере ниже каждый ответ сервера будет содержать два пользовательских заголовка: X-My-Common-Header и X-My-Custom-Header.

Корректный JSON/XML-ответ при исключении во время потоковой передачи по HTTP

Во время выполнения запроса по HTTP может возникнуть исключение, когда часть данных уже была отправлена. Обычно в таком случае исключение отправляется клиенту в виде обычного текста. Даже если для вывода данных использовался определённый формат, результат может стать недопустимым с точки зрения этого формата. Чтобы этого избежать, можно использовать настройку http_write_exception_in_output_format (по умолчанию отключена), которая укажет ClickHouse записывать исключение в указанном формате (в настоящее время поддерживаются форматы XML и JSON*). Примеры:
Последнее изменение 2 июля 2026 г.