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 pour spécifier un format par défaut autre que TabSeparated. L’en-tête X-ClickHouse-Format sélectionne explicitement le format de la réponse : il s’agit d’un alias du paramètre output_format, il surcharge donc également une clause FORMAT dans la requête. Il ne modifie jamais la façon dont le corps de la requête d’un INSERT est analysé — utilisez input_format ou format à cette fin.
{name:Type}. Les valeurs des paramètres sont transmises via param_name :
Accéder aux tables via des chemins d’URL et construire des requêtes
Activer le routage par chemin
- Activez le paramètre de configuration
http_allow_path_requestsau niveau du serveur, qui permet à l’interface HTTP d’acheminer les requêtes basées sur des chemins vers le gestionnaire de requêtes :
- Activez les paramètres requis par utilisateur :
Le routage s’effectue avant l’authentification et ne peut donc pas dépendre d’un paramètre par utilisateur. Lorsque
http_allow_path_requests est désactivé, un chemin inconnu renvoie une erreur 404 de pré-authentification. Après le routage et l’authentification, les paramètres par utilisateur déterminent la manière dont le chemin est interprété, ce qui permet d’activer cette fonctionnalité de façon sélective pour un utilisateur, un rôle ou un profil.Accéder aux tables sous forme de fichiers
http_allow_table_as_file est activé, une requête vers /table.format.compression est traitée comme SELECT * FROM table. Activez http_allow_database_as_path pour utiliser /database/table.format.compression.
hits.csv et hits.CSV sont équivalents.
Un paramètre d’URL format ou output_format explicite surcharge le format indiqué dans le chemin. Ce n’est pas le cas de default_format : il indique uniquement le format à utiliser lorsqu’aucun autre élément n’en sélectionne un, car l’extension du chemin est plus spécifique. Un paramètre compression explicite doit correspondre à la compression indiquée dans le chemin ; des valeurs incompatibles entraînent une exception.
Construire une requête
SETTINGS de la requête ou via un profil utilisateur.
Modifier une requête existante
?query=SELECT a, b FROM hits&filter=a > 0&sort=-b&limit=10 est exécutée comme suit :
predefined_query_handler ou un client qui permet uniquement d’ajouter des paramètres d’URL :
FORMAT et un ORDER BY au sein de la requête, et ne modifient jamais les lignes écrites par un INSERT : un paramètre de construction placé sur une instruction INSERT ... SELECT façonne le résultat propre à cette instruction (vide), et non celui de son SELECT source. Pour façonner la source, placez le paramètre dans la clause SETTINGS du SELECT :
Surcharge des formats et de la compression
Les paramètres de format fonctionnent également avec d’autres protocoles, notamment le client natif et
clickhouse-local. input_format et output_format correspondent aux options --input-format et --output-format. Dans clickhouse-local, l’option --format correspond au paramètre bidirectionnel format, tandis que dans clickhouse-client, elle conserve sa signification historique limitée à la sortie et correspond à output_format.
compression est spécifique à la mise en forme des réponses HTTP et est traité avant l’exécution de la requête. Indiquez-le à l’aide d’un paramètre d’URL HTTP, d’une extension de chemin ou d’un profil utilisateur. Il est rejeté dans une clause SETTINGS de la requête.
Les réponses HTTP binaires et compressées incluent un en-tête Content-Disposition: attachment; filename=…. Le nom de fichier est dérivé du chemin d’URL ou prend la forme result.<format>.<compression> lorsque le chemin n’en fournit pas.
Utiliser une table de chemin dans une requête
query, cette table est accessible via implicit_table_at_top_level. Un SELECT sans clause FROM lit la table identifiée par le chemin :
FROM, le composant de chemin sert uniquement à fournir le nom du fichier téléchargé.
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 :