HighLoad++, Mikhail Tyulenev (MongoDB): Kausale Konsistenz: Von der Theorie zur Praxis

Die nÀchste Konferenz HighLoad++ findet am 6. und 7. April 2020 in Sankt Petersburg statt.
Details und Tickets unter diesem Link. HighLoad++ Sibirien 2019. Saal „Krasnojarsk“. 25. Juni, 12:00. Thesen und PrĂ€sentation.

HighLoad++, Mikhail Tyulenev (MongoDB): Kausale Konsistenz: Von der Theorie zur Praxis

Es kommt vor, dass praktische Anforderungen mit der Theorie in Konflikt stehen, in der wichtige Aspekte fĂŒr ein kommerzielles Produkt nicht berĂŒcksichtigt werden. In diesem Vortrag wird der Prozess der Auswahl und Kombination verschiedener AnsĂ€tze zur Erstellung von Komponenten fĂŒr die kausale Konsistenz basierend auf akademischen Forschungsergebnissen beschrieben, die aus den Anforderungen eines kommerziellen Produkts abgeleitet sind. Die Zuhörer erfahren von bestehenden theoretischen AnsĂ€tzen zu logischen Uhren, AbhĂ€ngigkeitsverfolgung, Systemsicherheit, Zeitsynchronisation und warum MongoDB sich fĂŒr bestimmte Lösungen entschieden hat.

Mikhail Tyulenev (im Folgenden – MT): – Ich werde ĂŒber kausale Konsistenz sprechen – eine Funktion, an der wir bei MongoDB gearbeitet haben. Ich arbeite in der Gruppe fĂŒr verteilte Systeme, wir haben sie vor etwa zwei Jahren entwickelt.

HighLoad++, Mikhail Tyulenev (MongoDB): Kausale Konsistenz: Von der Theorie zur Praxis

Im Verlauf musste ich mich mit einer Vielzahl akademischer Forschung auseinandersetzen, weil diese Funktion recht gut untersucht ist. Es stellte sich heraus, dass keine der Veröffentlichungen den Anforderungen im Produktionsumfeld entspricht, da die spezifischen Anforderungen, die in jeder Produktionsanwendung vorhanden sind, berĂŒcksichtigt werden mĂŒssen.

Ich werde darĂŒber sprechen, wie wir, als Verbraucher akademischer Forschung, daraus etwas erstellen, das wir unseren Nutzern als fertiges Produkt anbieten können, das einfach und sicher zu verwenden ist.

Kausale Konsistenz. Lassen Sie uns die Begriffe klÀren

ZunĂ€chst möchte ich in groben ZĂŒgen erlĂ€utern, was kausale Konsistenz ist. Es gibt zwei Charaktere – Leonard und Penny (aus der Serie „The Big Bang Theory“):

HighLoad++, Mikhail Tyulenev (MongoDB): Kausale Konsistenz: Von der Theorie zur Praxis

Angenommen, Penny ist in Europa und Leonard möchte ihr eine Überraschung, eine Party, machen. Und er denkt sich nichts Besseres aus, als sie aus seiner Freundesliste zu entfernen und allen Freunden ein Update im Feed zu schicken: „Lasst uns Penny erfreuen!“ (sie ist in Europa, wĂ€hrend sie schlĂ€ft, sieht sie das alles nicht und kann es nicht sehen, weil sie nicht dort ist). Schließlich löscht er diesen Beitrag, entfernt ihn aus dem Feed und stellt den Zugang wieder her, sodass sie nichts bemerkt und es keinen Skandal gibt.
Das ist alles wunderbar, aber nehmen wir an, das System ist verteilt und die Ereignisse laufen nicht ganz so ab. Es könnte zum Beispiel passieren, dass die ZugriffsbeschrĂ€nkung von Penny eintrat, nachdem dieser Beitrag erschienen ist, wenn die Ereignisse nicht durch kausale ZusammenhĂ€nge verbunden sind. Das ist ein Beispiel dafĂŒr, wann kausale Konsistenz erforderlich ist, um eine GeschĂ€ftsanforderung zu erfĂŒllen (in diesem Fall).

TatsĂ€chlich sind dies ziemlich nicht-triviale Eigenschaften von Datenbanken – nur sehr wenige unterstĂŒtzen sie. Lassen Sie uns zu den Modellen ĂŒbergehen.

Konsistenzmodelle

Was ist ĂŒberhaupt ein Konsistenzmodell in Datenbanken? Es sind bestimmte Garantien, die ein verteiltes System bezĂŒglich der Daten und der Reihenfolge, in der der Kunde sie erhalten kann, gibt.

Im Grunde hĂ€ngen alle Konsistenzmodelle davon ab, wie sehr ein verteiltes System einer solchen Architektur Ă€hnelt, die beispielsweise auf einem einzigen Node auf einem Laptop lĂ€uft. Und wie sehr sich ein System, das auf Tausenden von geografisch verteilten Nodes arbeitet, von einem Laptop unterscheidet, in dem all diese Eigenschaften prinzipiell automatisch erfĂŒllt sind.

Deshalb gelten Konsistenzmodelle nur fĂŒr verteilte Systeme. Alle Systeme, die frĂŒher existierten und auf vertikaler Skalierung basierten, hatten solche Probleme nicht. Dort gab es einen Buffer Cache, aus dem alles stets abgerufen wurde.

Starke Modell

Die tatsĂ€chlich erste Modell ist das Starke (oder auch Riseability, wie es oft genannt wird). Es handelt sich um ein Konsistenzmodell, das garantiert, dass jede Änderung, sobald die BestĂ€tigung vorliegt, dass sie erfolgt ist, von allen Nutzern des Systems gesehen werden kann.

Das schafft eine globale Reihenfolge aller Ereignisse in der Datenbank. Dies ist eine sehr starke Konsistenzeigenschaft und sie ist insgesamt sehr kostenintensiv. Dennoch wird sie sehr gut unterstĂŒtzt. Sie ist einfach sehr teuer und langsam – daher wird sie selten genutzt. Das nennt man Riseability.

Es gibt eine weitere, stĂ€rkere Eigenschaft, die im Spanner unterstĂŒtzt wird – sie wird externe Konsistenz genannt. DarĂŒber werden wir spĂ€ter sprechen.

Kausal

Das NĂ€chste ist Causal, genau das, worĂŒber ich gesprochen habe. Zwischen Strong und Causal gibt es noch einige Unterebenen, ĂŒber die ich nicht sprechen werde, aber sie alle reduzieren sich auf Causal. Dieses Modell ist wichtig, weil es das stĂ€rkste von allen Modellen ist, die stĂ€rkste Konsistenz bei Vorhandensein von Netzwerken oder Partitionen.

Causals sind die Situation, in der Ereignisse durch eine kausale Beziehung verbunden sind. Sehr oft werden sie aus der Perspektive des Kunden als Read your own rights wahrgenommen. Wenn der Kunde bestimmte Werte beobachtet hat, kann er die Werte, die in der Vergangenheit waren, nicht sehen. Er beginnt bereits, prÀfixartige LesevorgÀnge zu sehen. Das alles lÀuft auf dasselbe hinaus.
Causals als Konsistenzmodell bedeutet eine partielle Ordnung von Ereignissen auf dem Server, bei der die Ereignisse von allen Clients in derselben Reihenfolge beobachtet werden. In diesem Fall - Leonard und Penny.

Eventual

Das dritte Modell ist die Eventual Consistency. Das ist das, was alle verteilten Systeme unterstĂŒtzen, das Mindestmodell, das ĂŒberhaupt sinnvoll ist. Es bedeutet Folgendes: Wenn wir Änderungen an den Daten vornehmen, werden sie irgendwann konsistent.

In diesem Moment sagt es nichts, sonst wĂŒrde es zur External Consistency werden - das wĂ€re eine ganz andere Geschichte. Dennoch ist dies ein sehr beliebtes Modell, das am weitesten verbreitet ist. StandardmĂ€ĂŸig verwenden alle Benutzer verteilter Systeme tatsĂ€chlich die Eventual Consistency.

Ich möchte einige vergleichende Beispiele anfĂŒhren:

HighLoad++, Mikhail Tyulenev (MongoDB): Kausale Konsistenz: Von der Theorie zur Praxis

Was bedeuten diese Pfeile?

  • Latenz. Bei zunehmender StĂ€rke der Konsistenz wird sie aus offensichtlichen GrĂŒnden grĂ¶ĂŸer: Es mĂŒssen mehr Aufzeichnungen gemacht, BestĂ€tigungen von allen Hosts und Knoten im Cluster eingeholt werden, dass die Daten dort bereits vorhanden sind. Dementsprechend ist die Eventual Consistency die schnellste Antwort, weil man dort in der Regel sogar im Speicher committieren kann und das grundsĂ€tzlich ausreicht.
  • VerfĂŒgbarkeit. Wenn man dies als die Möglichkeit versteht, dass das System bei Vorhandensein von Netzwerkunterbrechungen, Partitionen oder einigen AusfĂ€llen antworten kann - die Fehlertoleranz steigt bei abnehmendem Konsistenzmodell, da es ausreicht, dass ein Host erreichbar ist und dabei einige Daten liefert. Eventual Consistency garantiert im Übrigen nichts ĂŒber die Daten - es kann alles Mögliche sein.
  • Anomalien. Dabei steigt natĂŒrlich die Anzahl der Anomalien. Bei Strong Consistency sollten diese eigentlich kaum vorkommen, wĂ€hrend sie bei Eventual Consistency beliebig hĂ€ufig sein können. Die Frage stellt sich: Warum wĂ€hlen die Menschen Eventual Consistency, wenn sie Anomalien enthĂ€lt? Die Antwort liegt darin, dass Eventual Consistency-Modelle anwendbar sind und Anomalien zum Beispiel nur fĂŒr einen kurzen Zeitraum bestehen; es gibt die Möglichkeit, einen Master zum Lesen zu nutzen und mehr oder weniger konsistente Daten zu lesen; oft gibt es die Möglichkeit, starke Konsistenzmodelle zu verwenden. Praktisch funktioniert das und hĂ€ufig ist die Anzahl der Anomalien zeitlich begrenzt.

CAP-Theorem

Wenn Sie die Begriffe Consistency und Availability sehen, was kommt Ihnen in den Sinn? Richtig – das CAP-Theorem! Ich möchte jetzt einen Mythos aufklĂ€ren
 Das bin nicht ich – es ist Martin Kleppmann, der einen großartigen Artikel und ein hervorragendes Buch geschrieben hat.

HighLoad++, Mikhail Tyulenev (MongoDB): Kausale Konsistenz: Von der Theorie zur Praxis

Das CAP-Theorem ist ein Prinzip, das in den 2000er Jahren formuliert wurde, wonach Consistency, Availability und Partitions: WĂ€hlen Sie beliebig zwei, und die dritte kann nicht gewĂ€hlt werden. Das war ein gewisses Prinzip. Es wurde einige Jahre spĂ€ter als Theorem bewiesen, das taten Gilbert und Lynch. Danach wurde es wie ein Mantra verwendet – Systeme wurden in CA, CP, AP und so weiter unterteilt.

Dieses Theorem wurde tatsĂ€chlich fĂŒr folgende FĂ€lle bewiesen... Erstens wurde Availability nicht als kontinuierlicher Wert von null bis hundert betrachtet (0 – System 'tot', 100 – antwortet schnell; so haben wir es uns angewöhnt zu betrachten), sondern als eine Eigenschaft eines Algorithmus, die garantiert, dass er bei allen seinen AusfĂŒhrungen Daten zurĂŒckgibt.

Über die Antwortzeit steht dort kein Wort! Es gibt einen Algorithmus, der Daten nach 100 Jahren zurĂŒckgibt – ein völlig hervorragender verfĂŒgbarer Algorithmus, der Teil des CAP-Theorems ist.
Zweitens: Das Theorem wurde fĂŒr Änderungen der Werte desselben SchlĂŒssels bewiesen, wobei diese Änderungen eine resizable Linie darstellen. Das bedeutet, dass sie in der Praxis kaum verwendet werden, weil es andere Modelle wie Eventual Consistency, Strong Consistency (vielleicht) gibt.

Worauf will ich hinaus? Auf das, dass das CAP-Theorem in der Form, wie es bewiesen wurde, praktisch nicht anwendbar ist und selten verwendet wird. In der theoretischen Form schrÀnkt es auf eine gewisse Weise alles ein. Es ergibt sich ein gewisses Prinzip, das intuitiv korrekt ist, aber insgesamt nicht wirklich bewiesen ist.

Causal Consistency ist das stÀrkste Modell

Was jetzt passiert, ist, dass man alle drei Dinge erhalten kann: Konsistenz, VerfĂŒgbarkeit kann durch Partitionen erreicht werden. Insbesondere die kausale Konsistenz – das ist das stĂ€rkste Konsistenzmodell, das auch bei Partitions (NetzwerkausfĂ€llen) funktioniert. Deshalb ist es so interessant, daher haben wir uns damit beschĂ€ftigt.

HighLoad++, Mikhail Tyulenev (MongoDB): Kausale Konsistenz: Von der Theorie zur Praxis

Erstens vereinfacht es die Arbeit der Anwendungsentwickler. Insbesondere gibt es eine starke UnterstĂŒtzung vom Server: Wenn alle Aufzeichnungen, die innerhalb eines Clients erfolgen, garantiert in dieser Reihenfolge auf einem anderen Client ankommen. Zweitens hĂ€lt sie Partitionen stand.

Die interne KĂŒche von MongoDB

Im Gedenken an das Mittagessen bewegen wir uns in die KĂŒche. Ich werde ĂŒber das Systemmodell erzĂ€hlen, insbesondere – was MongoDB fĂŒr diejenigen ist, die zum ersten Mal von dieser Datenbank hören.

HighLoad++, Mikhail Tyulenev (MongoDB): Kausale Konsistenz: Von der Theorie zur Praxis

HighLoad++, Mikhail Tyulenev (MongoDB): Kausale Konsistenz: Von der Theorie zur Praxis

MongoDB (im Folgenden „MongoDB“) ist ein verteiltes System, das horizontale Skalierung unterstĂŒtzt, also Sharding; und innerhalb jedes Shards unterstĂŒtzt es auch Datenredundanz, also Replikation.

Sharding in „MongoDB“ (kein relationales DBMS) fĂŒhrt eine automatische Balancierung durch, das heißt, jede Dokumentensammlung (oder „Tabelle“ in relationalen Daten) wird in StĂŒcke zerlegt, und der Server bewegt sie automatisch zwischen den Shards.

Der Query Router, der die Anfragen verteilt, ist fĂŒr den Client eine Art von Client, ĂŒber den er arbeitet. Er weiß bereits, wo sich welche Daten befinden und leitet alle Anfragen an den richtigen Shard weiter.

Ein weiterer wichtiger Punkt: MongoDB ist ein Single Master. Es gibt einen Primary – dieser kann Aufzeichnungen ĂŒbernehmen, die die SchlĂŒssel unterstĂŒtzen, die er enthĂ€lt. Multi-Master-SchreibvorgĂ€nge sind nicht möglich.

Wir haben das Release 4.2 gemacht – es sind neue interessante Dinge hinzugekommen. Insbesondere haben wir Lucene eingefĂŒhrt – die Suche – also ausfĂŒhrbares Java direkt in „Mongo“, und jetzt ist es möglich, die Suche ĂŒber Lucene durchzufĂŒhren, genauso wie in „Elasticsearch“.

Und wir haben ein neues Produkt geschaffen – Charts, das ebenfalls auf „Atlas“ (der eigene Cloud von „Mongo“) verfĂŒgbar ist. Sie haben ein Free Tier – man kann damit experimentieren. Charts hat mir sehr gefallen – Datenvisualisierung, sehr intuitiv.

Zutaten der kausalen Konsistenz

Ich habe ungefĂ€hr 230 Artikel gezĂ€hlt, die zu diesem Thema veröffentlicht wurden – von Leslie Lamport. Ich werde Ihnen jetzt aus meinem GedĂ€chtnis einige Teile dieser Materialien ĂŒbermitteln.

HighLoad++, Mikhail Tyulenev (MongoDB): Kausale Konsistenz: Von der Theorie zur Praxis

Alles begann mit dem Artikel von Leslie Lampert, der in den 1970er Jahren geschrieben wurde. Wie Sie sehen, gibt es bis heute weiterhin Forschungsarbeiten zu diesem Thema. Derzeit erlebt die kausale Konsistenz ein Interesse im Zusammenhang mit der Entwicklung von verteilten Systemen.

EinschrÀnkungen

Welche EinschrĂ€nkungen gibt es? Das ist tatsĂ€chlich einer der Hauptpunkte, denn die EinschrĂ€nkungen, die Produktionssysteme aufweisen, unterscheiden sich erheblich von den EinschrĂ€nkungen, die in akademischen Artikeln existieren. Oft sind sie recht kĂŒnstlich.

HighLoad++, Mikhail Tyulenev (MongoDB): Kausale Konsistenz: Von der Theorie zur Praxis

  • Erstens, „MongoDB“ ist ein Single-Master, wie ich bereits gesagt habe (das vereinfacht vieles).
  • Wir gehen davon aus, dass das System etwa 10.000 Shards unterstĂŒtzen sollte. Wir können keine architektonischen Entscheidungen treffen, die diesen Wert eindeutig einschrĂ€nken.
  • Wir haben eine Cloud, aber wir gehen davon aus, dass der Benutzer die Möglichkeit haben sollte, wenn er das Binary herunterlĂ€dt, es auf seinem Laptop ausfĂŒhrt und alles perfekt funktioniert.
  • Wir gehen davon aus, dass das in der Forschung selten genutzt wird: externe Clients können tun, was sie wollen. „MongoDB“ ist Open Source. Entsprechend können Clients sehr clever oder bösartig sein – sie können alles kaputtmachen wollen. Wir gehen davon aus, dass byzantinische Fehler auftreten können.
  • FĂŒr externe Clients, die außerhalb des Perimeters sind – eine wichtige EinschrĂ€nkung: Wenn diese Funktion deaktiviert ist, sollten keine Leistungsverschlechterungen beobachtet werden.
  • Ein weiterer Punkt – ganz anti-akademisch: die KompatibilitĂ€t zwischen frĂŒheren und zukĂŒnftigen Versionen. Alte Treiber mĂŒssen neue Updates unterstĂŒtzen, und die Datenbank muss alte Treiber unterstĂŒtzen.

Insgesamt stellen all dies EinschrÀnkungen dar.

Komponenten der kausalen Konsistenz

Ich werde jetzt einige Komponenten vorstellen. Wenn man die kausale Konsistenz betrachtet, lassen sich verschiedene Blöcke unterscheiden. Wir haben aus Arbeiten ausgewĂ€hlt, die zu einem bestimmten Block gehören: AbhĂ€ngigkeitsverfolgung, die Auswahl von Uhren, wie diese Uhren untereinander synchronisiert werden können, und wie wir Sicherheit gewĂ€hrleisten – das ist ein grober Überblick ĂŒber das, worĂŒber ich sprechen werde:

HighLoad++, Mikhail Tyulenev (MongoDB): Kausale Konsistenz: Von der Theorie zur Praxis

VollstÀndige AbhÀngigkeitsverfolgung (Full Dependency Tracking)

Warum ist das nötig? Damit, wenn Daten repliziert werden – jeder Eintrag, jede Änderung der Daten enthĂ€lt Informationen darĂŒber, von welchen Änderungen sie abhĂ€ngt. Die allererste und naivste Änderung ist die, dass jede Nachricht, die einen Eintrag enthĂ€lt, Informationen ĂŒber die vorherigen Nachrichten enthĂ€lt:

HighLoad++, Mikhail Tyulenev (MongoDB): Kausale Konsistenz: Von der Theorie zur Praxis

In diesem Beispiel sind die Nummern in geschweiften Klammern die Eintragsnummern. Manchmal werden diese EintrĂ€ge mit den Werten sogar ganz ĂŒbergeben, manchmal werden irgendwelche Versionen ĂŒbergeben. Der Kern der Sache ist, dass jede Änderung Informationen ĂŒber die vorherige enthĂ€lt (sie trĂ€gt all dies klar in sich).

Warum haben wir uns entschieden, einen solchen Ansatz (vollstĂ€ndiges Tracking) nicht zu verwenden? Offensichtlich, weil dieser Ansatz unpraktisch ist: Jede Änderung in einem sozialen Netzwerk hĂ€ngt von allen vorherigen Änderungen in diesem sozialen Netzwerk ab, was zum Beispiel „Facebook“ oder „VKontakte“ in jedem Update ĂŒbertrĂ€gt. Dennoch gibt es viele Studien ĂŒber genau das Full Dependency Tracking – das sind prĂ€-soziale Netzwerke, in einigen Situationen funktioniert das tatsĂ€chlich.

Explizites AbhÀngigkeits-Tracking (Explicit Dependency Tracking)

Der nĂ€chste ist eingeschrĂ€nkter. Hier wird ebenfalls die Übertragung von Informationen betrachtet, aber nur von der, die offensichtlich abhĂ€ngt. Was von was abhĂ€ngt, bestimmt in der Regel bereits die Anwendung. Wenn Daten repliziert werden, werden bei einer Anfrage nur die Antworten zurĂŒckgegeben, wenn die vorherigen AbhĂ€ngigkeiten erfĂŒllt sind, das heißt, angezeigt werden. Darin liegt der Kern, wie kausale Konsistenz funktioniert.

HighLoad++, Mikhail Tyulenev (MongoDB): Kausale Konsistenz: Von der Theorie zur Praxis

Sie sieht, dass Eintrag 5 von den EintrĂ€gen 1, 2, 3, 4 abhĂ€ngt – entsprechend wartet sie, bevor der Kunde Zugriff auf die Änderungen erhĂ€lt, die durch das Zugriffsrecht von Penny vorgenommen wurden, wenn alle vorherigen Änderungen bereits in die Datenbank eingegangen sind.

Das befriedigt uns auch nicht, weil es trotzdem zu viele Informationen gibt, und das wird langsam machen. Es gibt einen anderen Ansatz


Lamport-Uhr (Lamport Clock)

Sie sind sehr alt. Die Lamport-Uhr impliziert, dass diese AbhÀngigkeiten in eine skalare Funktion zusammengefasst werden, die Lamport-Uhr genannt wird.

Eine skalare Funktion ist eine abstrakte Zahl. Oft wird sie als logische Zeit bezeichnet. Bei jedem Ereignis erhöht sich dieser ZÀhler. Der ZÀhler, der derzeit dem Prozess bekannt ist, sendet jede Nachricht. Es ist klar, dass Prozesse desynchronisiert sein können und unterschiedliche Zeiten haben können. Dennoch gleicht das System durch diesen Nachrichtenaustausch die Uhren irgendwie aus. Was passiert in diesem Fall?

Ich habe den großen Shard halbiert, um es verstĂ€ndlich zu machen: Friends können in einem Knoten leben, der ein StĂŒck der Sammlung enthĂ€lt, wĂ€hrend Feed in einem völlig anderen Knoten leben kann, der ein StĂŒck dieser Sammlung enthĂ€lt. Ist klar, wie sie nicht in der Warteschlange landen können? Zuerst sagt Feed: "Repliziert", und dann - Friends. Wenn das System keine Garantien bietet, dass Feed nicht angezeigt wird, solange die AbhĂ€ngigkeiten von Friends in der Sammlung Friends auch nicht geliefert werden, haben wir genau die Situation, die ich erwĂ€hnt habe.

Sie sehen, wie sich die logische Zeit des Counters auf dem Feed erhöht:

HighLoad++, Mikhail Tyulenev (MongoDB): Kausale Konsistenz: Von der Theorie zur Praxis

Daher ist die Hauptsache, die diese Lamport-Uhr und die kausale Konsistenz (erklÀrt durch die Lamport-Uhr) zusammenhÀlt: Wenn wir Ereignisse A und B haben und Ereignis B von Ereignis A abhÀngt *, dann folgt daraus, dass die Logische Zeit von Ereignis A kleiner ist als die Logische Zeit von Ereignis B.

* Manchmal wird auch gesagt, dass A vor B passiert ist, das heißt, A geschah vor B – das ist eine Art Relation, die die Gesamtheit der Ereignisse, die ĂŒberhaupt stattgefunden haben, teilweise ordnet.

Umgekehrt gilt das nicht. Das ist tatsĂ€chlich einer der Hauptnachteile der Lamport-Uhr – die partielle Ordnung. Es gibt das Konzept von gleichzeitigen Ereignissen, das heißt Ereignisse, bei denen weder (A passiert vor B) noch (A passiert vor B) gilt. Ein Beispiel könnte das gleichzeitige HinzufĂŒgen von Leonard zu den Freunden einer anderen Person sein (nicht einmal von Leonard, sondern von Sheldon, zum Beispiel).
Das ist die Eigenschaft, die oft bei der Arbeit mit Lamport-Uhren genutzt wird: Man schaut sich genau die Funktion an und zieht daraus den Schluss – vielleicht sind diese Ereignisse abhĂ€ngig. Denn in eine Richtung ist es wahr: Wenn die Logische Zeit A kleiner ist als die Logische Zeit B, dann kann B nicht vor A passieren; ist sie grĂ¶ĂŸer, dann kann es sein.

Vektor-Uhren (Vector Clock)

Die logische Entwicklung der Lamport-Uhren sind die Vektor-Uhren. Sie unterscheiden sich dadurch, dass jeder Knoten, der hier vorhanden ist, seine eigenen, separaten Uhren enthĂ€lt, und diese werden als Vektor ĂŒbermittelt.
In diesem Fall sehen Sie, dass der Nullindex des Vektors fĂŒr den Feed und der erste Index des Vektors fĂŒr die Freunde verantwortlich ist (jede dieser Knoten). Und jetzt werden sie zunehmen: Der Nullindex des "Feeds" erhöht sich bei der Aufzeichnung – 1, 2, 3:

HighLoad++, Mikhail Tyulenev (MongoDB): Kausale Konsistenz: Von der Theorie zur Praxis

Was sind die Vorteile von Vektoruhren? Sie ermöglichen es, welche Ereignisse simultan sind und wann sie an verschiedenen Knoten stattfinden. Das ist fĂŒr das Sharding-System wie "MongoDB" sehr wichtig. Wir haben uns jedoch nicht dafĂŒr entschieden, obwohl es ein großartiges Tool ist, das wunderbar funktioniert und uns wahrscheinlich gepasst hĂ€tte...

Wenn wir 10.000 Shards haben, können wir keine 10.000 Komponenten ĂŒbermitteln, selbst wenn wir komprimieren oder etwas anderes einfallen lassen – die Nuttungsrate wird immer viel geringer sein als das Volumen des gesamten Vektors. Daher, mit schwerem Herzen, haben wir darauf verzichtet und sind zu einer anderen Lösung ĂŒbergegangen.

Spanner TrueTime. Atomuhren

Ich habe gesagt, dass es um den "Spanner" geht. Das ist ein cooles Ding, direkt aus dem 21. Jahrhundert: Atomuhren, GPS-Synchronisation.

Was ist die Idee? Der "Spanner" ist ein Google-System, das kĂŒrzlich sogar fĂŒr die Leute verfĂŒgbar wurde (sie haben SQL hinzugefĂŒgt). Jede Transaktion hat dort einen bestimmten Zeitstempel. Da die Zeit synchronisiert ist*, kann jedem Ereignis eine bestimmte Zeit zugewiesen werden – Atomuhren haben eine Wartezeit, nach der garantiert "ein anderes Zeitgeschehen" eintritt.

HighLoad++, Mikhail Tyulenev (MongoDB): Kausale Konsistenz: Von der Theorie zur Praxis

Somit wird durch einfaches Eintragen in die Datenbank und Warten einer gewissen Zeit automatisch die Serialisierbarkeit des Ereignisses garantiert. Sie haben das stĂ€rkste Konsistenzmodell, das man sich grundsĂ€tzlich vorstellen kann – es ist externe Konsistenz.

* Das ist das Hauptproblem der Lamport-Uhren – sie sind in verteilten Systemen niemals synchron. Sie können auseinanderdriften, selbst bei vorhandener NTP funktionieren sie nicht sehr gut. Der "Spanner" verfĂŒgt ĂŒber Atomuhren und Synchronisation, anscheinend auf Mikrosekunden genau.

Warum haben wir uns nicht dafĂŒr entschieden? Wir gehen nicht davon aus, dass unsere Nutzer ĂŒber eingebaute Atomuhren verfĂŒgen. Wenn sie eingebaut in jedes Laptop verfĂŒgbar sind, wird es eine super coole GPS-Synchronisation geben – dann ja... Aber bis jetzt ist das Beste, was möglich ist – Amazon, Basisstationen – fĂŒr Enthusiasten... Deshalb haben wir andere Uhren verwendet.

Hybride Uhren (Hybrid Clock)

Das ist praktisch das, was in MongoDB tickt, um kausale Konsistenz sicherzustellen. Hybrid sind sie worin? Ein Hybrid ist ein Skalarwert, der aus zwei Komponenten besteht:

HighLoad++, Mikhail Tyulenev (MongoDB): Kausale Konsistenz: Von der Theorie zur Praxis

  • Die erste ist die Unix-Zeit (die Anzahl der Sekunden seit "Beginn der Computerwelt").
  • Die zweite ist ein gewisser Inkrement, ebenfalls ein 32-Bit unsigned int.

Das ist im Wesentlichen alles. Es gibt einen Ansatz: Der Teil, der fĂŒr die Zeit verantwortlich ist, wird stĂ€ndig mit den Uhren synchronisiert; jedes Mal, wenn ein Update erfolgt, synchronisiert sich dieser Teil mit den Uhren und es stellt sich heraus, dass die Zeit immer mehr oder weniger korrekt ist, wĂ€hrend der Inkrement es ermöglicht, Veranstaltungen zu unterscheiden, die im selben Moment stattfinden.

Warum ist das wichtig fĂŒr MongoDB? Weil es ermöglicht, bestimmte Backups und Wiederherstellungen zu einem bestimmten Zeitpunkt durchzufĂŒhren, das heißt, die Ereignisse werden zeitlich indiziert. Das ist wichtig, wenn bestimmte Ereignisse benötigt werden; fĂŒr eine Datenbank sind Ereignisse die Änderungen in der Datenbank, die in bestimmten ZeitrĂ€umen stattgefunden haben.

Den wichtigsten Grund werde ich nur Ihnen sagen (bitte, erzĂ€hlen Sie es niemandem)! Wir haben das so gemacht, weil so die geordneten, indizierten Daten im MongoDB OpLog aussehen. OpLog ist eine Datenstruktur, die alle Änderungen in der Datenbank enthĂ€lt: Sie gelangen zunĂ€chst in das OpLog und werden dann erst auf den Storage angewendet, wenn es sich um eine replizierte Datensatz oder Shard handelt.

Das war der Hauptgrund. Es gibt jedoch auch praktische Anforderungen an die Entwicklung der Datenbank, das bedeutet, dass es einfach sein muss - wenig Code, so wenige defekte Elemente wie möglich, die neu geschrieben und getestet werden mĂŒssen. Dass unsere OpLogs mit hybriden Uhren indiziert waren, hat stark geholfen und die richtige Wahl ermöglicht. Das hat sich tatsĂ€chlich bewĂ€hrt und irgendwie zauberhaft beim ersten Prototypen funktioniert. Es war wirklich großartig!

Uhrensynchronisation

Es gibt mehrere synchronisationsmethoden, die in der wissenschaftlichen literatur beschrieben sind. Ich spreche von synchronisation, wenn wir zwei verschiedene shards haben. Wenn es nur einen replika-satz gibt, ist keine synchronisation notwendig: das ist «single-master»; wir haben ein OpLog, in das alle Ă€nderungen eingehen – in diesem fall sind die gesamten eintrĂ€ge bereits sequenziell im «OpLog» geordnet. Aber wenn wir zwei unterschiedliche shards haben, ist die synchronisation der zeit wichtig. Hier haben vektoruhren mehr geholfen! Aber die haben wir nicht.

HighLoad++, Mikhail Tyulenev (MongoDB): Kausale Konsistenz: Von der Theorie zur Praxis

Die zweite möglichkeit sind die «HerzschlĂ€ge» (Heartbeats). Man kann einige signale austauschen, die in regelmĂ€ĂŸigen abstĂ€nden gesendet werden. Aber die «HerzschlĂ€ge» sind zu langsam, wir können die latenz unseren kunden nicht bieten.

Echte zeit – das ist natĂŒrlich eine großartige sache. Aber wiederum, das ist wahrscheinlich die zukunft
 Obwohl man im «Atlas» bereits arbeiten kann, gibt es schon schnelle «amazonische» zeitsynchronisatoren. Aber das wird nicht fĂŒr alle verfĂŒgbar sein.

Gossiping ist, wenn alle nachrichten eine zeitangabe enthalten. Das ist ungefĂ€hr das, was wir verwenden. Jede nachricht zwischen nĂŒtzen, treibern, routen und datenknoten – alles fĂŒr «MongoDB» – sind irgendwelche elemente, komponenten einer datenbank, die uhren besitzen, die ticken. Überall haben sie den wert der hybriden zeit, der ĂŒbertragen wird. 64 bit? Das ist möglich, das lĂ€sst sich umsetzen.

Wie funktioniert das alles zusammen?

Hier betrachte ich ein replika-set, um es etwas einfacher zu halten. Es gibt einen Primary und einen Secondary. Der Secondary fĂŒhrt die replikation durch und ist nicht immer vollstĂ€ndig mit dem Primary synchronisiert.

Es erfolgt ein einfĂŒgen (insert) im «Primary» mit einem bestimmten zeitwert. Dieses insert erhöht den internen zĂ€hler um 11, wenn das maximum erreicht ist. Oder es wird die zeiten ĂŒberprĂŒft und synchronisiert sich nach den uhren, wenn die zeiten höher sind. Dies ermöglicht eine zeitliche ordnung.

Nachdem er den eintrag vorgenommen hat, tritt ein wichtiger moment ein. Die uhren in «MongoDB» werden nur dann inkrementiert, wenn ein eintrag im «OpLog» erfolgt. Das ist das ereignis, das den zustand des systems Ă€ndert. In allen klassischen artikeln wird ein ereignis als das eintrudeln einer nachricht in einem knoten betrachtet: eine nachricht ist angekommen – das bedeutet, das system hat seinen zustand geĂ€ndert.

Das hĂ€ngt damit zusammen, dass man bei der Forschung nicht genau verstehen kann, wie diese Nachricht interpretiert wird. Wir wissen sicher, dass, wenn sie nicht im "Oplog" erfasst ist, sie ĂŒberhaupt nicht interpretiert wird, und die SystemzustandsĂ€nderung ist nur der Eintrag im "Oplog". Das vereinfacht uns alles: sowohl das Modell als auch die Möglichkeit, innerhalb eines Replikatsatzes zu ordnen, sowie viele andere nĂŒtzliche Dinge.

Es wird der Wert zurĂŒckgegeben, der bereits im "Oplog" gespeichert ist – wir wissen, dass dieser Wert im "Oplog" bereits vorhanden ist, und seine Zeit ist 12. Angenommen, jetzt beginnt das Lesen von einem anderen Knoten (Secondary), und er ĂŒbertrĂ€gt bereits afterClusterTime in der Nachricht selbst. Er sagt: "Ich benötige alles, was mindestens nach 12 oder wĂ€hrend der zwölf passiert ist" (siehe Bild oben).

Das nennt man Causal a consistent (CAT). Es gibt ein solches Konzept in der Theorie, dass dies ein gewisser Zeitabschnitt ist, der fĂŒr sich selbst konsistent ist. In diesem Fall kann man sagen, dass dies der Zustand des Systems ist, der im Moment 12 beobachtet wurde.

Hier ist momentan noch nichts, weil es quasi die Situation simuliert, in der der Secondary die Daten vom Primary replizieren muss. Er wartet... Und hier kommen die Daten – er gibt diese Werte zurĂŒck.

HighLoad++, Mikhail Tyulenev (MongoDB): Kausale Konsistenz: Von der Theorie zur Praxis

So funktioniert es ungefÀhr. Fast.

Was bedeutet "fast"? Angenommen, es gibt eine Person, die gelesen und verstanden hat, wie das alles funktioniert. Sie hat verstanden, dass jedes Mal, wenn ClusterTime auftritt, die internen logischen Uhren aktualisiert werden, und dann erhöht der nĂ€chste Eintrag um eins. Diese Funktion nimmt 20 Zeilen ein. Angenommen, diese Person ĂŒbertrĂ€gt die maximal große 64-Bit-Zahl minus eins.

Warum "minus eins"? Weil die internen Uhren in diesen Wert eingesetzt werden (offensichtlich ist das die grĂ¶ĂŸte mögliche und grĂ¶ĂŸer als die aktuelle Zeit), dann erfolgt der Eintrag im "Oplog", und die Uhren werden erneut um eins inkrementiert – und dann wird bereits der maximale Wert erreicht (da sind einfach alle Einsen, weiter geht es nicht, unsaint int's).

Es ist klar, dass das System danach absolut fĂŒr nichts verfĂŒgbar wird. Man kann es nur entladen, reinigen – viel Handarbeit. VollstĂ€ndige VerfĂŒgbarkeit:

HighLoad++, Mikhail Tyulenev (MongoDB): Kausale Konsistenz: Von der Theorie zur Praxis

Wenn sich das irgendwo anders repliziert, fÀllt der gesamte Cluster aus. Eine absolut inakzeptable Situation, die jeder sehr schnell und einfach organisieren kann! Daher haben wir diesen Punkt als einen der wichtigsten angesehen. Wie kann man das verhindern?

Unser Weg ist es, clusterTime zu unterschreiben.

So wird es in der Nachricht ĂŒbermittelt (vor dem blauen Text). Aber wir haben auch begonnen, eine Signatur zu generieren (blauer Text):

HighLoad++, Mikhail Tyulenev (MongoDB): Kausale Konsistenz: Von der Theorie zur Praxis

Die Signatur wird mit einem SchlĂŒssel generiert, der innerhalb der Datenbank im geschĂŒtzten Bereich gespeichert ist; sie wird selbst generiert und aktualisiert (die Benutzer sehen davon nichts). Ein Hash wird generiert, und jede Nachricht wird beim Erstellen signiert und beim Empfang validiert.
Wahrscheinlich fragen sich die Leute: „Wie sehr verlangsamt das alles?“ Ich habe gesagt, dass es schnell funktionieren sollte, insbesondere ohne diese Funktion.

Was bedeutet es in diesem Fall, Causal consistency zu nutzen? Es zeigt den afterClusterTime-Parameter an. Andernfalls werden Werte in jedem Fall ĂŒbertragen. Gossiping funktioniert seit Version 3.6 immer.

Wenn wir eine stÀndige Generierung von Signaturen beibehalten, wird das die Systeme selbst ohne diese Funktion verlangsamen, was unseren AnsÀtzen und Anforderungen nicht entspricht. Was haben wir also gemacht?

Mach das schnell!

Es ist eine ziemlich einfache Sache, aber der Trick ist interessant – ich teile es, vielleicht interessiert es jemanden.
Wir haben einen Hash, in dem signierte Daten gespeichert sind. Alle Daten gehen durch den Cache. Der Cache signiert nicht spezifisch die Zeit, sondern einen Bereich. Wenn ein bestimmter Wert eintrifft, generieren wir einen Bereich, maskieren die letzten 16 Bits, und diesen Wert signieren wir:

HighLoad++, Mikhail Tyulenev (MongoDB): Kausale Konsistenz: Von der Theorie zur Praxis

Durch den Erhalt einer solchen Signatur beschleunigen wir das System (theoretisch) um 65.000 Mal. Es funktioniert hervorragend: Als wir Experimente durchfĂŒhrten, wurde die Zeit fĂŒr unser sequenzielles Update tatsĂ€chlich um 10.000 Mal verkĂŒrzt. Es ist klar, dass das nicht funktioniert, wenn sie durcheinander kommen. Aber in den meisten praktischen FĂ€llen funktioniert es. Die Kombination aus Range-Signatur und Signatur hat das Sicherheitsproblem gelöst.

Was haben wir gelernt?

Die Lektionen, die wir daraus gezogen haben:

  • Man muss Materialien, Geschichten und Artikel lesen, weil es viel Interessantes gibt. Wenn wir an einer Funktion arbeiten (besonders jetzt, wo wir Transaktionen gemacht haben usw.), sollte man lesen und sich einarbeiten. Das kostet Zeit, ist aber sehr nĂŒtzlich, da man versteht, wo wir stehen. Wir haben nichts wirklich Neues erfunden – wir haben einfach Zutaten verwendet.

    Generell gibt es einen bestimmten Unterschied im Denken, wenn eine akademische Konferenz stattfindet (zum Beispiel "Sigmon") – dort konzentriert sich jeder auf neue Ideen. Was ist die Neuheit unseres Algorithmus? Hier gibt es nicht viel Neuheit. Die Neuheit besteht vielmehr darin, wie wir bestehende AnsĂ€tze miteinander gemischt haben. Deshalb ist es wichtig, die Klassiker zu lesen, beginnend mit Lamport.

  • Im Produktionsumfeld gibt es völlig andere Anforderungen. Ich bin mir sicher, dass viele von Ihnen es nicht mit "sphĂ€rischen" Datenbanken im abstrakten Vakuum zu tun haben, sondern mit normalen, realen Dingen, die Probleme hinsichtlich VerfĂŒgbarkeit, Latenz und Fehlertoleranz haben.
  • Zuletzt mussten wir verschiedene Ideen in Betracht ziehen und mehrere völlig unterschiedliche Artikel zu einem Ansatz kombinieren. Die Idee des Signierens stammt zum Beispiel aus einem Artikel, der das Paxos-Protokoll behandelt hat, das fĂŒr nicht-byzantinische Fehler innerhalb des Autorisierungsprotokolls gedacht ist, fĂŒr byzantinische – außerhalb des Autorisierungsprotokolls... Insgesamt ist das genau das, was wir am Ende getan haben.

    Hier gibt es absolut nichts Neues! Aber sobald wir all das zusammengefĂŒgt haben... Es ist dasselbe wie zu sagen, dass das Rezept fĂŒr Salat Olivier nichts Besonderes ist, weil Eier, Mayonnaise und Gurken bereits erfunden wurden... Es ist ungefĂ€hr die gleiche Geschichte.

HighLoad++, Mikhail Tyulenev (MongoDB): Kausale Konsistenz: Von der Theorie zur Praxis

Ich beende damit. Danke!

Fragen

Frage aus dem Publikum (im Folgenden – F): – Vielen Dank, Michail, fĂŒr den Vortrag! Das Thema Zeit ist interessant. Sie verwenden Gossiping. Sie haben gesagt, dass jeder seine eigene Zeit hat, jeder kennt seine lokale Zeit. Ich habe so verstanden, dass wir einen Treiber haben – es kann viele Kunden mit Treibern geben, ebenso viele Abfrageplaner, auch viele Shards... Was passiert mit dem System, wenn es plötzlich eine Diskrepanz gibt: einer denkt, dass er eine Minute voraus ist, der andere – eine Minute hinterher? Wo landen wir?

MT: – Eine ausgezeichnete Frage! Ich wollte gerade ĂŒber die Shards sprechen. Wenn ich die Frage richtig verstehe, haben wir die Situation, dass es Shard 1 und Shard 2 gibt. Das Lesen erfolgt von diesen beiden Shards – sie haben unterschiedliche Zeiten, und sie interagieren nicht miteinander, weil die Zeit, die sie kennen, unterschiedlich ist, besonders die Zeit, die in ihren Op-Logs existiert.
Angenommen, Shard 1 hat eine Million EintrĂ€ge gemacht, Shard 2 – ĂŒberhaupt nichts, und die Anfrage kam an beide Shards. Und der erste hat eine afterClusterTime von ĂŒber einer Million. In dieser Situation, wie ich erklĂ€rt habe, wird Shard 2 nie antworten.

Frage: – Ich wollte wissen, wie sie synchronisiert werden und eine logische Zeit auswĂ€hlen?

MT: – Die Synchronisierung erfolgt sehr einfach. Wenn Shard eine afterClusterTime erhĂ€lt und die Zeit im „Op-Log“ nicht findet – initiiert es no approved. Das bedeutet, dass es seine Zeit auf diesen Wert anhebt. Das bedeutet, dass es keine Ereignisse gibt, die auf diese Anfrage reagieren. Es erzeugt dieses Ereignis kĂŒnstlich und ist somit kausal konsistent.

Frage: – Und was, wenn danach noch irgendwelche Ereignisse eintreffen, die im Netzwerk irgendwo verloren gegangen sind?

MT: – Shard ist so konstruiert, dass sie nicht mehr eintreffen, da es einen Single Master gibt. Wenn er bereits geschrieben hat, dann werden sie nicht mehr eintreffen, sondern danach. Es kann nicht passieren, dass irgendwo etwas stecken bleibt, dann macht er no write und diese Ereignisse kommen an – und die kausale Konsistenz wird verletzt. Wenn er no write macht, mĂŒssen sie alle danach kommen (er wird auf sie warten).

HighLoad++, Mikhail Tyulenev (MongoDB): Kausale Konsistenz: Von der Theorie zur Praxis

Frage: – Ich habe einige Fragen zu den Warteschlangen. Kausale Konsistenz setzt voraus, dass es eine bestimmte Warteschlange von Aktionen gibt, die ausgefĂŒhrt werden mĂŒssen. Was passiert, wenn ein Paket verloren geht? Es kommt 10., 11. ... aber der 12. geht verloren, wĂ€hrend alle anderen warten, dass es ausgefĂŒhrt wird. Und plötzlich stirbt die Maschine, wir können nichts tun. Gibt es eine maximale LĂ€nge der Warteschlange, die sich anhĂ€uft, bevor sie ausgefĂŒhrt wird? Was fĂŒr einen fatalen Fehler gibt es bei Verlust eines bestimmten Zustands? Zumal wir aufzeichnen, dass es einen vorherigen Zustand gibt, mĂŒssen wir doch irgendwie darauf basieren? Aber wir haben uns nicht darauf gestĂŒtzt!

MT: – Auch eine ausgezeichnete Frage! Was tun wir? In MongoDB gibt es das Konzept von Quorum-SchreibvorgĂ€ngen und Quorum-Lesungen. In welchen FĂ€llen kann eine Nachricht verloren gehen? Wenn der Schreibvorgang ohne Quorum ist oder wenn die LesevorgĂ€nge nicht quorum sind (da kann auch etwas MĂŒll anhaften).
BezĂŒglich der kausalen Konsistenz haben wir eine umfangreiche experimentelle ÜberprĂŒfung durchgefĂŒhrt, deren Ergebnis war, dass, wenn Aufzeichnungen und LesevorgĂ€nge nicht quorum-basiert sind, VerstĂ¶ĂŸe gegen die kausale Konsistenz auftreten. Genau das, was Sie sagen!

Unser Rat: Verwenden Sie mindestens quorum-basiertes Lesen bei der Nutzung der kausalen Konsistenz. In diesem Fall wird nichts verloren gehen, selbst wenn die quorum-basierte Aufzeichnung ausfĂ€llt
 Das ist eine orthogonale Situation: Wenn der Benutzer nicht möchte, dass Daten verloren gehen, muss er eine quorum-basierte Aufzeichnung verwenden. Kausale Konsistenz bietet keine Garantie fĂŒr die Haltbarkeit. Die Garantie fĂŒr die Haltbarkeit bietet die Replikation und die mit der Replikation verbundene Technik.

Frage: – Wenn wir eine Instanz erstellen, die bei uns das Sharding durchfĂŒhrt (nicht master, sondern slave), stĂŒtzt sie sich auf die Unix-Zeit ihrer eigenen Maschine oder auf die Zeit des "Masters"; synchronisiert sie sich beim ersten Mal oder regelmĂ€ĂŸig?

MT: – Jetzt werde ich das klĂ€ren. Ein Shard (d. h. eine horizontale Partition) hat immer einen PrimĂ€rschlĂŒssel. In einem Shard kann es einen "Master" geben und Replikate. Aber der Shard unterstĂŒtzt immer die Speicherung, weil er ein gewisses DomĂ€nenmodell unterstĂŒtzen muss (im Shard befindet sich der PrimĂ€rschlĂŒssel).

Frage: – Das heißt, alles hĂ€ngt rein vom "Master" ab? Wird immer die "Master"-Zeit verwendet?

MT: – Ja. Man kann bildlich sagen: Die Uhren ticken, wenn die Aufnahme im "Master", im "OpLog", erfolgt.

Frage: – Wir haben einen Kunden, der sich verbindet, und er muss ĂŒber die Zeit nichts wissen?

MT: – Er muss gar nichts wissen! Wenn wir darĂŒber sprechen, wie das beim Kunden funktioniert: Der Kunde muss, wenn er die kausale Konsistenz nutzen möchte, eine Sitzung eröffnen. In dieser Sitzung sind alles enthalten: Transaktionen in der Sitzung sowie Rechte abrufen
 Eine Sitzung ist eine Anordnung der logischen Ereignisse, die mit dem Kunden passieren.

Wenn er diese Sitzung eröffnet und dort angibt, dass er kausale Konsistenz möchte (sofern die Sitzung standardmĂ€ĂŸig kausale Konsistenz unterstĂŒtzt), funktioniert alles automatisch. Der Treiber speichert diese Zeit und erhöht sie, wenn er eine neue Nachricht erhĂ€lt. Er merkt sich, welche Antwort der vorherige Server zurĂŒckgegeben hat, der die Daten geliefert hat. Die nĂ€chste Anfrage wird afterCluster enthalten ("Zeit grĂ¶ĂŸer als diese").

Der Kunde muss wirklich ĂŒberhaupt nichts wissen! Das ist fĂŒr ihn völlig intransparent. Wenn die Leute diese Funktionen nutzen, was kann man damit erreichen? Erstens kann man sicher auf Secondaries lesen: Man kann auf das Primary schreiben und von geografisch replizierten Secondaries lesen und sich sicher sein, dass es funktioniert. Dabei können die Sessions, die auf dem Primary aufgezeichnet wurden, sogar an das Secondary ĂŒbertragen werden, d. h. man kann nicht nur eine Session, sondern mehrere verwenden.

Frage: – Das Thema der Eventual Consistency ist eng verbunden mit einem neuen Bereich der Informatik – den CRDT-Datentypen (Conflict-free Replicated Data Types). Haben Sie ĂŒber die Integration dieser Datentypen in die Datenbank nachgedacht und was können Sie dazu sagen?

MT: – Gute Frage! CRDT macht bei Konflikten beim Schreiben Sinn: in MongoDB – ein Single Master.

Frage: – Ich habe eine Frage von den DevOps. In der realen Welt gibt es solche heiklen Situationen, in denen ein byzantinischer Fehler auftritt und böse Menschen innerhalb des geschĂŒtzten Bereichs anfangen, in das Protokoll einzugreifen und auf spezielle Weise manipulierte Pakete zu senden?

HighLoad++, Mikhail Tyulenev (MongoDB): Kausale Konsistenz: Von der Theorie zur Praxis

MT: – Böse Menschen innerhalb des Bereichs sind wie ein Trojanisches Pferd! Böse Menschen innerhalb des Bereichs können viele schlechte Dinge tun.

Frage: – Es ist offensichtlich, dass es nicht richtig ist, im Server ein Loch zu lassen, durch das man einen Zoo von Elefanten schieben und den gesamten Cluster fĂŒr immer abstĂŒrzen lassen kann
 Das wĂŒrde Zeit fĂŒr eine manuelle Wiederherstellung erfordern
 Das ist, milde gesagt, nicht in Ordnung. Auf der anderen Seite ist es interessant, dass es im wirklichen Leben in der Praxis Situationen gibt, in denen tatsĂ€chlich solche internen Angriffe vorkommen?

MT: – Da ich in der realen Welt nicht oft mit Sicherheitsverletzungen konfrontiert bin, kann ich nicht sagen – vielleicht kommen sie vor. Aber wenn wir ĂŒber die Entwicklerphilosophie sprechen, denken wir so: Wir haben einen Perimeter, der die Leute, die fĂŒr die Sicherheit zustĂ€ndig sind, absichert – das ist das Schloss, die Mauer; und innerhalb des Bereichs kann man tun, was man will. Es ist klar, dass es Benutzer gibt, die nur schauen können, und solche, die das Verzeichnis löschen können.

Je nach Rechten kann der Schaden, den Benutzer anrichten können, von einer Maus bis zu einem Elefanten reichen. Klar ist, dass ein Benutzer mit vollen Rechten alles tun kann. Ein Benutzer mit eingeschrÀnkten Rechten kann erheblich weniger Schaden anrichten. Insbesondere kann er das System nicht zerstören.

Frage: – Im geschĂŒtzten Bereich hat jemand unerwartete Protokolle fĂŒr den Server erstellt, um den Server zu deaktivieren, und falls alles gut geht, sogar den gesamten Cluster... Kann es wirklich so "gut" sein?

MT: – Ich habe noch nie von solchen Dingen gehört. Dass man einen Server auf diese Weise lahmlegen kann, ist kein Geheimnis. Intern mit einem Protokoll, wĂ€hrend man ein autorisierter Benutzer ist, der etwas derartiges in eine Nachricht schreiben kann... Eigentlich ist das nicht möglich, weil es trotzdem verifiziert werden muss. Es gibt die Möglichkeit, diese Authentifizierung fĂŒr Benutzer, die es nicht wollen, zu deaktivieren – das sind dann deren Probleme; sie haben, grob gesagt, selbst die Mauern eingerissen und man könnte einen Elefanten hineinstecken, der alles niedertrampelt... Aber insgesamt könnte man in der Rolle eines Technikers kommen und ihn herausziehen!

Frage: – Danke fĂŒr den Bericht. Sergey ("Yandex"). In "Mongo" gibt es eine Konstante, die die Anzahl der stimmberechtigten Mitglieder im Replica Set auf 7 (sieben) limitiert. Warum ist das eine Konstante? Warum ist das kein Parameter?

MT: – Im Replica Set haben wir manchmal bis zu 40 Knoten. Dort gibt es immer eine Mehrheit. Ich weiß nicht, welche Version...

Frage: – Im Replica Set kann man auch nicht-stimmberechtigte Mitglieder starten, aber stimmberechtigte maximal 7. Wie geht man in diesem Fall mit einem Ausfall um, wenn unser Replica Set ĂŒber 3 Rechenzentren verteilt ist? Ein Rechenzentrum kann problemlos ausfallen, und auch eine Maschine kann ausfallen.

MT: – Das ist schon ein bisschen außerhalb des Berichts. Das ist eine allgemeine Frage. Vielleicht kann ich darĂŒber spĂ€ter erzĂ€hlen.

HighLoad++, Mikhail Tyulenev (MongoDB): Kausale Konsistenz: Von der Theorie zur Praxis

Video abspielen

Ein wenig Werbung 🙂

Danke, dass Sie bei uns bleiben. Gefallen Ihnen unsere Artikel? Möchten Sie mehr interessante Inhalte sehen? UnterstĂŒtzen Sie uns, indem Sie eine Bestellung aufgeben oder uns Freunden empfehlen, Cloud-VPS fĂŒr Entwickler ab 4,99 $, ein einzigartiges Äquivalent zu Einsteigerservern, das wir fĂŒr Sie entwickelt haben: Die ganze Wahrheit ĂŒber VPS (KVM) E5-2697 v3 (6 Kerne) 10GB DDR4 480GB SSD 1Gbps ab 19 $ oder wie man einen Server richtig teilt? (es sind Optionen mit RAID1 und RAID10 bis zu 24 Kernen und bis zu 40GB DDR4 verfĂŒgbar).

Dell R730xd ist im Equinix Tier IV Rechenzentrum in Amsterdam doppelt so gĂŒnstig? Nur bei uns 2 x Intel TetraDeca-Core Xeon 2x E5-2697v3 2.6GHz 14C 64GB DDR4 4x960GB SSD 1Gbps 100 TB ab $199 in den Niederlanden! Dell R420 — 2x E5-2430 2.2Ghz 6C 128GB DDR3 2x960GB SSD 1Gbps 100TB — ab $99! Lesen Sie, wie man eine Unternehmensinfrastruktur der Klasse C mit Dell R730xd E5-2650 v4-Servern fĂŒr 9000 Euro im Preis-Leistungs-VerhĂ€ltnis aufbaut?

Quelle: habr.com

60GB SSD 8Gb DDR4