Die nÀchste HighLoad++ Konferenz findet am 6. und 7. April 2020 in St. Petersburg statt.
Details und Tickets . HighLoad++ Sibirien 2019. Raum âKrasnojarskâ. 25. Juni, 12:00. Abstracts und .

Es kommt vor, dass praktische Anforderungen mit der Theorie in Konflikt stehen, wobei wichtige Aspekte fĂŒr kommerzielle Produkte nicht berĂŒcksichtigt werden. In diesem Vortrag wird der Prozess der Auswahl und Kombination verschiedener AnsĂ€tze zur Erstellung von Komponenten der Kausalen Konsistenz basierend auf akademischen Forschungsergebnissen unter den Anforderungen eines kommerziellen Produkts vorgestellt. Die Zuhörer erfahren von bestehenden theoretischen AnsĂ€tzen zu logischen Uhren, AbhĂ€ngigkeitsverfolgung, Systemsicherheit, Uhren-Synchronisation und warum MongoDB bei bestimmten Lösungen geblieben ist.
Michail Tjulenew (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.

Im Verlauf des Prozesses musste ich mit einer Vielzahl akademischer Forschungen vertraut werden, da dieses Feature gut erforscht ist. Es stellte sich heraus, dass kein Artikel den spezifischen Anforderungen entsprach, die in Produktionsumgebungen benötigt werden, aufgrund der sehr speziellen Anforderungen, die wahrscheinlich in jeder Produktionsanwendung vorhanden sind.
Ich werde darĂŒber berichten, wie wir als Verbraucher akademischer Forschung etwas daraus entwickeln, das wir unseren Nutzern als fertiges Produkt prĂ€sentieren können, das einfach und sicher zu verwenden ist.
Kausale Konsistenz (Causal Consistency). 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â):

Angenommen, Penny ist in Europa und Leonard möchte eine Ăberraschung fĂŒr sie organisieren. Er entscheidet sich dafĂŒr, sie aus seiner Freundesliste zu entfernen und allen Freunden ein Update im Feed zu senden: âLasst uns Penny eine Freude machen!â (Sie ist in Europa, schlĂ€ft und sieht das alles nicht, weil sie nicht dort ist). Am Ende löscht er diesen Beitrag, entfernt ihn aus dem Feed und stellt den Zugang wieder her, damit sie nichts merkt und es zu keinem Skandal kommt.
Das ist alles wunderbar, aber nehmen wir an, dass das System verteilt ist und die Ereignisse nicht ganz wie geplant ablaufen. Es könnte zum Beispiel passieren, dass Pennys ZugangsbeschrĂ€nkung nach dem Erscheinen dieses Beitrags erfolgt, wenn die Ereignisse nicht kausal miteinander verbunden sind. TatsĂ€chlich ist dies ein Beispiel dafĂŒr, dass kausale Konsistenz benötigt wird, um eine GeschĂ€ftsanforderung zu erfĂŒllen (in diesem Fall).
TatsĂ€chlich sind das ziemlich komplexe Eigenschaften von Datenbanken â nur sehr wenige unterstĂŒtzen sie. Lassen Sie uns zu den Modellen ĂŒbergehen.
Konsistenzmodelle (Consistency Models)
Was ist ĂŒberhaupt das Konsistenzmodell in Datenbanken? Es sind bestimmte Garantien, die ein verteiltes System hinsichtlich der Daten, die der Kunde empfangen kann, und der Reihenfolge, in der dies geschieht, bietet.
Letztendlich lassen sich alle Konsistenzmodelle darauf zurĂŒckfĂŒhren, wie Ă€hnlich ein verteiltes System einem System ist, das beispielsweise auf einem einzelnen Node auf einem Laptop lĂ€uft. Und es stellt sich die Frage, inwieweit ein System, das auf Tausenden von geografisch verteilten 'Nods' arbeitet, dem Laptop Ă€hnelt, bei dem all diese Eigenschaften im Grunde automatisch erfĂŒllt sind.
Deshalb gelten Konsistenzmodelle ausschlieĂlich fĂŒr verteilte Systeme. Alle Systeme, die zuvor existierten und auf vertikaler Skalierung basierten, hatten solche Probleme nicht. Dort gab es einen einzigen Buffer Cache, aus dem alles stets abgerufen wurde.
Das Strong-Modell
Das erste Modell ist das Strong (oder auch Linearity, wie es oft genannt wird). Dies ist ein Konsistenzmodell, das garantiert, dass jede Ănderung, sobald die BestĂ€tigung erfolgt, dass sie stattgefunden hat, fĂŒr alle Benutzer des Systems sichtbar wird.
Dies stellt eine globale Ordnung aller Ereignisse in der Datenbank her. Es ist eine sehr mĂ€chtige Konsistenz-Eigenschaft, aber auch kostspielig. Dennoch wird sie gut unterstĂŒtzt. Es ist einfach sehr teuer und langsam â weshalb sie selten genutzt wird. Dies wird als Erreichbarkeit bezeichnet.
Es gibt eine weitere, stĂ€rkere Eigenschaft, die im âSpannerâ unterstĂŒtzt wird â die als externe Konsistenz bezeichnet wird. DarĂŒber werden wir spĂ€ter sprechen.
Kausal
Das nĂ€chste ist kausal, das ist genau das, worĂŒber ich gesprochen habe. Zwischen starker und kausaler Konsistenz gibt es noch einige Unterebenen, die ich nicht ansprechen werde, aber sie fĂŒhren alle zur kausalen Konsistenz. Dies ist ein wichtiges Modell, weil es das stĂ€rkste von allen Modellen ist, die stĂ€rkste Konsistenz in Anwesenheit von Netzwerken oder Partitionen.
Kausale Konsistenzen sind im Wesentlichen Situationen, in denen Ereignisse durch eine Ursache-Wirkung-Beziehung verbunden sind. HÀufig werden sie aus Sicht des Kunden als 'Lesen der eigenen Rechte' wahrgenommen. Wenn ein Kunde bestimmte Werte beobachtet hat, kann er die Werte aus der Vergangenheit nicht mehr sehen. Er beginnt bereits, prÀfixierte Lesungen zu sehen. Das alles lÀuft auf dasselbe hinaus.
Causals als Konsistenzmodell â eine teilweise Ordnung von Ereignissen auf dem Server, bei der Ereignisse von allen Clients in derselben Reihenfolge beobachtet werden. In diesem Fall â Leonard und Penny.
Eventual
Das dritte Modell ist die Eventual Consistency. Dies ist das, was alle verteilten Systeme unterstĂŒtzen, das Minimalmodell, das ĂŒberhaupt Sinn macht. Es bedeutet Folgendes: Wenn wir Ănderungen an den Daten vornehmen, werden sie irgendwann konsistent.
In diesem Moment gibt es keine definitive Aussage, sonst wĂŒrde es zu einer External Consistency â eine ganz andere Geschichte. Dennoch ist dies ein sehr populĂ€res Modell, das am weitesten verbreitet ist. StandardmĂ€Ăig verwenden alle Benutzer verteilter Systeme genau die Eventual Consistency.
Ich möchte einige vergleichende Beispiele anfĂŒhren:

Was bedeuten diese Pfeile?
- Latenz. Wenn die KonsistenzstĂ€rke erhöht wird, wird sie aus nachvollziehbaren GrĂŒnden gröĂer: Es mĂŒssen mehr EintrĂ€ge erstellt und BestĂ€tigungen von allen Hosts und Knoten im Cluster eingeholt werden, dass die Daten dort bereits vorhanden sind. Entsprechend ist die Eventual Consistency die schnellste Antwort, da man in der Regel sogar im Speicher committen kann und dies grundsĂ€tzlich ausreichend ist.
- VerfĂŒgbarkeit. Wenn man dies als die FĂ€higkeit des Systems versteht, auf Anfragen zu antworten, trotz Netzwerkunterbrechungen, Partitionierungen oder anderer AusfĂ€lle â erhöht sich die Fehlertoleranz bei einer reduzierten Konsistenzmodell, da es ausreicht, dass ein Host aktiv bleibt und dabei bestimmte Daten liefert. Eventual Consistency garantiert ĂŒberhaupt nichts bezĂŒglich der Daten â es kann alles Mögliche sein.
- Anomalien. Dabei steigt natĂŒrlich die Anzahl der Anomalien. Bei starker Konsistenz sollte es diese fast gar nicht geben, wĂ€hrend sie bei eventueller Konsistenz beliebig auftreten können. Die Frage ist: Warum entscheiden sich Menschen fĂŒr eventuelle Konsistenz, wenn diese Anomalien enthĂ€lt? Die Antwort liegt darin, dass Modelle der eventuellen Konsistenz anwendbar sind, und Anomalien treten zum Beispiel nur fĂŒr kurze Zeit auf; es besteht die Möglichkeit, einen Master fĂŒr LesevorgĂ€nge zu verwenden und mehr oder weniger konsistente Daten zu lesen; oft gibt es die Möglichkeit, starke Konsistenzmodelle zu nutzen. Praktisch funktioniert das, und die Anzahl der Anomalien ist oft zeitlich begrenzt.
CAP-Theorem
Wenn Sie die Worte Konsistenz und VerfĂŒgbarkeit hören, was kommt Ihnen in den Sinn? Richtig â das CAP-Theorem! Ich möchte jetzt einen Mythos entkrĂ€ften⊠Es bin nicht ich, sondern Martin Kleppmann, der einen groĂartigen Artikel und ein groĂartiges Buch geschrieben hat.

Der CAP-Satz ist ein Prinzip, das in den 2000er Jahren formuliert wurde. Es besagt, dass Konsistenz, VerfĂŒgbarkeit und Partitionierung: wĂ€hle zwei, und du kannst nicht alle drei auswĂ€hlen. UrsprĂŒnglich war es ein Konzept. Einige Jahre spĂ€ter wurde es von Gilbert und Lynch als Theorem bewiesen. Danach wurde es als Mantra verwendet â Systeme wurden in CA, CP, AP usw. unterteilt.
Dieses Theorem wurde tatsĂ€chlich fĂŒr folgende FĂ€lle bewiesen ⊠ZunĂ€chst wurde VerfĂŒgbarkeit nicht als kontinuierlicher Wert von null bis hundert betrachtet (0 â das System ist âtotâ, 100 â es reagiert schnell; so haben wir es gewöhnt zu betrachten), sondern als eine Eigenschaft des Algorithmus, die garantiert, dass er bei allen AusfĂŒhrungen Daten zurĂŒckgibt.
Im Zusammenhang mit der Antwortzeit wird ĂŒberhaupt kein Wort verloren! Es gibt einen Algorithmus, der Daten in 100 Jahren zurĂŒckgibt â ein vollkommen verfĂŒgbarer Algorithmus, der Teil des CAP-Satzes ist.
Zweitens wurde das Theorem fĂŒr Ănderungen bei Werten desselben SchlĂŒssels bewiesen, wobei diese Ănderungen eine anpassbare Linie darstellen. Das bedeutet, dass sie in der Praxis kaum verwendet werden, da andere Modelle wie Eventual Consistency oder Strong Consistency praktizierter sein könnten.
Warum das Ganze? Weil der CAP-Satz in der Form, in der er bewiesen wurde, praktisch nicht anwendbar ist und selten genutzt wird. In theoretischer Form schrÀnkt er auf gewisse Weise ein. Es ergibt sich ein Prinzip, das intuitiv wahr ist, aber nicht wirklich bewiesen wurde.
Kausale Konsistenz â das stĂ€rkste Modell
Was derzeit geschieht, ist, dass man alle drei Dinge erhalten kann: Konsistenz und VerfĂŒgbarkeit können auch bei Partitionen sichergestellt werden. Insbesondere die kausale Konsistenz ist das stĂ€rkste Konsistenzmodell, das auch bei Partitionen (NetzwerkausfĂ€llen) weiterhin funktioniert. Daher ist es von groĂem Interesse fĂŒr uns, und deshalb haben wir uns damit beschĂ€ftigt.

Es vereinfacht zunĂ€chst die Arbeit der Anwendungsentwickler. Insbesondere durch die umfangreiche UnterstĂŒtzung seitens des Servers: Wenn alle Transaktionen eines Clients garantiert in derselben Reihenfolge beim anderen Client ankommen. Zweitens hĂ€lt es auch Partitionen stand.
Die interne Funktionsweise von MongoDB
Angesichts des Mittagessens begeben wir uns in die KĂŒche. Ich werde das Systemmodell erlĂ€utern, insbesondere was MongoDB ist, fĂŒr diejenigen, die zum ersten Mal von dieser Datenbank hören.


MongoDB (im Folgenden âMongoDB") ist ein verteiltes System, das horizontale Skalierung, also Sharding, unterstĂŒtzt; und innerhalb jedes Shards wird auch Datenredundanz durch Replikation unterstĂŒtzt.
Sharding in MongoDB (eine nicht-relationale Datenbank) fĂŒhrt eine automatische Lastenverteilung durch, das heiĂt, jede Dokumentensammlung (oder âTabelleâ im Sinne relationaler Daten) wird in Fragmente unterteilt, und der Server verschiebt diese automatisch zwischen den Shards.
Der Query Router, der die Anfragen verteilt, agiert fĂŒr den Client als ein gewisser 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 EintrĂ€ge entgegennehmen, die die SchlĂŒssel unterstĂŒtzen, die er in sich hĂ€lt. Multi-Master-Write ist nicht möglich.
Wir haben Version 4.2 veröffentlicht â darin sind neue interessante Funktionen hinzugekommen. Insbesondere ist Lucene integriert â eine durchfĂŒhrbare Java-Suchfunktion direkt in MongoDB, wodurch die Suche ĂŒber Lucene, Ă€hnlich wie in Elasticsearch, möglich geworden ist.
Wir haben ein neues Produkt geschaffen â Charts, das ebenfalls auf âAtlasâ verfĂŒgbar ist (unser eigener Cloud âMongoâ). Es gibt ein Free Tier â man kann damit experimentieren. Mir haben die Charts sehr gefallen â die Datenvisualisierung ist Ă€uĂerst intuitiv.
Causal Consistency
Ich habe etwa 230 Artikel gezĂ€hlt, die zu diesem Thema von Leslie Lampert veröffentlicht wurden. Jetzt erinnere ich mich und kann Ihnen einige Teile dieser Materialien ĂŒbermitteln.

Alles begann mit einem Artikel von Leslie Lampert, der in den 1970er Jahren geschrieben wurde. Wie Sie sehen, gibt es immer noch laufende Forschungen zu diesem Thema. Momentan erfĂ€hrt Causal Consistency aufgrund der Entwicklungen in verteilten Systemen groĂes Interesse.
EinschrÀnkungen
Welche EinschrĂ€nkungen gibt es? Das ist tatsĂ€chlich einer der Hauptpunkte, denn die EinschrĂ€nkungen, die Produktion Systeme auferlegen, unterscheiden sich stark von den EinschrĂ€nkungen in akademischen Artikeln. Oft sind sie ziemlich kĂŒnstlich.

- Erstens: âMongoDBâ ist ein Single-Master-System, wie ich bereits erwĂ€hnt 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 offensichtlich einschrĂ€nken.
- Wir bieten Cloud-Lösungen an, aber wir glauben, dass Benutzer die Möglichkeit haben sollten, die Software herunterzuladen, sie auf ihrem Laptop auszufĂŒhren und dass alles einwandfrei funktioniert.
- Wir gehen davon aus, dass Research selten genutzt wird: Externe Kunden können tun, was sie wollen. MongoDB ist Open Source, was bedeutet, dass Kunden die Möglichkeit haben, es entsprechend ihrer BedĂŒrfnisse zu verĂ€ndern. Wir erwarten, dass es zu komplexen Situationen kommen kann.
- FĂŒr externe Kunden auĂerhalb des Perimeters besteht eine wichtige EinschrĂ€nkung: Wenn diese Funktion deaktiviert ist, sollten keine LeistungsbeeintrĂ€chtigungen sichtbar sein.
- Ein weiterer Punkt â eher unkonventionell: die KompatibilitĂ€t zwischen alten und neuen Versionen. Alte Treiber mĂŒssen neue Updates unterstĂŒtzen, und die Datenbank muss alte Treiber unterstĂŒtzen.
Insgesamt bringt das einige EinschrÀnkungen mit sich.
Komponenten der kausalen Konsistenz
Ich möchte nun einige Komponenten vorstellen. Wenn wir im Allgemeinen Causal Consistency betrachten, können wir verschiedene Bereiche identifizieren. Wir haben aus Arbeiten ausgewĂ€hlt, die zu einem bestimmten Bereich gehören: Dependency Tracking, die Auswahl der Uhren, wie diese Uhren miteinander synchronisiert werden können, und wie wir die Sicherheit gewĂ€hrleisten â das ist ein grober Plan, ĂŒber den ich sprechen werde:

VollstÀndiges Dependency Tracking (Full Dependency Tracking)
Wozu ist es notwendig? Damit bei der Replikation von Daten â jede Eintragung, jede DatenĂ€nderung Informationen darĂŒber enthĂ€lt, von welchen Ănderungen sie abhĂ€ngt. Die erste und naivste Ănderung ist, wenn jede Nachricht, die eine Eintragung enthĂ€lt, Informationen ĂŒber die vorherigen Nachrichten enthĂ€lt:

In diesem Beispiel steht die Nummer in geschweiften Klammern fĂŒr die Eintragungsnummern. Manchmal werden diese Eintragungen mit Werten sogar ganz ĂŒbergeben, manchmal auch bestimmte Versionen. Das Wesentliche ist, dass jede Ănderung Informationen ĂŒber die vorherige enthĂ€lt (dies alles ist implizit enthalten).
Warum haben wir uns entschieden, diesen Ansatz (vollstĂ€ndiges Tracking) nicht zu verwenden? Offensichtlich, weil dieser Ansatz unpraktisch ist: Jede VerĂ€nderung in einem sozialen Netzwerk hĂ€ngt von allen vorherigen Ănderungen in diesem sozialen Netzwerk ab, was bedeutet, dass man beispielsweise "Facebook" oder "VKontakte" in jedem Update ĂŒbermitteln muss. Dennoch gibt es viele Studien zu genau diesem Thema, dem Full Dependency Tracking â dies betrifft presoziale Netzwerke, und fĂŒr einige Situationen funktioniert es wirklich.
Explizites AbhÀngigkeits-Tracking
Das nĂ€chste ist ein eingeschrĂ€nkterer Ansatz. Hier wird ebenfalls die Ăbertragung von Informationen betrachtet, aber nur von den Informationen, die eindeutig abhĂ€ngen. Was von was abhĂ€ngt, wird in der Regel bereits von der Anwendung definiert. Wenn Daten repliziert werden, werden bei der Abfrage nur die Antworten ausgegeben, wenn die vorherigen AbhĂ€ngigkeiten erfĂŒllt sind, das heiĂt, angezeigt wurden. Das ist das Wesen davon, wie kausale Konsistenz funktioniert.

Sie sieht, dass der Datensatz 5 von den DatensĂ€tzen 1, 2, 3, 4 abhĂ€ngt â folglich wartet sie, bevor der Kunde Zugang zu den Ănderungen erhĂ€lt, die durch Penny's Zugriffsregelung vorgenommen wurden, solange alle vorherigen Ănderungen bereits in der Datenbank verarbeitet wurden.
Das ist auch fĂŒr uns nicht akzeptabel, da es einfach zu viele Informationen gibt, was zu Verzögerungen fĂŒhren wird. Es gibt einen anderen AnsatzâŠ
Lamport-Uhr (Lamport Clock)
Sie sind sehr alt. Die Lamport-Uhr bedeutet, dass diese AbhÀngigkeiten in eine skalare Funktion umgewandelt werden, die als Lamport-Uhr bezeichnet 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 dem Prozess momentan bekannt ist, sendet jede Nachricht. Es ist klar, dass Prozesse asynchron sein können und völlig unterschiedliche Zeiten haben. Dennoch gleicht das System durch diesen Nachrichtenaustausch irgendwie die Uhren aus. Was passiert in diesem Fall?
Ich habe den groĂen Shard halbiert, um es klarer zu machen: Friends können in einem Knoten leben, der ein StĂŒck der Sammlung enthĂ€lt, wĂ€hrend Feed in einem anderen Knoten untergebracht ist, der ebenfalls ein StĂŒck dieser Sammlung enthĂ€lt. Verstehst du, wie sie nicht in der Warteschlange landen können? Zuerst wird Feed sagen: âRepliziertâ, und dann â Friends. Wenn das System keine Garantien bietet, dass Feed nicht angezeigt wird, solange die AbhĂ€ngigkeiten von Friends in der Friends-Sammlung ebenfalls nicht bereitgestellt sind, stellen wir genau die Situation fest, die ich erwĂ€hnt habe.
Du siehst, wie die logische Zeit des Counters bei Feed steigt:

Das Hauptmerkmal dieser Lamport-Uhr und der kausalen Konsistenz (erklÀrt durch die Lamport-Uhr) ist folgendes: Wenn wir die Ereignisse A und B haben und Ereignis B von Ereignis A abhÀngt*, 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, d.h. A geschah vor B â dies stellt eine Beziehung dar, die die gesamte Menge der Ereignisse, die ĂŒberhaupt geschehen sind, teilweise ordnet.
In die entgegengesetzte Richtung ist es falsch. Das ist tatsĂ€chlich eine der Hauptnachteile der Lamport-Uhr â partielle Ordnung. Es gibt das Konzept von gleichzeitigen Ereignissen, also Ereignissen, bei denen weder (A geschah vor B) noch (A geschah nach B). Ein Beispiel könnte sein, wenn Leonard jemanden in seine Freundeliste hinzufĂŒgt (nicht unbedingt Leonard selbst, sondern beispielsweise Sheldon).
Das ist genau die Eigenschaft, die hĂ€ufig bei der Arbeit mit Lamport-Uhren verwendet wird: Man schaut sich die Funktion an und zieht daraus den Schluss, dass vielleicht diese Ereignisse voneinander abhĂ€ngig sind. Denn in eine Richtung ist es tatsĂ€chlich so: Wenn LogicalTime A kleiner ist als LogicalTime B, kann B nicht vor A geschehen; ist es gröĂer, dann könnte es sein.
Vektoruhren (Vector Clock)
Die logische Weiterentwicklung der Lamport-Uhr sind die Vektoruhren. Sie unterscheiden sich dadurch, dass jeder Knoten, der hier vorhanden ist, seine eigenen separaten Uhren enthĂ€lt, die als Vektor ĂŒbertragen werden.
In diesem Fall sehen Sie, dass der Nullindex des Vektors fĂŒr den Feed verantwortlich ist, und der erste Index des Vektors fĂŒr die Freunde (jeder dieser Knoten). Und nun werden sie erhöht: Der Nullindex fĂŒr den âFeedâ wird bei der Registrierung erhöht â 1, 2, 3:

Was macht Vektoruhren besser? Sie ermöglichen es, nachzuvollziehen, welche Ereignisse gleichzeitig stattfinden und wann sie auf verschiedenen Knoten auftreten. Das ist fĂŒr ein Sharding-System wie MongoDB Ă€uĂerst wichtig. Dennoch haben wir uns nicht dafĂŒr entschieden, obwohl es eine interessante Lösung ist, die groĂartig funktioniert und wahrscheinlich auch fĂŒr uns geeignet wĂ€reâŠ
Wenn wir 10.000 Shards haben, können wir nicht 10.000 Komponenten ĂŒbertragen, selbst wenn wir komprimieren und uns etwas einfallen lassen â die Nutzlast wird trotzdem um ein Vielfaches geringer sein als das gesamte Volumen dieses Vektors. Daher haben wir widerwillig diesen Ansatz aufgegeben und sind zu einem anderen ĂŒbergegangen.
Spanner TrueTime. Atomuhren
Ich habe gesagt, dass es eine Geschichte ĂŒber âSpannerâ geben wird. Das ist eine coole Sache, wirklich aus dem 21. Jahrhundert: Atomuhren, GPS-Synchronisation.
Was ist die Idee? âSpannerâ ist Googles System, das vor kurzem sogar fĂŒr die Ăffentlichkeit zugĂ€nglich gemacht 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 Zeitpunkt âeintrittâ.

Durch das einfache Speichern in der Datenbank und das Warten einer bestimmten Zeit wird automatisch die Serialisierbarkeit von Ereignissen gewĂ€hrleistet. Sie verfĂŒgen ĂŒber das stĂ€rkste Konsistenzmodell, das man sich vorstellen kann â es ist externe Konsistenz.
* Das ist das Hauptproblem der Lamport-Uhren â sie sind in verteilten Systemen nie synchron. Sie können auseinanderdriften, selbst mit NTP arbeiten sie nicht besonders gut. Die "Spanner"-Uhren haben Atomuhren und Synchronisation, die offenbar im Mikrosekundenbereich funktioniert.
Warum haben wir diese nicht gewĂ€hlt? Wir setzen nicht voraus, dass unsere Nutzer eingebaute Atomuhren haben. Wenn diese in jedem Laptop verbaut sind, mit einer groĂartigen GPS-Synchronisation â dann ja⊠Aber derzeit ist das Beste, was möglich ist, die "Amazon", Basisstationen â fĂŒr die Enthusiasten⊠Daher haben wir andere Uhren verwendet.
Hybride Uhren (Hybrid Clock)
Das ist tatsÀchlich das, was in "MongoDB" tickt, um kausale Konsistenz zu gewÀhrleisten. Was macht sie hybrid? Hybrid ist ein skalarer Wert, aber er besteht aus zwei Komponenten:

- Erstens â die Unix-Epoche (wie viele Sekunden seit dem "Beginn der Computerwelt" vergangen sind).
- Das zweite ist ein gewisser Inkrement, ebenfalls ein 32-Bit unsigned int.
Das ist eigentlich 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, wird dieser Teil mit den Uhren synchronisiert, sodass die Zeit immer mehr oder weniger korrekt ist, und der Inkrement ermöglicht es, Ereignisse zu unterscheiden, die zum gleichen Zeitpunkt aufgetreten sind.
Warum ist das fĂŒr MongoDB wichtig? Weil es ermöglicht, Backups zu bestimmten Zeitpunkten zu erstellen, also wird das Ereignis mit einer Zeitstempel indiziert. Das ist wichtig, wenn bestimmte Ereignisse benötigt werden; fĂŒr die Datenbank sind Ereignisse Ănderungen, die zu bestimmten Zeitpunkten in der Datenbank erfolgt sind.
Den wichtigsten Grund erklĂ€re ich nur Ihnen (bitte, sagen Sie es niemandem)! Wir haben das so gemacht, weil es so aussieht, dass geordnete, indexierte Daten im MongoDB OpLog gespeichert werden. Das OpLog ist eine Datenstruktur, die alle Ănderungen in der Datenbank enthĂ€lt: Diese gelangen zunĂ€chst in das OpLog und werden dann auf die eigentliche Storage angewendet, wenn es sich um replizierte Daten oder Shards handelt.
Das war der Hauptgrund. Es gibt schlieĂlich auch praktische Anforderungen an die Datenbankentwicklung, was bedeutet, dass es einfach sein muss â wenig Code, so wenige defekte Elemente wie möglich, die neu geschrieben und getestet werden mĂŒssen. Die Tatsache, dass unsere OpLogs von hybriden Uhren indiziert wurden, hat erheblich geholfen und die richtige Wahl ermöglicht. Das hat sich wirklich ausgezahlt und irgendwie magisch beim ersten Prototypen funktioniert. Es war einfach groĂartig!
Uhrensynchronisation
Es gibt mehrere Methoden zur Synchronisation, die in der wissenschaftlichen Literatur beschrieben sind. Ich spreche von der Synchronisation, wenn wir zwei unterschiedliche Shards haben. Wenn es ein Replica-Set gibt, ist keine Synchronisation erforderlich: das ist ein "Single-Master"; wir haben ein OpLog, in das alle Ănderungen eingehen â in diesem Fall ist alles bereits sequenziell im "OpLog" geordnet. Aber wenn wir zwei verschiedene Shards haben, ist Zeit-Synchronisation hier wichtig. Hier haben die Vektoruhren mehr geholfen! Aber die haben wir nicht.

Die zweite Möglichkeit sind die "Heartbeats". Hier können wir bestimmte Signale austauschen, die in festen Intervallen auftreten. Allerdings sind die "Heartbeats" zu langsam, um die Latenz fĂŒr unseren Kunden zu gewĂ€hrleisten.
Echte Zeit ist natĂŒrlich eine wunderbare Sache. Aber das ist wahrscheinlich die Zukunft... Obwohl es im "Atlas" bereits möglich ist, gibt es schon schnelle "Amazon"-Zeit-Synchronisierer. Doch diese werden nicht fĂŒr alle zugĂ€nglich sein.
Gossiping bedeutet, dass alle Nachrichten Zeitstempel enthalten. Das ist ungefĂ€hr das, was wir verwenden. Jede Nachricht zwischen den Knoten, den Treibern, dem Router und den Datenknoten - alles fĂŒr "MongoDB" - sind Elemente, Komponenten der Datenbank, die Uhren beinhalten, die ticken. Ăberall gibt es Werte fĂŒr hybridisierte Zeit, diese werden ĂŒbertragen. 64 Bits? Das lĂ€sst sich machen.
Wie funktioniert das alles zusammen?
Hier betrachte ich ein Replikat-Set, um es etwas einfacher zu machen. Es gibt einen PrimĂ€r- und einen SekundĂ€rknoten. Der SekundĂ€rknoten fĂŒhrt die Replikation durch und ist nicht immer vollstĂ€ndig mit dem PrimĂ€rknoten synchronisiert.
Es erfolgt ein Insert in die âPrimĂ€rdatenâ mit einem bestimmten Zeitwert. Dieses Insert erhöht den internen ZĂ€hler um 11, wenn dies das Maximum ist. Andernfalls wird es die Zeitwerte ĂŒberprĂŒfen und sich nach den Stunden synchronisieren, wenn die Stundenwerte gröĂer sind. Dies ermöglicht eine zeitliche Sortierung.
Nachdem er den Eintrag vornimmt, gibt es einen wichtigen Moment. Die Uhren in âMongoDBâ werden nur im Falle eines Eintrags im âOplogâ inkrementiert. Dies ist das Ereignis, das den Zustand des Systems verĂ€ndert. In allen klassischen Artikeln wird ein Ereignis als das Eintreffen einer Nachricht in einem Knoten betrachtet: eine Nachricht ist angekommen â das bedeutet, das System hat seinen Zustand geĂ€ndert.
Dies hĂ€ngt damit zusammen, dass es bei der Untersuchung nicht ganz klar ist, wie diese Nachricht interpretiert werden wird. Wir wissen genau, dass wenn sie nicht im âOplogâ reflektiert ist, sie auf keine Weise interpretiert werden kann, und die SystemzustandsĂ€nderung nur durch einen Eintrag im âOplogâ erfolgt. Das vereinfacht alles fĂŒr uns: sowohl das Modell ist vereinfacht, als auch es ermöglicht eine Sortierung innerhalb eines Replikat-Sets und viele andere nĂŒtzliche Dinge.
Es wird ein Wert zurĂŒckgegeben, der bereits im "OpLog" gespeichert ist â wir wissen, dass dieser Wert im "OpLog" bereits vorhanden ist und seine Zeit 12 Uhr betrĂ€gt. Jetzt sagen wir, dass das Lesen von einem anderen Node (Secondary) beginnt, und er ĂŒbertrĂ€gt bereits afterClusterTime in der Nachricht. Er sagt: âIch benötige alles, was mindestens nach 12 Uhr oder zur gleichen Zeit passiert istâ (siehe Abbildung oben).
Das nennt man Causal and consistent (CAT). Es gibt ein Konzept in der Theorie, das besagt, 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 zu dem Zeitpunkt 12 SchlĂŒssel beobachtet wurde.
Hier ist momentan nichts, da dies sich so verhĂ€lt, als ob die Situation simuliert wird, in der Secondary Daten von Primary replizieren muss. Er wartet⊠Und hier sind die Daten angekommen â die Werte werden zurĂŒckgegeben.

So funktioniert das ungefÀhr. Fast.
Was bedeutet "fast schon"? Stellen wir uns vor, es gibt einen Menschen, der verstanden hat, wie das alles funktioniert. Er hat erkannt, dass jedes Mal, wenn ein ClusterTime auftritt, die internen logischen Uhren aktualisiert werden, und dann wird der nĂ€chste Eintrag um eins erhöht. Diese Funktion umfasst 20 Zeilen. Angenommen, dieser Mensch ĂŒbertrĂ€gt die gröĂtmögliche 64-Bit-Zahl minus eins.
Warum âminus einsâ? Weil die internen Uhren in diesen Wert eingepasst werden (offensichtlich ist dies der gröĂte mögliche Wert, der ĂŒber der aktuellen Zeit liegt), dann erfolgt der Eintrag in das âOp-Logâ, und die Uhren werden um eins erhöht â und dann haben wir den wirklich maximalen Wert (da sind einfach alle Einsen, weiter gehtâs nicht, unsignierte Integer).
Es ist klar, dass das System nach diesem Vorgang absolut fĂŒr nichts mehr verfĂŒgbar ist. Es kann nur entladen und gereinigt werden â das erfordert viel manuelle Arbeit. VollstĂ€ndige VerfĂŒgbarkeit:

AuĂerdem, falls dies irgendwohin repliziert wird, stĂŒrzt der gesamte Cluster einfach ab. Eine absolut inakzeptable Situation, die jeder Mensch sehr schnell und einfach herbeifĂŒhren kann! Daher haben wir diesen Punkt als einen der wichtigsten betrachtet. Wie kann man das verhindern?
Unser Weg ist es, clusterTime zu unterschreiben
So wird es in der Nachricht ĂŒbermittelt (bis zum blauen Text). Aber wir haben auch begonnen, eine Signatur zu generieren (blauer Text):

Die Signatur wird mit einem SchlĂŒssel generiert, der in der Datenbank innerhalb eines geschĂŒtzten Bereichs gespeichert ist; der SchlĂŒssel selbst wird generiert und aktualisiert (Benutzer sehen davon nichts). Ein Hash wird erzeugt, und jede Nachricht wird beim Erstellen signiert und beim Empfang validiert.
Vielleicht stellt sich die Frage: "Wie sehr verlangsamt das alles?" Ich habe gesagt, dass es schnell funktionieren sollte, insbesondere ohne diese Funktion.
Was bedeutet es, in diesem Fall nach kausaler Konsistenz zu arbeiten? Das bedeutet, den afterClusterTime-Parameter anzuzeigen. Ansonsten werden die Werte in jedem Fall ĂŒbermittelt. Gossiping arbeitet seit Version 3.6 immer.
Wenn wir die stÀndige Generierung von Signaturen beibehalten, wird dies das System sogar ohne die Funktion verlangsamen, was nicht unseren AnsÀtzen und Anforderungen entspricht. Und was haben wir getan?
Mach das schnell!
Es ist eine ziemlich einfache Sache, aber der Trick ist interessant â ich teile es, vielleicht interessiert es jemand.
Wir haben einen Hash, in dem die signierten Daten gespeichert sind. Alle Daten laufen durch den Cache. Der Cache signiert nicht konkret die Zeit, sondern einen Bereich. Wenn ein Wert eintrifft, generieren wir den Bereich, maskieren die letzten 16 Bit, und dieses Ergebnis signieren wir:

Durch diese Signatur beschleunigen wir das System (theoretisch) um das 65.000-Fache. Es funktioniert hervorragend: bei Experimenten wurde die Zeit fĂŒr den sequentiellen Update-Prozess tatsĂ€chlich um das 10.000-Fache verkĂŒrzt. Klar, wenn sie unregelmĂ€Ăig sind, klappt es nicht. Aber in den meisten praktischen FĂ€llen funktioniert es. Die Kombination aus der Signatur des Bereichs zusammen mit der Hauptsignatur hat ein Sicherheitsproblem gelöst.
Was haben wir gelernt?
Lektionen, die wir daraus gezogen haben:
- Es ist wichtig, Materialien, Geschichten und Artikel zu lesen, denn es gibt viel Interessantes zu entdecken. Wenn wir an einem Feature arbeiten (insbesondere jetzt, wo wir Transaktionen verarbeitet haben usw.), mĂŒssen wir lesen und verstehen. Das kostet Zeit, ist aber tatsĂ€chlich sehr hilfreich, weil es klar macht, wo wir stehen. Wir haben anscheinend nichts Neues erfunden â wir haben einfach die Zutaten genommen.
Generell gibt es einen gewissen Unterschied im Denken, wenn es um akademische Konferenzen geht (wie zum Beispiel die "Sigmon"), wo alle auf neue Ideen fokussiert sind. Was ist die Neuheit unseres Algorithmus? Hier gibt es nicht viel Neues. Die Neuheit liegt eher darin, wie wir bestehende AnsÀtze miteinander kombiniert haben. Daher ist es wichtig, die Klassiker zu lesen, beginnend mit Lamport.
- In der Produktion gelten völlig andere Anforderungen. Ich bin mir sicher, dass viele von Ihnen nicht mit "sphĂ€rischen" Datenbanken in einem abstrakten Vakuum konfrontiert sind, sondern mit normalen, realen Dingen, die Probleme in Bezug auf VerfĂŒgbarkeit, Latenz und Ausfallsicherheit aufweisen.
- Das Letzte ist, dass wir verschiedene Ideen betrachten und mehrere grundsĂ€tzlich verschiedene Artikel zu einem Ansatz kombiniert haben. Die Idee des Signierens stammt beispielsweise aus einem Artikel, der das Paxos-Protokoll betrachtete, welches fĂŒr nicht-byzantinische Fehler innerhalb des Autorisierungsprotokolls gedacht ist, wĂ€hrend es fĂŒr byzantinische Fehler auĂerhalb des Autorisierungsprotokolls gilt... Insgesamt ist das genau das, was wir schlieĂlich umgesetzt haben.
Hier gibt es absolut nichts Neues! Aber sobald wir alles zusammen mischen⊠Es wĂ€re so, als wĂŒrde man sagen, dass das Rezept fĂŒr Olivier-Salat Unsinn ist, nur weil Eier, Mayonnaise und Gurken bereits erfunden wurden⊠Es ist etwa die gleiche Geschichte.

Damit schlieĂe ich. Vielen Dank!
Fragen
Frage aus dem Publikum (im Folgenden â F): â Vielen Dank, Michail, fĂŒr den Vortrag! Das Thema Zeit ist interessant. Sie verwenden Gossiping. Sie sagten, 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, auch viele Query-Planer, und auch viele Shards⊠Was passiert mit dem System, wenn es plötzlich zu einem Ungleichgewicht kommt: jemand denkt, er ist eine Minute voraus, jemand anderer â eine Minute hinterher? Wo landen wir?
MT: â Das ist tatsĂ€chlich eine groĂartige Frage! Ich wollte gerade ĂŒber die Shards sprechen. Wenn ich die Frage richtig verstehe, haben wir die Situation: Es gibt Shard 1 und Shard 2, das Lesen erfolgt von diesen beiden Shards â sie haben Unterschiede, interagieren nicht miteinander, weil die Zeiten, die sie kennen, unterschiedlich sind, insbesondere die Zeit, die in ihren LogbĂŒchern existiert.
Angenommen, shard 1 hat eine Million EintrĂ€ge gemacht, shard 2 hingegen gar nichts, und die Anfrage kam an zwei shards. Und shard 1 hat eine afterClusterTime von ĂŒber einer Million. In einem solchen Fall, wie ich erklĂ€rt habe, wird shard 2 niemals antworten.
Frage: â Ich wollte wissen, wie sie sich synchronisieren und eine logische Zeit wĂ€hlen?
MT: â Das Synchronisieren ist ganz einfach. Ein shard, wenn er nach afterClusterTime keine Zeit im "OpLog" findet, initiiert no approved. Das bedeutet, dass er seine Zeit auf diesen Wert anhebt. Das zeigt an, dass es keine Ereignisse gibt, die dieser Anfrage entsprechen. Er erstellt dieses Ereignis kĂŒnstlich und wird dadurch kausal konsistent.
Frage: â Und wenn danach noch irgendwelche Ereignisse eintreffen, die irgendwo im Netzwerk verloren gegangen sind?
MT: â Der shard ist so strukturiert, dass diese bereits nicht mehr eintreffen, da es sich um einen Single-Master handelt. Wenn er bereits geschrieben hat, werden sie nicht mehr eintreffen, sondern kommen danach. Es kann nicht passieren, dass irgendwo etwas stecken bleibt, er dann no write macht und diese Ereignisse eintreffen â und die kausale Konsistenz gestört wird. Wenn er no write macht, mĂŒssen alle noch weiter eintreffen (er wird auf sie warten).

Frage: â Ich habe einige Fragen zu Warteschlangen. Kausale Konsistenz setzt voraus, dass es eine bestimmte Reihenfolge von Aktionen gibt, die ausgefĂŒhrt werden mĂŒssen. Was passiert, wenn ein Paket verloren geht? Der 10. und 11. sind gegangen, aber der 12. fehlt, wĂ€hrend alle anderen darauf warten, dass er bearbeitet wird. Und plötzlich stirbt unsere Maschine, wir können nichts mehr tun. Gibt es eine maximale LĂ€nge der Warteschlange, die sich aufstaut, bevor sie bearbeitet wird? Welche schwerwiegenden Fehler treten auf, wenn ein Zustand verloren geht? Besonders wenn wir aufzeichnen, dass es einen vorherigen Zustand gibt, von dem wir ausgehen sollten? Aber darauf haben wir uns nicht gestĂŒtzt!
MT: â Auch eine groĂartige 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 die Aufzeichnung nicht im Quorum ist oder wenn das Lesen nicht quorum ist (es kann ebenfalls MĂŒll auftauchen).
BezĂŒglich der kausalen Konsistenz haben wir eine umfangreiche experimentelle ĂberprĂŒfung durchgefĂŒhrt, deren Ergebnis zeigte, dass bei nicht quorum konformen Schreib- und LesevorgĂ€ngen VerstöĂe gegen die kausale Konsistenz auftreten. Genau das, was Sie sagen!
Unser Tipp: Verwenden Sie mindestens ein Quorum-Lesen bei der Nutzung von Kausal-Konsistenz. In diesem Fall gehen keine Daten verloren, selbst wenn das Quorum-Write verloren geht... Dies ist eine orthogonale Situation: Wenn der Benutzer nicht möchte, dass Daten verloren gehen, muss er Quorum-Write verwenden. Kausal-Konsistenz garantiert nicht die Haltbarkeit. Die Garantie fĂŒr die Haltbarkeit bieten Replikation und die mit der Replikation verbundene Technik.
Frage: â Wenn wir eine Instanz erstellen, die bei uns das Sharding ausfĂŒhrt (nicht master, sondern entsprechend slave), stĂŒtzt sie sich auf die Unix-Zeit ihrer eigenen Maschine oder auf die Zeit des «Masters»; wird sie beim ersten Mal oder regelmĂ€Ăig synchronisiert?
MT: â Lass mich das klarstellen. Ein Shard (d. h. eine horizontale Partition) hat immer einen Primary. In einem Shard kann es einen âMasterâ und Replikate geben. Aber der Shard muss immer das Schreiben unterstĂŒtzen, da er einen bestimmten Bereich abdecken muss (im Shard befindet sich der Primary).
Frage: â Bedeutet das, dass alles rein vom âMasterâ abhĂ€ngt? Wird immer die âMasterâ-Zeit verwendet?
MT: â Ja. Man kann bildlich sagen: Die Uhren ticken, wenn ein Write im âMasterâ erfolgt, im âOpLogâ.
Frage: â Wir haben einen Kunden, der sich verbindet, und er muss nichts ĂŒber die Zeit wissen?
MT: â Man muss ĂŒberhaupt nichts wissen! Wenn es darum geht, wie es beim Kunden funktioniert: Der Kunde muss, wenn er Causal Consistency nutzen möchte, eine Sitzung öffnen. In dieser Sitzung sind sowohl die Transaktionen als auch die Rechte enthalten... Eine Sitzung ist eine Anordnung der logischen Ereignisse, die mit dem Kunden stattfinden.
Wenn er diese Sitzung öffnet und sagt, dass er Causal Consistency möchte (sofern die Sitzung standardmĂ€Ăig Causal Consistency unterstĂŒtzt), funktioniert alles automatisch. Der Treiber merkt sich diese Zeit und erhöht sie, wenn er eine neue Nachricht erhĂ€lt. Er merkt sich, welche Antwort vom Server zurĂŒckgegeben wurde, der die Daten geliefert hat. Die nĂ€chste Anfrage wird "afterCluster" enthalten ("Zeit gröĂer als diese").
Der Kunde muss absolut nichts wissen! Es ist fĂŒr ihn vollkommen intransparent. Wenn Menschen diese Funktionen nutzen, was erlaubt das? Erstens kann man sekundĂ€re Systeme sicher lesen: Man kann auf dem PrimĂ€rsystem schreiben und von geografisch replizierten sekundĂ€ren Systemen lesen und sich sicher sein, dass es funktioniert. Gleichzeitig können die Sitzungen, die auf dem PrimĂ€rsystem aufgezeichnet wurden, auch auf das SekundĂ€rsystem ĂŒbertragen werden, das heiĂt, man kann nicht nur eine Sitzung, sondern mehrere nutzen.
Frage: â Mit dem Thema der eventualen Konsistenz ist eng der neue Bereich der Informatik â die Datentypen CRDT (konflikfreig replicierte Datentypen) verbunden. Haben Sie eine Integration dieser Datentypen in die Datenbank in Betracht gezogen und was können Sie dazu sagen?
MT: â Gute Frage! CRDT macht Sinn bei Schreibkonflikten: in MongoDB â ein einzelner Master.
Frage: â Ich habe eine Frage von den DevOps. In der heutigen Welt gibt es manchmal solche hinterhĂ€ltigen Situationen, in denen ein byzantinischer Fehler auftritt und böse Leute innerhalb des geschĂŒtzten Perimeters beginnen, sich in das Protokoll einzuhacken, indem sie speziell gestaltete Pakete senden?

MT: â Böse Leute im Inneren des Perimeters sind wie ein trojanisches Pferd! Böse Leute innerhalb des Perimeters können viele schĂ€dliche Dinge tun.
Frage: â Es ist klar, dass es nicht richtig ist, im Server eine Art LĂŒcke zu lassen, durch die man einen Elefantenpark hindurchschieben und den gesamten Cluster fĂŒr immer zum Absturz bringen kann... Es wird Zeit brauchen, um manuell wiederherzustellen... Das ist, gelinde gesagt, nicht korrekt. Andererseits ist es interessant zu wissen: Kommt es in der RealitĂ€t, in der Praxis, tatsĂ€chlich zu solchen internen Angriffen?
MT: â Da ich in der realen Welt selten mit Sicherheitsverletzungen konfrontiert werde, kann ich nicht sagen, ob sie tatsĂ€chlich passieren. Aber was die Entwicklerphilosophie angeht, so denken wir folgendermaĂen: Wir haben einen Umfang, der die Leute, die fĂŒr die Sicherheit zustĂ€ndig sind, schĂŒtzt â das ist das Schloss, die Mauer; innerhalb dieses Umfangs kann man alles Mögliche tun. Es ist klar, dass es Benutzer gibt, die nur ansehen können, und solche, die die Berechtigung haben, Verzeichnisse zu löschen.
Je nach Rechten kann der Schaden, den Benutzer anrichten können, variieren â von einer Maus bis hin zu einem Elefanten. Klar ist, dass ein Benutzer mit vollen Rechten alles Mögliche tun kann. Ein Benutzer mit eingeschrĂ€nkten Rechten verursacht deutlich weniger Schaden. Insbesondere kann er das System nicht zerstören.
Frage: â In einem geschĂŒtzten Umfang wird manchmal versucht, unerwartete Protokolle fĂŒr den Server zu erstellen, um den Server lahmzulegen und, wenn man GlĂŒck hat, den gesamten Cluster... Ist es wirklich so "gut"?
MT: â Ich habe noch nie von solchen Dingen gehört. Dass man so einen Server zum Absturz bringen kann, ist kein Geheimnis. Innerhalb des Protokolls, als autorisierter Nutzer, der eine Nachricht schreiben kann, ist das jedoch nicht möglich, da es trotzdem verifiziert wird. Es besteht die Möglichkeit, diese Authentifizierung fĂŒr Nutzer abzuschalten, die es nicht wollen â das sind dann ihre Probleme; sie haben, grob gesagt, selbst die Mauern eingerissen und können einen Elefanten hineinstecken, der alles zertrampelt⊠Man könnte sich auch als Techniker verkleiden, vorbeikommen und ihn herausziehen!
Frage: â Vielen Dank fĂŒr den Vortrag. Sergej ("Yandex"). In MongoDB gibt es eine Konstante, die die Anzahl der abstimmenden Mitglieder im Replica Set limitiert, und diese Konstante betrĂ€gt 7. Warum ist das eine Konstante? Warum ist das kein Parameter?
MT: â In einem Replica Set haben wir auch mal 40 Knoten. Dort gibt es immer eine Mehrheit. Ich weiĂ nicht, welche VersionâŠ
Frage: â Im Replica Set kann man nicht abstimmende Mitglieder betreiben, aber abstimmende â maximal 7. Wie gehen wir in diesem Fall mit einem Ausfall um, wenn unser Replica Set auf 3 Rechenzentren verteilt ist? Ein Rechenzentrum kann problemlos ausfallen, und ein weiteres GerĂ€t könnte ebenfalls ausfallen.
MT: â Das liegt schon etwas auĂerhalb des Vortrags. Das ist eine allgemeine Frage. Vielleicht kann ich spĂ€ter darĂŒber erzĂ€hlen.


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 Ihren Freunden empfehlen. , eine einzigartige Alternative zu Einsteiger-Servern, die wir fĂŒr Sie entwickelt haben: (VerfĂŒgbar sind Optionen mit RAID1 und RAID10, bis zu 24 Kerne und bis zu 40GB DDR4).
Dell R730xd im Equinix Tier IV Rechenzentrum in Amsterdam zum halben Preis? Nur bei uns in den Niederlanden! Dell R420 â 2x E5-2430 2.2GHz 6C 128GB DDR3 2x960GB SSD 1Gbps 100TB â ab 99 $! Lesen Sie darĂŒber
Quelle: habr.com
