Datenbankpartitionierung
Wie auf der Seite Wie werden die Daten gespeichert seite, partitionierte Datenbanken Ihrer Anwendung die Möglichkeit, Dokumente auf demselben shard unter Verwendung des Dokumentpartitionsschlüssels. Diese Seite hilft Ihnen herauszufinden, ob Ihr datenmodell für die Verwendung mit partitionierten Datenbanken geeignet ist.
IBM® Cloudant® for IBM Cloud® unterstützt zwei Datenbanktypen:
- Nicht aufgeteilt: der Standardtyp. Die Dokumente werden von der Datenbank automatisch Shards zugewiesen, um die Arbeitslast auszugleichen.
- Partitioniert: Die Dokument-IDs enthalten einen anwendungsspezifischen Partitionsschlüssel, der sich darauf auswirkt, wie die Daten den Shards zugeordnet werden.
IBM Cloudant empfiehlt, eine partitionierte Datenbank nur dann zu verwenden, wenn das Datenmodell eine logische Partitionierung von Dokumenten in viele (500+) Partitionen zulässt. Unter Bestimmen der Eignung von partitionierten Datenbanken erfahren Sie, ob Ihre Anwendung partitionierte Datenbanken verwenden kann.
Aus der Sicht der Anwendung besteht der Hauptunterschied zwischen einer nicht partitionierten und einer partitionierten Datenbank darin, wie Sie Ihre Daten abfragen können:
- Bei einer nicht partitionierten Datenbank können nur globale sekundäre Indizes erstellt und abgefragt werden.
- In einer partitionierten Datenbank können sowohl globale als auch partitionierte sekundäre Indizes erstellt und abgefragt werden.
Dieses Dokument enthält nähere Angaben zu den Verwendungszwecken der einzelnen Indexarten.
Grenzwerte für partitionierte Datenbanken
Partitionierte Datenbanken haben Grenzen für die Anzahl der Indizes und die Gesamtgröße aller Dokumente mit demselben Partitionsschlüssel aller Dokumente mit demselben Partitionsschlüssel.
Partitionsbezogene Abfragen haben ein kürzeres, vom Dienst erzwungenes Timeout als globale abfragen und eine geringere Begrenzung der Gesamtzahl der Dokumente, die mit einer Anfrage abgerufen werden können HTTP anfrage abgerufen werden können.
Einzelheiten zu diesen Beschränkungen finden Sie unter IBM Cloudant.
Gründe für die Verwendung einer partitionierten Datenbank
Partitionierte Datenbanken sind ideal, wenn Ihre Anwendung von der Gruppierung zusammengehöriger Dokumente profitiert und eine vorhersehbare, skalierbare Abfrageleistung benötigt.
Eine partitionierte Datenbank ermöglicht sowohl Abfragen auf Partitions-Ebene als auch globale Abfragen. Die partitionsbezogene Abfrage nutzt die gemeinsame Lage von Dokumenten mit einem bestimmten Partitionsschlüssel und ermöglicht eine effizientere und skalierbare Abfrageleistung. Bei Workloads, die in Form eines Partitionsschlüssels ausgedrückt werden können, kann dies abfragelatenz und Kosten erheblich reduzieren.
Die Partitionierung ist besonders wertvoll, wenn Ihre Anwendung eine vorhersehbare leistung im großen Maßstab benötigt. Abfragen mit Partitionierung, die Indizes effektiv nutzen indizes nutzen, bleiben schnell, auch wenn der Datenbestand wächst, und lassen sich effizient über bis zu 64 Shards skalieren. Daher sind partitionierte Datenbanken gut geeignet für arbeitslasten mit hohem Durchsatz und niedriger Latenz.
Wenn der Datensatz viele Datenbank-Shards erfordert, verwenden Anwendungen typischerweise partitionsbezogene Abfragen für latenzempfindliche Operationen, während globale Abfragen für weniger zeitkritische Aufgaben wie die Stapelverarbeitung reserviert sind.
Gründe, warum partitionierte Datenbanken möglicherweise nicht geeignet sind
Partitionierte Datenbanken erfordern eine sorgfältige Datenmodellierung und unter Umständen die Duplizierung von indizes erfordern. Für viele Anwendungsfälle lohnt sich dieser Mehraufwand nicht.
Partitionierte Datenbanken bieten zwar Leistungsvorteile, wenn sie richtig eingesetzt werden, führen sie Einschränkungen ein, die nicht für jede Arbeitslast geeignet sind. Sie müssen einen sinnvollen Partitionsschlüssel für Ihre Anwendungen definieren, der zusammengehörige dokumente gruppiert und eine effiziente Abfrage unterstützt. Wenn jedes Dokument einen eindeutigen Schlüssel hat, oder wenn es zu wenige Partitionsschlüssel gibt, schneiden partitionierte Datenbanken wahrscheinlich schlechter als nicht partitionierte Datenbanken.
Für Abfragen mit Partitionierungsbereich müssen Sie partitionierte Indizes erstellen. Dies kann je nach den Zugriffsmustern Ihrer Anwendung die Pflege sowohl globaler als auch partitionierter Indizes zugriffsmustern Ihrer Anwendung.
Bestimmung der Eignung einer partitionierten Datenbank
Sie kennen nun die Vor- und Nachteile von partitionierten Datenbanken, der nächste Schritt besteht darin, zu verstehen, ob Ihr Datenmodell mit einer partitionierten Datenbank funktioniert.
Bewerten Sie Ihr Datenmodell und Ihre Anwendungsanforderungen anhand dieser Kriterien, um die Eignung einer partitionierten Datenbank:
- Eine hohe Kardinalität der Partitionsschlüssel ist von entscheidender Bedeutung: Die Anzahl der eindeutigen Partitionsschlüssel sollte weitaus größer sein als die Anzahl der Scherben.
- Die Abfragelast muss gleichmäßig verteilt sein: Wenn die meisten Abfragen auf einen einzigen Partitionsschlüssel abzielen, können Hotspots entstehen und die Leistung beeinträchtigen.
- Partitionsschlüssel sollten zusammengehörige Dokumente gruppieren: Wenn jeder Schlüssel nur einem Dokument zugeordnet ist, bietet die Partitionierung nur wenig Nutzen.
Gute und schlechte Trennwand - Schlüsselbeispiele
Um dies zu begründen, wollen wir uns einige Anwendungsfälle und einige gute und schlechte Entscheidungen für einen partitionsschlüssel.
| Anwendungsfall | Partitionsschlüssel | Gut oder schlecht | Grund |
|---|---|---|---|
| E-Commerce-System - Bestellungen | customer_id |
Gut | Hohe Kardinalität und Abfragen sind auf viele Kunden verteilt. |
| E-Commerce-System - Bestellungen | order_id |
Ungültig | Ein Dokument pro Partition; keine Gruppierung oder Wiederverwendung. |
| E-Commerce-System - Bestellungen | status |
Ungültig | Geringe Kardinalität der Statuswerte (vorläufig, bezahlt, erstattet, storniert) erzeugt zu wenige Partitionen. |
| E-Commerce-System - Bestellungen | country_code |
Ungültig | Geringe Kardinalität; einige wenige Länder dominieren den Verkehr. |
| IoT - Sensormesswerte | device_id |
Gut | Viele Geräte erzeugen Daten und verteilen die Last gleichmäßig. |
| IoT - Sensormesswerte | reading_id |
Ungültig | Eindeutig pro Dokument; Partitionen enthalten nur ein Element. |
| IoT - Sensormesswerte | date |
Ungültig | Die meisten Suchanfragen zielen auf aktuelle Daten ab, was zu Hotspots führt. |
| IoT - Sensormesswerte | region |
Ungültig | Einige wenige Regionen können den Verkehr dominieren, was zu einem Ungleichgewicht führt. |
Es gibt Anwendungsfälle, in denen es keine geeignete Wahl für einen Partitionsschlüssel gibt. In diesen Fällen ist eine nicht partitionierte Datenbank die beste Wahl. Dies kann z. B. eine Datenbank von Benutzern sein, in der E-Mail-Adressen, Kennworthashes und Datumsangaben der letzten Anmeldungen gespeichert werden. Keines dieser Felder eignet sich als Partitionsschlüssel, daher muss stattdessen eine nicht partitionierte Datenbank verwendet werden.
Erstellen von partitionierten Datenbanken und Indizes
Sie müssen bei der Erstellung der Datenbank entscheiden, ob eine Partitionierung erfolgen soll. Geben Sie beim Erstellen der Datenbank durch den Abfragezeichenfolgeparameter partitioned an, ob es sich um eine partitionierte Datenbank
handelt. Die Standardeinstellung für „ partitioned “ lautet „ false “.
Ähnlich ist ein Index entweder global oder partitioniert; Sie legen dies fest, wenn Sie sie legen dies fest, wenn Sie einen Index über das Feld partitioned in Ihrem Entwurfsdokument erstellen. Alle indizes im Entwurfsdokument
erben das Feld partitioned des Entwurfs dokuments. Wenn Sie einen partitionierten Index abfragen, verwenden Sie partitionierte Abfragen die den abzufragenden Partitionsschlüssel in Ihrer Anfrage enthalten.
Der Partitionierungstyp eines Indexes oder einer Datenbank kann nach seiner Erstellung nicht mehr geändert werden.
Abfragen, die auf Partitionen beschränkt sind, können nur auf partitionierte Indizes durchgeführt werden. Ähnlich, können globale Abfragen nur an globalen Indizes vorgenommen werden.
Abfragen
IBM Cloudant unterstützt sowohl globale als auch partitionierte Abfragen. Um beide Typen effektiv zu nutzen, müssen für jeden Abfragebereich separate für jeden Abfragebereich erstellt werden.
Globale Abfragen funktionieren gut in Datenbanken mit geringer Shard-Anzahl (16 oder weniger), sie eignen sich jedoch weniger für latenzempfindliche Operationen, wenn die Anzahl der shards zunimmt. Im Gegensatz dazu skalieren Abfragen mit Partitionierung effizient mit und sind die bevorzugte Option für Anwendungen, die eine vorhersehbare vorhersehbare Leistung mit geringer Latenz für große Datensätze benötigen.
Um von partitionsspezifischen Abfragen zu profitieren, muss die Mehrzahl der Anwendungsabfragen auf bestimmte Partitionsschlüssel abzielen. Dies ermöglicht der Datenbank, die Vorteile der die Vorteile des gemeinsamen Standorts von Dokumenten zu nutzen und eine konsistente Leistung in großem Umfang zu liefern.
Unter Wie sich Sharding auf die Datenbankleistung auswirkt finden Sie Details darüber, wie globale und partitionierte Abfragen die Leistung Ihrer Datenbankoperationen beeinflussen.
Globale Abfrage
Sie können globale Abfragen durchführen:
Standardmäßig wird ein globaler Index erstellt, aber Sie können auch explizit einen globalen Index mit "options.partitioned": false in Ihrem Entwurfsdokument erstellen:
{
"options": {
"partitioned": false
},
"views": {
"by-device": {
"map": "function(doc) { emit(doc.deviceID, doc.infrastructureID) }"
}
}
}
Abfragen mit Partitionierung
Sie können Abfragen mit Partitionierung durchführen, indem Sie:
Um einen partitionierten Index zu erstellen, der Abfragen mit Partitionierung unterstützt, geben Sie "options.partitioned": true in Ihrem Entwurfsdokument an:
{
"options": {
"partitioned": true
},
"views": {
"by-device": {
"map": "function(doc) { emit(doc.deviceID, doc.infrastructureID) }"
}
}
}
Lernprogramme für partitionierte Datenbanken
Partitionierte Datenbanken sind auf den ersten Blick schwer zu verstehen. In diesen beiden Beispielen können Sie die Konzepte in Aktion sehen:
- Lesen Sie " Erstellen eines IoT Historikers mit partitionierten Datenbanken ", um einen tiefen Einblick in partitionierte Datenbanken mit Beispielen in verschiedenen Programmiersprachen zu erhalten.
- In diesem Blog-Artikel erfahren Sie mehr über partitionierte Datenbanken und „ Node.js “ – darunter auch, wie man eine partitionierte Datenbank erstellt, sowie Informationen zu Suchfunktionen, Views und einem globalen Index.