Datenbank in einem kommerziellen Projekt: Was tun?

Alles mit dem Ende der Ferien! ... Einige werden sagen, dass diese Glückwünsche so lala sind. Aber sicherlich werden viele bald Urlaub haben, also nehmen Sie sich etwas mehr Zeit. Nun, wir verlieren nicht an Dynamik und teilen an diesem warmen Tag die Erfahrungen unserer Partner. Es geht darum, die Arbeit mit der Datenbank zu optimieren. Weitere Details unter dem Schnitt!



Ich gebe dem Autor das Wort.

Wir begrüßen Sie, Leser von Habr! Wir sind das WaveAccess- Team. In diesem Artikel werden wir Ihnen die Erfahrungen mit der Verwendung des Azure Cosmos DB-Datenbankdienstes (DB) in einem kommerziellen Projekt mitteilen . Wir werden Ihnen erklären, warum die Datenbank vorgesehen ist und mit welchen Nuancen wir uns während der Entwicklung auseinandersetzen mussten.

Was ist Azure Cosmos DB?


Azure Cosmos DB ist ein kommerzieller, global verteilter Datenbankdienst mit einem Paradigma für mehrere Modelle, der als PaaS-Lösung bereitgestellt wird. Sie ist die nächste Generation von Azure DocumentDB.

Die Datenbank wurde 2017 von Microsoft unter Beteiligung von Leslie Lamport, Ph.D. in Computer Science, entwickelt (Turing-Preisträger 2013 für einen grundlegenden Beitrag zur Theorie verteilter Systeme, LaTex-Entwickler, Entwickler der TLA + -Spezifikation).

Die Hauptmerkmale von Azure Cosmos DB sind:

  • Nicht relationale Datenbank;
  • Die darin enthaltenen Dokumente werden als JSON gespeichert.
  • Horizontale Skalierung mit einer Auswahl geografischer Regionen;



  • Datenparadigma für mehrere Modelle: Schlüsselwert, Dokument, Diagramm, Spaltenfamilie;
  • Geringe Latenz für 99% der Anforderungen: weniger als 10 ms für Leseoperationen und weniger als 15 ms für (indizierte) Schreiboperationen;
  • Entwickelt für hohen Durchsatz;
  • Es garantiert Verfügbarkeit, Datenkonsistenz und Latenz auf SLA-Ebene von 99,999%.
  • Konfigurierbare Bandbreite
  • Automatische Replikation (Master-Slave);
  • Automatische Indizierung von Daten;
  • Anpassbare Datenkonsistenzstufen. 5 verschiedene Ebenen (Stark, Begrenzte Stalenität, Sitzung, Konsistentes Präfix, Eventuell);

In der Grafik sehen Sie die Abhängigkeit verschiedener Konsistenzstufen von der Verfügbarkeit, Leistung und Konsistenz von Daten.



  • Für den bequemen Übergang von der Datenbank zu Cosmos DB gibt es viele APIs für den Zugriff auf Daten: SQL, JavaScript, Gremlin, MongoDB, Cassandra, Azure Blob;
  • Anpassbare Firewall;
  • Benutzerdefinierte Datenbankgröße.

Die Aufgabe, die wir gelöst haben


Tausende von Sensoren auf der ganzen Welt übertragen alle paar N Sekunden Informationen (im Folgenden: Benachrichtigungen). Diese Benachrichtigungen müssen in der Datenbank gespeichert und dann gesucht und in der Benutzeroberfläche des Systembetreibers angezeigt werden.

Kundenanforderungen:

  • Verwenden eines Stapels von Microsoft-Technologien, einschließlich der Azure-Cloud;
  • Durchsatz von 100 Anfragen pro Sekunde;
  • Benachrichtigungen haben keine klare Struktur und könnten weiter ausgebaut werden.
  • Für kritische Benachrichtigungen ist die Verarbeitungsgeschwindigkeit wichtig.
  • Hohe Systemstabilität.

Basierend auf den Kundenanforderungen wurden wir idealerweise von einer nicht relationalen, global verteilten, zuverlässigen kommerziellen Datenbank angesprochen.



Wenn wir uns Datenbanken ansehen, die Cosmos DB ähnlich sind, können wir uns an Amazon DynamoDB, Google Cloud Spanner, erinnern. Amazon DynamoDB ist jedoch nicht global verteilt, und Google Cloud Spanner weist weniger Konsistenzstufen und Datenmodelltypen auf (nur tabellarisch, relational).

Aus diesen Gründen haben wir uns für Azure Cosmos DB entschieden. Für die Interaktion mit der Datenbank haben wir das Azure Cosmos DB SDK für .NET verwendet , da das Backend in .NET geschrieben wurde.

Die Nuancen, denen wir begegnet sind


1. Datenbankverwaltung

Um die Datenbank verwenden zu können, müssen Sie zunächst ein Tool zur Verwaltung auswählen. Wir haben Azure Cosmos DB Data Explorer im Azure-Portal und im DocumentDbExplorer verwendet . Es gibt auch ein Azure Storage Explorer-Dienstprogramm.



2. Einrichten von Datenbanksammlungen

In Cosmos DB besteht jede Datenbank aus Sammlungen und Dokumenten.

Anpassbare Sammlungsfunktionen, auf die Sie achten sollten:

  • Sammlungsgröße: fest oder unbegrenzt;
  • Bandbreite in Einheiten von Anforderungen pro Sekunde RU / s (ab 400 RU / s);



  • Indizierungsrichtlinie (einschließlich oder ausgenommen Dokumente und Pfade zum und vom Index, Einrichten verschiedener Indextypen, Einrichten von Indexaktualisierungsmodi).

Typisches Indexbeispiel

{ "id": "datas", "indexingPolicy": { "indexingMode": "consistent", "automatic": true, "includedPaths": [ { "path": "/*", "indexes": [ { "kind": "Range", "dataType": "Number", "precision": -1 }, { "kind": "Hash", "dataType": "String" }, { "kind": "Spatial", "dataType": "Point" } ] } ], "excludedPaths": [] } } 

Damit die Teilstringsuche funktioniert, müssen Sie für Zeichenfolgenfelder den Hash-Index verwenden ("kind": "Hash").

3. Datenbanktransaktionen

Transaktionen werden in der Datenbank auf der Ebene gespeicherter Prozeduren implementiert (das Ausführen einer gespeicherten Prozedur ist eine atomare Operation). Gespeicherte JavaScript-Prozeduren

 var helloWorldStoredProc = { id: "helloWorld", body: function () { var context = getContext(); var response = context.getResponse(); response.setBody("Hello, World"); } } 

4. Datenbankwechselkanal

Feed ändern hört Änderungen in der Sammlung. Wenn Änderungen an Sammlungsdokumenten vorgenommen werden, löst die Datenbank ein Ereignis über Änderungen an allen Abonnenten dieses Kanals aus.

Wir haben Change Feed verwendet, um Änderungen an der Sammlung zu verfolgen. Beim Erstellen eines Kanals müssen Sie zunächst eine AUX-Hilfssammlung erstellen, die die Verarbeitung des Änderungskanals für mehrere Arbeitsrollen koordiniert.

5. Datenbankbeschränkungen:

  • Fehlende Massenoperationen (verwendete gespeicherte Prozeduren zum Löschen von Massen , Aktualisieren von Dokumenten);
  • Fehlende teilweise Aktualisierung des Dokuments;
  • Keine SKIP-Operation (Komplexität der Paginierungsimplementierung). Um die Paginierung in Benachrichtigungsanforderungen zu implementieren, haben wir RequestContinuation (Link zum letzten Element als Ergebnis der Ausgabe) und MaxItemCount (Anzahl der von der Datenbank zurückgegebenen Elemente) verwendet. Standardmäßig werden die Ergebnisse stapelweise zurückgegeben (nicht mehr als 100 Artikel und nicht mehr als 1 MB in jedem Paket). Die Anzahl der zurückgegebenen Artikel kann mit dem Parameter MaxItemCount auf 1000 erhöht werden.

6. Verarbeitung des 429. Datenbankfehlers

Wenn die Erfassungsbandbreite ihr Maximum erreicht, generiert die Datenbank den Fehler "429 Too Many Request". Um dies zu verarbeiten, können Sie die Einstellung RetryOptions im SDK verwenden, wobei MaxRetryAttemptOnThrottledRequests die Anzahl der Versuche zum Abschließen der Anforderung und MaxRetryWaitTimeInSeconds die Gesamtzeit der Verbindungsversuche ist.

7. Prognose der Kosten für die Nutzung der Datenbank

Um die Kosten für die Nutzung der Datenbank vorherzusagen, haben wir den Online-Rechner RU / s verwendet. Im Basisplan entspricht eine Anforderungseinheit für ein Element von 1 KB einem einfachen GET-Befehl durch eine Verknüpfung mit sich selbst oder der Kennung dieses Elements.

Schlussfolgerungen


Azure Cosmos DB ist einfach zu verwenden, einfach und flexibel über das Azure-Portal zu konfigurieren. Die vielen Datenzugriffs-APIs erleichtern die Migration zu Cosmos DB. Sie müssen keinen Datenbankadministrator beauftragen, um die Datenbank zu verwalten. SLA-Finanzgarantien und globale horizontale Skalierung machen diese Datenbank auf dem Markt sehr attraktiv. Es eignet sich für den Einsatz in Unternehmen und globalen Anwendungen, die hohe Anforderungen an Fehlertoleranz und Bandbreite stellen. Wir bei WaveAccess verwenden Cosmos DB weiterhin in unseren Projekten.

Über den Autor


Das WaveAccess- Team erstellt technisch anspruchsvolle, hoch geladene und fehlertolerante Software für Unternehmen auf der ganzen Welt. Alexander Azarov , Senior Vice President für Softwareentwicklung bei WaveAccess, kommentiert:

Auf den ersten Blick können schwierige Aufgaben mit relativ einfachen Methoden gelöst werden. Es ist wichtig, nicht nur neue Werkzeuge zu erlernen, sondern auch das Wissen über bekannte Technologien zu perfektionieren.

Firmenblog

Source: https://habr.com/ru/post/de413757/


All Articles