VT2020-QuestDB-Fiche
QuestDB est la base de données Open Source axée sur les séries temporelles la plus rapide.
Résumé
QuestDB est une extension du ANSI SQL classique. Il permet d'utiliser de nouvelles options lors des requêtes pour manipuler les données temporelles. La manière d'effectuer les lectures et écritures dans les tables de données à totalement était repensée et optimisée, afin d'avoir des temps d’exécution très court. L'outil dispose d'une console web intégrée, mais est également accessible à travers des requêtes REST, Postgre, et InfluxDB. Ses différentes fonctionnalités en font un outil parfait pour les entreprises qui utilisent des données temporelles précises.
Concepts
Modèle de stockage
QuestDB utilise un modèle de stockage basé sur les colonnes. Chaque colonne d'une table est stockée dans un fichier séparé. Chaque nouvelle entrée dans une table est ajoutée à la fin de chaque fichier colonne ("append"), de manière a pouvoir récupérer des données dans le même ordre qu'elles ont été ajoutées.
Écriture
Les écritures dans une tables sont effectuées à la fin de chaque fichier table une par une. La fin d'un fichier colonne est mappée dans une page mémoire de la RAM, l'ajout est donc essentiellement une écriture en mémoire. Une fois que la page mémoire est remplie, elle est dé-mappé et une nouvelle page est construite. Les données sont donc écrites dans le disque dur au moment du dé-mappage.
Cette méthode d'écriture a été conçue pour assurer un temps consistent en écriture, et une consommation de ressources minimale.
Lecture
Si les données de la colonne ont une taille fixe (comme un int par exemple), alors la donnée en lecture est accessible grâce à un shift de bits, qui donne un offset dans le fichier. Cet offset est ensuite transformé en un offset dans la page mémoire correspondante, d'où on récupère la valeur.
Atomicité
QuestDB assure que les tables sont consistantes avec l'utilisation de l'atomicité pour les mise à jour. Chaque écriture, une fois effectuée, produit un commit qui valide l'insertion. Si il y a un problème, il n'y a pas de commit et donc l'opération est rollback. Les métadonnées sont stockées dans un fichier séparé. Il sert notamment à empêcher la lecture de données non commité.
Symboles
Nouveau type de donnée introduit par QuestDB. Il permet de stocker les strings qui apparaissent souvent dans une table qui contient ces strings ainsi qu'une valeur int associée.
Propriétés :
- Les tables de symboles sont stockées dans des fichiers différents des fichier colonne.
- Conversion automatique de string vers int et inversement lors de lecture ou écriture.
- Les symboles supportent les indexes.
Avantages :
- Réduits la complexité des schémas de tables en enlevant le besoin de déclarer de nouvelles tables et de faire des JOIN.
- Transparent pour l'utilisateur.
- Performance de requête grandement améliorée. (comparer et écrire des int au lieu de string)
- Performance de stockage grandement améliorée. (stocker des int au lieu de string)
"designated timestamp"
L'attribut "designated timestamp" permet de spécifier une colonne dans une table qui aura des fonctionnalités supplémentaire. Effectuer des requêtes sur une colonne qui possède l'attribut réduit grandement le temps d’exécution.
Propriétés
- Une seule colonne peut être désignée "designated timestamp" par table.
- Seule une colonne "timestamp" peut être désignée.
- L'attribut se fixe uniquement lors de la création d'un table ou d'une sous-table.
- Une fois qu'une colonne possède l'attribut, il n'est plus possible d'insérer des données plus ancienne que la dernière ajoutée.
Avantages
En plus du temps réduit de requête, "designated timestamp" offre d'autres avantages :
- Créer des partitions de tables.
- Utiliser des JOIN sur le temps, comme "ASOF JOIN".
Index
Un index stocke les numéros des lignes associés à une valeur, afin de permettre un accès en lecture plus rapide. Il permet de ne plus scanner toute la table lors d'une requête qui contient la clause WHERE, ou un JOIN. Un INSERT mets à jour à la fois la table et l'index.
Avantages
- Le temps des requêtes avec une conditions sur les données est grandement réduit.
Inconvénients
- Temps supplémentaire lors de l'écriture dans une table.
- Prend plus de place en mémoire, car il faut stocker la table d'index.
Partitions
QuestDB permet de partitionner les données en fonction du temps. Chaque partition est stockée dans un fichier différent.
Propriétés
- Les partitions peuvent être crée par intervalle de jours, mois, ou année. (DAY, MONTH, YEAR)
- Par défaut, un table n'est pas partitionnée. (NONE)
- Une partition est définie lors de la création d'une table.
- Une partition n'est possible que sur une table possédant une "designated timestamp"
Avantages
- Réduit les entrées/sorties du disque pour les recherches d'intervalle de timestamp.
- Améliore significativement les temps de recherche et calcul.
- Fichiers séparés physiquement.
Extensions SQL
Nouvelles clauses
LATEST BY permet de simplifier les opérations UPDATE et DELETE, dans l’environnement de QuestDB qui ne permet que les ajouts en fin de fichier.
SAMPLE BY permet de faire des échantillons de données, par exemple prendre une valeur par mois/heure.
QuestDB simplifie également la syntaxe pour faire recherche sur les timestamp.
Simplifications
Plusieurs clauses obligatoire dans la syntaxe de ANSI SQL deviennent optionnelles en QuestDB. Dans un premier temps, SELECT * FROM peut simplement être enlevé. Une requête qui récupère tous les élément d'une table est possible rien qu'en utilisant le nom de la table. La même chose est possible avec la clause GROUP BY, qui est faite automatiquement lorsque l'on utilise une opération d’agrégations telle que sum().
Utilisation
Installation
Il y a plusieurs manières d'obtenir QuestDB. Vous devez dans un premier temps vous rendre sur la page de téléchargement, et sélectionner la méthode qui vous convient. J'ai choisi d'installer ma version avec le binaire Linux. Si vous avez choisi une autre version, veuillez suivre le lien Docs correspondante en haut à droite de la méthode que vous avez choisi.
Pour le binaire Linux, le site vous fourni une archive tar.gz. Téléchargez là, et placez l'archive dans le dossier de votre choix, de préférence vide. Déplacez vous dans le dossier où se trouve l'archive, et lancez la commande :
tar -xvf questdb-5.0.5-rt-linux-amd64.tar.gz
(le nom de l'archive peut être amené a changer en fonction de la version)
Vous pouvez maintenant supprimer l'archive. Dans le dossier qui est apparu se trouve votre nouvelle base de données QuestDB.
Exécution
Maintenant que vous êtes en possession du dossier QuestDB, déplacez vous dans le dossier bin/. Pour lancer la base de données, lancez la commande suivante :
./questdb.sh start
A partir de maintenant, la base de données est démarrée à l'adresse http://localhost:9000 . Vous pouvez y accéder depuis votre navigateur pour accéder à l'interface web ou le client Grafana, ou bien utiliser les API (REST, Postgres, InfluxDB).
Pour arrêter la base de données, lancez la commande :
./questdb.sh stop
Les données sont sauvegardé par défaut dans votre dossier $home/.questdb
, donc elles ne disparaissent pas si on arrête la base.
Pour intéragir avec la base de données, veuillez suivre la démonstration à cette page.
Références
Veille Technologique 2020
- Année : VT2020
- Sujet : QuestDB
- Présentation
- Démonstration
- Auteur : Tom Graugnard