
Si vous utilisez une base de donnĂ©es de sĂ©ries temporelles (timeseries db, ) comme principal stockage pour un site de statistiques, vous risqueriez de vous retrouver avec beaucoup de maux de tĂȘte au lieu de rĂ©soudre vos problĂšmes. Je travaille sur un projet utilisant une telle base, et parfois InfluxDB, dont nous allons parler, a prĂ©sentĂ© des surprises inattendues.
Avertissement: les problÚmes mentionnés concernent la version InfluxDB 1.7.4.
Pourquoi les séries temporelles ?
Le projet consiste Ă suivre les transactions dans diverses blockchains et Ă afficher des statistiques. Plus prĂ©cisĂ©ment, nous examinons l'Ă©mission et la destruction de stablecoins (). Ă partir de ces transactions, des graphiques doivent ĂȘtre construits et des tableaux rĂ©capitulatifs doivent ĂȘtre prĂ©sentĂ©s.
En analysant les transactions, l'idée est venue : utiliser InfluxDB comme principal stockage de données de séries temporelles. Les transactions sont des points dans le temps et elles s'adaptent bien au modÚle de séries temporelles.
De plus, les fonctions d'agrĂ©gation semblaient trĂšs pratiques - elles conviennent parfaitement au traitement de graphiques sur de longues pĂ©riodes. L'utilisateur a besoin d'un graphique annuel, alors que la base contient des donnĂ©es avec un intervalle de cinq minutes. Envoyer les cent mille points serait absurde - en plus d'un long traitement, ils ne tiendraient mĂȘme pas Ă l'Ă©cran. Vous pouvez Ă©crire votre propre implĂ©mentation pour augmenter l'intervalle de temps, ou utiliser les fonctions d'agrĂ©gation intĂ©grĂ©es d'Influx. GrĂące Ă elles, vous pouvez regrouper les donnĂ©es par jours et envoyer les 365 points nĂ©cessaires.
Ce qui me troublait un peu, c'est que ces bases sont gĂ©nĂ©ralement utilisĂ©es pour collecter des mĂ©triques. Surveillance des serveurs, appareils IoT, toutes ces sources qui « envoient » des millions de points tels que : [<temps> â <valeur de la mĂ©trique>]. Mais si la base fonctionne bien avec un grand flux de donnĂ©es, pourquoi un petit volume devrait-il poser des problĂšmes ? Avec cette rĂ©flexion, nous avons dĂ©cidĂ© d'utiliser InfluxDB.
Quoi d'autre de pratique dans InfluxDB
En plus des fonctions d'agrĂ©gation mentionnĂ©es, il y a une autre chose remarquable - les requĂȘtes continues (). C'est un planificateur intĂ©grĂ© Ă la base de donnĂ©es qui peut traiter des donnĂ©es selon un calendrier. Par exemple, vous pouvez regrouper toutes les entrĂ©es d'une journĂ©e toutes les 24 heures, calculer la moyenne et enregistrer un nouveau point dans une autre table sans avoir Ă Ă©crire vos propres solutions.
Il y a aussi politiques de rĂ©tention () â configuration de la suppression des donnĂ©es aprĂšs une certaine pĂ©riode. Utile lorsqu'il est nĂ©cessaire de conserver la charge CPU sur une semaine avec des mesures prises chaque seconde, mais qu'une telle prĂ©cision n'est pas nĂ©cessaire sur plusieurs mois. Dans cette situation, il est possible de procĂ©der ainsi :
- crĂ©er une requĂȘte continue pour agrĂ©ger les donnĂ©es dans une autre table ;
- pour la premiÚre table, définir une politique de suppression des métriques qui sont plus anciennes que cette semaine.
Et Influx s'occupera de réduire la taille des données et de supprimer ce qui est superflu.
Concernant les données stockées
Il n'y a pas beaucoup de données stockées : environ 70 000 transactions et un million de points d'information de marché. L'ajout de nouvelles entrées ne dépasse pas 3000 points par jour. Il existe également des métriques pour le site, mais il y a peu de données et selon la politique de conservation, elles ne sont pas conservées plus d'un mois.
ProblĂšmes
Au cours du développement et des tests ultérieurs du service, des problÚmes de plus en plus critiques sont apparus lors de l'exploitation d'InfluxDB.
1. Suppression des données
Il y a une série de données avec des transactions :
SELECT time, amount, block, symbol FROM transactions WHERE symbol='USDT'Résultat :

J'envoie une commande pour supprimer des données :
DELETE FROM transactions WHERE symbol='USDT'Ensuite, je fais une requĂȘte pour rĂ©cupĂ©rer les donnĂ©es dĂ©jĂ supprimĂ©es. Et Influx ne renvoie pas une rĂ©ponse vide, mais une partie des donnĂ©es qui devraient ĂȘtre supprimĂ©es.
J'essaie de supprimer la table entiĂšre :
DROP MEASUREMENT transactionsJe vérifie la suppression de la table :
SHOW MEASUREMENTSJe ne vois pas la table dans la liste, mais la nouvelle requĂȘte de donnĂ©es renvoie toujours le mĂȘme ensemble de transactions.
Le problÚme ne s'est produit qu'une seule fois, car le cas de suppression est un cas unique. Mais ce comportement de la base de données ne correspond clairement pas à ce que l'on pourrait considérer comme un fonctionnement 'correct'. Plus tard, j'ai trouvé sur github un problÚme ouvert il y a presque un an à ce sujet.
En conséquence, la suppression et la restauration subséquente de toute la base ont permis de résoudre le problÚme.
2. Nombres Ă virgule flottante
Les calculs mathématiques lors de l'utilisation des fonctions intégrées d'InfluxDB donnent des erreurs de précision. Ce n'est pas étonnant, mais c'est désagréable.
Dans mon cas, les donnĂ©es ont une composante financiĂšre et je souhaite les traiter avec une grande prĂ©cision. Pour cette raison, je prĂ©vois d'abandonner les requĂȘtes continues.
3. Les requĂȘtes continues ne peuvent pas ĂȘtre adaptĂ©es Ă diffĂ©rents fuseaux horaires
Le service dispose d'un tableau avec des statistiques quotidiennes sur les transactions. Pour chaque jour, il faut regrouper toutes les transactions de la journée. Cependant, le jour de chaque utilisateur débutant à des heures différentes, le set de transactions varie également. Selon UTC, il y a de décalage pour lesquelles il faut agréger les données.
Dans InfluxDB, lors du regroupement par temps, il est possible d'indiquer un décalage, par exemple pour l'heure de Moscou (UTC+3) :
SELECT MEAN("supply") FROM transactions GROUP BY symbol, time(1d, 3h) fill(previous)Mais le rĂ©sultat de la requĂȘte sera incorrect. Pour une raison quelconque, les donnĂ©es regroupĂ©es par jour commenceront en 1677 (InfluxDB prend officiellement en charge les pĂ©riodes de temps depuis cette annĂ©e):

Pour contourner ce problÚme, le service a temporairement été transféré sur UTC+0.
4. Performance
Il existe de nombreux benchmarks sur Internet comparant InfluxDB et d'autres bases de donnĂ©es. Lors de ma premiĂšre consultation, ils semblaient ĂȘtre des matĂ©riels marketing, mais je pense maintenant qu'il y a une part de vĂ©ritĂ©.
Je vais vous raconter mon cas.
Le service fournit une mĂ©thode API qui retourne des statistiques des derniĂšres 24 heures. Dans les calculs, la mĂ©thode interroge la base trois fois avec les requĂȘtes suivantes :
SELECT * FROM coins_info WHERE time <= NOW() GROUP BY symbol ORDER BY time DESC LIMIT 1SELECT * FROM dominance_info ORDER BY time DESC LIMIT 1SELECT * FROM transactions WHERE time >= NOW() - 24h ORDER BY time DESCExplication :
- Dans la premiĂšre requĂȘte, nous obtenons les derniers points pour chaque piĂšce avec des donnĂ©es de marchĂ©. Huit points pour huit piĂšces dans mon cas.
- La deuxiĂšme requĂȘte obtient le point le plus rĂ©cent.
- La troisiĂšme interroge la liste des transactions des derniĂšres 24 heures, il peut y en avoir plusieurs centaines.
Je prĂ©cise qu'en InfluxDB, des index sont automatiquement construits par tags et par temps, ce qui accĂ©lĂšre les requĂȘtes. Dans la premiĂšre requĂȘte, symbol est un tag.
J'ai effectué un test de stress pour cette méthode API. Avec 25 RPS, le serveur montrait une charge complÚte de six CPU :

Cependant, le processus NodeJs ne générait aucune charge.
La vitesse d'exécution a déjà commencé à se dégrader à 7-10 RPS : si un client pouvait obtenir une réponse en 200 ms, alors 10 clients devaient attendre une seconde. 25 RPS est la limite à partir de laquelle la stabilité était affectée, des erreurs 500 étaient retournées aux clients.
Avec une telle performance, il est impossible d'utiliser Influx dans notre projet. De plus, dans un projet oĂč la surveillance doit ĂȘtre dĂ©montrĂ©e Ă de nombreux clients, des problĂšmes similaires pourraient survenir et le serveur de mĂ©triques serait surchargĂ©.
Sortie
La principale leçon tirée de cette expérience est qu'il ne faut pas intégrer une technologie inconnue dans un projet sans une analyse suffisante. Une simple vérification des tickets ouverts sur GitHub aurait pu fournir des informations pour éviter de choisir InfluxDB comme principal stockage de données.
InfluxDB devait bien convenir aux besoins de mon projet, mais comme l'a montré la pratique, cette base de données ne répond pas aux exigences et présente de nombreux problÚmes.
Une version 2.0.0-beta du projet est déjà disponible dans le dépÎt, espérons que cette nouvelle version apportera des améliorations significatives. En attendant, je vais commencer à explorer la documentation de TimescaleDB.
Source : habr.com
