Requisitos previos
- tener una instancia de ClickHouse server en funcionamiento
- tener
curlinstalado. En Ubuntu o Debian, ejecutesudo apt install curlo consulte esta documentación para ver las instrucciones de instalación.
Descripción general
clickhouse-server escucha en los siguientes puertos:
- puerto 8123 para HTTP
- se puede habilitar el puerto 8443 para HTTPS
GET / sin ningún parámetro, se devuelve un código de respuesta 200 junto con la cadena “Ok.”:
http_server_default_response y puede modificarse si se desea.
Véase también: Consideraciones sobre los códigos de respuesta HTTP.
Interfaz de usuario web
GET /ping. Este controlador siempre devuelve “Ok.” (con un salto de línea al final). Disponible a partir de la versión 18.12.13. Véase también /replicas_status para comprobar el retraso de la réplica.
Consultas mediante HTTP/HTTPS
- enviar la solicitud como parámetro URL ‘query’
- usar el método POST.
- enviar el comienzo de la consulta en el parámetro ‘query’ y el resto mediante POST
El tamaño de la URL está limitado a 1 MiB de forma predeterminada; esto puede cambiarse con el ajuste
http_max_uri_size.SELECT 1. Tenga en cuenta el uso de la codificación URL para el espacio: %20.
command
Response
-nv (sin salida detallada) y -O- para mostrar el resultado en la terminal.
En este caso, no es necesario usar la codificación de URL para el espacio:
command
command
response
curl es algo incómodo, ya que los espacios deben codificarse en la URL.
Aunque wget codifica todo automáticamente, no recomendamos usarlo porque no funciona bien con HTTP 1.1 cuando se usan keep-alive y Transfer-Encoding: chunked.
TabSeparated.
La cláusula FORMAT se usa en la consulta para solicitar cualquier otro formato. Por ejemplo:
command
Response
default_format o la cabecera X-ClickHouse-Format para especificar un formato predeterminado distinto de TabSeparated.
{name:Type}. Los valores de los parámetros se envían mediante param_name:
Consultas INSERT a través de HTTP/HTTPS
POST para transmitir datos es necesario para las consultas INSERT. En este caso, puede escribir el comienzo de la consulta en el parámetro de la URL y usar POST para enviar los datos que se van a insertar. Los datos que se van a insertar podrían ser, por ejemplo, un dump de MySQL separado por tabulaciones. De esta manera, la consulta INSERT sustituye a LOAD DATA LOCAL INFILE de MySQL.
Ejemplos
INSERT habitual para insertar datos:
INSERT INTO t VALUES:
Los datos se muestran en un orden aleatorio debido al procesamiento paralelo de consultas
Compresión
clickhouse-compressor para trabajar con ellos. Se instala de forma predeterminada con el paquete clickhouse-client.
Para aumentar la eficiencia de la inserción de datos, desactive la verificación de checksum del lado del servidor mediante la opción http_native_compression_disable_checksumming_on_decompress.
Si especifica compress=1 en la URL, el servidor comprimirá los datos que le envía. Si especifica decompress=1 en la URL, el servidor descomprimirá los datos que envíe con el método POST.
También puede optar por usar compresión HTTP. ClickHouse admite los siguientes métodos de compresión:
gzipbrdeflatexzzstdlz4bz2snappy
POST comprimida, agregue la cabecera de solicitud Content-Encoding: compression_method.
Para que ClickHouse comprima la respuesta, agregue la cabecera Accept-Encoding: compression_method a la solicitud.
Puede configurar el nivel de compresión de los datos mediante la opción http_zlib_compression_level para todos los métodos de compresión.
Algunos clientes HTTP pueden descomprimir de forma predeterminada los datos del servidor (con
gzip y deflate), por lo que podría recibir datos descomprimidos incluso si usa correctamente las opciones de compresión.Ejemplos
Base de datos predeterminada
database de la URL o la cabecera X-ClickHouse-Database para especificar la base de datos predeterminada.
default. Como alternativa, siempre puede especificar la base de datos usando un punto antes del nombre de la tabla.
Autenticación
- Mediante autenticación básica HTTP.
- En los parámetros de URL
userypassword
- Uso de las cabeceras ‘X-ClickHouse-User’ y ‘X-ClickHouse-Key’
default. Si no se especifica la contraseña, se usa una contraseña vacía.
También puede usar los parámetros de URL para especificar cualquier configuración para procesar una sola consulta o perfiles completos de configuración.
Por ejemplo:
Uso de sesiones de ClickHouse en el protocolo HTTP
GET session_id a la petición. Puede usar cualquier cadena como ID de sesión.
De forma predeterminada, la sesión finaliza tras 60 segundos de inactividad. Para cambiar este timeout (en segundos), modifique la opción default_session_timeout en la configuración del servidor o añada el parámetro GET session_timeout a la petición.
Para comprobar el estado de la sesión, use el parámetro session_check=1. Solo se puede ejecutar una consulta a la vez dentro de una misma sesión.
Puede recibir información sobre el progreso de una consulta en las cabeceras de respuesta X-ClickHouse-Progress. Para ello, habilite send_progress_in_http_headers.
A continuación se muestra un ejemplo de la secuencia de cabeceras:
Las solicitudes en ejecución no se detienen automáticamente si se pierde la conexión HTTP. El análisis sintáctico y el formateo de datos se realizan en el lado del servidor, por lo que usar la red puede resultar ineficiente.
Existen los siguientes parámetros opcionales:
La interfaz HTTP permite pasar datos externos (tablas temporales externas) para realizar consultas. Para obtener más información, consulta “Datos externos para el procesamiento de consultas”.
Búfer de respuesta
buffer_sizewait_end_of_query
buffer_size determina cuántos bytes del resultado se almacenarán en el búfer de la memoria del servidor. Si el cuerpo del resultado supera este umbral, el búfer se escribe en el canal HTTP y los datos restantes se envían directamente al canal HTTP.
Para asegurarse de que toda la respuesta quede almacenada en el búfer, establezca wait_end_of_query=1. En este caso, los datos que no se almacenen en memoria se guardarán en un archivo temporal del servidor.
Por ejemplo:
Establecer un rol con parámetros de consulta
SET ROLE y la sentencia a la vez, ya que no se permiten múltiples sentencias:
role:
SET ROLE my_role antes de la sentencia.
Además, es posible especificar varios parámetros de consulta role:
?role=my_role&role=my_other_role funciona igual que ejecutar SET ROLE my_role, my_other_role antes de la sentencia.
Advertencias sobre los códigos de respuesta HTTP
Native, TSV o JSON; el mensaje de error siempre aparecerá en medio del flujo de respuesta.
Puede mitigar este problema habilitando wait_end_of_query=1 (Almacenamiento en búfer de respuesta). En este caso, el envío del encabezado HTTP se retrasa hasta que se resuelve la consulta completa. Sin embargo, esto no soluciona por completo el problema, porque el resultado debe seguir cabiendo dentro de http_response_buffer_size, y otras configuraciones, como send_progress_in_http_headers, pueden interferir con el retraso del encabezado.
Estas excepciones en ClickHouse tienen un formato de excepción uniforme, como se muestra a continuación, independientemente del formato utilizado (p. ej., Native, TSV, JSON, etc.) cuando http_write_exception_in_output_format=0 (valor predeterminado). Esto facilita el análisis y la extracción de mensajes de error en el lado del cliente.
<TAG> es una etiqueta aleatoria de 16 bytes, la misma etiqueta enviada en el encabezado de respuesta X-ClickHouse-Exception-Tag.
El <error message> es el mensaje real de la excepción (la longitud exacta puede encontrarse en <message_length>). Todo el bloque de excepción descrito anteriormente puede tener un tamaño de hasta 16 KiB.
A continuación se muestra un ejemplo en formato JSON
CSV
Consultas con parámetros
Ejemplo
Tabulaciones en los parámetros de URL
\N. Esto significa que el carácter de tabulación debe codificarse como \t (o \ y una tabulación). Por ejemplo, lo siguiente contiene una tabulación real entre abc y 123, y la cadena de entrada se divide en dos valores:
%09 en un parámetro de la URL, no se interpretará correctamente:
\t como %5C%09. Por ejemplo:
Interfaz HTTP predefinida
http_handlers se configura para contener varias rule. ClickHouse hará coincidir las solicitudes HTTP recibidas con el tipo predefinido en rule, y la primera regla que coincida ejecutará el handler. Después, ClickHouse ejecutará la consulta predefinida correspondiente si la coincidencia se realiza correctamente.
config.xml
http_handlers funcionan de la siguiente manera.
rule permite configurar los siguientes parámetros:
methodheadersurlfull_urlhandler
-
methodse utiliza para hacer coincidir la parte correspondiente al método de la solicitud HTTP.methodcumple por completo la definición de [method] (https://developer.mozilla.org/en-US/docs/Web/HTTP/Methods) del protocolo HTTP. Es una configuración opcional. Si no está definida en el archivo de configuración, no se compara la parte del método de la solicitud HTTP. -
urlse utiliza para hacer coincidir la parte de la URL (ruta y cadena de consulta) de la solicitud HTTP. Siurltiene el prefijoregex:, se esperan expresiones regulares de RE2. Es una configuración opcional. Si no está definida en el archivo de configuración, no se compara la parte de la URL de la solicitud HTTP. -
full_urles igual queurl, pero incluye la URL completa, es decir,schema://host:port/path?query_string. Ten en cuenta que ClickHouse no admite “virtual hosts”, por lo quehostes una dirección IP (y no el valor del encabezadoHost). -
empty_query_string- garantiza que no haya ninguna cadena de consulta (?query_string) en la solicitud -
headersse utilizan para hacer coincidir la parte de los encabezados de la solicitud HTTP. Es compatible con las expresiones regulares de RE2. Es una configuración opcional. Si no está definida en el archivo de configuración, no se compara la parte de los encabezados de la solicitud HTTP. -
handlercontiene la parte principal del procesamiento. Puede tener el siguientetype: Y los siguientes parámetros:query— úselo con el tipopredefined_query_handler; ejecuta la consulta cuando se llama al controlador.query_param_name— úselo con el tipodynamic_query_handler; extrae y ejecuta el valor correspondiente aquery_param_nameen los parámetros de la solicitud HTTP.status— úselo con el tipostatic; código de estado de la respuesta.content_type— úselo con cualquier tipo; content-type de la respuesta.http_response_headers— úselo con cualquier tipo; mapa de encabezados de la respuesta. También puede usarse para establecer el tipo de contenido.response_content— úselo con el tipostatic; contenido de la respuesta enviado al cliente; al usar el prefijo ‘file://’ o ‘config://’, obtiene el contenido del archivo o de la configuración y lo envía al cliente.user- usuario con el que se ejecutará la consulta (el usuario predeterminado esdefault). Nota: no es necesario especificar la contraseña de este usuario.
type.
predefined_query_handler
predefined_query_handler admite la configuración de los valores Settings y query_params. Puede configurar query para el tipo predefined_query_handler.
El valor de query es una consulta predefinida de predefined_query_handler que ClickHouse ejecuta cuando coincide una solicitud HTTP, y se devuelve el resultado de la consulta. Es una configuración obligatoria.
El siguiente ejemplo define los valores de las configuraciones max_threads y max_final_threads, y luego consulta la tabla del sistema para comprobar si estas configuraciones se han establecido correctamente.
Para conservar los
handlers predeterminados, como query, play y ping, agregue la regla <defaults/>.Parámetro virtual _request_body
predefined_query_handler admite un parámetro virtual especial, _request_body.
Contiene el cuerpo de la solicitud HTTP sin procesar como una cadena.
Esto permite crear API REST flexibles que pueden aceptar formatos de datos arbitrarios y procesarlos dentro de las consultas.
Por ejemplo, puede usar _request_body para implementar un endpoint REST que acepte datos JSON en una solicitud POST y los inserte en una tabla:
En un
predefined_query_handler solo se admite una consulta.dynamic_query_handler
dynamic_query_handler, la consulta se escribe como parámetro de la solicitud HTTP. La diferencia es que, en predefined_query_handler, la consulta se escribe en el archivo de configuración. query_param_name puede configurarse en dynamic_query_handler.
ClickHouse extrae y ejecuta el valor correspondiente a query_param_name en la URL de la solicitud HTTP. El valor predeterminado de query_param_name es /query . Es una configuración opcional. Si no hay ninguna definición en el archivo de configuración, el parámetro no se pasa.
Para probar esta funcionalidad, el siguiente ejemplo define los valores de max_threads y max_final_threads, y consulta si la configuración se aplicó correctamente.
Ejemplo:
static
static puede devolver content_type, código de estado y response_content. response_content puede devolver el contenido especificado.
Por ejemplo, para devolver un mensaje “Say Hi!”:
http_response_headers se puede usar para establecer el tipo de contenido en lugar de content_type.
redirect
redirect realizará una redirección 302 a location
Por ejemplo, así puedes añadir automáticamente set user a play en ClickHouse play:
Encabezados de respuesta HTTP
http_response_headers, que acepta pares clave-valor que representan los nombres de los encabezados y sus valores. Esta funcionalidad resulta especialmente útil para implementar encabezados de seguridad personalizados, políticas CORS o cualquier otro requisito relacionado con encabezados HTTP en toda la interfaz HTTP de ClickHouse.
Por ejemplo, puede configurar encabezados para:
- Endpoints de consulta normales
- Web UI
- Comprobación de estado.
common_http_response_headers. Estos se aplicarán a todos los handlers HTTP definidos en la configuración.
Los encabezados se incluirán en la respuesta HTTP de cada handler configurado.
En el ejemplo siguiente, cada respuesta del servidor contendrá dos encabezados personalizados: X-My-Common-Header y X-My-Custom-Header.
Respuesta JSON/XML válida en caso de excepción durante HTTP streaming
http_write_exception_in_output_format (desactivada de forma predeterminada), que indica a ClickHouse que escriba la excepción en el formato especificado (actualmente compatible con los formatos XML y JSON*).
Ejemplos: