Ich bin dabei, ein neues System für einen großen Geodatensatz zu entwerfen, für den eine schnelle Leseabfrageleistung erforderlich ist. Daher möchte ich sehen, ob jemand der Meinung ist, dass es in der folgenden Situation möglich ist oder Erfahrung / Ratschläge zu geeigneten DBMSs, Datenstrukturen oder alternativen Methoden hat, um die erforderliche Leistung zu erzielen:
Daten werden kontinuierlich aus verarbeiteten Satellitenradardaten erzeugt, die eine globale Abdeckung haben werden. Basierend auf der Satellitenauflösung und der Landbedeckung des Globus schätze ich, dass der gesamte Datensatz Werte an 75 Milliarden diskreten Orten auf dem Globus liefert. Über die Lebensdauer eines einzelnen Satelliten werden an jedem dieser Standorte bis zu 300 Werte ausgegeben (also ein Gesamtdatensatz von> 22 Billionen Werten). Dies gilt für einen Satelliten, und es gibt bereits einen zweiten Satelliten im Orbit, wobei zwei weitere in den nächsten Jahren geplant sind. Es wird also eine Menge Daten geben! Ein einzelnes Datenelement ist sehr einfach und besteht nur aus (Längengrad, Breitengrad, Wert), aber aufgrund der Anzahl der Elemente schätze ich, dass ein einzelner Satellit bis zu 100 TB produzieren kann.
Die geschriebenen Daten sollten niemals aktualisiert werden müssen, da sie nur wachsen, wenn neue Satellitenerfassungen verarbeitet werden. Die Schreibleistung ist nicht wichtig, aber die Leseleistung ist entscheidend. Das Ziel dieses Projekts ist es, die Daten über eine einfache Oberfläche wie einen Layer über Google Maps zu visualisieren, wobei jeder Punkt einen Farbwert hat, der auf dem Durchschnitt, dem Gradienten oder einer Funktion über die Zeit basiert. (Demo am Ende des Beitrags).
Ausgehend von diesen Anforderungen muss die Datenbank skalierbar sein, und wir werden wahrscheinlich nach Cloud-Lösungen suchen. Das System muss in der Lage sein, Geodatenabfragen wie "Punkte in der Nähe (lat, lon)" und "Punkte innerhalb (box)" zu verarbeiten und eine Leseleistung von <1s für die Lokalisierung eines einzelnen Punkts sowie Polygone mit bis zu 50.000 Punkte (obwohl bis zu 200.000 Punkte vorzuziehen wären).
Bisher habe ich einen Testdatensatz von ~ 750 Millionen Datenelementen an 111 Millionen Standorten. Ich habe eine postgres / postGIS-Instanz ausprobiert, die einwandfrei funktioniert hat, aber ohne die Möglichkeit des Splitterns kann ich dies nicht, da die Daten wachsen. Ich habe auch eine mongoDB-Instanz ausprobiert, was wiederum für OK erscheint und mit Sharding kann es ausreichend sein, mit dem Datenvolumen zu skalieren. Ich habe kürzlich etwas über Elasticsearch gelernt, daher sind Kommentare dazu hilfreich, da sie für mich neu sind.
Hier ist eine kurze Animation dessen, was wir mit dem gesamten Datensatz erreichen wollen:
Dieses GIF (aus meiner Postgres-Testversion) liefert (6x3) vorberechnete Raster-Kacheln, die jeweils ~ 200.000 Punkte enthalten und jeweils ~ 17 Sekunden benötigen, um sie zu generieren. Durch Klicken auf einen Punkt wird das Diagramm erstellt, indem alle historischen Werte in <1s an der nächstgelegenen Position gezogen werden.
Entschuldigung für den langen Beitrag, alle Kommentare / Ratschläge sind willkommen.