Wie die effiziente Speicherung und Abfrage von einer Milliarde Reihen von sensor-Daten

Situation:
Ich habe einen neuen job angefangen und wurde mit der Aufgabe betraut, herauszufinden, was zu tun mit Ihre sensor-Daten-Tabelle. Es hat 1,3 Milliarden Zeilen von sensor-Daten. Die Daten sind Recht einfach: im Grunde nur eine sensor-ID, das Datum und die sensor-Wert an diesem Punkt in der Zeit (Doppel).

Derzeit ist, werden die Daten in einer Tabelle in einer MSSQL-Server Datenbank.

Durch die Ende dieses Jahres erwarte ich, dass die Anzahl der Reihen erhöht sich auf 2-3 Milliarden.

Ich bin auf der Suche nach einem besseren Weg, um zu speichern und Abfrage dieser Daten (von Datum), und da gibt es eine Menge von „big data“ – Produkte, die unsere gibt, und ich habe keine wirkliche Erfahrung mit der Verwaltung solcher big-data-sets, ich Frage hier für jegliche Hinweise.

Es ist nicht ein großes Unternehmen, und unsere Ressourcen sind nicht unbegrenzt 😉

Einige weitere details über unser Anwendungsfall:

  • Die Daten dargestellt in Graphen und zeigt die sensor-Werte über die Zeit.
  • Wir planen eine API erstellen zu lassen, die unseren Kunden fetch-sensor-Daten für jeden Zeitraum, der Sie interessiert (… Daten 2 Jahre zurück ist genauso relevant wie die im letzten Monat von Daten).

Meine Forschung so weit führte mich zu der überlegung, die folgenden Lösungen:

  1. Damit die Daten im SQL Server

    aber die Partitionierung der Tabelle (es ist nicht partitioniert jetzt). Das verlangen wird, dass die enterprise-version von SQL Server, das kostet eine Menge.

  2. Verschieben Sie die Daten auf Azure SQL-Server.

    Dort bekommen wir das partitioning feature für viel weniger Geld, aber sobald unsere DB wächst oben mit 250 GB kostet es viel mehr (und viel zu viel über 500gb).

  3. Verwenden mehrere Datenbanken

    Konnten wir mit 1 DB pro Kunde. Mehrere kleinere DBs wird billiger sein, als 1 große DB, aber wir haben eine Menge von Kunden, und die Pläne für mehr, so dass ich nicht wirklich wie das denken über die Verwaltung all dieser Datenbanken.

  4. Azure Storage-Tabellen

    Dies ist die option ich mag am besten so weit. Wir können partition die Daten von Unternehmen/sensor/Jahr/Monat, das Datum für Zeile-Taste und speichern der sensor-Wert.

    Ich habe noch keine Zeit gehabt zu testen, Abfrage-performance, aber von was ich gelesen habe sollte es gut sein. Aber es gibt einen wichtigen Nachteil, und das ist die Grenze von 1000 Rücksendung per HTTP-request. Wenn wir brauchen, zu Holen alle sensor-Daten für eine Woche, die wir brauchen, um eine Menge von HTTP-Anfragen. Ich bin mir nicht sicher jetzt, wie groß ein Problem ist das für unseren Anwendungsfall.

  5. Azure HDInsight (Hadoop, Azure)

    Wie gesagt ich habe keine Erfahrung mit big data und derzeit habe ich nicht bekommen, Hadoop gut genug, um zu wissen, ob es passt unserem Fall (expose-sensor-Daten für eine gegebene Zeitspanne, durch eine API). Sollte ich tiefer zu Graben und erfahren, oder ist meine Zeit besser verbringen verfolgen eine andere alternative?

Hat jemand Erfahrung von einem ähnlichen Fall. Was funktioniert für Sie? Beachten Sie, dass der Preis entscheidend, und eine „einfache“ Lösung könnte sein, die bevorzugt über einen sehr Komplex, obwohl der Komplex führt einige Sekunden besser.

UPDATE 1:
Beantworten Sie einige der Fragen in den Kommentaren unten.

  • Gibt es rund 12 000 sensoren, die potenziell Bericht jeweils ein Wert von 15 Sekunden. Das bedeutet: ~70 Millionen pro Tag. In der Realität, nicht alle dieser sensoren haben eine „Berichterstattung“ eingeschaltet, so sind wir nicht immer so viel Daten pro Tag, aber da wir natürlich weiter ausbauen wollen, mehr Kunden und sensoren, ich brauche wirklich eine Lösung, könnte eine Skalierung auf bis zu vielen Millionen von sensor-Werte ein Tag.
  • Partitionierung ist eine Lösung, und die Verwendung mehrerer Datenbanken und/oder Tabellen, ist etwas, was ich zwar ja, aber ich sehe dies als fallback, falls/wenn ich erschöpft haben andere Lösungen.
  • Ich gelesen habe, etwas mehr über HBase, http://opentsdb.net/ und google https://cloud.google.com/bigtable/ und es scheint, wie Hadoop könnte eine echte alternative zumindest.

UPDATE 2:
Heute erlebte ich etwas mit beiden azure table storage und HDInsight (HDI). Wir erfordern nicht viel in der Abfrage „Flexibilität“, und so denke ich, Azure Table Storage sieht echt vielversprechend aus. Es ist ein bisschen langsam herausziehen Daten aufgrund der 1000 item limit pro Anfrage, wie ich schon erwähnt habe, aber in meinen tests, die ich denke, es ist schnell genug für unsere Anwendungsfälle.

Habe ich auch gestolpert OpenTSDB, das ist, was führte mich zu versuchen, HDI in den ersten Platz. Nach einem tutorial auf Azure (https://azure.microsoft.com/en-us/documentation/articles/hdinsight-hbase-tutorial-get-started/) ich war in der Lage, ziemlich schnell speichern einer million Datensätzen und zu testen einige Abfragen. Es war viel schneller Abfragen als Azure Table Storage. Ich könnte mir sogar pull-down-300 000 Datensätze in einer http-Anforderung (dauerte 30 Sekunden obwohl).

Aber es kostet schon ein bisschen mehr als Azure-Tabellenspeicher, und ich denke, ich kann meine optimieren-code zum verbessern der Abfrageleistung mit Azure Table Storage (mehr feinkörnigen partition key und ausführen von Anforderungen parallel). So jetzt ich bin Neigung in Richtung Azure Table Storage aufgrund der Einfachheit, Preis und „gut-genug“ Leistung.

Werde ich meine Erkenntnisse an einen externen Berater bald, so bin ich aufgeregt, um zu lernen, seine Sicht auf die Dinge als gut.

  • Vorher würde ich alles versuchen, Lesen Sie die Informationen Tabellen in SQL Server. Oder wenn Sie beabsichtigen zu speichern, die Daten über mehrere Server, Lesen Sie die Informationen partitionierte sichten (siehe Abschnitt Partitionierte Sichten).
  • Sie erwähnen Kunden… Wenn Sie die sensor-Daten in einer großen Tabelle ohne Code, wie ist der Kunde verpflichtet, diese? Gibt es ein mapping mit dem sensor? Warum ich Frage: ich denke auch, dass man den Abfragen wird nicht die Abfrage über alle Kunden, sondern immer auf die Daten eines bestimmten Kunden, oder? Wenn ja: Wie viele Zeilen gibt es für jeden Kunden? Man könnte meinen, der eine Tabelle für jeden Kunden, alle mit der gleichen Struktur, Indizes, Einschränkungen… dazu bräuchte man eine TVF mit dynamischen SQL, der rest konnte bleiben ganz das gleiche…
  • Auch, wenn Sie regelmäßig benötigen einen standard-Satz von Aggregaten zu verzeichnen, Forschung Indizierte Sichten, die vollständig zu verwalten den Prozess der Zwischenspeicherung in einem separaten index, verschiedene vordefinierte Aggregate.
  • Gibt es irgendeine Art logische Gruppierung der Daten? Sind die sensoren in Gruppen? sind Zeiträume, in Gruppen? Sie könnten in der Lage sein, zu speichern, all dies in einem cube. Sie brauchen, um mehr zu verstehen gründlich, wie die Daten gemeldet werden, bevor Sie anwenden können, alle smarts.
  • Einige Gruppierung getan werden kann, ja: Kunden, die mehrere Standorte haben, und jeder Standort verfügt über mehrere sensoren. Jeder sensor hat eine eindeutige ID, die zugeordnet ist, um einen Standort und die Lage eines Kunden. Aber es gibt keine weitere Gruppierung als das. Auch, wie bereits erwähnt, beabsichtigen wir, diese Daten über eine API für unsere Kunden, so dass Sie entscheiden können, was Sie möchten, verwenden Sie die Daten für. Also wir wissen wirklich nicht, welche Art der Zeitspanne, die Sie Abfragen möchten, die für Sie vor der Zeit (obwohl wir das wahrscheinlich umsetzen, eine Art Obere Grenze der Zeitspanne pro Anfrage). Ich werde Lesen, bis auf die Würfel. Dank
  • Wenn Sie wan ‚ T ein sehr niedriges level-of-detail (d.h. jeder zweite für einen Tag), dann Würfel sind wahrscheinlich nicht die Antwort. Wenn es ist definitiv split von Kunden, dann ist das definitiv etwas, mit dem Sie arbeiten können, der durch Partitionierung der Daten auf Kunden-und wahrscheinlich clustering auf den Zeitraum an. Dies ist ein relationales DB-centric approac.
  • github.com/hhblaze/DBreeze



2 Replies
  1. 2

    Du wirst also um 3 Milliarden Datensätze, die von der Ende dieses Jahres (die gerade erst angefangen haben). Jeder Eintrag ist 4 Byte ID + 4 Byte datetime + 8 Byte double-Wert, die Summen in 3*10^9 * (4+4+8) == 48Gb.

    Können Sie ganz einfach speichern und verarbeiten diese 48Gb in einem in-memory-Datenbanken wie Redis, CouchBase, Tarantool, Aerospike. Alle von Ihnen sind open-source, so dass Sie nicht brauchen, um eine Lizenz entrichten.

    Möglicherweise gibt es einige zusätzliche overhead an Speicherverbrauch von 10-30%, also 48 GB bis zu 64 GB oder etwas mehr. Sollten Sie füttern die Datenbanken, die mit Ihren realen Daten um die Wirtschaftlichste für Ihren Fall.

    Nur eine physische Maschine sollte genug sein für die gesamte workload, da in-memory-Datenbanken sind in der Lage zu handhaben, 100K-1M-Abfragen/updates pro Sekunde pro Knoten (die tatsächliche Anzahl hängt von Ihrer spezifischen workload-Muster) . Zur besseren Verfügbarkeit würde ich das setup aus zwei Servern – ein master und ein slave.

    Den Preis von einem physischen server mit 64 GB an Bord, bis auf meine Erfahrung ist $2-3K. Beachten Sie, dass Sie brauchen nicht einmal eine SSD-Festplatte. Ein spinning-man sollte in Ordnung sein, weil die lese-Treffer-RAM und alle die schreibt nur angehängt, um die Transaktion zu melden. Dies ist, wie in-memory-Datenbanken arbeiten. Ich kann dies erläutern, wenn Sie irgendwelche Fragen haben.

    • Vielen Dank, ich werde in ein bisschen mehr als ich noch nicht als in-memory db ‚ s noch. Obwohl, das halten von Daten für mehrere Jahre und die Möglichkeit zur Abfrage der historischen Daten ist Teil des Geschäftsmodells, so werden die Daten einfach weiter an Größe zugenommen.
    • Du bist herzlich willkommen 🙂 Die Daten werden weiter wachsen in der Größe, sondern der Preis, der Speicher wird keep on falling in US-Dollar.
    • Könnte man nicht eine in-memory-Datenbank vor, der eine standard-Datenbank / Tabelle speichern?
  2. 0

    So, ich habe alle Technologien, die Sie aufgeführt, in irgendeiner Weise oder anderen. Welche Art von Abfragen, die Sie durchführen müssen? Denn je nachdem sind, Sie könnten Regel, einige der Lösungen. Wenn Sie nicht brauchen, um die Abfrage eine Menge von verschiedenen Möglichkeiten, die Tabelle Speicher könnte funktionieren gut für Sie. Seine “ werde-Skala echt gut aus, wenn Sie Folgen Sie den Richtlinien, und ist Billig. Aber wenn Sie nicht nur ein-Punkt-Abfrage für die Daten, die Sie benötigen, dann könnte es nicht so gut, oder zu kompliziert sein, um eine gute option. Opentsdb ist großartig, wenn Sie möchten, eine Zeitreihen-Datenbank. Die begrenzen Sie die Zeit-Serie-Typ Abfragen. Es eine Menge Zeit, die Serie dbs gibt, und es gibt eine Menge von Anwendungen, die auf der Oberseite der es wie Bootsmann und Grafana auf Liste zwei, die ich benutze. Die Letzte option HDI, ich würde die Daten gespeichert, die im Parkett-format (oder einem spaltenförmigen format), erstellen einer hive-Tabelle auf der Oberseite der Daten und Abfrage mit Spark SQL. Wirklich brauchen Sie nicht zu verwenden, Funken, die Sie nutzen könnten-Struktur als gut. Aber das, was Sie sollten bleiben Weg von ist traditionellen Karte Reduzieren, das Paradigma ist im Grunde tot, jetzt Tage, und Sie sollten nicht schreiben neuen code in es. Auf top von, dass, wenn Sie es nicht wissen, es gibt steile Lernkurve um ihn herum. Ich uns alle Technologien, und wir verwenden Sie für verschiedene Teile system und es hängt wirklich auf das Lesen und schreiben von Anforderungen der Anwendung. Ich würde schauen, bei der Verwendung von spark-und Parkett-wenn ich du wäre, aber es eine Menge neue Werkzeuge, die möglicherweise nicht benötigt werden.

    • Vielen Dank für die Hinweise 😉 hab ich aktualisiert meine Frage oben mit einigen relevanten Informationen, und ich werde sicher sein, check out die links, die Sie zur Verfügung gestellt

Schreibe einen Kommentar

Deine E-Mail-Adresse wird nicht veröffentlicht. Erforderliche Felder sind mit * markiert.