2013-04-04 7 views
6

Ich habe einige Software, die Daten über einen großen Zeitraum sammelt, ca. 200 Messwerte pro Sekunde. Es verwendet hierfür eine SQL-Datenbank. Ich möchte Azure verwenden, um viele meiner alten "archivierten" Daten zu verschieben.Design der Partitionierung für Azure-Tabellen-Speicher

Die Software verwendet eine Multi-Tenant-Architektur, daher plane ich, eine Azure-Tabelle pro Mandant zu verwenden. Jeder Tenant überwacht möglicherweise 10 bis 20 verschiedene Metriken, daher plane ich, die Metrik-ID (int) als Partitionsschlüssel zu verwenden.

Da jede Metrik nur eine Lesung pro Minute (max) hat, plane ich, DateTime.Ticks.ToString ("d19") als meine RowKey zu verwenden.

Mir fehlt ein wenig Verständnis, wie dies jedoch skalieren wird; So hoffte jemand könnte in der Lage sein, dies aufzuräumen:

Für die Leistung Azure wird/könnte meine Tabelle durch Partitionschlüssel teilen, um die Dinge schön und schnell zu halten. Dies würde in diesem Fall zu einer Partition pro Metrik führen.

Allerdings könnte mein Rowkey möglicherweise Daten über ca. 5 Jahre darstellen, also schätze ich ca. 2,5 Millionen Zeilen.

Ist Azure clever genug, um dann basierend auf dem Zeilenschlüssel zu teilen, oder entwerfe ich in einem zukünftigen Engpass? Ich weiß normalerweise nicht vorzeitig zu optimieren, aber mit etwas wie Azure, das nicht so sinnvoll wie normal scheint!

Suchen Sie nach einem Azure-Experten, um mich wissen zu lassen, ob ich in der richtigen Zeile bin oder ob ich meine Daten auch in mehr Tabellen aufteilen sollte.

Antwort

16

Ein paar Kommentare:

Neben den Daten aus Speichern, können Sie auch in aussehen wollen, wie Sie die Daten abrufen möchte, als dass Ihr Design erheblich ändern können. Einige der Fragen, die Sie wollen, sich fragen:

  • Wenn ich die Daten abrufen, werde ich die Daten werden Abrufen immer für eine bestimmte Metrik und für eine Datums-/Zeitbereich?
  • Oder muss ich die Daten für alle Metriken für einen bestimmten Datums-/Zeitbereich abrufen? Wenn dies der Fall ist, betrachten Sie den vollständigen Tabellenscan. Natürlich können Sie dies vermeiden, indem Sie mehrere Abfragen ausführen (eine Abfrage/PartitionKey).
  • Muss ich die neuesten Ergebnisse zuerst sehen, oder ist mir das wirklich egal. Wenn es früher ist, dann sollte Ihre RowKey-Strategie so etwas wie sein.

Auch da PartitionKey ein String-Wert ist, möchten Sie vielleicht int Wert auf einen string Wert mit einem gewissen „0“ prepadding konvertieren, so dass alle Ihre IDs erscheinen, um sonst Sie 1 erhalten werden, 10, 11, .., 19, 2, ... usw.

Soweit ich weiß, partitioniert Windows Azure die Daten nur basierend auf PartitionKey und nicht RowKey. Innerhalb einer Partition dient RowKey als eindeutiger Schlüssel. Windows Azure versucht, Daten mit demselben PartitionKey im selben Knoten zu halten, aber da jeder Knoten ein physisches Gerät ist (und daher eine Größenbeschränkung hat), können die Daten auch zu einem anderen Knoten fließen.

Möglicherweise möchten Sie diesen Blogbeitrag von Windows Azure Storage Team lesen: http://blogs.msdn.com/b/windowsazurestorage/archive/2010/11/06/how-to-get-most-out-of-windows-azure-tables.aspx.

UPDATE Basierend auf Ihren Kommentaren unten und einige Informationen von oben, lassen Sie uns versuchen, etwas Mathe zu tun. Dies basiert auf den neuesten Skalierbarkeitszielen, die hier veröffentlicht werden: http://blogs.msdn.com/b/windowsazurestorage/archive/2012/11/04/windows-azure-s-flat-network-storage-and-2012-scalability-targets.aspx. Die Dokumentation heißt es:

Single Table Partitions- eine Tabellenpartition alle Einheiten in einem Tabelle mit der gleichen Partition Schlüsselwert sind, und in der Regel Tabellen haben viele Partitionen. Das Durchsatzziel für eine einzelne Tabelle Partition ist:

  • Bis zu 2.000 Einheiten pro Sekunde
  • Hinweis, dies für eine einzelne Partition ist, und nicht eine einzige Tabelle. Daher kann eine Tabelle mit einer guten Partitionierung bis zu den 20.000 Entities/Sekunde verarbeiten, was das oben beschriebene Gesamtziel des Accounts ist.

Jetzt erwähnt, dass Sie 10 haben - 20 verschiedene metrische Punkte und für jede Metrik Punkt werden Sie maximal 1 Datensatz pro Minute schreiben, das bedeutet, dass Sie ein Maximum von 20 Einheiten würde das Schreiben/Minute/Tabelle, die weit unter dem Skalierbarkeitsziel von 2000 Einheiten/Sekunde liegt.

Jetzt bleibt die Frage des Lesens. Angenommen, ein Benutzer würde maximal 24 Stunden Daten (d. H. 24 * 60 = 1440 Punkte) pro Partition lesen. Unter der Annahme, dass der Benutzer die Daten für alle 20 Metriken für einen Tag erhält, wird jeder Benutzer (also jede Tabelle) maximal 28.800 Datenpunkte abrufen. Die Frage, die für Sie übrig bleibt, ist, wie viele Anfragen Sie pro Sekunde bekommen können, um diese Schwelle zu erreichen. Wenn Sie diese Informationen irgendwie extrapolieren könnten, denke ich, dass Sie einige Schlussfolgerungen über die Skalierbarkeit Ihrer Architektur ziehen können.

Ich würde auch empfehlen, dieses Video zu sehen: http://channel9.msdn.com/Events/Build/2012/4-004.

Hoffe, das hilft.

+0

Vielen Dank für Ihre Kommentare. Der wahrscheinliche Anwendungsfall besteht darin, dass ein Benutzer nur eine Datenmenge für eine einzelne Metrik anfordert. Dieser Bereich wird klein sein (vielleicht ein 24-Stunden-Fenster). Wenn mehrere Metriken erforderlich sind, würde dies über mehrere Abfragen erfolgen. – KingCronus

+0

Außerdem ist in diesem Fall kein Vorpaddeln erforderlich, da die Metriken nicht in einer bestimmten Reihenfolge sein müssen, aber danke für den Heads-up. – KingCronus

+0

Meine Antwort oben wurde aktualisiert. Hoffe das hilft. –