Hintergrund
Eine lokale Datenbank enthält fast 1,3 Milliarden eindeutige Zeilen. Jede Zeile ist indirekt einem bestimmten Breiten- und Längengrad (Ort) zugeordnet. Jede Zeile hat einen Datumsstempel.
Anwendungsfall
Das Problem ist wie folgt:
- Der Benutzer legt ein Start- / Enddatum und einen Wertebereich fest (z. B. 100 bis 105).
- Das System sammelt alle Zeilen, die dem angegebenen Datum entsprechen, gruppiert nach Standort.
- Das System ermittelt die Orte, an denen während dieser Daten eine statistische Wahrscheinlichkeit besteht, in den angegebenen Wertebereich zu fallen.
- Das System zeigt dem Benutzer alle übereinstimmenden Positionen an.
Dies ist ein Problem der Geschwindigkeit und des Maßstabs.
Frage
Was ist die kostengünstigste Lösungsarchitektur, die Sie sich vorstellen können, mit der ein solches System in weniger als fünf Sekunden Ergebnisse für Benutzer abrufen kann?
Aktuelles System
Die Umgebung ist derzeit:
- PostgreSQL 8.4 (Upgrade ist möglich; Datenbankwechsel ist keine Option)
- R und PL / R.
- XFS
- WD VelociRaptor
- 8 GB RAM (Corsair G.Skill; 1,3 GHz)
- Quad Core GenuineIntel 7 (2,8 GHz)
- Ubuntu 10.10
Hardware-Upgrades sind akzeptabel.
Update - Datenbankstruktur
Die Milliarden von Zeilen befinden sich in einer Tabelle, die ähnelt:
id | taken | location_id | category | value1 | value2 | value3
- id - Primärschlüssel
- genommen - Datum, das der Zeile zugewiesen wurde
- location_id - Verweis auf den Breiten- / Längengrad
- Kategorie - Eine Beschreibung der Daten
- value1 .. 3 - Die anderen Werte, die der Benutzer abfragen kann
Die taken
Spalte enthält in der Regel aufeinanderfolgende Daten pro location_id
Tag. Manchmal enthält jeder Standort Daten von 1800 bis 2010 (etwa 77.000 Daten, von denen viele dupliziert wurden, da jeder Standort Daten im gleichen Datumsbereich enthält).
Es gibt sieben Kategorien und die Tabellen sind bereits nach Kategorien unterteilt (unter Verwendung von untergeordneten Tabellen). Jede Kategorie enthält ~ 190 Millionen Zeilen. In naher Zukunft wird die Anzahl der Zeilen pro Kategorie eine Milliarde überschreiten.
Es gibt ungefähr 20.000 Standorte und 70.000 Städte. Die Standorte sind nach Längen- und Breitengrad mit der Stadt korreliert. Das Zuweisen jedes Standorts zu einer bestimmten Stadt bedeutet, die Stadtgrenzen zu finden, was keine triviale Aufgabe ist.
Ideen
Einige Ideen, die ich habe, sind:
- Suchen Sie einen Cloud-Dienst zum Hosten der Datenbank.
- Erstellen Sie einen SSD-Raid-Streifen (großartiges Video).
- Erstellen Sie eine Tabelle, in der alle Standorte nach Städten zusammengefasst sind (Vorberechnung).
Vielen Dank!