IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)

Vous êtes nouveau sur Developpez.com ? Créez votre compte ou connectez-vous afin de pouvoir participer !

Vous devez avoir un compte Developpez.com et être connecté pour pouvoir participer aux discussions.

Vous n'avez pas encore de compte Developpez.com ? Créez-en un en quelques instants, c'est entièrement gratuit !

Si vous disposez déjà d'un compte et qu'il est bien activé, connectez-vous à l'aide du formulaire ci-dessous.

Identifiez-vous
Identifiant
Mot de passe
Mot de passe oublié ?
Créer un compte

L'inscription est gratuite et ne vous prendra que quelques instants !

Je m'inscris !

Comment nous avons économisé 98 % des coûts du cloud en écrivant notre propre base de données
Par Hivekit

Le , par Anthony

917PARTAGES

7  0 
Quelle est la première règle en programmation ? Peut-être quelque chose comme "ne vous répétez pas" ou "si ça marche, n'y touchez pas" ? Ou encore "n'écrivez pas votre propre base de données"... C'est en effet une bonne règle.

Les bases de données sont un cauchemar à écrire, des exigences en matière d'atomicité, de cohérence, d'isolation et de durabilité (ACID) au partage, en passant par la récupération des erreurs et l'administration, tout est d'une difficulté inouïe.

Heureusement, il existe des bases de données extraordinaires qui ont été perfectionnées pendant des décennies et qui ne coûtent pas un centime. Alors pourquoi diable serions-nous assez fous pour en écrire une à partir de zéro ?

https://youtu.be/446rRsFpOnA

Eh bien, voici ce qu'il en est...

Hivekit exploite une plateforme cloud qui suit des dizaines de milliers de personnes et de véhicules en même temps. Chaque mise à jour de localisation est stockée et peut être récupérée via une API d'historique.

Le nombre de véhicules connectés simultanément et la fréquence de leurs mises à jour de localisation varient considérablement dans le temps, mais avoir environ 13 000 connexions simultanées, chacune envoyant environ une mise à jour par seconde, est assez normal.

Les clients de Hivekit utilisent ces données de manières très différentes. Certains cas d'utilisation sont très grossiers, par exemple lorsqu'une société de location de voitures souhaite afficher un aperçu de l'itinéraire emprunté par un client au cours de la journée. Ce type d'exigence pourrait être traité avec 30 à 100 points de localisation pour un trajet d'une heure, ce qui permettrait d'agréger et de compresser fortement les données de localisation avant de les stocker.

Mais il existe de nombreux autres cas d'utilisation pour lesquels cette option n'est pas envisageable. Les entreprises de livraison qui veulent pouvoir rejouer les secondes exactes qui ont précédé un accident. Les mines dotées de systèmes de localisation très précis sur site qui souhaitent générer des rapports indiquant quel travailleur a pénétré dans telle ou telle zone restreinte - à un demi-mètre près.

Ainsi, étant donné que le niveau de granularité dont chaque client aura besoin n'est pas connu à l'avance, chaque mise à jour de l'emplacement est stockée. Avec 13 000 véhicules, cela représente 3,5 milliards de mises à jour par mois, et ce chiffre ne fera qu'augmenter. Jusqu'à présent, Hivekit a utilisé AWS Aurora avec l'extension PostGIS pour le stockage des données géospatiales. Mais Aurora coûte déjà plus de 10 000 dollars par mois, rien que pour la base de données, et ce coût ne fera qu'augmenter à l'avenir.

Mais il ne s'agit pas seulement du prix d'Aurora. Bien qu'Aurora résiste assez bien à la charge, beaucoup des clients de Hivekit utilisent la version sur site de l'application. Et là, ils doivent faire tourner leurs propres clusters de base de données qui sont facilement submergés par ce volume de mises à jour.

Pourquoi n'utilisons-nous pas une base de données spécialement conçue pour les données géospatiales ?

Malheureusement, cela n'existe pas. De nombreuses bases de données, de Mongo et H2 à Redis, prennent en charge les types de données spatiales comme les points et les zones. Il existe également des "bases de données spatiales", mais il s'agit exclusivement d'extensions qui se greffent sur les bases de données existantes. PostGIS, construit au-dessus de PostgreSQL est probablement le plus connu, mais il y en a d'autres comme Geomesa qui offrent d'excellentes capacités d'interrogation géospatiale au-dessus d'autres moteurs de stockage.

Malheureusement, ce n'est pas ce dont nous avons besoin.

Voici à quoi ressemble notre profil d'exigences :

  • Performances d'écriture extrêmement élevées : nous voulons être en mesure de gérer jusqu'à 30 000 mises à jour de localisation par seconde et par nœud. Elles peuvent être mises en mémoire tampon avant d'être écrites, ce qui permet de réduire considérablement le nombre d'IOPS.
  • Parallélisme illimité : plusieurs nœuds doivent être en mesure d'écrire des données simultanément, sans limite supérieure.
  • Petite taille sur le disque : Compte tenu du volume de données, nous devons veiller à ce qu'elles occupent le moins d'espace possible sur le disque.

Cela signifie que nous devrons accepter certains compromis. Voici ce que nous acceptons :

[LIST][*] Des performances modérées pour les lectures sur disque : Notre serveur est construit autour d'une architecture en mémoire. Les requêtes et les filtres pour les flux en temps réel sont exécutés sur des données en mémoire et sont donc très rapides. Les lectures sur disque n'ont lieu que lorsqu'un...
La fin de cet article est réservée aux abonnés. Soutenez le Club Developpez.com en prenant un abonnement pour que nous puissions continuer à vous proposer des publications.

Une erreur dans cette actualité ? Signalez-nous-la !

Avatar de lvr
Membre extrêmement actif https://www.developpez.com
Le 12/05/2024 à 15:54
Passer de 10k€/mois à 200€/mois. Certes. Mais quel est le coût du développement et de la maintenance du système ?
Quand on met en place un nouveau système, il faut comparer (entre autres) le coût du Build et du Run du nouveau système vs. le Run de l'ancien.
2  0 
Avatar de SQLpro
Rédacteur https://www.developpez.com
Le 17/04/2024 à 20:19
Il y a des moments ou je me demande si les personnes qui fabrique ce genre de chose et prône leur outil sont sérieux et ont un tant soit peu étudié déjà les produits existants...

Alors allons y !

heure et l'identifiant, la latitude et la longitude, ne prend que 34 octets
Création d'une table équivalent pour stocker les données :
Code : Sélectionner tout
1
2
3
4
5
6
7
8
CREATE DATABASE DB_TESTS;
GO

USE DB_TESTS;
GO

CREATE TABLE T_POINTS (ID INT IDENTITY PRIMARY KEY, DH DATETIME2(0), LAT FLOAT, LONG FLOAT);
GO
Stockage de quelques premiers points aléatoires :
Code : Sélectionner tout
1
2
3
4
INSERT INTO T_POINTS 
SELECT CAST(ABS(CHECKSUM(NEWID()) / 100000.0) AS DATETIME),
       CHECKSUM(NEWID()) / 30000000.0, CHECKSUM(NEWID()) / 30000000.0 
GO 33333
Test de longueur du stockage des points :
Code : Sélectionner tout
1
2
SELECT TOP 100  DATALENGTH(ID) + DATALENGTH(DH ) + DATALENGTH(LAT) + DATALENGTH(LONG)
FROM   T_POINTS;
Tout ceci fait 26 octets, soit 24 % de moins !!!

Test en réalité avec 30 millions de points :

Code : Sélectionner tout
1
2
3
4
5
INSERT INTO T_POINTS
SELECT DATEADD(millisecond, CHECKSUM(NEWID()) / 100000, T1.DH), T1.LONG, T2.LAT
FROM   T_POINTS AS T1
       CROSS JOIN T_POINTS AS T2
WHERE  ABS(CHECKSUM(NEWID())) % 6 = 1;
Au passage ceci a mis 4 min 46 secondes sur mon portable pour un peu plus de 30 millions de lignes, soit 0,00953 ms par point inséré, soit 9,53 µs par point inséré... soit plus de 100 000 points insérés par seconde.... Bref, trois fois plus que Hivekit !!! Là je me marre !

Voyons maintenant la réalité du stockage :

Code : Sélectionner tout
EXEC sp_spaceused 'T_POINTS'
30 255 500 lignes utilisant 1 051 848 Ko soit 1 Go... Donc même chose que Hivekit , sauf que l'index de la Primary Key est compris dans ce volume...
À nouveau je me marre !!!
On continue...

la recréation d'un point particulier dans l'historique d'un domaine est passée d'environ deux secondes à environ 13 ms
Supposons qu'il s'agisse d'un UPDATE :
Code : Sélectionner tout
1
2
3
4
5
SET STATISTICS TIME ON;
GO
UPDATE T_POINTS
SET LAT = 50.0009873 , LONG = 33.2794173666 
WHERE ID = 11980242;
SQL Server Temps d'exécution*: Temps UC = 0*ms, temps écoulé = 0*ms.
Le temps écoulé par ce faire est tellement faible que non mesurable.... Par rapport au 13 secondes
Je rapelle que je fais mes tests sur un portable !!! ... je me marre encore !

Amusons nous à faire de la compression de la table :

Code : Sélectionner tout
1
2
3
ALTER TABLE T_POINTS REBUILD WITH (DATA_COMPRESSION = PAGE);
-- et mesurons le bénéfice de stockage :
EXEC sp_spaceused 'T_POINTS';
30 255 500 lignes occupent maintenant 565 304 Ko --> 0.54 Go... Presque la moitié....

Relançons notre requête de recherche :

Code : Sélectionner tout
1
2
3
4
5
SET STATISTICS TIME ON;
GO
UPDATE T_POINTS
SET LAT = 50.0009873 , LONG = 33.2794173666 
WHERE ID = 11980242;
On est passé en moyenne à 1 ms... On est loin des 13 ms...

Bref avec MS SQL Server on est juste 2 fois moins gourmand en stockage et juste au minimum 13 fois plus rapide....

Et compte tenu de la modicité du stockage on peut même utiliser la version Express gratuite de SQL Server qui permet de monter jusqu'à 327 Peta octets...

A +
4  3 
Avatar de Christophe
Responsable Systèmes https://www.developpez.com
Le 13/01/2025 à 21:05
SQL Pro : ton système tiendrai 13000 connexions simultanées ?
1  0