2016-04-08 5 views
0

Ich arbeite an einer Migration von MS SQL zu DynamoDB und ich bin mir nicht sicher, was ist der beste Hash-Schlüssel für meine Zwecke. In MS SQL habe ich eine Artikeltabelle, wo ich einige Produktinformationen für verschiedene Kunden speichere, also sind der Primärschlüssel eigentlich zwei Spalten customer_id und item_no. Im Anwendungscode muss ich spezifische Elemente und alle Elemente für eine Kundennummer abfragen, also war meine erste Idee, die Kundennummer als Hash-Schlüssel und das Element Nein als Bereichsschlüssel einzurichten. Aber ist das das beste Konzept in Bezug auf Partitionierung? Ich muss Produktdaten täglich mit 50.000-100.000 Produkten für einige größere Kunden importieren und, so weit ich weiß, wäre es besser, einen zufälligen Hash-Schlüssel zu haben. Andernfalls wird der Importjob nur auf einer Partition ausgeführt. Kann mir jemand einen Hinweis geben, welches ist das beste Datenmodell in diesem Fall?MS SQL zu DynamoDB Migration, was ist der beste Partition Schlüssel in meinem Fall

Bye, Peter

Antwort

0

Es klingt wie Sie item_no als Partitionsschlüssel, mit customer_id als Sortierschlüssel benötigen. Um alle Elemente für eine customer_id effizient abzufragen, sollten Sie einen globalen sekundären Index für customer_id erstellen.

Diese Konfiguration sollte Ihnen eine gute Verteilung geben, während Sie die von Ihnen angegebenen Abfragen ausführen können.

+0

thx Mark, ich mag diese Lösung und werde nächste Woche einen Leistungstest machen. – Xaptor

0

Sie sind auf dem richtigen Weg, Sie sollten wirklich aufpassen, wie Sie mit Schreibvorgängen umgehen, während Sie täglich einen Importauftrag ausführen. Vermeiden Sie es auch, Indizes unnötigerweise hinzuzufügen, da sie Ihre Schreibvorgänge nur vervielfachen.

Die Verwendung von customer_id als Hash-Schlüssel und item_no als Bereichsschlüssel bietet die beste Option nicht nur zum Abfragen, sondern auch zum Hochladen Ihrer Daten.

Wie Sie bereits erwähnt haben, wäre die Randomisierung Ihrer Kunden-IDs sehr hilfreich, um die Verwendung von Ressourcen zu optimieren und die Möglichkeit einer heißen Partition zu vermeiden. In Ihrem Fall würde ich das genaue Beispiel in der DynamoDB Dokumentation enthalten folgen:

[...] Eine Möglichkeit, den Schreibdurchsatz dieser Anwendung zu erhöhen würde die Schreibvorgänge über mehrere Teilungsschlüsselwerte randomisieren sein. Wählen Sie eine Zufallszahl aus einem festen Satz (beispielsweise 1 bis 200) und verketten es als Suffix [...]

Also, wenn Sie Ihre Kundeninformationen schreiben nur zufällig mit dem Suffix zuweisen zu Ihrem Kunden-IDs, vergewissern Sie sich, dass Sie sie gleichmäßig verteilen (z. B. CustomerXYZ.1, CustomerXYZ.2, ..., CustomerXYZ.200).

Um alle Elemente zu lesen, die Sie benötigen, um alle Elemente für jedes Suffix zu erhalten. Beispielsweise würden Sie zuerst eine Abfrageanforderung für den Partitionsschlüsselwert CustomerXYZ.1, dann eine weitere Abfrage für CustomerXYZ.2 usw. über CustomerXYZ.200 ausgeben. Da Sie den Suffixbereich (in diesem Fall 1 ... 200) kennen, müssen Sie nur die Datensätze abfragen, die jedes Suffix an die Kundennummer anhängen.

Jede Abfrage mit dem Hash-Schlüssel CustomerXYZ.n sollte einen Satz von Elementen (angegeben durch den Bereichsschlüssel) von diesem bestimmten Kunden zurückgeben. Ihre Anwendung müsste die Ergebnisse aus allen Abfrageanforderungen zusammenführen.

Dies wird sicherlich Ihr Leben schwerer machen, die Aufzeichnungen zu lesen (in Bezug auf die zusätzlichen Anforderungen benötigt), aber die Vorteile der optimierten Durchsatz und Leistung wird sich auszahlen.Denken Sie daran, dass eine heiße Partition nicht nur Ihre Gesamtkosten erhöht, sondern sich auch drastisch auf Ihre Leistung auswirkt.

Wenn Sie einen gut gestalteten Partitionsschlüssel haben, werden Ihre Abfragen immer sehr schnell und mit minimalen Kosten zurückgegeben.

Stellen Sie außerdem sicher, dass Ihr Importauftrag keine nach Kunden gruppierten Schreibvorgänge ausführt. Anstatt beispielsweise alle Artikel eines bestimmten Kunden in Serie zu schreiben, sortieren Sie die Schreibvorgänge so, dass sie auf alle Kunden verteilt sind. Obwohl Ihre Kunden aufgrund des ID-Randomisierungsprozesses auf mehrere Partitionen verteilt werden, sollten Sie diese zusätzliche Sicherheitsmaßnahme ergreifen, um einen Schreibvorgang in einer einzelnen Partition zu verhindern. Details siehe unten:

Von ‚Write Aktivität verteilt Während Data Upload‘ der offiziellen DynamoDB Dokumentation:

voll Um alle der Durchsatzleistung zu nutzen, die für Ihre Tabellen bereitgestellt worden ist, müssen Sie Verteilen Sie Ihre Arbeitslast über Ihre Partition Schlüsselwerte. In diesem Fall können Sie möglicherweise nicht alle Ressourcen , die DynamoDB für Ihre Tabelle bereitgestellt hat, verwenden, indem Sie eine ungleiche Upload-Arbeit auf Elemente mit demselben Partitionsschlüssel-Wert richten. Sie können Ihre Upload-Arbeit verteilen, indem Sie zuerst einen Eintrag von jedem Partitionsschlüssel-Wert hochladen. Sie dann das Muster für den nächsten Satz von Sortierschlüssel Werte wiederholen für alle Elemente, bis Sie alle Daten laden [...]

Quelle: http://docs.aws.amazon.com/amazondynamodb/latest/developerguide/GuidelinesForTables.html

Ich hoffe, das hilft. Grüße.