Je suis en train de concevoir un nouveau système pour un grand ensemble de données géospatiales qui nécessitera des performances de requête de lecture rapide. Par conséquent, je veux voir si quelqu'un pense que c'est possible ou a de l'expérience / des conseils sur les SGBD appropriés, la structure de données ou d'autres méthodes pour atteindre les performances requises dans la situation suivante:
Les données seront produites en continu à partir des données radar satellitaires traitées, qui auront une couverture mondiale. Sur la base de la résolution des satellites et de la couverture terrestre du globe, j'estime l'ensemble de données complet pour produire des valeurs à 75 milliards d'emplacements discrets sur le globe. Au cours de la durée de vie d'un seul satellite, la sortie produira jusqu'à 300 valeurs à chacun de ces emplacements (donc un ensemble de données total de> 22 billions de valeurs). C'est pour un satellite, et il y en a déjà un deuxième en orbite, avec deux autres prévus dans les nouvelles années. Il y aura donc beaucoup de données! Un seul élément de données est très simple et ne comprendra que (longitude, latitude, valeur), mais en raison du nombre d'éléments, j'estime qu'un seul satellite produira jusqu'à 100 To.
Les données écrites ne devraient jamais avoir besoin d'être mises à jour, car elles ne feront qu'augmenter à mesure que de nouvelles acquisitions de satellites seront traitées. Les performances d'écriture ne sont pas importantes, mais les performances de lecture sont cruciales. L'objectif de ce projet est de pouvoir visualiser les données via une interface simple telle qu'une couche sur google maps, où chaque point a une valeur colorée basée sur sa moyenne, son gradient ou une fonction dans le temps. (démo en fin de post).
À partir de ces exigences, la base de données doit être évolutive et nous sommes susceptibles de nous tourner vers des solutions cloud. Le système doit être capable de traiter des requêtes géospatiales telles que "points proches (lat, lon)" et "points dans (case)", et avoir des performances de lecture <1s pour localiser un seul point, et des polygones qui contiennent jusqu'à 50 000 points (bien que jusqu'à 200 000 points soient préférables).
Jusqu'à présent, j'ai un ensemble de données de test d'environ 750 millions d'éléments de données sur 111 millions d'emplacements. J'ai testé une instance postgres / postGIS, qui a bien fonctionné, mais sans possibilité de partitionnement, je ne le fais pas, cela pourra s'adapter à mesure que les données augmentent.J'ai également testé une instance mongoDB, qui semble à nouveau OK, donc loin, et avec le partage, il pourrait être suffisant de s'adapter au volume de données. J'ai récemment appris un peu sur elasticsearch, donc tout commentaire à ce sujet serait utile car c'est nouveau pour moi.
Voici une animation rapide de ce que nous voulons réaliser avec l'ensemble de données complet:
Ce gif (de mon essai postgres) sert (6x3) des tuiles raster pré-calculées, chacune contenant ~ 200 000 points et prenant ~ 17s pour générer chacune. En cliquant sur un point, le graphique est créé en tirant toutes les valeurs historiques à l'emplacement le plus proche en <1 s.
Toutes mes excuses pour le long post, tous les commentaires / conseils sont les bienvenus.