Datenbanken auf der IIoT-Plattform: Funktionsweise von Mail.ru Cloud Solutions mit Petabyte an Daten von mehreren Geräten


Hallo, ich bin Andrey Sergeev, der Leiter der Entwicklungsgruppe für IoT-Lösungen bei Mail.ru Cloud Solutions . Es ist bekannt, dass keine universelle Datenbank existiert. Insbesondere, wenn Sie eine Internet-of-Things-Plattform aufbauen müssen, die in der Lage ist, Millionen von Ereignissen von Sensoren pro Sekunde nahezu in Echtzeit zu verarbeiten.

Unser Produkt Mail.ru IoT Platform begann mit einem Prototyp, der auf Tarantool basiert. Ich werde Ihnen sagen, welchen Weg wir gegangen sind, auf welche Probleme wir gestoßen sind und wie wir sie gelöst haben. Und zeigen Sie auch die aktuelle Architektur der modernen Plattform des industriellen Internet der Dinge. In dem Artikel werden wir sprechen:

  • über unsere Datenbankanforderungen, die universelle Lösung und den CAP-Satz;
  • ob die Datenbank + der Anwendungsserver in einem Ansatz eine Silberkugel ist;
  • über die Entwicklung der Plattform und der darin verwendeten Datenbanken;
  • , Tarantool’ .

, @Databases Meetup by Mail.ru Cloud Solutions. , :



Mail.ru IoT Platform


Unser Produkt Mail.ru IoT Platform ist eine skalierbare und hardwareunabhängige Plattform zum Erstellen von Lösungen für das industrielle Internet der Dinge. Sie können damit Daten von Hunderttausenden von Geräten gleichzeitig erfassen und diesen Stream im Echtzeitmodus (d. H. Quasi-Echtzeit) verarbeiten, einschließlich der Verwendung benutzerdefinierter Regeln - Skripte in Python oder Lua.

Die Plattform kann eine unbegrenzte Menge an Rohdaten aus Quellen speichern. Es gibt eine Reihe vorgefertigter Komponenten zur Visualisierung und Analyse von Daten, integrierte Tools für die prädiktive Analyse und die Erstellung von Anwendungen auf der Basis der Plattform.


So sieht das Gerät der Mail.ru IoT-Plattform aus.

Derzeit steht die Plattform für die Installation nach dem On-Premise-Modell beim Kunden zur Verfügung. In diesem Jahr ist geplant, die Plattform als Service in der öffentlichen Cloud freizugeben.

Tarantool-Prototyp: Wie alles begann


Unsere Plattform begann als Pilotprojekt - ein Prototyp mit einer einzelnen Instanz von Tarantool, dessen Hauptfunktion darin bestand, den Datenfluss von einem OPC-Server zu empfangen, empfangene Ereignisse mithilfe von Lua-Skripten in Echtzeit zu verarbeiten, darauf basierende Schlüsselindikatoren zu überwachen und Ereignisse und Warnungen in zu generieren überlegene Systeme.


Tarantool-Prototyp-Schema

Dieser Prototyp arbeitete sogar mehrere Monate unter Kampfbedingungen an einem Cluster-Standort. Er ist eine Plattform für die Ölförderung auf hoher See im Irak am Persischen Golf. Er überwachte Schlüsselindikatoren und lieferte Daten für das Visualisierungssystem und das Ereignisprotokoll. Der Pilot wurde als erfolgreich anerkannt, aber wie so oft bei Prototypen - er ging nicht über den Piloten hinaus und der Prototyp wurde lange Zeit auf Eis gelegt, bis er in unsere Hände fiel.

Unsere Ziele bei der Entwicklung einer IoT-Plattform


Zusammen mit dem Prototyp hatten wir die Aufgabe, eine vollwertige, skalierbare und fehlertolerante IoT-Plattform zu erstellen, die später als Dienst in einer öffentlichen Cloud gestartet werden konnte.

Wir mussten eine Plattform mit der folgenden Einführung erstellen:

  1. Schließen Sie Hunderttausende von Geräten gleichzeitig an.
  2. Erhalten Sie Millionen von Ereignissen pro Sekunde.
  3. Stream-Verarbeitung im Echtzeitmodus.
  4. Speicherung von Rohdaten über mehrere Jahre.
  5. Tools für Streaming-Analysen und historische Analysen.
  6. Bereitstellungsunterstützung in mehreren Rechenzentren für maximale Notfallwiederherstellung.

Vor- und Nachteile des Plattformprototyps


Zum Zeitpunkt des Beginns der aktiven Entwicklung sah der Prototyp wie folgt aus:

  • Tarantool, das als Datenbank + Anwendungsserver (Anwendungsserver) verwendet wird;
  • Alle Daten werden im Tarantool-Speicher gespeichert.
  • Eine Anwendung auf Lua im selben Tarantool, die die Funktionen zum Empfangen, Verarbeiten und Aufrufen von Benutzerskripten für eingehende Daten ausführt.

Dieser Ansatz zum Erstellen von Anwendungen hat seine Vorteile :

  1. Der Code und die Daten befinden sich an einem Ort, sodass Sie die Daten direkt im Speicher der Anwendung verarbeiten können und die für herkömmliche Anwendungen typischen Overhead-Kosten für Netzwerkbesuche entfallen.
  2. Tarantool verwendet JIT (Just in Time Compiler) für Lua, das zur Kompilierungszeit Lua-Code in Maschinencode kompiliert, wodurch einfache Lua-Skripte mit einer Geschwindigkeit ausgeführt werden können, die mit C-Code vergleichbar ist (40.000 RPS von einem Kern - und dies ist nicht die Grenze !).
  3. Tarantool basiert auf kooperativem Multitasking, dh jeder Aufruf der gespeicherten Prozedur wird in einer eigenen Faser gestartet, einem Analogon von Coroutine, das die Leistung bei Aufgaben mit E / A-Vorgängen, z. B. Netzwerkbesuchen, noch weiter steigert.
  4. Effiziente Ressourcennutzung - Nur wenige Tools können 40.000 Anforderungen pro Sekunde von einem einzelnen CPU-Kern aus verarbeiten.

Es gibt jedoch erhebliche Nachteile :

  1. Wir müssen Rohdaten von Geräten mehrere Jahre lang speichern, aber wir haben nicht Hunderte von Petabyte Speicher für Tarantool.
  2. Eine direkte Folge des ersten Plus: Der gesamte Code unserer Plattform sind gespeicherte Prozeduren in der Datenbank. Dies bedeutet, dass jede Aktualisierung der Codebasis der Plattform eine Aktualisierung der Datenbank ist, was sehr schmerzhaft ist.
  3. , . , Tarantool 24-32 (Tarantool ) . — Tarantool, .
  4. . - , Tarantool Lua , - , LuaJIT .

Fazit: Tarantool ist eine gute Wahl für die Erstellung von MVP, aber für eine vollwertige, skalierbare, einfach zu unterstützende und fehlertolerante IoT-Plattform, die Daten von Hunderttausenden von Geräten empfangen, verarbeiten und speichern kann, ist es nicht geeignet.

Die Hauptschmerzen des Prototyps, die wir loswerden wollten


Zunächst wollten wir zwei Schmerzen unseres Prototyps heilen:

  1. Verlassen Sie das Konzept des Datenbank- und Anwendungsdienstes. Wir wollten den Anwendungscode unabhängig vom Datenspeicher aktualisieren.
  2. Vereinfachen Sie die dynamische Skalierung unter Last. Ich wollte eine einfache unabhängige horizontale Skalierung von so vielen Funktionen wie möglich erhalten.

Um diese Probleme zu lösen, haben wir einen innovativen und noch nicht getesteten Ansatz gewählt: Microservice-Architektur und Trennung von Diensten in Stateless-Anwendungen und Stateful-Datenbanken.

Um den Betrieb und die horizontale Skalierung von zustandslosen Diensten weiter zu vereinfachen, haben wir sie containerisiert und Kubernetes übernommen.


Wir haben herausgefunden, dass zustandslose Dienste noch zu entscheiden sind, was mit den Daten geschehen soll.

Grundlegende Datenbankanforderungen für die IoT-Plattform


Anfangs wollten wir den Garten nicht umzäunen und alle Plattformdaten in einer universellen Datenbank speichern. Nach der Analyse der Ziele kamen wir zu der folgenden Liste von Anforderungen für eine universelle Datenbank:

  1. ACID- — , .
  2. — .
  3. — , near real-time.
  4. — - .
  5. — , .
  6. — ( !), .
  7. — , ( !).
  8. SQL — .

CAP-


Bevor wir anfingen, alle auf dem Markt befindlichen Datenbanken zu sortieren, um unsere Anforderungen zu erfüllen, haben wir uns entschlossen, unsere Anforderungen an die Vernunft mit einem ziemlich bekannten Tool - CAP-Theoremen - zu validieren.

Das CAP-Theorem besagt, dass ein verteiltes System maximal zwei der folgenden drei Eigenschaften haben kann:

  1. Konsistenz (Datenkonsistenz) - In allen Rechenknoten zu einem bestimmten Zeitpunkt widersprechen sich die Daten nicht.
  2. Verfügbarkeit - Jede Anfrage an ein verteiltes System endet mit einer korrekten Antwort, jedoch ohne Garantie, dass die Antworten aller Knoten im System übereinstimmen.
  3. Partitionstoleranz - Auch wenn keine Verbindung zwischen Knoten besteht, arbeiten diese weiterhin unabhängig voneinander.


Das klassische CA-System ist beispielsweise ein PostgreSQL-Master-Slave-Cluster mit synchroner Replikation, und das klassische AP-System ist Cassandra.

Kehren wir zu unseren Anforderungen zurück und klassifizieren sie anhand des CAP-Theorems:

  1. ACID-Transaktionen und strenge Konsistenz (oder zumindest keine eventuelle Konsistenz) sind C.
  2. Die horizontale Skalierung zum Schreiben und Lesen sowie die hohe Verfügbarkeit beträgt A (Multi-Master).
  3. Die Fehlertoleranz ist P, wenn ein Rechenzentrum ausfällt, sollte die Plattform nicht sterben.


Schlussfolgerung : Die universelle Datenbank, die wir benötigen, muss alle drei Eigenschaften des CAP-Theorems haben, was bedeutet, dass es keine universelle Datenbank für alle unsere Anforderungen gibt.

Auswählen einer Datenbank für die Daten, mit denen die IoT-Plattform arbeitet


Wenn Sie keine universelle Datenbank auswählen können, haben wir uns entschieden, die Datentypen auszuwählen, mit denen die Plattform arbeiten soll, und für jeden Typ eine Datenbank auszuwählen.

In erster Näherung haben wir die Daten in zwei Typen unterteilt:

  1. Metainformationen sind ein Modell der Welt, Geräte, Einstellungen, Regeln, fast alle Daten, außer denen, die Endgeräte übertragen.
  2. Rohdaten von Geräten - Sensorwerte, Telemetrie und Serviceinformationen von Geräten. Tatsächlich handelt es sich hierbei um Zeitreihen, in denen jede einzelne Nachricht einen Wert und einen Zeitstempel enthält.

Auswählen einer Datenbank für Metadaten


Datenbankanforderungen für Metadaten . Metadaten sind von Natur aus relational. Sie zeichnen sich durch eine geringe Menge aus, werden selten geändert, sind jedoch wichtige Daten und können nicht verloren gehen. Daher ist die Konsistenz auch im Rahmen der asynchronen Replikation sowie der ACID-Transaktionen und der horizontalen Leseskalierung wichtig.

Es gibt relativ wenig solcher Daten und sie werden relativ selten geändert, sodass Sie die horizontale Skalierung für die Aufzeichnung sowie die mögliche Unzugänglichkeit der Aufzeichnungsdatenbank im Falle eines Unfalls opfern können. Das heißt, im Sinne des CAP-Theorems benötigen wir ein CA-System.

Welches ist im Normalfall geeignet . Mit einer solchen Problemstellung wäre jede klassische relationale Datenbank mit Unterstützung für Cluster mit asynchroner Replikation wie PostgreSQL oder MySQL für uns durchaus geeignet.

Merkmale unserer Plattform . Wir brauchten auch Unterstützung für Bäume mit spezifischen Anforderungen. Als Teil des Prototyps gab es eine Funktion aus den Systemen der BDVV-Klasse (Echtzeitdatenbanken) - die Modellierung der Welt mithilfe eines Tag-Baums. Mit ihnen können Sie alle Clientgeräte in einer Baumstruktur kombinieren, was die Verwaltung einer großen Anzahl von Geräten und deren Anzeige erleichtert.


So sieht die Anzeige von Geräten in Form einer Baumstruktur aus. Mit einem

solchen Baum können Sie Endgeräte mit der Umgebung verknüpfen. Sie können beispielsweise Geräte, die sich physisch in einem Raum befinden, in einem Teilbaum platzieren, was die Arbeit mit ihnen in Zukunft erheblich erleichtert. Dies ist eine praktische Funktion, außerdem wollten wir in der Nische des Luftzündsystems arbeiten, und dort ist das Vorhandensein einer solchen Funktionalität tatsächlich der Industriestandard.

Für die vollständige Implementierung von Tag-Bäumen muss eine potenzielle Datenbank die folgenden Anforderungen erfüllen:

  1. Unterstützung für Bäume mit beliebiger Breite und Tiefe.
  2. Änderung von Baumelementen in ACID-Transaktionen.
  3. Hohe Leistung beim Überqueren eines Baumes.

Klassische relationale Datenbanken können mit kleinen Bäumen ziemlich gut umgehen, aber mit beliebigen Bäumen nicht so gut.

Mögliche Lösung. Verwenden Sie zwei Datenbanken - eine Diagrammdatenbank zum Speichern eines Baums und eine relationale Datenbank zum Speichern der restlichen Metainformationen.

Dieser Ansatz hat mehrere große Nachteile gleichzeitig:

  1. Um die Konsistenz zwischen zwei Datenbanken sicherzustellen, müssen Sie einen externen Transaktionskoordinator hinzufügen.
  2. Dieses Design ist schwer zu warten und nicht sehr zuverlässig.
  3. Bei der Ausgabe erhalten wir zwei Datenbanken anstelle von einer, während die Diagrammdatenbank nur zur Unterstützung eingeschränkter Funktionen benötigt wird.


Eine mögliche, aber nicht sehr gute Lösung mit zwei Datenbanken


Unsere Lösung zum Speichern von Metadaten . Wir haben auch gedacht und uns daran erinnert, dass diese Funktionalität ursprünglich in einem auf Tarantool basierenden Prototyp implementiert wurde und sich als sehr gut herausstellte.

Bevor ich fortfahre, möchte ich eine nicht standardmäßige Definition von Tarantool geben: Tarantool ist keine Datenbank, sondern eine Reihe von Grundelementen zum Erstellen einer Datenbank für Ihren speziellen Fall.

Sofort verfügbare Grundelemente:

  • Speicherplatz - ein Analogon der Tabellen in der Datenbank zum Speichern von Daten.
  • Vollwertige ACID-Transaktionen.
  • Die Replikation erfolgt asynchron mithilfe von WAL-Protokollen.
  • Ein Sharding-Tool, das das automatische Resharding unterstützt.
  • Superschnelles LuaJIT für gespeicherte Prozeduren.
  • Große Standardbibliothek.
  • LuaRocks Paketmanager mit noch mehr Paketen.

Unsere CA-Lösung war eine relationale + Graph-Datenbank, die auf Tarantool basierte. Wir haben das Traum-Meta-Informations-Repository basierend auf Tarantool-Grundelementen zusammengestellt:

  • Platz für Datenspeicherung.
  • ACID-Transaktionen - waren verfügbar.
  • Asynchrone Replikation - war verfügbar.
  • Beziehungen - für gespeicherte Prozeduren.
  • Bäume - auch auf gespeicherten Prozeduren erstellt.

Die Cluster-Installation, die wir haben, ist klassisch für solche Systeme - ein Master zum Schreiben und mehrere Slive mit asynchroner Replikation zum Skalieren zum Lesen.

Das Ergebnis: eine schnelle, skalierbare Mischung aus relationaler und grafischer Datenbank. Eine einzelne Tarantool-Instanz kann Tausende von Leseanforderungen verarbeiten, einschließlich solcher mit aktivem Baumdurchlauf.

Auswählen einer Datenbank für Daten von Geräten


Datenbankanforderungen für Daten von Geräten . Diese Daten zeichnen sich durch häufiges Aufzeichnen und eine große Datenmenge aus: Millionen von Geräten, mehrjährige Speicherung, Petabyte an Informationen sowohl eingehender als auch gespeicherter Daten. Ihre hohe Verfügbarkeit ist wichtig, da es hauptsächlich die Sensorwerte sind, die sowohl für Benutzerregeln als auch für unsere internen Dienste gelten.

Für eine Datenbank sind die horizontale Skalierung zum Lesen und Schreiben, die Verfügbarkeit und Fehlertoleranz sowie die Verfügbarkeit vorgefertigter Analysetools für die Arbeit mit diesem Datenarray, vorzugsweise basierend auf SQL, wichtig. Gleichzeitig können wir Konsistenz- und ACID-Transaktionen opfern.

Das heißt, im Rahmen des CAP-Theorems benötigen wir ein AP-System.

Zusätzliche Anforderungen. Wir hatten mehrere zusätzliche Anforderungen, um zu entscheiden, wo die riesigen Datenmengen gespeichert werden sollen:

  1. Zeitreihen - Daten von Sensoren sind Zeitreihen, ich wollte eine spezialisierte Basis bekommen.
  2. Open Source - Die Vorteile von Open Source Code erfordern keine Kommentare.
  3. Ein freier Cluster ist eine häufige Plage unter neuen Datenbanken.
  4. Gute Komprimierung - Angesichts der Datenmenge und im Allgemeinen ihrer Einheitlichkeit wollte ich die gespeicherten Daten effektiv komprimieren.
  5. Erfolgreicher Betrieb - Wir wollten mit einer Datenbank beginnen, die bereits jemand in der Nähe unserer Lasten aktiv nutzt, um Risiken zu minimieren.

Unsere Entscheidung . ClickHouse entsprach ausschließlich unseren Anforderungen - eine spaltenbasierte Datenbank mit Zeitreihen mit Replikation, Multimaster, Sharding, SQL-Unterstützung und einem kostenlosen Cluster. Darüber hinaus verfügt Mail.ru über langjährige erfolgreiche Erfahrung im Betrieb eines der größten ClickHouse-Cluster im Speichervolumen.

Aber egal wie gut ClickHouse ist, und wir haben Probleme damit.

Datenbankprobleme für diese Geräte und ihre Lösung


Das Problem mit der Schreibleistung. Sofort gab es ein Problem mit der Schreibleistung eines großen Datenstroms. Sie müssen so schnell wie möglich in die Analysedatenbank gebracht werden, damit die Regeln, die den Ereignisfluss in Echtzeit analysieren, den Verlauf eines bestimmten Geräts anzeigen und entscheiden können, ob eine Warnung ausgelöst werden soll oder nicht.

Lösung des Problems . ClickHouse toleriert nicht mehrere einzelne Einfügungen (Einfügungen), funktioniert jedoch gut mit großen Datenstapeln (Batches) - es kann problemlos Stapel in Millionen von Zeilen aufzeichnen. Wir haben uns entschlossen, den eingehenden Datenstrom zu puffern und diese Daten dann stapelweise einzufügen.


Wir haben also mit einer schlechten Aufzeichnungsleistung fertig geworden. Das Aufzeichnungsproblem

wurde behoben, aber es kostete uns eine erhebliche Verzögerung von mehreren Sekunden zwischen der Eingabe von Daten in das System und ihrem Auftreten in unserer Datenbank.

Dies ist entscheidend für verschiedene Algorithmen, die in Echtzeit auf Daten von Sensoren reagieren.

Leistungsproblem lesen. Stream-Analysen für die Echtzeit-Datenverarbeitung benötigen ständig Informationen aus der Datenbank - dies sind Zehntausende kleiner Abfragen. Im Durchschnitt enthält ein ClickHouse-Knoten ungefähr hundert analytische Abfragen gleichzeitig. Er wurde für seltene schwere analytische Abfragen zur Verarbeitung großer Datenmengen erstellt. Dies ist natürlich nicht geeignet, um Trends im Datenfluss von Hunderttausenden von Sensoren zu berechnen.


Bei einer großen Anzahl von Anfragen funktioniert ClickHouse nicht gut.

Lösen des Problems . Wir haben uns entschlossen, einen Cache vor ClickHouse zu platzieren, der die am häufigsten angeforderten heißen Daten der letzten 24 Stunden enthält.

Die Daten für die letzten 24 Stunden sind keine Daten für ein Jahr, sondern auch eine beträchtliche Datenmenge. Daher benötigen wir hier auch ein AP-System mit horizontaler Skalierung zum Lesen und Schreiben, das sich jedoch auf die Leistung sowohl für die Aufzeichnung einzelner als auch für mehrere Ereignisse konzentriert lesen. Es erfordert auch Hochverfügbarkeit, Zeitreihenanalyse, Persistenz und integrierte TTL.

Am Ende brauchten wir ein schnelles ClickHouse, das aus Geschwindigkeitsgründen sogar alles im Speicher speichern kann. Wir haben keine geeignete Lösung auf dem Markt gefunden und beschlossen, sie auf der Basis von Tarantool-Grundelementen zu konstruieren:

  1. Persistenz - ist (WAL-Protokolle + Schnappschüsse).
  2. Leistung - es gibt alle Daten im Speicher.
  3. Skalierung - es gibt Replikation + Sharding.
  4. Hohe Verfügbarkeit - gibt es.
  5. Tools zur Analyse von Zeitreihen (Gruppierung, Aggregation usw.), die für gespeicherte Prozeduren erstellt wurden.
  6. TTL - erstellt auf gespeicherten Prozeduren mit einer Hintergrundfaser (Coroutine).

Es stellte sich als bequeme und produktive Lösung heraus - eine Instanz enthält 10.000 RPCs zum Lesen, einschließlich analytischer Abfragen von bis zu Zehntausenden von Abfragen.

Hier ist die resultierende Architektur:


Endgültige Architektur: ClickHouse als analytische Datenbank und Tarantool-Cache, in dem Daten innerhalb von 24 Stunden gespeichert werden

Neuer Datentyp - Status und dessen Speicherung


Wir haben spezialisierte Datenbanken für alle Daten ausgewählt, aber die Plattform wurde entwickelt und ein neuer Datentyp wurde angezeigt - state. Der Status enthält den aktuellen Status von Geräten und Sensoren sowie verschiedene globale Variablen für Stream-Analyseregeln.

Zum Beispiel gibt es eine Glühbirne im Raum. Es kann sowohl ein- als auch ausgeschaltet werden, und Sie müssen immer Zugriff auf den aktuellen Status haben, auch in den Regeln. Ein anderes Beispiel ist eine Variable in Stream-Regeln, beispielsweise eine Art Zähler. Diese Art von Daten zeichnet sich durch die Notwendigkeit häufiger Aufzeichnungen und schnellen Zugriffs aus, gleichzeitig nehmen die Daten selbst eine relativ geringe Menge ein.

Das Meta-Informations-Repository ist für diese Datentypen schlecht geeignet, da sich der Status häufig ändern kann und in unserem Fall die Aufzeichnungsobergrenze auf einen Master beschränkt ist. Langzeit- und Betriebslager sind ebenfalls schlecht geeignet, da sich unser Zustand vor drei Jahren zuletzt geändert hat und es wichtig ist, dass wir einen schnellen Lesezugriff haben.

Das heißt, für die Datenbank, in der der Status gespeichert ist, sind horizontale Skalierung zum Lesen und Schreiben, hohe Verfügbarkeit und Fehlertoleranz wichtig, während Konsistenz auf der Ebene der Werte / Dokumente erforderlich ist. Sie können auf die Gesamtkonsistenz und die ACID-Transaktionen zurückgreifen.

Eine geeignete Lösung kann ein beliebiger Schlüsselwert oder eine Dokumentendatenbank sein: ein schattierter Redis-Cluster, MongoDB oder erneut Tarantool.

Tarantool-Vorteile:

  1. Dies ist die beliebteste Art, Tarantool zu verwenden.
  2. Horizontale Skalierung - Es gibt asynchrone Replikation + Sharding.
  3. Konsistenz auf Dokumentebene - ist.

Als Ergebnis haben wir jetzt drei Tarantools, die wir für völlig unterschiedliche Fälle verwenden: Speichern von Metainformationen, einen Cache zum schnellen Lesen von Daten von Geräten und Speichern von Statusdaten.

So wählen Sie eine Datenbank für die IoT-Plattform aus


  1. Eine universelle Datenbank existiert nicht.
  2. Jeder Datentyp verfügt über eine eigene Datenbank, die für ihn am besten geeignet ist.
  3. Manchmal ist die von Ihnen benötigte Datenbank möglicherweise nicht auf dem Markt verfügbar.
  4. Tarantool eignet sich als Basis für eine spezialisierte Datenbank.

Dieser Vortrag wurde erstmals bei @Databases Meetup von Mail.ru Cloud Solutions gehalten. Sehen Sie sich ein Video mit anderen Aufführungen an und melden Sie sich für Ankündigungen von Telegrammveranstaltungen rund um Kubernetes bei der Mail.ru Group an .


Was noch zu lesen :

  1. Welche Datenbank für das Projekt ausgewählt werden soll, um nicht erneut auszuwählen .
  2. Mehr als Ceph: Blockspeicher in der MCS-Cloud .


All Articles