Предварительные требования
- запущенный экземпляр сервера ClickHouse
- установленный
curl. В Ubuntu или Debian выполнитеsudo apt install curlили обратитесь к этой документации за инструкциями по установке.
Обзор
clickhouse-server прослушивает следующие порты:
- порт 8123 для HTTP
- можно включить порт 8443 для HTTPS
GET / без каких-либо параметров, будет возвращён код ответа 200 вместе со строкой “Ok.”:
http_server_default_response; при необходимости его можно изменить.
См. также: особенности кодов HTTP-ответов.
Веб-интерфейс
GET /ping. Этот обработчик всегда возвращает “Ok.” (с символом перевода строки в конце). Доступно начиная с версии 18.12.13. См. также /replicas_status, чтобы проверить задержку реплики.
Выполнение запросов по HTTP/HTTPS
- передать запрос в параметре URL ‘query’
- использовать метод POST.
- Передать начало запроса в параметре ‘query’, а остальную часть — через POST
По умолчанию размер URL ограничен 1 MiB, это можно изменить с помощью настройки
http_max_uri_size.SELECT 1 используется curl. Обратите внимание на URL-кодирование пробела: %20.
command
Response
wget используется с параметрами -nv (без подробного вывода) и -O- для вывода результата в терминал.
В этом случае URL-кодирование пробела не требуется:
command
command
response
curl не очень удобна, поскольку пробелы в URL нужно экранировать.
Хотя wget сам экранирует всё, мы не рекомендуем его использовать, потому что он плохо работает по HTTP 1.1 с keep-alive и Transfer-Encoding: chunked.
TabSeparated.
Предложение FORMAT используется в запросе для указания любого другого формата. Например:
command
Response
default_format или заголовок X-ClickHouse-Format, чтобы задать формат по умолчанию вместо TabSeparated.
{name:Type}. Значения параметров передаются через param_name:
INSERT-запросы через HTTP/HTTPS
INSERT-запросов необходим метод передачи данных POST. В этом случае начало запроса можно указать в параметре URL, а сами данные для вставки передать через POST. Данными для вставки может быть, например, дамп из MySQL с полями, разделёнными табуляцией. Таким образом, запрос INSERT заменяет команду LOAD DATA LOCAL INFILE из MySQL.
Примеры
INSERT для вставки данных:
INSERT INTO t VALUES:
Данные выводятся в случайном порядке из-за параллельной обработки запроса
Сжатие
clickhouse-compressor. Она по умолчанию устанавливается вместе с пакетом clickhouse-client.
Чтобы повысить эффективность вставки данных, отключите проверку контрольных сумм на стороне сервера с помощью настройки http_native_compression_disable_checksumming_on_decompress.
Если указать compress=1 в URL, сервер будет сжимать отправляемые вам данные. Если указать decompress=1 в URL, сервер будет распаковывать данные, которые вы передаёте методом POST.
Вы также можете использовать HTTP-сжатие. ClickHouse поддерживает следующие методы сжатия:
gzipbrdeflatexzzstdlz4bz2snappy
POST, добавьте заголовок запроса Content-Encoding: compression_method.
Чтобы ClickHouse сжимал ответ, добавьте в запрос заголовок Accept-Encoding: compression_method.
Уровень сжатия данных для всех методов сжатия можно настроить с помощью параметра http_zlib_compression_level.
Некоторые HTTP-клиенты по умолчанию могут распаковывать данные, полученные от сервера (для
gzip и deflate), поэтому вы можете получить уже распакованные данные, даже если правильно используете настройки сжатия.Примеры
База данных по умолчанию
database или заголовок X-ClickHouse-Database, чтобы задать базу данных по умолчанию.
default. При необходимости вы всегда можете явно указать базу данных, поставив точку перед именем таблицы.
Аутентификация
- С помощью базовой HTTP-аутентификации.
- В URL-параметрах
userиpassword
- Использование header ‘X-ClickHouse-User’ и ‘X-ClickHouse-Key’
default. Если пароль не указан, используется пустой пароль.
Вы также можете использовать параметры URL, чтобы задать любые настройки для обработки отдельного запроса или целых профилей настроек.
Например:
Использование сеансов 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) |
| Параметры | Описание |
|---|---|
query_id (optional) | Можно передать как идентификатор запроса (любая строка). replace_running_query |
quota_key (optional) | Можно передать как ключ квоты (любая строка). “Квоты” |
Буферизация ответа
buffer_sizewait_end_of_query
buffer_size определяет количество байтов результата, которое нужно буферизовать в памяти сервера. Если тело результата превышает этот порог, буфер записывается в HTTP-канал, а оставшиеся данные отправляются в HTTP-канал напрямую.
Чтобы буферизовать ответ целиком, установите wait_end_of_query=1. В этом случае данные, которые не помещаются в памяти, будут буферизоваться во временном файле сервера.
Например:
Установка роли с помощью параметров запроса
SET ROLE и сам оператор вместе невозможно, так как мультиоператоры не поддерживаются:
role:
SET ROLE my_role перед оператором.
Кроме того, можно указать несколько параметров запроса role:
?role=my_role&role=my_other_role эквивалентно выполнению SET ROLE my_role, my_other_role перед выполнением оператора.
Нюансы кодов HTTP-ответов
Native, TSV или JSON; сообщение об ошибке всегда будет находиться в середине потока ответа.
Вы можете частично решить эту проблему, включив wait_end_of_query=1 (Буферизация ответа). В этом случае отправка HTTP-заголовка откладывается до тех пор, пока запрос не будет полностью обработан. Однако это не устраняет проблему полностью, поскольку результат по-прежнему должен помещаться в http_response_buffer_size, а другие настройки, такие как send_progress_in_http_headers, могут помешать задержке заголовка.
Такие исключения в ClickHouse имеют единообразный формат, как показано ниже, независимо от того, какой формат используется (например, Native, TSV, JSON и т. д.), если http_write_exception_in_output_format=0 (по умолчанию). Это упрощает разбор и извлечение сообщений об ошибках на стороне клиента.
<TAG> — это случайный тег длиной 16 байт, то есть тот же тег, который отправляется в заголовке ответа X-ClickHouse-Exception-Tag.
<error message> — это фактическое сообщение об исключении (точную длину можно найти в <message_length>). Весь описанный выше блок исключения может иметь размер до 16 КиБ.
Вот пример в формате JSON
CSV
Запросы с параметрами
Пример
Табуляции в параметрах URL
\N. Это означает, что символ табуляции должен быть закодирован как \t (или как \ и символ табуляции). Например, ниже между abc и 123 стоит настоящий символ табуляции, а входная строка разбивается на два значения:
%09 в параметре URL, он не будет корректно разобран:
\t как %5C%09. Например:
Предопределённый HTTP-интерфейс
http_handlers настраивается так, чтобы содержать несколько rule. ClickHouse сопоставляет полученные HTTP-запросы с предопределённым типом в rule, и первое совпавшее rule запускает обработчик. Затем ClickHouse выполнит соответствующий предопределённый запрос, если сопоставление прошло успешно.
config.xml
http_handlers работают следующим образом.
В rule можно настроить следующие параметры:
methodheadersurlfull_urlhandler
-
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
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-заголовки ответа
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_write_exception_in_output_format (по умолчанию отключена), которая укажет ClickHouse записывать исключение в указанном формате (в настоящее время поддерживаются форматы XML и JSON*).
Примеры: