Предварительные требования
- запущенный экземпляр сервера ClickHouse
- установленный
curl. В Ubuntu или Debian выполнитеsudo apt install curlили обратитесь к этой документации за инструкциями по установке.
Обзор
HTTP-интерфейс позволяет использовать ClickHouse на любой платформе из любого языка программирования в формате REST API. HTTP-интерфейс более ограничен, чем нативный интерфейс, но обеспечивает лучшую поддержку языков программирования. По умолчаниюclickhouse-server прослушивает следующие порты:
- порт 8123 для HTTP
- можно включить порт 8443 для HTTPS
GET / без каких-либо параметров, будет возвращён код ответа 200 вместе со строкой “Ok.”:
http_server_default_response; при необходимости его можно изменить.
См. также: нюанс кодов HTTP-ответов.
Веб-интерфейс
В ClickHouse есть веб-интерфейс, доступный по следующему адресу: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, чтобы задать формат по умолчанию вместо TabSeparated. Заголовок X-ClickHouse-Format явно задаёт формат ответа: это псевдоним настройки output_format, поэтому он также переопределяет предложение FORMAT в запросе. Он не изменяет способ разбора тела запроса INSERT — для этого используйте input_format или format. Чтобы вернуть поведение версий до 26.8, когда заголовок был псевдонимом default_format и не переопределял предложение FORMAT, отключите настройку http_x_clickhouse_format_overrides_output_format (в профиле пользователя или через URL-параметр; как и настройки формата, её можно изменять в режиме только для чтения).
{name:Type}. Значения параметров передаются через param_name:
Доступ к таблицам через URL-пути и формирование запросов
Доступно в ClickHouse 26.8 и более поздних версиях. HTTP-интерфейс может интерпретировать URL-путь как базу данных, таблицу, формат вывода и метод сжатия. Параметры URL позволяют сформировать результат, поэтому для простых запросов на чтение SQL не требуется. Эти возможности по умолчанию включены начиная с ClickHouse 26.10; в версиях 26.8 и 26.9 их необходимо было включать явно.Настройки маршрутизации по путям
Интерпретация путей настраивается на двух уровнях:- Параметр конфигурации сервера
http_allow_path_requestsпозволяет HTTP-интерфейсу направлять запросы с путями обработчику запросов. По умолчанию он включён; установите для него значение0, чтобы любой путь, для которого не настроен обработчик, снова возвращал ответ404:
- Приведённые ниже настройки для отдельных пользователей определяют, как интерпретируется маршрутизированный путь. Все они, кроме
http_allow_filters_as_unrecognized_url_parameters, включены по умолчанию, и каждую из них можно включить или отключить для пользователя, роли или профиля:
Маршрутизация выполняется до аутентификации, поэтому она не может зависеть от настройки для отдельного пользователя. Если
http_allow_path_requests отключена, неизвестный путь возвращает ответ 404 до аутентификации. После маршрутизации и аутентификации настройки отдельных пользователей определяют, как интерпретируется путь, позволяя выборочно включать или отключать эту возможность для пользователя, роли или профиля.Настройка
http_allow_filters_as_unrecognized_url_parameters по умолчанию отключена, поскольку она действует для всех запросов HTTP-интерфейса, включая конечную точку /?query=...: если её включить, любой нераспознанный параметр URL, добавленный клиентом, превращается в фильтр запроса. В этом случае для имени настройки с опечаткой уже не выдаётся ошибка UNKNOWN_SETTING — вместо неё запрос завершается ошибкой UNKNOWN_IDENTIFIER или же, если имя случайно совпадает со столбцом запрашиваемой таблицы, результат незаметно фильтруется.Доступ к таблицам как к файлам
Если параметрhttp_allow_table_as_file включен, запрос к /table.format.compression обрабатывается как SELECT * FROM table. Параметр http_allow_database_as_path также позволяет использовать /database/table.format.compression.
hits.csv и hits.CSV эквивалентны.
Явно указанный URL-параметр format или output_format переопределяет формат в пути. default_format этого не делает: он задаёт формат, используемый, только если формат не задан другим способом, а расширение пути имеет более высокий приоритет. Явно указанный параметр compression должен совпадать со сжатием в пути; при конфликте значений возникает исключение.
Формирование запроса
Следующие настройки оборачивают базовый запрос в производную таблицу. Их можно комбинировать друг с другом и с существующим запросом. Их можно передавать как URL-параметры HTTP-запроса, в предложенииSETTINGS внутри запроса или через профиль пользователя.
Изменение существующего запроса
Настройки формирования применимы не только к запросам по путям, но и к запросу, который вы составляете сами. Запрос становится производной таблицей, поэтому настройки применяются к его результату, а не объединяются с ним. Например,?query=SELECT a, b FROM hits&filter=a > 0&sort=-b&limit=10 выполняется следующим образом:
predefined_query_handler или клиенте, который позволяет лишь добавлять URL-параметры:
FORMAT и ORDER BY внутри запроса и никогда не изменяют строки, записываемые INSERT: настройка формирования в операторе INSERT ... SELECT задаёт форму собственного (пустого) результата оператора, а не исходного SELECT. Чтобы задать форму источника, укажите настройку в предложении SETTINGS самого оператора SELECT:
Переопределение форматов и сжатия
Настройки формата также работают с другими протоколами, включая нативный клиент и
clickhouse-local. input_format и output_format соответствуют параметрам --input-format и --output-format. В clickhouse-local параметр --format сопоставляется с двунаправленной настройкой format, а в clickhouse-client сохраняет историческое значение только для вывода и сопоставляется с output_format.
compression используется исключительно для формирования HTTP-ответов и обрабатывается до выполнения запроса. Укажите его с помощью URL-параметра HTTP-запроса, расширения пути или профиля пользователя. В предложении SETTINGS внутри запроса он не допускается.
Двоичные и сжатые HTTP-ответы содержат заголовок Content-Disposition: attachment; filename=…. Имя файла определяется URL-путём, а если путь его не задаёт, используется result.<format>.<compression>.
Использование таблицы из пути в запросе
Если путь указывает на таблицу и вы также задаёте параметрquery, таблица из пути становится доступной через implicit_table_at_top_level. SELECT без предложения FROM читает данные из таблицы, указанной в пути:
FROM, компонент пути задаёт только имя скачиваемого файла.
INSERT-запросы через HTTP/HTTPS
INSERT-запросов необходим метод передачи данных POST. В этом случае начало запроса можно указать в параметре URL, а сами данные для вставки передать через POST. Данными для вставки может быть, например, дамп из MySQL с полями, разделёнными табуляцией. Таким образом, запрос INSERT заменяет команду LOAD DATA LOCAL INFILE из MySQL.
Примеры
Чтобы создать таблицу:INSERT для вставки данных:
INSERT INTO t VALUES:
--data-binary с префиксом @:
Данные выводятся в случайном порядке из-за параллельной обработки запроса
Вставка данных в формате Protobuf
Данные в двоичных форматах, таких какProtobuf, отправляются так же, поскольку --data-binary передаёт байты без изменений.
Настройки, которые требуются формату, например format_schema, передаются в виде параметров URL наряду с query — как и любые другие настройки.
В примерах ниже используются эта таблица и файл схемы message.proto, расположенный в каталоге format_schema_path сервера:
format_schema имя файла схемы и тип сообщения:
format_schema_source значение string, а имя типа сообщения укажите в format_schema_message_name.
Параметр --url-query утилиты curl (версии 7.87 и выше) выполняет URL-кодирование каждого параметра, поэтому запрос и схему можно записать как есть:
Protobuf ожидает, что каждому сообщению предшествует его длина, закодированная как varint.
Для одиночного сообщения без такого префикса используйте ProtobufSingle, а для строк, передаваемых как вложенные сообщения одного сообщения Envelope, — ProtobufList.
Сжатие
Сжатие можно использовать для уменьшения сетевого трафика при передаче больших объёмов данных или для создания дампов, которые сразу сжимаются. При передаче данных можно использовать внутренний формат сжатия ClickHouse. Сжатые данные имеют нестандартный формат, и для работы с ними требуется программа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-протоколе
Сеансы ClickHouse также можно использовать в HTTP-протоколе. Для этого добавьте к запросуGET-параметр session_id. В качестве идентификатора сеанса можно использовать любую строку.
По умолчанию сеанс завершается после 60 секунд бездействия. Чтобы изменить этот тайм-аут (в секундах), измените настройку default_session_timeout в конфигурации сервера или добавьте к запросу GET-параметр session_timeout.
Чтобы проверить состояние сеанса, используйте параметр session_check=1. В одном сеансе одновременно может выполняться только один запрос.
Информацию о прогрессе выполнения запроса можно получить из заголовков ответа X-ClickHouse-Progress. Для этого включите send_progress_in_http_headers.
Ниже приведен пример последовательности заголовков:
Выполняющиеся запросы не останавливаются автоматически при потере HTTP-соединения. Парсинг и форматирование данных выполняются на стороне сервера, поэтому передача по сети может быть неэффективной.
Существуют следующие необязательные параметры:
HTTP-интерфейс позволяет передавать внешние данные (внешние временные таблицы) для выполнения запросов. Подробнее см. в разделе “Внешние данные для обработки запросов”.
Буферизация ответа
Буферизацию ответа можно включить на стороне сервера. Для этого предусмотрены следующие URL-параметры: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-ответов
Из-за ограничений HTTP-протокола код ответа HTTP 200 не гарантирует, что запрос был выполнен успешно. Вот пример: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, после чего выполняется запрос к системной таблице, чтобы проверить, были ли эти настройки успешно установлены.
Чтобы сохранить обработчики по умолчанию, такие как
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 может возникнуть исключение, когда часть данных уже была отправлена. Обычно в таком случае исключение отправляется клиенту в виде обычного текста. Даже если для вывода данных использовался определённый формат, результат может стать недопустимым с точки зрения этого формата. Чтобы этого избежать, можно использовать настройкуhttp_write_exception_in_output_format (по умолчанию отключена), которая укажет ClickHouse записывать исключение в указанном формате (в настоящее время поддерживаются форматы XML и JSON*).
Примеры: