Prérequis
- disposer d’une instance du serveur ClickHouse en cours d’exécution
- avoir
curlinstallé. Sur Ubuntu ou Debian, exécutezsudo apt install curlou consultez cette documentation pour les instructions d’installation.
Vue d’ensemble
clickhouse-server écoute sur les ports suivants :
- le port 8123 pour HTTP
- le port 8443 pour HTTPS, si celui-ci est activé
GET / sans aucun paramètre, un code de réponse 200 est renvoyé avec la chaîne “Ok.” :
http_server_default_response et peut être modifiée si nécessaire.
Voir aussi : Mises en garde concernant les codes de réponse HTTP.
Interface utilisateur web
GET /ping. Ce handler renvoie toujours “Ok.” (avec un saut de ligne à la fin). Disponible à partir de la version 18.12.13. Voir aussi /replicas_status pour vérifier le retard de la réplique.
Exécuter des requêtes via HTTP/HTTPS
- envoyer la requête en tant que paramètre d’URL ‘query’
- utiliser la méthode POST.
- envoyer le début de la requête dans le paramètre ‘query’, et le reste via POST
La taille de l’URL est limitée à 1 MiB par défaut ; cela peut être modifié avec le paramètre
http_max_uri_size.SELECT 1. Notez l’utilisation de l’encodage URL pour l’espace : %20.
command
Response
-nv (non-verbose) et -O- pour afficher le résultat dans le terminal.
Dans ce cas, il n’est pas nécessaire d’utiliser l’encodage URL pour l’espace :
command
command
response
curl est assez peu pratique, car les espaces doivent être encodés dans l’URL.
Bien que wget encode tout de lui-même, nous ne recommandons pas de l’utiliser, car il ne fonctionne pas bien avec HTTP 1.1 lors de l’utilisation de keep-alive et de Transfer-Encoding: chunked.
TabSeparated.
La clause FORMAT est utilisée dans la requête pour spécifier un autre format. Par exemple :
command
Response
default_format ou l’en-tête X-ClickHouse-Format pour spécifier un format par défaut autre que TabSeparated.
{name:Type}. Les valeurs des paramètres sont transmises via param_name :
Requêtes INSERT via HTTP/HTTPS
POST est nécessaire pour transmettre des données dans les requêtes INSERT. Dans ce cas, vous pouvez écrire le début de la requête dans le paramètre d’URL et utiliser POST pour transmettre les données à insérer. Les données à insérer peuvent être, par exemple, un dump MySQL séparé par des tabulations. Ainsi, la requête INSERT remplace LOAD DATA LOCAL INFILE de MySQL.
Exemples
INSERT habituelle pour insérer des données :
INSERT INTO t VALUES :
Les données sont renvoyées dans un ordre aléatoire en raison du traitement parallèle des requêtes
Compression
clickhouse-compressor pour les manipuler. Il est installé par défaut avec le paquet clickhouse-client.
Pour améliorer l’efficacité de l’insertion de données, désactivez la vérification de la somme de contrôle côté serveur à l’aide du paramètre http_native_compression_disable_checksumming_on_decompress.
Si vous spécifiez compress=1 dans l’URL, le serveur compressera les données qu’il vous envoie. Si vous spécifiez decompress=1 dans l’URL, le serveur décompressera les données que vous envoyez dans la méthode POST.
Vous pouvez également choisir d’utiliser la compression HTTP. ClickHouse prend en charge les méthodes de compression suivantes :
gzipbrdeflatexzzstdlz4bz2snappy
POST compressée, ajoutez l’en-tête de requête Content-Encoding: compression_method.
Pour que ClickHouse compresse la réponse, ajoutez l’en-tête Accept-Encoding: compression_method à la requête.
Vous pouvez configurer le niveau de compression des données à l’aide du paramètre http_zlib_compression_level pour toutes les méthodes de compression.
Certains clients HTTP peuvent décompresser par défaut les données provenant du serveur (avec
gzip et deflate), et vous pouvez recevoir des données décompressées même si vous utilisez correctement les paramètres de compression.Exemples
Base de données par défaut
database ou l’en-tête X-ClickHouse-Database pour indiquer la base de données par défaut.
default. Vous pouvez également toujours préciser la base de données en la faisant précéder d’un point avant le nom de la table.
Authentification
- En utilisant l’authentification HTTP Basic.
- Dans les paramètres d’URL
useretpassword
- Utilisation des en-têtes ‘X-ClickHouse-User’ et ‘X-ClickHouse-Key’
default est utilisé. Si le mot de passe n’est pas spécifié, un mot de passe vide est utilisé.
Vous pouvez également utiliser les paramètres d’URL pour définir des réglages pour le traitement d’une seule requête ou de profils complets de réglages.
Par exemple :
Utilisation des sessions ClickHouse avec le protocole HTTP
GET session_id à la requête. Vous pouvez utiliser n’importe quelle chaîne comme identifiant de session.
Par défaut, la session prend fin après 60 secondes d’inactivité. Pour modifier ce délai d’expiration (en secondes), modifiez le paramètre default_session_timeout dans la configuration du serveur, ou ajoutez le paramètre GET session_timeout à la requête.
Pour vérifier l’état de la session, utilisez le paramètre session_check=1. Une seule requête à la fois peut être exécutée dans une même session.
Vous pouvez recevoir des informations sur la progression d’une requête dans les en-têtes de réponse X-ClickHouse-Progress. Pour ce faire, activez send_progress_in_http_headers.
Vous trouverez ci-dessous un exemple de séquence d’en-têtes :
Les requêtes en cours d’exécution ne s’arrêtent pas automatiquement si la connexion HTTP est perdue. L’analyse syntaxique et le formatage des données sont effectués côté serveur, et le recours au réseau peut s’avérer peu efficace.
Les paramètres facultatifs suivants existent :
L’interface HTTP permet de transmettre des données externes (tables temporaires externes) pour l’exécution de requêtes. Pour plus d’informations, consultez “External data for query processing”.
Mise en tampon des réponses
buffer_sizewait_end_of_query
buffer_size détermine le nombre d’octets du résultat à mettre en tampon dans la mémoire du serveur. Si le corps d’un résultat dépasse ce seuil, le tampon est écrit dans le canal HTTP et les données restantes sont envoyées directement à ce canal.
Pour garantir que l’intégralité de la réponse soit mise en tampon, définissez wait_end_of_query=1. Dans ce cas, les données qui ne sont pas stockées en mémoire seront mises en tampon dans un fichier temporaire sur le serveur.
Par exemple :
Définir un rôle avec des paramètres de requête
SET ROLE et l’instruction en une seule fois, car les requêtes multi-instructions ne sont pas autorisées :
role :
SET ROLE my_role avant l’instruction.
De plus, il est possible de spécifier plusieurs paramètres de requête role :
?role=my_role&role=my_other_role fonctionne comme si SET ROLE my_role, my_other_role était exécuté avant l’instruction.
Mises en garde concernant les codes de réponse HTTP
Native, TSV ou JSON ; le message d’erreur se trouvera toujours au milieu du flux de réponse.
Vous pouvez atténuer ce problème en activant wait_end_of_query=1 (mise en tampon des réponses). Dans ce cas, l’envoi de l’en-tête HTTP est différé jusqu’à ce que la requête soit entièrement traitée. Cependant, cela ne résout pas complètement le problème, car le résultat doit toujours tenir dans http_response_buffer_size, et d’autres paramètres comme send_progress_in_http_headers peuvent empêcher ce délai d’être appliqué à l’en-tête.
Dans ClickHouse, ces exceptions ont un format cohérent, comme ci-dessous, quel que soit le format utilisé (par ex. Native, TSV, JSON, etc.) lorsque http_write_exception_in_output_format=0 (par défaut). Cela facilite l’analyse et l’extraction des messages d’erreur côté client.
<TAG> est un tag aléatoire de 16 octets, identique à celui envoyé dans l’en-tête de réponse X-ClickHouse-Exception-Tag.
Le <error message> correspond au message d’exception proprement dit (sa longueur exacte figure dans <message_length>). L’ensemble du bloc d’exception décrit ci-dessus peut atteindre 16 Kio.
Voici un exemple au format JSON
CSV
Requêtes avec paramètres
Exemple
Tabulations dans les paramètres d’URL
\N. Cela signifie que le caractère de tabulation doit être encodé sous la forme \t (ou \ suivi d’une tabulation). Par exemple, ce qui suit contient une véritable tabulation entre abc et 123, et la chaîne d’entrée est divisée en deux valeurs :
%09 dans un paramètre d’URL, il ne sera pas correctement interprété :
\t sous la forme %5C%09. Par exemple :
Interface HTTP prédéfinie
http_handlers est configuré pour contenir plusieurs rule. ClickHouse fera correspondre les requêtes HTTP reçues au type prédéfini dans rule, et la première règle qui correspond exécutera le gestionnaire. Ensuite, ClickHouse exécutera la requête prédéfinie correspondante si la correspondance aboutit.
config.xml
http_handlers sont les suivantes.
rule permet de configurer les paramètres suivants :
methodheadersurlfull_urlhandler
-
methodsert à faire correspondre la partie méthode de la requête HTTP.methodest entièrement conforme à la définition de [method] (https://developer.mozilla.org/en-US/docs/Web/HTTP/Methods) dans le protocole HTTP. Il s’agit d’une configuration facultative. S’il n’est pas défini dans le fichier de configuration, aucune correspondance n’est effectuée sur la partie méthode de la requête HTTP. -
urlsert à faire correspondre la partie URL (chemin et chaîne de requête) de la requête HTTP. Siurlest préfixé parregex:, il attend des expressions régulières RE2. Il s’agit d’une configuration facultative. S’il n’est pas défini dans le fichier de configuration, aucune correspondance n’est effectuée sur la partie URL de la requête HTTP. -
full_urlest identique àurl, mais inclut l’URL complète, c.-à-d.schema://host:port/path?query_string. Remarque : ClickHouse ne prend pas en charge les « hôtes virtuels », donchostest une adresse IP (et non la valeur de l’en-têteHost). -
empty_query_string- garantit l’absence de chaîne de requête (?query_string) dans la requête -
headersservent à faire correspondre la partie en-têtes de la requête HTTP. Ils sont compatibles avec les expressions régulières RE2. Il s’agit d’une configuration facultative. S’ils ne sont pas définis dans le fichier de configuration, aucune correspondance n’est effectuée sur la partie en-têtes de la requête HTTP. -
handlercontient la partie principale du traitement. Il peut avoir letypesuivant : Et les paramètres suivants :query— à utiliser avec le typepredefined_query_handler, exécute la query lorsque le gestionnaire est appelé.query_param_name— à utiliser avec le typedynamic_query_handler, extrait et exécute la valeur correspondant àquery_param_namedans les paramètres de requête HTTP.status— à utiliser avec le typestatic, code d’état de la réponse.content_type— à utiliser avec n’importe quel type, content-type de la réponse.http_response_headers— à utiliser avec n’importe quel type, map des en-têtes de la réponse. Peut également être utilisé pour définir le type de contenu.response_content— à utiliser avec le typestatic, contenu de la réponse envoyé au client ; lors de l’utilisation du préfixe ‘file://’ ou ‘config://’, le contenu est lu depuis le fichier ou la configuration, puis envoyé au client.user- utilisateur avec lequel exécuter la query (l’utilisateur par défaut estdefault). Remarque, vous n’avez pas besoin de spécifier de password pour cet utilisateur.
type sont décrites ci-dessous.
predefined_query_handler
predefined_query_handler prend en charge la définition des valeurs Settings et query_params. Vous pouvez configurer query pour le type predefined_query_handler.
La valeur query est une requête prédéfinie de predefined_query_handler, exécutée par ClickHouse lorsqu’une requête HTTP correspond, puis le résultat de la requête est renvoyé. Cette configuration est obligatoire.
L’exemple suivant définit les valeurs des paramètres max_threads et max_final_threads, puis interroge la table système pour vérifier si ces paramètres ont bien été définis.
Pour conserver les
handlers par défaut tels que query, play, ping, ajoutez la règle <defaults/>.Paramètre virtuel _request_body
predefined_query_handler prend en charge un paramètre virtuel spécial, _request_body.
Il contient le corps brut de la requête HTTP sous forme de chaîne de caractères.
Cela vous permet de créer des API REST flexibles, capables d’accepter des formats de données arbitraires et de les traiter dans vos requêtes.
Par exemple, vous pouvez utiliser _request_body pour implémenter un point de terminaison REST qui accepte des données JSON dans une requête POST et les insère dans une table :
Dans un
predefined_query_handler, une seule query est acceptée.dynamic_query_handler
dynamic_query_handler, la requête est écrite comme paramètre de la requête HTTP. La différence est que, dans predefined_query_handler, la requête est écrite dans le fichier de configuration. query_param_name peut être configuré dans dynamic_query_handler.
ClickHouse extrait et exécute la valeur associée à query_param_name dans l’URL de la requête HTTP. La valeur par défaut de query_param_name est /query . Cette configuration est facultative. Si rien n’est défini dans le fichier de configuration, le paramètre n’est pas transmis.
Pour tester cette fonctionnalité, l’exemple suivant définit les valeurs de max_threads et max_final_threads, puis vérifie par une requête si les paramètres ont bien été définis.
Exemple :
static
static peut renvoyer content_type, status et response_content. response_content peut renvoyer le contenu indiqué.
Par exemple, pour renvoyer le message “Bonjour !” :
http_response_headers peut être utilisé pour définir le type de contenu à la place de content_type.
redirect
redirect effectue une redirection 302 vers location
Par exemple, voici comment ajouter automatiquement set user à play dans ClickHouse play :
En-têtes de réponse HTTP
http_response_headers, qui accepte des paires clé-valeur représentant les noms des en-têtes et leurs valeurs. Cette fonctionnalité est particulièrement utile pour mettre en place des en-têtes de sécurité personnalisés, des politiques CORS ou toute autre exigence relative aux en-têtes HTTP sur votre interface HTTP ClickHouse.
Par exemple, vous pouvez configurer des en-têtes pour :
- Points de terminaison de requête standard
- Web UI
- Vérification d’état.
common_http_response_headers. Ceux-ci seront appliqués à tous les gestionnaires HTTP définis dans la configuration.
Les en-têtes seront inclus dans la réponse HTTP de chaque gestionnaire configuré.
Dans l’exemple ci-dessous, chaque réponse du serveur contiendra deux en-têtes personnalisés : X-My-Common-Header et X-My-Custom-Header.
Réponse JSON/XML valide en cas d’exception lors du streaming HTTP
http_write_exception_in_output_format (désactivé par défaut), qui indique à ClickHouse d’écrire l’exception dans le format spécifié (actuellement pris en charge pour les formats XML et JSON*).
Exemples :