Fortgeschritten7 Min. Lesezeit

Wie DynamoDB-Partition-Keys funktionieren

Dein Partition Key ist keine Spalte — er ist eine Adresse. DynamoDB hasht diesen Key und der Hash entscheidet, welche physische Maschine das Item speichert. Wähle den Key gut und die Last verteilt sich; wähle ihn schlecht und ein Server kriegt die Hitze ab.

Wie funktionieren DynamoDB-Partition-Keys?

DynamoDB jagt deinen Partition Key durch eine interne Hash-Funktion, und dieser Hash entscheidet, welche physische Partition das Item speichert. Der Key wird nicht sortiert oder indexiert wie eine SQL-Spalte — er ist eine Adresse. Wähle einen High-Cardinality-Key und die Last verteilt sich über viele Partitionen; wähle einen Low-Cardinality-Key und eine einzelne Partition bekommt die gesamte Hitze ab.

  • Der Key wird gehasht, nicht sortiert. DynamoDB jagt deinen Partition Key durch einen internen Hash, um eine Partition zu wählen. Zwei benachbarte Werte landen nirgendwo nah beieinander auf der Platte.
  • Eine Partition ist eine echte Speichereinheit. Jede deckelt bei etwa 10 GB, 3.000 Read Units/s und 1.000 Write Units/s. Dein Traffic wird geteilt durch die Anzahl der Partitionen, über die sich deine Keys verteilen.
  • Hot Keys sind das Footgun. Trichtere die meisten Requests auf einen Partition-Key-Wert und du throttelst auf dieser Partition, während der Rest der Tabelle untätig liegt.
  • High-Cardinality-Keys gewinnen. Je mehr verschiedene, gleichmäßig getroffene Key-Werte du hast, desto mehr Partitionen absorbieren die Last.

Beginne damit, was der Key tatsächlich tut

Von SQL kommend ist ein Primary Key eine sortierte, indexierte Spalte, auf der du JOIN und ORDER BY machst. In DynamoDB tut der Partition Key (manchmal Hash Key genannt) etwas anderes: Er entscheidet Platzierung.

DynamoDB füttert den Partition Key in eine interne Hash-Funktion. Die Ausgabe bildet auf einen Keyspace ab, und der Keyspace ist in Bereiche zerschnitten — jeder Bereich von einer physischen Partition besessen. Diese Partition ist echter Speicher auf einer echten Node.

Also beantwortet der Partition Key eine Frage: welche Maschine hält dieses Item? Der Sort Key, falls du einen hast, ordnet Items nur innerhalb dieser Maschine. Er spielt bei der Platzierung keine Rolle.

Verfolge einen Write durch den Hash

Sagen wir, du betreibst eine SaaS, die Gerätemessungen aufnimmt. Deine Tabelle SensorReadings verwendet einen Partition Key deviceId und einen Sort Key readingTs. Du schreibst eine Messung für deviceId = "vac-7741".

Hier ist der Pfad, den dieser Write nimmt — von deinem Key bis zur Platte, auf der er landet:

Keyspace-ScheibePutItemdeviceId = 'vac-7741'Partition KeyhashenHash bildet auf einenPunkt im Keyspace abWelcher Bereichbesitzt ihn?Partition P2Item gespeichert,nach readingTs geordnet

Der Write für vac-7741 wird auf einen Punkt im Keyspace gehasht, dieser Punkt fällt in den Bereich von P2, und das Item landet auf P2 — dort nach readingTs geordnet.

Was zu verinnerlichen ist: "vac-7741" und "vac-7742" sind ein Zeichen voneinander entfernt, aber ihre Hashes sind unverwandt. Sie leben fast sicher auf verschiedenen Partitionen. Es gibt kein „in der Nähe" im Partition-Keyspace.

Das ist die Consistent-Hashing-Idee, die DynamoDB vom ursprünglichen Design erbte — das Amazon-Dynamo-Paper von 2007 („Dynamo: Amazon's Highly Available Key-value Store") verteilte Keys über Nodes durch Hashing genau so, dass keine einzelne Node zum Bottleneck wurde.

Respektiere die harten Limits der Partition

Eine physische Partition ist endlich. Laut dem AWS DynamoDB Developer Guide hält jede bis zu etwa:

LimitPro Partition
Speicher~10 GB
Read-Throughput3.000 Read Units/s
Write-Throughput1.000 Write Units/s

Wenn eine Partition über 10 GB füllt oder dein provisionierter Throughput mehr Raum braucht, splittet DynamoDB sie — der Keyspace-Bereich wird geteilt und Items verteilen sich über mehr Partitionen. Das ist automatisch; du triggerst es nicht.

Der Haken: Ein Split verteilt Items nach ihrem Hash. Wenn jeder heiße Request einen einzelnen Partition-Key-Wert anvisiert, hilft Splitten nicht — all dieser Traffic hasht weiterhin auf denselben Punkt. Du kannst die Last eines einzelnen Keys nicht über Partitionen splitten.

Benenne die Falle: die Hot Partition

Eine Hot Partition ist das klassische Footgun. Sie passiert, wenn ein Partition-Key-Wert (oder eine winzige Menge davon) einen unverhältnismäßigen Anteil des Traffics absorbiert.

Konkretes Versagen: Du stellst SensorReadings auf einen Partition Key region um, mit Werten wie "us-east", "eu-west". Drei Regionen bedeuten drei Key-Werte bedeuten — höchstens — drei Partitionen, die echte Arbeit leisten. Knall "us-east" mit Reads und es throttelt bei 3.000 RCU, während die gesamte provisionierte Kapazität der Tabelle ungenutzt liegt.

Die Adaptive Capacity von DynamoDB mildert das — sie kann ungenutzten Throughput zu einer beschäftigten Partition verschieben und einen einzelnen sehr-heißen Key auf seine eigene Partition isolieren. AWS hat das in den re:Invent-„Advanced Design Patterns for DynamoDB"-Deep-Dive-Sessions detailliert. Aber Adaptive Capacity kauft Zeit, keine Immunität: Sie kann die Last eines einzelnen Keys nicht unterteilen. Designe für Verteilung; verlass dich nicht auf das Sicherheitsnetz.

Wähle einen High-Cardinality-Key

Die Lösung ist Kardinalität — die Anzahl verschiedener Key-Werte und wie gleichmäßig der Traffic sie trifft.

  • Niedrige Kardinalität (region, status, true/false): wenige Partitionen, Traffic konzentriert sich, du throttelst früh.
  • Hohe Kardinalität (deviceId, userId, eine Order-ID): viele Werte, die über viele Partitionen hashen, Last verteilt sich, Spielraum wächst.

Von SQL kommend würdest du gerne eine status-Spalte indexieren und darauf filtern. Als DynamoDB-Partition-Key ist das eine Falle — er kann nicht verteilen. Halte Low-Cardinality-Attribute als Filter oder als Sort Key eines Secondary Index, nie als das, was die Platzierung entscheidet.

Wenn ein natürlich guter Key trotzdem schief liegt — eine Handvoll Wal-Mandanten, die den Rest überholen — füge ein Suffix hinzu, um einen logischen Wert über N Partitionen aufzufächern, z. B. tenantId#3 für einen gesharded Schreibpfad. Du re-aggregierst beim Read.

Um Items innerhalb einer Partition zu zielen, sobald dein Key verteilt ist, schreibst du eine KeyConditionExpression auf dem Sort Key. Du kannst eine gegen dein eigenes Schema im DynamoDB Expression Builder zusammenstellen, bevor du sie in Code verdrahtest:

deviceId = "vac-7741" AND readingTs BETWEEN "2026-06-01" AND "2026-06-30"

Das liest das Juni-Fenster eines Geräts aus einer einzelnen Partition — eine Query, kein Scan. Der Partition Key fixiert die Maschine; die Sort-Key-Bedingung schränkt die Zeilen ein.

Fallstricke und nächste Schritte

  • Wähle einen Key nicht danach, was sich in SQL gut liest. Wähle ihn danach, was verteilt. Kardinalität zuerst, Query-Bequemlichkeit zweitens.
  • Nimm nicht an, dass die Gesamtkapazität der Tabelle pro Key dir gehört. Throughput ist pro Partition; ein heißer Wert kann throtteln, während die Tabelle untätig aussieht.
  • Bekämpfe keinen Split. Er ist automatisch und Hash-getrieben — deine Aufgabe ist, ihm genug verschiedene Keys zu geben, um sich zu verteilen.

Sobald dein Key sauber verteilt, sind die nächsten Entscheidungen, wie du Items innerhalb einer Partition anlegst — siehe Single-Table-Design — und wann ein Secondary Index das richtige Werkzeug für ein zweites Access Pattern ist.

Lade DynoTable herunter, um deine echten Partitionen und Key-Verteilung zu durchsuchen und einen Hot Key zu erkennen, bevor er dich nachts weckt.

Aktualisiert