{"id":56365,"date":"2020-02-11T00:00:00","date_gmt":"2020-02-10T21:00:00","guid":{"rendered":"https:\/\/prohoster.info\/blog\/blog_prohoster\/highload-mihail-tyulenev-mongodb-causal-consistency-ot-teorii-k-praktike"},"modified":"2020-02-18T14:04:37","modified_gmt":"2020-02-18T11:04:37","slug":"highload-mihail-tyulenev-mongodb-causal-consistency-ot-teorii-k-praktike","status":"publish","type":"post","link":"https:\/\/prohoster.info\/de\/blog\/administrirovanie\/highload-mihail-tyulenev-mongodb-causal-consistency-ot-teorii-k-praktike","title":{"rendered":"HighLoad++, Michail Tjulenew (MongoDB): Kausale Konsistenz: von der Theorie zur Praxis","gt_translate_keys":[{"key":"rendered","format":"text"}]},"content":{"rendered":"<p>Die n\u00e4chste HighLoad++ Konferenz findet am 6. und 7. April 2020 in St. Petersburg statt. <br \/>\nDetails und Tickets <noindex><a rel=\"nofollow\" href=\"http:\/\/bit.ly\/2sSxgBx\">\u00fcber den Link<\/a><\/noindex>. HighLoad++ Sibirien 2019. Raum \u201eKrasnojarsk\u201c. 25. Juni, 12:00. Abstracts und <noindex><a rel=\"nofollow\" href=\"https:\/\/www.highload.ru\/siberia\/2019\/abstracts\/5253\">Pr\u00e4sentation n\u00fctzlich sein.<\/a><\/noindex>.<\/p>\n<p><img decoding=\"async\" alt=\"HighLoad++, Michail Tjulenew (MongoDB): Kausale Konsistenz: von der Theorie zur Praxis\" src=\"\/wp-content\/uploads\/2020\/02\/cded9c5434d670db7295aadf5da0a9f1.jpg\" style=\"display:block;margin: 0 auto;\" \/><br \/>\n<br \/>\nEs kommt vor, dass praktische Anforderungen mit der Theorie in Konflikt stehen, wobei wichtige Aspekte f\u00fcr kommerzielle Produkte nicht ber\u00fccksichtigt werden. In diesem Vortrag wird der Prozess der Auswahl und Kombination verschiedener Ans\u00e4tze zur Erstellung von Komponenten der Kausalen Konsistenz basierend auf akademischen Forschungsergebnissen unter den Anforderungen eines kommerziellen Produkts vorgestellt. Die Zuh\u00f6rer erfahren von bestehenden theoretischen Ans\u00e4tzen zu logischen Uhren, Abh\u00e4ngigkeitsverfolgung, Systemsicherheit, Uhren-Synchronisation und warum MongoDB bei bestimmten L\u00f6sungen geblieben ist.<noindex><a rel=\"nofollow\" name=\"habracut\"><\/a><\/noindex><\/p>\n<p><b>Michail Tjulenew (im Folgenden \u2013 MT):<\/b> \u2013 Ich werde \u00fcber Kausale Konsistenz sprechen \u2013 eine Funktion, an der wir bei MongoDB gearbeitet haben. Ich arbeite in der Gruppe f\u00fcr verteilte Systeme, wir haben sie vor etwa zwei Jahren entwickelt.<\/p>\n<p><img decoding=\"async\" alt=\"HighLoad++, Michail Tjulenew (MongoDB): Kausale Konsistenz: von der Theorie zur Praxis\" src=\"\/wp-content\/uploads\/2020\/02\/b8d0a5b64e715f53b033fa8c398e2eb4.jpg\" style=\"display:block;margin: 0 auto;\" \/><br \/>\n<br \/>\nIm 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\u00f6tigt werden, aufgrund der sehr speziellen Anforderungen, die wahrscheinlich in jeder Produktionsanwendung vorhanden sind.<\/p>\n<p>Ich werde dar\u00fcber berichten, wie wir als Verbraucher akademischer Forschung etwas daraus entwickeln, das wir unseren Nutzern als fertiges Produkt pr\u00e4sentieren k\u00f6nnen, das einfach und sicher zu verwenden ist.<\/p>\n<h3>Kausale Konsistenz (Causal Consistency). Lassen Sie uns die Begriffe kl\u00e4ren.<\/h3>\n<p>\nZun\u00e4chst m\u00f6chte ich in groben Z\u00fcgen erl\u00e4utern, was kausale Konsistenz ist. Es gibt zwei Charaktere \u2013 Leonard und Penny (aus der Serie \u201eThe Big Bang Theory\u201c):<\/p>\n<p><img decoding=\"async\" alt=\"HighLoad++, Michail Tjulenew (MongoDB): Kausale Konsistenz: von der Theorie zur Praxis\" src=\"\/wp-content\/uploads\/2020\/02\/ee0835b604ae5d5d6c0fa1bc369e6b18.jpg\" style=\"display:block;margin: 0 auto;\" \/><br \/>\n<br \/>\nAngenommen, Penny ist in Europa und Leonard m\u00f6chte eine \u00dcberraschung f\u00fcr sie organisieren. Er entscheidet sich daf\u00fcr, sie aus seiner Freundesliste zu entfernen und allen Freunden ein Update im Feed zu senden: \u201eLasst uns Penny eine Freude machen!\u201c (Sie ist in Europa, schl\u00e4ft und sieht das alles nicht, weil sie nicht dort ist). Am Ende l\u00f6scht er diesen Beitrag, entfernt ihn aus dem Feed und stellt den Zugang wieder her, damit sie nichts merkt und es zu keinem Skandal kommt.<br \/>\nDas ist alles wunderbar, aber nehmen wir an, dass das System verteilt ist und die Ereignisse nicht ganz wie geplant ablaufen. Es k\u00f6nnte zum Beispiel passieren, dass Pennys Zugangsbeschr\u00e4nkung nach dem Erscheinen dieses Beitrags erfolgt, wenn die Ereignisse nicht kausal miteinander verbunden sind. Tats\u00e4chlich ist dies ein Beispiel daf\u00fcr, dass kausale Konsistenz ben\u00f6tigt wird, um eine Gesch\u00e4ftsanforderung zu erf\u00fcllen (in diesem Fall).<\/p>\n<p>Tats\u00e4chlich sind das ziemlich komplexe Eigenschaften von Datenbanken \u2013 nur sehr wenige unterst\u00fctzen sie. Lassen Sie uns zu den Modellen \u00fcbergehen.<\/p>\n<h3>Konsistenzmodelle (Consistency Models)<\/h3>\n<p>\nWas ist \u00fcberhaupt 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.<\/p>\n<p>Letztendlich lassen sich alle Konsistenzmodelle darauf zur\u00fcckf\u00fchren, wie \u00e4hnlich ein verteiltes System einem System ist, das beispielsweise auf einem einzelnen Node auf einem Laptop l\u00e4uft. Und es stellt sich die Frage, inwieweit ein System, das auf Tausenden von geografisch verteilten 'Nods' arbeitet, dem Laptop \u00e4hnelt, bei dem all diese Eigenschaften im Grunde automatisch erf\u00fcllt sind.<\/p>\n<p>Deshalb gelten Konsistenzmodelle ausschlie\u00dflich f\u00fcr 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.<\/p>\n<h3>Das Strong-Modell<\/h3>\n<p>\nDas erste Modell ist das Strong (oder auch Linearity, wie es oft genannt wird). Dies ist ein Konsistenzmodell, das garantiert, dass jede \u00c4nderung, sobald die Best\u00e4tigung erfolgt, dass sie stattgefunden hat, f\u00fcr alle Benutzer des Systems sichtbar wird.<\/p>\n<p>Dies stellt eine globale Ordnung aller Ereignisse in der Datenbank her. Es ist eine sehr m\u00e4chtige Konsistenz-Eigenschaft, aber auch kostspielig. Dennoch wird sie gut unterst\u00fctzt. Es ist einfach sehr teuer und langsam \u2013 weshalb sie selten genutzt wird. Dies wird als Erreichbarkeit bezeichnet.<\/p>\n<p>Es gibt eine weitere, st\u00e4rkere Eigenschaft, die im \u201eSpanner\u201c unterst\u00fctzt wird \u2013 die als externe Konsistenz bezeichnet wird. Dar\u00fcber werden wir sp\u00e4ter sprechen.<\/p>\n<h3>Kausal<\/h3>\n<p>\nDas n\u00e4chste ist kausal, das ist genau das, wor\u00fcber ich gesprochen habe. Zwischen starker und kausaler Konsistenz gibt es noch einige Unterebenen, die ich nicht ansprechen werde, aber sie f\u00fchren alle zur kausalen Konsistenz. Dies ist ein wichtiges Modell, weil es das st\u00e4rkste von allen Modellen ist, die st\u00e4rkste Konsistenz in Anwesenheit von Netzwerken oder Partitionen.<\/p>\n<p>Kausale Konsistenzen sind im Wesentlichen Situationen, in denen Ereignisse durch eine Ursache-Wirkung-Beziehung verbunden sind. H\u00e4ufig 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\u00e4fixierte Lesungen zu sehen. Das alles l\u00e4uft auf dasselbe hinaus.<br \/>\nCausals als Konsistenzmodell \u2013 eine teilweise Ordnung von Ereignissen auf dem Server, bei der Ereignisse von allen Clients in derselben Reihenfolge beobachtet werden. In diesem Fall \u2013 Leonard und Penny.<\/p>\n<h3>Eventual<\/h3>\n<p>\nDas dritte Modell ist die Eventual Consistency. Dies ist das, was alle verteilten Systeme unterst\u00fctzen, das Minimalmodell, das \u00fcberhaupt Sinn macht. Es bedeutet Folgendes: Wenn wir \u00c4nderungen an den Daten vornehmen, werden sie irgendwann konsistent.<\/p>\n<p>In diesem Moment gibt es keine definitive Aussage, sonst w\u00fcrde es zu einer External Consistency \u2013 eine ganz andere Geschichte. Dennoch ist dies ein sehr popul\u00e4res Modell, das am weitesten verbreitet ist. Standardm\u00e4\u00dfig verwenden alle Benutzer verteilter Systeme genau die Eventual Consistency.<\/p>\n<p>Ich m\u00f6chte einige vergleichende Beispiele anf\u00fchren:<\/p>\n<p><img decoding=\"async\" alt=\"HighLoad++, Michail Tjulenew (MongoDB): Kausale Konsistenz: von der Theorie zur Praxis\" src=\"\/wp-content\/uploads\/2020\/02\/c23e59b30d96de6ec456aaa76c67ad61.jpg\" style=\"display:block;margin: 0 auto;\" \/><br \/>\n<br \/>\nWas bedeuten diese Pfeile?<\/p>\n<ul>\n<li><b>Latenz.<\/b> Wenn die Konsistenzst\u00e4rke erh\u00f6ht wird, wird sie aus nachvollziehbaren Gr\u00fcnden gr\u00f6\u00dfer: Es m\u00fcssen mehr Eintr\u00e4ge erstellt und Best\u00e4tigungen 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\u00e4tzlich ausreichend ist.<\/li>\n<li><b>Verf\u00fcgbarkeit.<\/b> Wenn man dies als die F\u00e4higkeit des Systems versteht, auf Anfragen zu antworten, trotz Netzwerkunterbrechungen, Partitionierungen oder anderer Ausf\u00e4lle \u2013 erh\u00f6ht sich die Fehlertoleranz bei einer reduzierten Konsistenzmodell, da es ausreicht, dass ein Host aktiv bleibt und dabei bestimmte Daten liefert. Eventual Consistency garantiert \u00fcberhaupt nichts bez\u00fcglich der Daten \u2013 es kann alles M\u00f6gliche sein.<\/li>\n<li><b>Anomalien.<\/b> Dabei steigt nat\u00fcrlich die Anzahl der Anomalien. Bei starker Konsistenz sollte es diese fast gar nicht geben, w\u00e4hrend sie bei eventueller Konsistenz beliebig auftreten k\u00f6nnen. Die Frage ist: Warum entscheiden sich Menschen f\u00fcr eventuelle Konsistenz, wenn diese Anomalien enth\u00e4lt? Die Antwort liegt darin, dass Modelle der eventuellen Konsistenz anwendbar sind, und Anomalien treten zum Beispiel nur f\u00fcr kurze Zeit auf; es besteht die M\u00f6glichkeit, einen Master f\u00fcr Lesevorg\u00e4nge zu verwenden und mehr oder weniger konsistente Daten zu lesen; oft gibt es die M\u00f6glichkeit, starke Konsistenzmodelle zu nutzen. Praktisch funktioniert das, und die Anzahl der Anomalien ist oft zeitlich begrenzt.<\/li>\n<\/ul>\n<p><\/p>\n<h3>CAP-Theorem<\/h3>\n<p>\nWenn Sie die Worte Konsistenz und Verf\u00fcgbarkeit h\u00f6ren, was kommt Ihnen in den Sinn? Richtig \u2013 das CAP-Theorem! Ich m\u00f6chte jetzt einen Mythos entkr\u00e4ften\u2026 Es bin nicht ich, sondern Martin Kleppmann, der einen gro\u00dfartigen Artikel und ein gro\u00dfartiges Buch geschrieben hat.<\/p>\n<p><img decoding=\"async\" alt=\"HighLoad++, Michail Tjulenew (MongoDB): Kausale Konsistenz: von der Theorie zur Praxis\" src=\"\/wp-content\/uploads\/2020\/02\/02a9b84585218c4e85afd65f7e88aa26.jpg\" style=\"display:block;margin: 0 auto;\" \/><br \/>\n<br \/>\nDer CAP-Satz ist ein Prinzip, das in den 2000er Jahren formuliert wurde. Es besagt, dass Konsistenz, Verf\u00fcgbarkeit und Partitionierung: w\u00e4hle zwei, und du kannst nicht alle drei ausw\u00e4hlen. Urspr\u00fcnglich war es ein Konzept. Einige Jahre sp\u00e4ter wurde es von Gilbert und Lynch als Theorem bewiesen. Danach wurde es als Mantra verwendet \u2013 Systeme wurden in CA, CP, AP usw. unterteilt.<\/p>\n<p>Dieses Theorem wurde tats\u00e4chlich f\u00fcr folgende F\u00e4lle bewiesen \u2026 Zun\u00e4chst wurde Verf\u00fcgbarkeit nicht als kontinuierlicher Wert von null bis hundert betrachtet (0 \u2013 das System ist \u201etot\u201c, 100 \u2013 es reagiert schnell; so haben wir es gew\u00f6hnt zu betrachten), sondern als eine Eigenschaft des Algorithmus, die garantiert, dass er bei allen Ausf\u00fchrungen Daten zur\u00fcckgibt.<\/p>\n<p>Im Zusammenhang mit der Antwortzeit wird \u00fcberhaupt kein Wort verloren! Es gibt einen Algorithmus, der Daten in 100 Jahren zur\u00fcckgibt \u2013 ein vollkommen verf\u00fcgbarer Algorithmus, der Teil des CAP-Satzes ist.<br \/>\nZweitens wurde das Theorem f\u00fcr \u00c4nderungen bei Werten desselben Schl\u00fcssels bewiesen, wobei diese \u00c4nderungen 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\u00f6nnten.<\/p>\n<p>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\u00e4nkt er auf gewisse Weise ein. Es ergibt sich ein Prinzip, das intuitiv wahr ist, aber nicht wirklich bewiesen wurde.<\/p>\n<h3>Kausale Konsistenz \u2013 das st\u00e4rkste Modell<\/h3>\n<p>\nWas derzeit geschieht, ist, dass man alle drei Dinge erhalten kann: Konsistenz und Verf\u00fcgbarkeit k\u00f6nnen auch bei Partitionen sichergestellt werden. Insbesondere die kausale Konsistenz ist das st\u00e4rkste Konsistenzmodell, das auch bei Partitionen (Netzwerkausf\u00e4llen) weiterhin funktioniert. Daher ist es von gro\u00dfem Interesse f\u00fcr uns, und deshalb haben wir uns damit besch\u00e4ftigt.<\/p>\n<p><img decoding=\"async\" alt=\"HighLoad++, Michail Tjulenew (MongoDB): Kausale Konsistenz: von der Theorie zur Praxis\" src=\"\/wp-content\/uploads\/2020\/02\/c4320294320261858a6d22faa97b9e23.jpg\" style=\"display:block;margin: 0 auto;\" \/><br \/>\n<br \/>\nEs vereinfacht zun\u00e4chst die Arbeit der Anwendungsentwickler. Insbesondere durch die umfangreiche Unterst\u00fctzung seitens des Servers: Wenn alle Transaktionen eines Clients garantiert in derselben Reihenfolge beim anderen Client ankommen. Zweitens h\u00e4lt es auch Partitionen stand.<\/p>\n<h3>Die interne Funktionsweise von MongoDB<\/h3>\n<p>\nAngesichts des Mittagessens begeben wir uns in die K\u00fcche. Ich werde das Systemmodell erl\u00e4utern, insbesondere was MongoDB ist, f\u00fcr diejenigen, die zum ersten Mal von dieser Datenbank h\u00f6ren.<\/p>\n<p><img decoding=\"async\" alt=\"HighLoad++, Michail Tjulenew (MongoDB): Kausale Konsistenz: von der Theorie zur Praxis\" src=\"\/wp-content\/uploads\/2020\/02\/a1784442ff1c44403b5347f4f43a1197.jpg\" style=\"display:block;margin: 0 auto;\" \/><br \/>\n<br \/>\n<img decoding=\"async\" alt=\"HighLoad++, Michail Tjulenew (MongoDB): Kausale Konsistenz: von der Theorie zur Praxis\" src=\"\/wp-content\/uploads\/2020\/02\/a1f9bcb4daebb43e4fc848a5f5f07c60.jpg\" style=\"display:block;margin: 0 auto;\" \/><br \/>\n<br \/>\nMongoDB (im Folgenden \u201eMongoDB\") ist ein verteiltes System, das horizontale Skalierung, also Sharding, unterst\u00fctzt; und innerhalb jedes Shards wird auch Datenredundanz durch Replikation unterst\u00fctzt.<\/p>\n<p>Sharding in MongoDB (eine nicht-relationale Datenbank) f\u00fchrt eine automatische Lastenverteilung durch, das hei\u00dft, jede Dokumentensammlung (oder \u201eTabelle\u201c im Sinne relationaler Daten) wird in Fragmente unterteilt, und der Server verschiebt diese automatisch zwischen den Shards.<\/p>\n<p>Der Query Router, der die Anfragen verteilt, agiert f\u00fcr den Client als ein gewisser Client, \u00fcber den er arbeitet. Er wei\u00df bereits, wo sich welche Daten befinden und leitet alle Anfragen an den richtigen Shard weiter.<\/p>\n<p>Ein weiterer wichtiger Punkt: MongoDB ist ein Single Master. Es gibt einen Primary \u2013 dieser kann Eintr\u00e4ge entgegennehmen, die die Schl\u00fcssel unterst\u00fctzen, die er in sich h\u00e4lt. Multi-Master-Write ist nicht m\u00f6glich.<\/p>\n<p>Wir haben Version 4.2 ver\u00f6ffentlicht \u2013 darin sind neue interessante Funktionen hinzugekommen. Insbesondere ist Lucene integriert \u2013 eine durchf\u00fchrbare Java-Suchfunktion direkt in MongoDB, wodurch die Suche \u00fcber Lucene, \u00e4hnlich wie in Elasticsearch, m\u00f6glich geworden ist.<\/p>\n<p>Wir haben ein neues Produkt geschaffen \u2013 Charts, das ebenfalls auf \u201eAtlas\u201c verf\u00fcgbar ist (unser eigener Cloud \u201eMongo\u201c). Es gibt ein Free Tier \u2013 man kann damit experimentieren. Mir haben die Charts sehr gefallen \u2013 die Datenvisualisierung ist \u00e4u\u00dferst intuitiv.<\/p>\n<h3>Causal Consistency<\/h3>\n<p>\nIch habe etwa 230 Artikel gez\u00e4hlt, die zu diesem Thema von Leslie Lampert ver\u00f6ffentlicht wurden. Jetzt erinnere ich mich und kann Ihnen einige Teile dieser Materialien \u00fcbermitteln.<\/p>\n<p><img decoding=\"async\" alt=\"HighLoad++, Michail Tjulenew (MongoDB): Kausale Konsistenz: von der Theorie zur Praxis\" src=\"\/wp-content\/uploads\/2020\/02\/e88b34b7a724e94837b944a4ddd21a04.jpg\" style=\"display:block;margin: 0 auto;\" \/><br \/>\n<br \/>\nAlles 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\u00e4hrt Causal Consistency aufgrund der Entwicklungen in verteilten Systemen gro\u00dfes Interesse.<\/p>\n<h3>Einschr\u00e4nkungen<\/h3>\n<p>\nWelche Einschr\u00e4nkungen gibt es? Das ist tats\u00e4chlich einer der Hauptpunkte, denn die Einschr\u00e4nkungen, die Produktion Systeme auferlegen, unterscheiden sich stark von den Einschr\u00e4nkungen in akademischen Artikeln. Oft sind sie ziemlich k\u00fcnstlich.<\/p>\n<p><img decoding=\"async\" alt=\"HighLoad++, Michail Tjulenew (MongoDB): Kausale Konsistenz: von der Theorie zur Praxis\" src=\"\/wp-content\/uploads\/2020\/02\/9583ba9ff870e4ddc7aad4ba4c59ecc1.jpg\" style=\"display:block;margin: 0 auto;\" \/><br \/>\n<\/p>\n<ul>\n<li>Erstens: \u201eMongoDB\u201c ist ein Single-Master-System, wie ich bereits erw\u00e4hnt habe (das vereinfacht vieles).<\/li>\n<li>Wir gehen davon aus, dass das System etwa 10.000 Shards unterst\u00fctzen sollte. Wir k\u00f6nnen keine architektonischen Entscheidungen treffen, die diesen Wert offensichtlich einschr\u00e4nken.<\/li>\n<li>Wir bieten Cloud-L\u00f6sungen an, aber wir glauben, dass Benutzer die M\u00f6glichkeit haben sollten, die Software herunterzuladen, sie auf ihrem Laptop auszuf\u00fchren und dass alles einwandfrei funktioniert.<\/li>\n<li>Wir gehen davon aus, dass Research selten genutzt wird: Externe Kunden k\u00f6nnen tun, was sie wollen. MongoDB ist Open Source, was bedeutet, dass Kunden die M\u00f6glichkeit haben, es entsprechend ihrer Bed\u00fcrfnisse zu ver\u00e4ndern. Wir erwarten, dass es zu komplexen Situationen kommen kann.<\/li>\n<li>F\u00fcr externe Kunden au\u00dferhalb des Perimeters besteht eine wichtige Einschr\u00e4nkung: Wenn diese Funktion deaktiviert ist, sollten keine Leistungsbeeintr\u00e4chtigungen sichtbar sein.<\/li>\n<li>Ein weiterer Punkt \u2013 eher unkonventionell: die Kompatibilit\u00e4t zwischen alten und neuen Versionen. Alte Treiber m\u00fcssen neue Updates unterst\u00fctzen, und die Datenbank muss alte Treiber unterst\u00fctzen.<\/li>\n<\/ul>\n<p>\nInsgesamt bringt das einige Einschr\u00e4nkungen mit sich.<\/p>\n<h3>Komponenten der kausalen Konsistenz<\/h3>\n<p>\nIch m\u00f6chte nun einige Komponenten vorstellen. Wenn wir im Allgemeinen Causal Consistency betrachten, k\u00f6nnen wir verschiedene Bereiche identifizieren. Wir haben aus Arbeiten ausgew\u00e4hlt, die zu einem bestimmten Bereich geh\u00f6ren: Dependency Tracking, die Auswahl der Uhren, wie diese Uhren miteinander synchronisiert werden k\u00f6nnen, und wie wir die Sicherheit gew\u00e4hrleisten \u2013 das ist ein grober Plan, \u00fcber den ich sprechen werde:<\/p>\n<p><img decoding=\"async\" alt=\"HighLoad++, Michail Tjulenew (MongoDB): Kausale Konsistenz: von der Theorie zur Praxis\" src=\"\/wp-content\/uploads\/2020\/02\/10c2631d6e61a280139b448628db763e.jpg\" style=\"display:block;margin: 0 auto;\" \/><br \/>\n<\/p>\n<h3>Vollst\u00e4ndiges Dependency Tracking (Full Dependency Tracking)<\/h3>\n<p>\nWozu ist es notwendig? Damit bei der Replikation von Daten \u2013 jede Eintragung, jede Daten\u00e4nderung Informationen dar\u00fcber enth\u00e4lt, von welchen \u00c4nderungen sie abh\u00e4ngt. Die erste und naivste \u00c4nderung ist, wenn jede Nachricht, die eine Eintragung enth\u00e4lt, Informationen \u00fcber die vorherigen Nachrichten enth\u00e4lt:<\/p>\n<p><img decoding=\"async\" alt=\"HighLoad++, Michail Tjulenew (MongoDB): Kausale Konsistenz: von der Theorie zur Praxis\" src=\"\/wp-content\/uploads\/2020\/02\/fa5d0086c3c77e33631d8a2cd5c217fa.jpg\" style=\"display:block;margin: 0 auto;\" \/><br \/>\n<br \/>\nIn diesem Beispiel steht die Nummer in geschweiften Klammern f\u00fcr die Eintragungsnummern. Manchmal werden diese Eintragungen mit Werten sogar ganz \u00fcbergeben, manchmal auch bestimmte Versionen. Das Wesentliche ist, dass jede \u00c4nderung Informationen \u00fcber die vorherige enth\u00e4lt (dies alles ist implizit enthalten).<\/p>\n<p>Warum haben wir uns entschieden, diesen Ansatz (vollst\u00e4ndiges Tracking) nicht zu verwenden? Offensichtlich, weil dieser Ansatz unpraktisch ist: Jede Ver\u00e4nderung in einem sozialen Netzwerk h\u00e4ngt von allen vorherigen \u00c4nderungen in diesem sozialen Netzwerk ab, was bedeutet, dass man beispielsweise \"Facebook\" oder \"VKontakte\" in jedem Update \u00fcbermitteln muss. Dennoch gibt es viele Studien zu genau diesem Thema, dem Full Dependency Tracking \u2013 dies betrifft presoziale Netzwerke, und f\u00fcr einige Situationen funktioniert es wirklich.<\/p>\n<h3>Explizites Abh\u00e4ngigkeits-Tracking<\/h3>\n<p>\nDas n\u00e4chste ist ein eingeschr\u00e4nkterer Ansatz. Hier wird ebenfalls die \u00dcbertragung von Informationen betrachtet, aber nur von den Informationen, die eindeutig abh\u00e4ngen. Was von was abh\u00e4ngt, 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\u00e4ngigkeiten erf\u00fcllt sind, das hei\u00dft, angezeigt wurden. Das ist das Wesen davon, wie kausale Konsistenz funktioniert.<\/p>\n<p><img decoding=\"async\" alt=\"HighLoad++, Michail Tjulenew (MongoDB): Kausale Konsistenz: von der Theorie zur Praxis\" src=\"\/wp-content\/uploads\/2020\/02\/7fe101b998c1a0c922788d8d36a5243f.jpg\" style=\"display:block;margin: 0 auto;\" \/><br \/>\n<br \/>\nSie sieht, dass der Datensatz 5 von den Datens\u00e4tzen 1, 2, 3, 4 abh\u00e4ngt \u2013 folglich wartet sie, bevor der Kunde Zugang zu den \u00c4nderungen erh\u00e4lt, die durch Penny's Zugriffsregelung vorgenommen wurden, solange alle vorherigen \u00c4nderungen bereits in der Datenbank verarbeitet wurden.<\/p>\n<p>Das ist auch f\u00fcr uns nicht akzeptabel, da es einfach zu viele Informationen gibt, was zu Verz\u00f6gerungen f\u00fchren wird. Es gibt einen anderen Ansatz\u2026<\/p>\n<h3>Lamport-Uhr (Lamport Clock)<\/h3>\n<p>\nSie sind sehr alt. Die Lamport-Uhr bedeutet, dass diese Abh\u00e4ngigkeiten in eine skalare Funktion umgewandelt werden, die als Lamport-Uhr bezeichnet wird.<\/p>\n<p>Eine skalare Funktion ist eine abstrakte Zahl. Oft wird sie als logische Zeit bezeichnet. Bei jedem Ereignis erh\u00f6ht sich dieser Z\u00e4hler. Der Z\u00e4hler, der dem Prozess momentan bekannt ist, sendet jede Nachricht. Es ist klar, dass Prozesse asynchron sein k\u00f6nnen und v\u00f6llig unterschiedliche Zeiten haben. Dennoch gleicht das System durch diesen Nachrichtenaustausch irgendwie die Uhren aus. Was passiert in diesem Fall?<\/p>\n<p>Ich habe den gro\u00dfen Shard halbiert, um es klarer zu machen: Friends k\u00f6nnen in einem Knoten leben, der ein St\u00fcck der Sammlung enth\u00e4lt, w\u00e4hrend Feed in einem anderen Knoten untergebracht ist, der ebenfalls ein St\u00fcck dieser Sammlung enth\u00e4lt. Verstehst du, wie sie nicht in der Warteschlange landen k\u00f6nnen? Zuerst wird Feed sagen: \u201eRepliziert\u201c, und dann \u2013 Friends. Wenn das System keine Garantien bietet, dass Feed nicht angezeigt wird, solange die Abh\u00e4ngigkeiten von Friends in der Friends-Sammlung ebenfalls nicht bereitgestellt sind, stellen wir genau die Situation fest, die ich erw\u00e4hnt habe.<\/p>\n<p>Du siehst, wie die logische Zeit des Counters bei Feed steigt:<\/p>\n<p><img decoding=\"async\" alt=\"HighLoad++, Michail Tjulenew (MongoDB): Kausale Konsistenz: von der Theorie zur Praxis\" src=\"\/wp-content\/uploads\/2020\/02\/bae152d1890b53804f2cb28122983df6.jpg\" style=\"display:block;margin: 0 auto;\" \/><br \/>\n<br \/>\nDas Hauptmerkmal dieser Lamport-Uhr und der kausalen Konsistenz (erkl\u00e4rt durch die Lamport-Uhr) ist folgendes: Wenn wir die Ereignisse A und B haben und Ereignis B von Ereignis A abh\u00e4ngt*, folgt daraus, dass die Logische Zeit von Ereignis A kleiner ist als die Logische Zeit von Ereignis B.<\/p>\n<p><i>* Manchmal wird auch gesagt, dass A vor B passiert ist, d.h. A geschah vor B \u2013 dies stellt eine Beziehung dar, die die gesamte Menge der Ereignisse, die \u00fcberhaupt geschehen sind, teilweise ordnet.<\/i><\/p>\n<p>In die entgegengesetzte Richtung ist es falsch. Das ist tats\u00e4chlich eine der Hauptnachteile der Lamport-Uhr \u2013 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\u00f6nnte sein, wenn Leonard jemanden in seine Freundeliste hinzuf\u00fcgt (nicht unbedingt Leonard selbst, sondern beispielsweise Sheldon).<br \/>\nDas ist genau die Eigenschaft, die h\u00e4ufig 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\u00e4ngig sind. Denn in eine Richtung ist es tats\u00e4chlich so: Wenn LogicalTime A kleiner ist als LogicalTime B, kann B nicht vor A geschehen; ist es gr\u00f6\u00dfer, dann k\u00f6nnte es sein.<\/p>\n<h3>Vektoruhren (Vector Clock)<\/h3>\n<p>\nDie logische Weiterentwicklung der Lamport-Uhr sind die Vektoruhren. Sie unterscheiden sich dadurch, dass jeder Knoten, der hier vorhanden ist, seine eigenen separaten Uhren enth\u00e4lt, die als Vektor \u00fcbertragen werden.<br \/>\nIn diesem Fall sehen Sie, dass der Nullindex des Vektors f\u00fcr den Feed verantwortlich ist, und der erste Index des Vektors f\u00fcr die Freunde (jeder dieser Knoten). Und nun werden sie erh\u00f6ht: Der Nullindex f\u00fcr den \u201eFeed\u201c wird bei der Registrierung erh\u00f6ht \u2013 1, 2, 3:<\/p>\n<p><img decoding=\"async\" alt=\"HighLoad++, Michail Tjulenew (MongoDB): Kausale Konsistenz: von der Theorie zur Praxis\" src=\"\/wp-content\/uploads\/2020\/02\/d89292686ed8dd41aef06090f16db1c0.jpg\" style=\"display:block;margin: 0 auto;\" \/><br \/>\n<br \/>\nWas macht Vektoruhren besser? Sie erm\u00f6glichen es, nachzuvollziehen, welche Ereignisse gleichzeitig stattfinden und wann sie auf verschiedenen Knoten auftreten. Das ist f\u00fcr ein Sharding-System wie MongoDB \u00e4u\u00dferst wichtig. Dennoch haben wir uns nicht daf\u00fcr entschieden, obwohl es eine interessante L\u00f6sung ist, die gro\u00dfartig funktioniert und wahrscheinlich auch f\u00fcr uns geeignet w\u00e4re\u2026<\/p>\n<p>Wenn wir 10.000 Shards haben, k\u00f6nnen wir nicht 10.000 Komponenten \u00fcbertragen, selbst wenn wir komprimieren und uns etwas einfallen lassen \u2013 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 \u00fcbergegangen.<\/p>\n<h3>Spanner TrueTime. Atomuhren<\/h3>\n<p>\nIch habe gesagt, dass es eine Geschichte \u00fcber \u201eSpanner\u201c geben wird. Das ist eine coole Sache, wirklich aus dem 21. Jahrhundert: Atomuhren, GPS-Synchronisation.<\/p>\n<p>Was ist die Idee? \u201eSpanner\u201c ist Googles System, das vor kurzem sogar f\u00fcr die \u00d6ffentlichkeit zug\u00e4nglich gemacht wurde (sie haben SQL hinzugef\u00fcgt). Jede Transaktion hat dort einen bestimmten Zeitstempel. Da die Zeit synchronisiert ist*, kann jedem Ereignis eine bestimmte Zeit zugewiesen werden \u2013 Atomuhren haben eine Wartezeit, nach der garantiert ein anderes Zeitpunkt \u201eeintritt\u201c.<\/p>\n<p><img decoding=\"async\" alt=\"HighLoad++, Michail Tjulenew (MongoDB): Kausale Konsistenz: von der Theorie zur Praxis\" src=\"\/wp-content\/uploads\/2020\/02\/707b5998fbb500d201aafffccc666f0e.jpg\" style=\"display:block;margin: 0 auto;\" \/><br \/>\n<br \/>\nDurch das einfache Speichern in der Datenbank und das Warten einer bestimmten Zeit wird automatisch die Serialisierbarkeit von Ereignissen gew\u00e4hrleistet. Sie verf\u00fcgen \u00fcber das st\u00e4rkste Konsistenzmodell, das man sich vorstellen kann \u2013 es ist externe Konsistenz.<\/p>\n<p>* Das ist das Hauptproblem der Lamport-Uhren \u2013 sie sind in verteilten Systemen nie synchron. Sie k\u00f6nnen auseinanderdriften, selbst mit NTP arbeiten sie nicht besonders gut. Die \"Spanner\"-Uhren haben Atomuhren und Synchronisation, die offenbar im Mikrosekundenbereich funktioniert.<\/p>\n<p>Warum haben wir diese nicht gew\u00e4hlt? Wir setzen nicht voraus, dass unsere Nutzer eingebaute Atomuhren haben. Wenn diese in jedem Laptop verbaut sind, mit einer gro\u00dfartigen GPS-Synchronisation \u2013 dann ja\u2026 Aber derzeit ist das Beste, was m\u00f6glich ist, die \"Amazon\", Basisstationen \u2013 f\u00fcr die Enthusiasten\u2026 Daher haben wir andere Uhren verwendet.<\/p>\n<h3>Hybride Uhren (Hybrid Clock)<\/h3>\n<p>\nDas ist tats\u00e4chlich das, was in \"MongoDB\" tickt, um kausale Konsistenz zu gew\u00e4hrleisten. Was macht sie hybrid? Hybrid ist ein skalarer Wert, aber er besteht aus zwei Komponenten:<\/p>\n<p><img decoding=\"async\" alt=\"HighLoad++, Michail Tjulenew (MongoDB): Kausale Konsistenz: von der Theorie zur Praxis\" src=\"\/wp-content\/uploads\/2020\/02\/dab03a87d9f6ee2e716f75baff1736bc.jpg\" style=\"display:block;margin: 0 auto;\" \/><br \/>\n<\/p>\n<ul>\n<li>Erstens \u2013 die Unix-Epoche (wie viele Sekunden seit dem \"Beginn der Computerwelt\" vergangen sind).<\/li>\n<li>Das zweite ist ein gewisser Inkrement, ebenfalls ein 32-Bit unsigned int.<\/li>\n<\/ul>\n<p>\nDas ist eigentlich alles. Es gibt einen Ansatz: Der Teil, der f\u00fcr die Zeit verantwortlich ist, wird st\u00e4ndig 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\u00f6glicht es, Ereignisse zu unterscheiden, die zum gleichen Zeitpunkt aufgetreten sind.<\/p>\n<p>Warum ist das f\u00fcr MongoDB wichtig? Weil es erm\u00f6glicht, Backups zu bestimmten Zeitpunkten zu erstellen, also wird das Ereignis mit einer Zeitstempel indiziert. Das ist wichtig, wenn bestimmte Ereignisse ben\u00f6tigt werden; f\u00fcr die Datenbank sind Ereignisse \u00c4nderungen, die zu bestimmten Zeitpunkten in der Datenbank erfolgt sind.<\/p>\n<p>Den wichtigsten Grund erkl\u00e4re 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 \u00c4nderungen in der Datenbank enth\u00e4lt: Diese gelangen zun\u00e4chst in das OpLog und werden dann auf die eigentliche Storage angewendet, wenn es sich um replizierte Daten oder Shards handelt.<\/p>\n<p>Das war der Hauptgrund. Es gibt schlie\u00dflich auch praktische Anforderungen an die Datenbankentwicklung, was bedeutet, dass es einfach sein muss \u2013 wenig Code, so wenige defekte Elemente wie m\u00f6glich, die neu geschrieben und getestet werden m\u00fcssen. Die Tatsache, dass unsere OpLogs von hybriden Uhren indiziert wurden, hat erheblich geholfen und die richtige Wahl erm\u00f6glicht. Das hat sich wirklich ausgezahlt und irgendwie magisch beim ersten Prototypen funktioniert. Es war einfach gro\u00dfartig!<\/p>\n<h3>Uhrensynchronisation<\/h3>\n<p>\nEs 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 \u00c4nderungen eingehen \u2013 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.<\/p>\n<p><img decoding=\"async\" alt=\"HighLoad++, Michail Tjulenew (MongoDB): Kausale Konsistenz: von der Theorie zur Praxis\" src=\"\/wp-content\/uploads\/2020\/02\/7d3306747490ac044b7f8130defea0c9.jpg\" style=\"display:block;margin: 0 auto;\" \/><br \/>\n<br \/>\nDie zweite M\u00f6glichkeit sind die \"Heartbeats\". Hier k\u00f6nnen wir bestimmte Signale austauschen, die in festen Intervallen auftreten. Allerdings sind die \"Heartbeats\" zu langsam, um die Latenz f\u00fcr unseren Kunden zu gew\u00e4hrleisten.<\/p>\n<p>Echte Zeit ist nat\u00fcrlich eine wunderbare Sache. Aber das ist wahrscheinlich die Zukunft... Obwohl es im \"Atlas\" bereits m\u00f6glich ist, gibt es schon schnelle \"Amazon\"-Zeit-Synchronisierer. Doch diese werden nicht f\u00fcr alle zug\u00e4nglich sein.<\/p>\n<p>Gossiping bedeutet, dass alle Nachrichten Zeitstempel enthalten. Das ist ungef\u00e4hr das, was wir verwenden. Jede Nachricht zwischen den Knoten, den Treibern, dem Router und den Datenknoten - alles f\u00fcr \"MongoDB\" - sind Elemente, Komponenten der Datenbank, die Uhren beinhalten, die ticken. \u00dcberall gibt es Werte f\u00fcr hybridisierte Zeit, diese werden \u00fcbertragen. 64 Bits? Das l\u00e4sst sich machen.<\/p>\n<h3>Wie funktioniert das alles zusammen?<\/h3>\n<p>\nHier betrachte ich ein Replikat-Set, um es etwas einfacher zu machen. Es gibt einen Prim\u00e4r- und einen Sekund\u00e4rknoten. Der Sekund\u00e4rknoten f\u00fchrt die Replikation durch und ist nicht immer vollst\u00e4ndig mit dem Prim\u00e4rknoten synchronisiert.<\/p>\n<p>Es erfolgt ein Insert in die \u201ePrim\u00e4rdaten\u201c mit einem bestimmten Zeitwert. Dieses Insert erh\u00f6ht den internen Z\u00e4hler um 11, wenn dies das Maximum ist. Andernfalls wird es die Zeitwerte \u00fcberpr\u00fcfen und sich nach den Stunden synchronisieren, wenn die Stundenwerte gr\u00f6\u00dfer sind. Dies erm\u00f6glicht eine zeitliche Sortierung.<\/p>\n<p>Nachdem er den Eintrag vornimmt, gibt es einen wichtigen Moment. Die Uhren in \u201eMongoDB\u201c werden nur im Falle eines Eintrags im \u201eOplog\u201c inkrementiert. Dies ist das Ereignis, das den Zustand des Systems ver\u00e4ndert. In allen klassischen Artikeln wird ein Ereignis als das Eintreffen einer Nachricht in einem Knoten betrachtet: eine Nachricht ist angekommen \u2013 das bedeutet, das System hat seinen Zustand ge\u00e4ndert.<\/p>\n<p>Dies h\u00e4ngt 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 \u201eOplog\u201c reflektiert ist, sie auf keine Weise interpretiert werden kann, und die Systemzustands\u00e4nderung nur durch einen Eintrag im \u201eOplog\u201c erfolgt. Das vereinfacht alles f\u00fcr uns: sowohl das Modell ist vereinfacht, als auch es erm\u00f6glicht eine Sortierung innerhalb eines Replikat-Sets und viele andere n\u00fctzliche Dinge.<\/p>\n<p>Es wird ein Wert zur\u00fcckgegeben, der bereits im \"OpLog\" gespeichert ist \u2013 wir wissen, dass dieser Wert im \"OpLog\" bereits vorhanden ist und seine Zeit 12 Uhr betr\u00e4gt. Jetzt sagen wir, dass das Lesen von einem anderen Node (Secondary) beginnt, und er \u00fcbertr\u00e4gt bereits afterClusterTime in der Nachricht. Er sagt: \u201eIch ben\u00f6tige alles, was mindestens nach 12 Uhr oder zur gleichen Zeit passiert ist\u201c (siehe Abbildung oben).<\/p>\n<p>Das nennt man Causal and consistent (CAT). Es gibt ein Konzept in der Theorie, das besagt, dass dies ein gewisser Zeitabschnitt ist, der f\u00fcr sich selbst konsistent ist. In diesem Fall kann man sagen, dass dies der Zustand des Systems ist, der zu dem Zeitpunkt 12 Schl\u00fcssel beobachtet wurde.<\/p>\n<p>Hier ist momentan nichts, da dies sich so verh\u00e4lt, als ob die Situation simuliert wird, in der Secondary Daten von Primary replizieren muss. Er wartet\u2026 Und hier sind die Daten angekommen \u2013 die Werte werden zur\u00fcckgegeben.<\/p>\n<p><img decoding=\"async\" alt=\"HighLoad++, Michail Tjulenew (MongoDB): Kausale Konsistenz: von der Theorie zur Praxis\" src=\"\/wp-content\/uploads\/2020\/02\/54d9de3e2696c1e5d19f4da206be090b.jpg\" style=\"display:block;margin: 0 auto;\" \/><br \/>\n<br \/>\nSo funktioniert das ungef\u00e4hr. Fast.<\/p>\n<p>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\u00e4chste Eintrag um eins erh\u00f6ht. Diese Funktion umfasst 20 Zeilen. Angenommen, dieser Mensch \u00fcbertr\u00e4gt die gr\u00f6\u00dftm\u00f6gliche 64-Bit-Zahl minus eins.<\/p>\n<p>Warum \u201eminus eins\u201c? Weil die internen Uhren in diesen Wert eingepasst werden (offensichtlich ist dies der gr\u00f6\u00dfte m\u00f6gliche Wert, der \u00fcber der aktuellen Zeit liegt), dann erfolgt der Eintrag in das \u201eOp-Log\u201c, und die Uhren werden um eins erh\u00f6ht \u2013 und dann haben wir den wirklich maximalen Wert (da sind einfach alle Einsen, weiter geht\u2019s nicht, unsignierte Integer).<\/p>\n<p>Es ist klar, dass das System nach diesem Vorgang absolut f\u00fcr nichts mehr verf\u00fcgbar ist. Es kann nur entladen und gereinigt werden \u2013 das erfordert viel manuelle Arbeit. Vollst\u00e4ndige Verf\u00fcgbarkeit:<\/p>\n<p><img decoding=\"async\" alt=\"HighLoad++, Michail Tjulenew (MongoDB): Kausale Konsistenz: von der Theorie zur Praxis\" src=\"\/wp-content\/uploads\/2020\/02\/634b25fe0ef1e0af39181cd59c7b522f.jpg\" style=\"display:block;margin: 0 auto;\" \/><br \/>\n<br \/>\nAu\u00dferdem, falls dies irgendwohin repliziert wird, st\u00fcrzt der gesamte Cluster einfach ab. Eine absolut inakzeptable Situation, die jeder Mensch sehr schnell und einfach herbeif\u00fchren kann! Daher haben wir diesen Punkt als einen der wichtigsten betrachtet. Wie kann man das verhindern?<\/p>\n<h3>Unser Weg ist es, clusterTime zu unterschreiben<\/h3>\n<p>\nSo wird es in der Nachricht \u00fcbermittelt (bis zum blauen Text). Aber wir haben auch begonnen, eine Signatur zu generieren (blauer Text):<\/p>\n<p><img decoding=\"async\" alt=\"HighLoad++, Michail Tjulenew (MongoDB): Kausale Konsistenz: von der Theorie zur Praxis\" src=\"\/wp-content\/uploads\/2020\/02\/c16e985f9610e01a61293e0d6dde459b.jpg\" style=\"display:block;margin: 0 auto;\" \/><br \/>\n<br \/>\nDie Signatur wird mit einem Schl\u00fcssel generiert, der in der Datenbank innerhalb eines gesch\u00fctzten Bereichs gespeichert ist; der Schl\u00fcssel selbst wird generiert und aktualisiert (Benutzer sehen davon nichts). Ein Hash wird erzeugt, und jede Nachricht wird beim Erstellen signiert und beim Empfang validiert.<br \/>\nVielleicht stellt sich die Frage: \"Wie sehr verlangsamt das alles?\" Ich habe gesagt, dass es schnell funktionieren sollte, insbesondere ohne diese Funktion.<\/p>\n<p>Was bedeutet es, in diesem Fall nach kausaler Konsistenz zu arbeiten? Das bedeutet, den afterClusterTime-Parameter anzuzeigen. Ansonsten werden die Werte in jedem Fall \u00fcbermittelt. Gossiping arbeitet seit Version 3.6 immer.<\/p>\n<p>Wenn wir die st\u00e4ndige Generierung von Signaturen beibehalten, wird dies das System sogar ohne die Funktion verlangsamen, was nicht unseren Ans\u00e4tzen und Anforderungen entspricht. Und was haben wir getan?<\/p>\n<h3>Mach das schnell!<\/h3>\n<p>\nEs ist eine ziemlich einfache Sache, aber der Trick ist interessant \u2013 ich teile es, vielleicht interessiert es jemand.<br \/>\nWir 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:<\/p>\n<p><img decoding=\"async\" alt=\"HighLoad++, Michail Tjulenew (MongoDB): Kausale Konsistenz: von der Theorie zur Praxis\" src=\"\/wp-content\/uploads\/2020\/02\/f4810456f08ba1cc69730ac0079d4206.jpg\" style=\"display:block;margin: 0 auto;\" \/><br \/>\n<br \/>\nDurch diese Signatur beschleunigen wir das System (theoretisch) um das 65.000-Fache. Es funktioniert hervorragend: bei Experimenten wurde die Zeit f\u00fcr den sequentiellen Update-Prozess tats\u00e4chlich um das 10.000-Fache verk\u00fcrzt. Klar, wenn sie unregelm\u00e4\u00dfig sind, klappt es nicht. Aber in den meisten praktischen F\u00e4llen funktioniert es. Die Kombination aus der Signatur des Bereichs zusammen mit der Hauptsignatur hat ein Sicherheitsproblem gel\u00f6st.<\/p>\n<h3>Was haben wir gelernt?<\/h3>\n<p>\nLektionen, die wir daraus gezogen haben:<\/p>\n<ul>\n<li>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\u00fcssen wir lesen und verstehen. Das kostet Zeit, ist aber tats\u00e4chlich sehr hilfreich, weil es klar macht, wo wir stehen. Wir haben anscheinend nichts Neues erfunden \u2013 wir haben einfach die Zutaten genommen.\n<p>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\u00e4tze miteinander kombiniert haben. Daher ist es wichtig, die Klassiker zu lesen, beginnend mit Lamport.<\/li>\n<li>In der Produktion gelten v\u00f6llig andere Anforderungen. Ich bin mir sicher, dass viele von Ihnen nicht mit \"sph\u00e4rischen\" Datenbanken in einem abstrakten Vakuum konfrontiert sind, sondern mit normalen, realen Dingen, die Probleme in Bezug auf Verf\u00fcgbarkeit, Latenz und Ausfallsicherheit aufweisen.<\/li>\n<li>Das Letzte ist, dass wir verschiedene Ideen betrachten und mehrere grunds\u00e4tzlich verschiedene Artikel zu einem Ansatz kombiniert haben. Die Idee des Signierens stammt beispielsweise aus einem Artikel, der das Paxos-Protokoll betrachtete, welches f\u00fcr nicht-byzantinische Fehler innerhalb des Autorisierungsprotokolls gedacht ist, w\u00e4hrend es f\u00fcr byzantinische Fehler au\u00dferhalb des Autorisierungsprotokolls gilt... Insgesamt ist das genau das, was wir schlie\u00dflich umgesetzt haben.\n<p>Hier gibt es absolut nichts Neues! Aber sobald wir alles zusammen mischen\u2026 Es w\u00e4re so, als w\u00fcrde man sagen, dass das Rezept f\u00fcr Olivier-Salat Unsinn ist, nur weil Eier, Mayonnaise und Gurken bereits erfunden wurden\u2026 Es ist etwa die gleiche Geschichte.<\/li>\n<\/ul>\n<p>\n<img decoding=\"async\" alt=\"HighLoad++, Michail Tjulenew (MongoDB): Kausale Konsistenz: von der Theorie zur Praxis\" src=\"\/wp-content\/uploads\/2020\/02\/2f9e5cb77079f9a0f7bdf76430c3386e.jpg\" style=\"display:block;margin: 0 auto;\" \/><br \/>\n<br \/>\nDamit schlie\u00dfe ich. Vielen Dank!<\/p>\n<h3>Fragen<\/h3>\n<p>\n<b>Frage aus dem Publikum (im Folgenden \u2013 F):<\/b> \u2013 Vielen Dank, Michail, f\u00fcr 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 \u2013 es kann viele Kunden mit Treibern geben, auch viele Query-Planer, und auch viele Shards\u2026 Was passiert mit dem System, wenn es pl\u00f6tzlich zu einem Ungleichgewicht kommt: jemand denkt, er ist eine Minute voraus, jemand anderer \u2013 eine Minute hinterher? Wo landen wir?<\/p>\n<p><b>MT:<\/b> \u2013 Das ist tats\u00e4chlich eine gro\u00dfartige Frage! Ich wollte gerade \u00fcber 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 \u2013 sie haben Unterschiede, interagieren nicht miteinander, weil die Zeiten, die sie kennen, unterschiedlich sind, insbesondere die Zeit, die in ihren Logb\u00fcchern existiert.<br \/>\nAngenommen, shard 1 hat eine Million Eintr\u00e4ge gemacht, shard 2 hingegen gar nichts, und die Anfrage kam an zwei shards. Und shard 1 hat eine afterClusterTime von \u00fcber einer Million. In einem solchen Fall, wie ich erkl\u00e4rt habe, wird shard 2 niemals antworten.<\/p>\n<p><b>Frage:<\/b> \u2013 Ich wollte wissen, wie sie sich synchronisieren und eine logische Zeit w\u00e4hlen?<\/p>\n<p><b>MT:<\/b> \u2013 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\u00fcnstlich und wird dadurch kausal konsistent.<\/p>\n<p><b>Frage:<\/b> \u2013 Und wenn danach noch irgendwelche Ereignisse eintreffen, die irgendwo im Netzwerk verloren gegangen sind?<\/p>\n<p><b>MT:<\/b> \u2013 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 \u2013 und die kausale Konsistenz gest\u00f6rt wird. Wenn er no write macht, m\u00fcssen alle noch weiter eintreffen (er wird auf sie warten).<\/p>\n<p><img decoding=\"async\" alt=\"HighLoad++, Michail Tjulenew (MongoDB): Kausale Konsistenz: von der Theorie zur Praxis\" src=\"\/wp-content\/uploads\/2020\/02\/dbbc7c5c653f0c9fa449cceb88ed62ef.jpg\" style=\"display:block;margin: 0 auto;\" \/><br \/>\n<br \/>\n<b>Frage:<\/b> \u2013 Ich habe einige Fragen zu Warteschlangen. Kausale Konsistenz setzt voraus, dass es eine bestimmte Reihenfolge von Aktionen gibt, die ausgef\u00fchrt werden m\u00fcssen. Was passiert, wenn ein Paket verloren geht? Der 10. und 11. sind gegangen, aber der 12. fehlt, w\u00e4hrend alle anderen darauf warten, dass er bearbeitet wird. Und pl\u00f6tzlich stirbt unsere Maschine, wir k\u00f6nnen nichts mehr tun. Gibt es eine maximale L\u00e4nge 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\u00fctzt!<\/p>\n<p><b>MT:<\/b> \u2013 Auch eine gro\u00dfartige Frage! Was tun wir? In MongoDB gibt es das Konzept von Quorum-Schreibvorg\u00e4ngen und Quorum-Lesungen. In welchen F\u00e4llen kann eine Nachricht verloren gehen? Wenn die Aufzeichnung nicht im Quorum ist oder wenn das Lesen nicht quorum ist (es kann ebenfalls M\u00fcll auftauchen).<br \/>\nBez\u00fcglich der kausalen Konsistenz haben wir eine umfangreiche experimentelle \u00dcberpr\u00fcfung durchgef\u00fchrt, deren Ergebnis zeigte, dass bei nicht quorum konformen Schreib- und Lesevorg\u00e4ngen Verst\u00f6\u00dfe gegen die kausale Konsistenz auftreten. Genau das, was Sie sagen!<\/p>\n<p>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\u00f6chte, dass Daten verloren gehen, muss er Quorum-Write verwenden. Kausal-Konsistenz garantiert nicht die Haltbarkeit. Die Garantie f\u00fcr die Haltbarkeit bieten Replikation und die mit der Replikation verbundene Technik.<\/p>\n<p><b>Frage:<\/b> \u2013 Wenn wir eine Instanz erstellen, die bei uns das Sharding ausf\u00fchrt (nicht master, sondern entsprechend slave), st\u00fctzt sie sich auf die Unix-Zeit ihrer eigenen Maschine oder auf die Zeit des \u00abMasters\u00bb; wird sie beim ersten Mal oder regelm\u00e4\u00dfig synchronisiert?<\/p>\n<p><b>MT:<\/b> \u2013 Lass mich das klarstellen. Ein Shard (d. h. eine horizontale Partition) hat immer einen Primary. In einem Shard kann es einen \u201eMaster\u201c und Replikate geben. Aber der Shard muss immer das Schreiben unterst\u00fctzen, da er einen bestimmten Bereich abdecken muss (im Shard befindet sich der Primary).<\/p>\n<p><b>Frage:<\/b> \u2013 Bedeutet das, dass alles rein vom \u201eMaster\u201c abh\u00e4ngt? Wird immer die \u201eMaster\u201c-Zeit verwendet?<\/p>\n<p><b>MT:<\/b> \u2013 Ja. Man kann bildlich sagen: Die Uhren ticken, wenn ein Write im \u201eMaster\u201c erfolgt, im \u201eOpLog\u201c.<\/p>\n<p><b>Frage:<\/b> \u2013 Wir haben einen Kunden, der sich verbindet, und er muss nichts \u00fcber die Zeit wissen?<\/p>\n<p><b>MT:<\/b> \u2013 Man muss \u00fcberhaupt nichts wissen! Wenn es darum geht, wie es beim Kunden funktioniert: Der Kunde muss, wenn er Causal Consistency nutzen m\u00f6chte, eine Sitzung \u00f6ffnen. 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.<\/p>\n<p>Wenn er diese Sitzung \u00f6ffnet und sagt, dass er Causal Consistency m\u00f6chte (sofern die Sitzung standardm\u00e4\u00dfig Causal Consistency unterst\u00fctzt), funktioniert alles automatisch. Der Treiber merkt sich diese Zeit und erh\u00f6ht sie, wenn er eine neue Nachricht erh\u00e4lt. Er merkt sich, welche Antwort vom Server zur\u00fcckgegeben wurde, der die Daten geliefert hat. Die n\u00e4chste Anfrage wird \"afterCluster\" enthalten (\"Zeit gr\u00f6\u00dfer als diese\").<\/p>\n<p>Der Kunde muss absolut nichts wissen! Es ist f\u00fcr ihn vollkommen intransparent. Wenn Menschen diese Funktionen nutzen, was erlaubt das? Erstens kann man sekund\u00e4re Systeme sicher lesen: Man kann auf dem Prim\u00e4rsystem schreiben und von geografisch replizierten sekund\u00e4ren Systemen lesen und sich sicher sein, dass es funktioniert. Gleichzeitig k\u00f6nnen die Sitzungen, die auf dem Prim\u00e4rsystem aufgezeichnet wurden, auch auf das Sekund\u00e4rsystem \u00fcbertragen werden, das hei\u00dft, man kann nicht nur eine Sitzung, sondern mehrere nutzen.<\/p>\n<p><b>Frage:<\/b> \u2013 Mit dem Thema der eventualen Konsistenz ist eng der neue Bereich der Informatik \u2013 die Datentypen CRDT (konflikfreig replicierte Datentypen) verbunden. Haben Sie eine Integration dieser Datentypen in die Datenbank in Betracht gezogen und was k\u00f6nnen Sie dazu sagen?<\/p>\n<p><b>MT:<\/b> \u2013 Gute Frage! CRDT macht Sinn bei Schreibkonflikten: in MongoDB \u2013 ein einzelner Master.<\/p>\n<p><b>Frage:<\/b> \u2013 Ich habe eine Frage von den DevOps. In der heutigen Welt gibt es manchmal solche hinterh\u00e4ltigen Situationen, in denen ein byzantinischer Fehler auftritt und b\u00f6se Leute innerhalb des gesch\u00fctzten Perimeters beginnen, sich in das Protokoll einzuhacken, indem sie speziell gestaltete Pakete senden?<\/p>\n<p><img decoding=\"async\" alt=\"HighLoad++, Michail Tjulenew (MongoDB): Kausale Konsistenz: von der Theorie zur Praxis\" src=\"\/wp-content\/uploads\/2020\/02\/99a521d04b416e6978aa68ce7c4a4c46.jpg\" style=\"display:block;margin: 0 auto;\" \/><br \/>\n<br \/>\n<b>MT:<\/b> \u2013 B\u00f6se Leute im Inneren des Perimeters sind wie ein trojanisches Pferd! B\u00f6se Leute innerhalb des Perimeters k\u00f6nnen viele sch\u00e4dliche Dinge tun.<\/p>\n<p><b>Frage:<\/b> \u2013 Es ist klar, dass es nicht richtig ist, im Server eine Art L\u00fccke zu lassen, durch die man einen Elefantenpark hindurchschieben und den gesamten Cluster f\u00fcr 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\u00e4t, in der Praxis, tats\u00e4chlich zu solchen internen Angriffen?<\/p>\n<p><b>MT:<\/b> \u2013 Da ich in der realen Welt selten mit Sicherheitsverletzungen konfrontiert werde, kann ich nicht sagen, ob sie tats\u00e4chlich passieren. Aber was die Entwicklerphilosophie angeht, so denken wir folgenderma\u00dfen: Wir haben einen Umfang, der die Leute, die f\u00fcr die Sicherheit zust\u00e4ndig sind, sch\u00fctzt \u2013 das ist das Schloss, die Mauer; innerhalb dieses Umfangs kann man alles M\u00f6gliche tun. Es ist klar, dass es Benutzer gibt, die nur ansehen k\u00f6nnen, und solche, die die Berechtigung haben, Verzeichnisse zu l\u00f6schen.<\/p>\n<p>Je nach Rechten kann der Schaden, den Benutzer anrichten k\u00f6nnen, variieren \u2013 von einer Maus bis hin zu einem Elefanten. Klar ist, dass ein Benutzer mit vollen Rechten alles M\u00f6gliche tun kann. Ein Benutzer mit eingeschr\u00e4nkten Rechten verursacht deutlich weniger Schaden. Insbesondere kann er das System nicht zerst\u00f6ren.<\/p>\n<p><b>Frage:<\/b> \u2013 In einem gesch\u00fctzten Umfang wird manchmal versucht, unerwartete Protokolle f\u00fcr den Server zu erstellen, um den Server lahmzulegen und, wenn man Gl\u00fcck hat, den gesamten Cluster... Ist es wirklich so \"gut\"?<\/p>\n<p><b>MT:<\/b> \u2013 Ich habe noch nie von solchen Dingen geh\u00f6rt. 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\u00f6glich, da es trotzdem verifiziert wird. Es besteht die M\u00f6glichkeit, diese Authentifizierung f\u00fcr Nutzer abzuschalten, die es nicht wollen \u2013 das sind dann ihre Probleme; sie haben, grob gesagt, selbst die Mauern eingerissen und k\u00f6nnen einen Elefanten hineinstecken, der alles zertrampelt\u2026 Man k\u00f6nnte sich auch als Techniker verkleiden, vorbeikommen und ihn herausziehen!<\/p>\n<p><b>Frage:<\/b> \u2013 Vielen Dank f\u00fcr den Vortrag. Sergej (\"Yandex\"). In MongoDB gibt es eine Konstante, die die Anzahl der abstimmenden Mitglieder im Replica Set limitiert, und diese Konstante betr\u00e4gt 7. Warum ist das eine Konstante? Warum ist das kein Parameter?<\/p>\n<p><b>MT:<\/b> \u2013 In einem Replica Set haben wir auch mal 40 Knoten. Dort gibt es immer eine Mehrheit. Ich wei\u00df nicht, welche Version\u2026<\/p>\n<p><b>Frage:<\/b> \u2013 Im Replica Set kann man nicht abstimmende Mitglieder betreiben, aber abstimmende \u2013 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\u00e4t k\u00f6nnte ebenfalls ausfallen.<\/p>\n<p><b>MT:<\/b> \u2013 Das liegt schon etwas au\u00dferhalb des Vortrags. Das ist eine allgemeine Frage. Vielleicht kann ich sp\u00e4ter dar\u00fcber erz\u00e4hlen.<\/p>\n<p><img decoding=\"async\" alt=\"HighLoad++, Michail Tjulenew (MongoDB): Kausale Konsistenz: von der Theorie zur Praxis\" src=\"\/wp-content\/uploads\/2020\/02\/161966c7e77704dc619674ff0302ff57.jpg\" style=\"display:block;margin: 0 auto;\" \/><br \/>\n<br \/>\n<center><div class=\"youtube-placeholder\" data-id=\"UnAprFMX1d4\" onclick=\"loadVideo(this)\">\r\n        <img decoding=\"async\" src=\"https:\/\/img.youtube.com\/vi\/UnAprFMX1d4\/hqdefault.jpg\" alt=\"Video abspielen\" loading=\"lazy\" width=\"480\" height=\"360\" style=\"width:100%;height:auto;\">\r\n        <div class=\"play-button\"><\/div>\r\n    <\/div><\/center><\/p>\n<h3>Ein wenig Werbung \ud83d\ude42<\/h3>\n<p>\nDanke, dass Sie bei uns bleiben. Gefallen Ihnen unsere Artikel? M\u00f6chten Sie mehr interessante Inhalte sehen? Unterst\u00fctzen Sie uns, indem Sie eine Bestellung aufgeben oder uns Ihren Freunden empfehlen. <noindex><a rel=\"nofollow\" href=\"https:\/\/ua-hosting.company\/cloudvps\/nl\">Cloud-VPS f\u00fcr Entwickler ab 4,99 $<\/a><\/noindex>, <b>eine einzigartige Alternative zu Einsteiger-Servern, die wir f\u00fcr Sie entwickelt haben:<\/b> <noindex><a rel=\"nofollow\" href=\"https:\/\/habr.com\/company\/ua-hosting\/blog\/347386\/\">Alles \u00fcber VPS (KVM) E5-2697 v3 (6 Kerne) 10GB DDR4 480GB SSD 1Gbps ab 19 $ oder wie man einen Server richtig teilt?<\/a><\/noindex> (Verf\u00fcgbar sind Optionen mit RAID1 und RAID10, bis zu 24 Kerne und bis zu 40GB DDR4).<\/p>\n<p><b>Dell R730xd im Equinix Tier IV Rechenzentrum in Amsterdam zum halben Preis?<\/b> Nur bei uns <b><noindex><a rel=\"nofollow\" href=\"https:\/\/ua-hosting.company\/serversnl\">2 x Intel TetraDeca-Core Xeon 2x E5-2697v3 2.6GHz 14C 64GB DDR4 4x960GB SSD 1Gbps 100 TB ab 199 $<\/a><\/noindex> in den Niederlanden! <b>Dell R420 \u2014 2x E5-2430 2.2GHz 6C 128GB DDR3 2x960GB SSD 1Gbps 100TB \u2014 ab 99 $!<\/b><\/b> Lesen Sie dar\u00fcber <noindex><a rel=\"nofollow\" href=\"https:\/\/habr.com\/company\/ua-hosting\/blog\/329618\/\">Wie man eine Unternehmenskosten-Infrastruktur mit Dell R730xd E5-2650 v4-Servern f\u00fcr ein paar Euro aufbaut?<\/a><\/noindex><br \/>\n<br \/>Quelle: <a content=\"nofollow\" rel=\"nofollow\" href=\"https:\/\/habr.com\/ru\/company\/ua-hosting\/blog\/487638\/\">habr.com<\/a><\/p>","protected":false,"gt_translate_keys":[{"key":"rendered","format":"html"}]},"excerpt":{"rendered":"<p>\u0421\u043b\u0435\u0434\u0443\u044e\u0449\u0430\u044f \u043a\u043e\u043d\u0444\u0435\u0440\u0435\u043d\u0446\u0438\u044f HighLoad++ \u043f\u0440\u043e\u0439\u0434\u0435\u0442 6 \u0438 7 \u0430\u043f\u0440\u0435\u043b\u044f 2020 \u0433\u043e\u0434\u0430 \u0432 \u0421\u0430\u043d\u043a\u0442-\u041f\u0435\u0442\u0435\u0440\u0431\u0443\u0440\u0433\u0435. \u041f\u043e\u0434\u0440\u043e\u0431\u043d\u043e\u0441\u0442\u0438 \u0438 \u0431\u0438\u043b\u0435\u0442\u044b \u043f\u043e \u0441\u0441\u044b\u043b\u043a\u0435. HighLoad++ Siberia 2019. \u0417\u0430\u043b \u00ab\u041a\u0440\u0430\u0441\u043d\u043e\u044f\u0440\u0441\u043a\u00bb. 25 \u0438\u044e\u043d\u044f, 12:00. \u0422\u0435\u0437\u0438\u0441\u044b \u0438 \u043f\u0440\u0435\u0437\u0435\u043d\u0442\u0430\u0446\u0438\u044f. \u0411\u044b\u0432\u0430\u0435\u0442, \u0447\u0442\u043e \u043f\u0440\u0430\u043a\u0442\u0438\u0447\u0435\u0441\u043a\u0438\u0435 \u0442\u0440\u0435\u0431\u043e\u0432\u0430\u043d\u0438\u044f \u043a\u043e\u043d\u0444\u043b\u0438\u043a\u0442\u0443\u044e\u0442 \u0441 \u0442\u0435\u043e\u0440\u0438\u0435\u0439, \u0433\u0434\u0435 \u043d\u0435 \u0443\u0447\u0442\u0435\u043d\u044b \u0432\u0430\u0436\u043d\u044b\u0435 \u0434\u043b\u044f \u043a\u043e\u043c\u043c\u0435\u0440\u0447\u0435\u0441\u043a\u043e\u0433\u043e \u043f\u0440\u043e\u0434\u0443\u043a\u0442\u0430 \u0430\u0441\u043f\u0435\u043a\u0442\u044b. \u0412 \u044d\u0442\u043e\u043c \u0434\u043e\u043a\u043b\u0430\u0434\u0435 \u043f\u0440\u0435\u0434\u0441\u0442\u0430\u0432\u043b\u0435\u043d \u043f\u0440\u043e\u0446\u0435\u0441\u0441 \u0432\u044b\u0431\u043e\u0440\u0430 \u0438 \u043a\u043e\u043c\u0431\u0438\u043d\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u044f \u0440\u0430\u0437\u043b\u0438\u0447\u043d\u044b\u0445 \u043f\u043e\u0434\u0445\u043e\u0434\u043e\u0432 \u043a \u0441\u043e\u0437\u0434\u0430\u043d\u0438\u044e [&hellip;]<\/p>\n","protected":false,"gt_translate_keys":[{"key":"rendered","format":"html"}]},"author":1,"featured_media":0,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"footnotes":""},"categories":[688],"tags":[],"class_list":["post-56365","post","type-post","status-publish","format-standard","hentry","category-administrirovanie"],"aioseo_notices":[],"aioseo_head":"\n\t\t<!-- All in One SEO 4.9.10 - aioseo.com -->\n\t<meta name=\"description\" content=\"\u0421\u043b\u0435\u0434\u0443\u044e\u0449\u0430\u044f \u043a\u043e\u043d\u0444\u0435\u0440\u0435\u043d\u0446\u0438\u044f HighLoad++ \u043f\u0440\u043e\u0439\u0434\u0435\u0442 6 \u0438 7 \u0430\u043f\u0440\u0435\u043b\u044f 2020 \u0433\u043e\u0434\u0430 \u0432 \u0421\u0430\u043d\u043a\u0442-\u041f\u0435\u0442\u0435\u0440\u0431\u0443\u0440\u0433\u0435. \u041f\u043e\u0434\u0440\u043e\u0431\u043d\u043e\u0441\u0442\u0438 \u0438 \u0431\u0438\u043b\u0435\u0442\u044b \u043f\u043e \u0441\u0441\u044b\u043b\u043a\u0435. HighLoad++ Siberia 2019. \u0417\u0430\u043b \u00ab\u041a\u0440\u0430\u0441\u043d\u043e\u044f\u0440\u0441\u043a\u00bb. 25 \u0438\u044e\u043d\u044f, 12:00. \u0422\u0435\u0437\u0438\u0441\u044b \u0438 \u043f\u0440\u0435\u0437\u0435\u043d\u0442\u0430\u0446\u0438\u044f. \u0411\u044b\u0432\u0430\u0435\u0442, \u0447\u0442\u043e \u043f\u0440\u0430\u043a\u0442\u0438\u0447\u0435\u0441\u043a\u0438\u0435 \u0442\u0440\u0435\u0431\u043e\u0432\u0430\u043d\u0438\u044f \u043a\u043e\u043d\u0444\u043b\u0438\u043a\u0442\u0443\u044e\u0442 \u0441 \u0442\u0435\u043e\u0440\u0438\u0435\u0439, \u0433\u0434\u0435 \u043d\u0435 \u0443\u0447\u0442\u0435\u043d\u044b \u0432\u0430\u0436\u043d\u044b\u0435 \u0434\u043b\u044f \u043a\u043e\u043c\u043c\u0435\u0440\u0447\u0435\u0441\u043a\u043e\u0433\u043e \u043f\u0440\u043e\u0434\u0443\u043a\u0442\u0430 \u0430\u0441\u043f\u0435\u043a\u0442\u044b. \u0412 \u044d\u0442\u043e\u043c \u0434\u043e\u043a\u043b\u0430\u0434\u0435 \u043f\u0440\u0435\u0434\u0441\u0442\u0430\u0432\u043b\u0435\u043d \u043f\u0440\u043e\u0446\u0435\u0441\u0441 \u0432\u044b\u0431\u043e\u0440\u0430 \u0438 \u043a\u043e\u043c\u0431\u0438\u043d\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u044f \u0440\u0430\u0437\u043b\u0438\u0447\u043d\u044b\u0445 \u043f\u043e\u0434\u0445\u043e\u0434\u043e\u0432 \u043a \u0441\u043e\u0437\u0434\u0430\u043d\u0438\u044e\" \/>\n\t<meta name=\"robots\" content=\"max-image-preview:large\" \/>\n\t<meta name=\"author\" content=\"Yuri Gagarin\"\/>\n\t<link rel=\"canonical\" href=\"https:\/\/prohoster.info\/de\/blog\/administrirovanie\/highload-mihail-tyulenev-mongodb-causal-consistency-ot-teorii-k-praktike\" \/>\n\t<meta name=\"generator\" content=\"All in One SEO (AIOSEO) 4.9.10\" \/>\n\t\t<meta property=\"og:locale\" content=\"de_DE\" \/>\n\t\t<meta property=\"og:site_name\" content=\"ProHoster | \u041a\u0443\u043f\u0438\u0442\u044c \u043d\u0430\u0434\u0435\u0436\u043d\u044b\u0439 \u0445\u043e\u0441\u0442\u0438\u043d\u0433 \u0434\u043b\u044f \u0441\u0430\u0439\u0442\u043e\u0432 \u0441 \u0437\u0430\u0449\u0438\u0442\u043e\u0439 \u043e\u0442 DDoS, VPS VDS \u0441\u0435\u0440\u0432\u0435\u0440\u044b\" \/>\n\t\t<meta property=\"og:type\" content=\"article\" \/>\n\t\t<meta property=\"og:title\" content=\"\ud83e\udd47HighLoad++, \u041c\u0438\u0445\u0430\u0438\u043b \u0422\u044e\u043b\u0435\u043d\u0435\u0432 (MongoDB): Causal consistency: \u043e\u0442 \u0442\u0435\u043e\u0440\u0438\u0438 \u043a \u043f\u0440\u0430\u043a\u0442\u0438\u043a\u0435 | ProHoster\" \/>\n\t\t<meta property=\"og:description\" content=\"\u0421\u043b\u0435\u0434\u0443\u044e\u0449\u0430\u044f \u043a\u043e\u043d\u0444\u0435\u0440\u0435\u043d\u0446\u0438\u044f HighLoad++ \u043f\u0440\u043e\u0439\u0434\u0435\u0442 6 \u0438 7 \u0430\u043f\u0440\u0435\u043b\u044f 2020 \u0433\u043e\u0434\u0430 \u0432 \u0421\u0430\u043d\u043a\u0442-\u041f\u0435\u0442\u0435\u0440\u0431\u0443\u0440\u0433\u0435. \u041f\u043e\u0434\u0440\u043e\u0431\u043d\u043e\u0441\u0442\u0438 \u0438 \u0431\u0438\u043b\u0435\u0442\u044b \u043f\u043e \u0441\u0441\u044b\u043b\u043a\u0435. HighLoad++ Siberia 2019. \u0417\u0430\u043b \u00ab\u041a\u0440\u0430\u0441\u043d\u043e\u044f\u0440\u0441\u043a\u00bb. 25 \u0438\u044e\u043d\u044f, 12:00. \u0422\u0435\u0437\u0438\u0441\u044b \u0438 \u043f\u0440\u0435\u0437\u0435\u043d\u0442\u0430\u0446\u0438\u044f. \u0411\u044b\u0432\u0430\u0435\u0442, \u0447\u0442\u043e \u043f\u0440\u0430\u043a\u0442\u0438\u0447\u0435\u0441\u043a\u0438\u0435 \u0442\u0440\u0435\u0431\u043e\u0432\u0430\u043d\u0438\u044f \u043a\u043e\u043d\u0444\u043b\u0438\u043a\u0442\u0443\u044e\u0442 \u0441 \u0442\u0435\u043e\u0440\u0438\u0435\u0439, \u0433\u0434\u0435 \u043d\u0435 \u0443\u0447\u0442\u0435\u043d\u044b \u0432\u0430\u0436\u043d\u044b\u0435 \u0434\u043b\u044f \u043a\u043e\u043c\u043c\u0435\u0440\u0447\u0435\u0441\u043a\u043e\u0433\u043e \u043f\u0440\u043e\u0434\u0443\u043a\u0442\u0430 \u0430\u0441\u043f\u0435\u043a\u0442\u044b. \u0412 \u044d\u0442\u043e\u043c \u0434\u043e\u043a\u043b\u0430\u0434\u0435 \u043f\u0440\u0435\u0434\u0441\u0442\u0430\u0432\u043b\u0435\u043d \u043f\u0440\u043e\u0446\u0435\u0441\u0441 \u0432\u044b\u0431\u043e\u0440\u0430 \u0438 \u043a\u043e\u043c\u0431\u0438\u043d\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u044f \u0440\u0430\u0437\u043b\u0438\u0447\u043d\u044b\u0445 \u043f\u043e\u0434\u0445\u043e\u0434\u043e\u0432 \u043a \u0441\u043e\u0437\u0434\u0430\u043d\u0438\u044e\" \/>\n\t\t<meta property=\"og:url\" content=\"https:\/\/prohoster.info\/de\/blog\/administrirovanie\/highload-mihail-tyulenev-mongodb-causal-consistency-ot-teorii-k-praktike\" \/>\n\t\t<meta property=\"og:image\" content=\"https:\/\/prohoster.info\/wp-content\/uploads\/2021\/11\/logo-350.jpg\" \/>\n\t\t<meta property=\"og:image:secure_url\" content=\"https:\/\/prohoster.info\/wp-content\/uploads\/2021\/11\/logo-350.jpg\" \/>\n\t\t<meta property=\"og:image:width\" content=\"350\" \/>\n\t\t<meta property=\"og:image:height\" content=\"350\" \/>\n\t\t<meta property=\"article:published_time\" content=\"2020-02-10T21:00:00+00:00\" \/>\n\t\t<meta property=\"article:modified_time\" content=\"2020-02-18T11:04:37+00:00\" \/>\n\t\t<meta property=\"article:publisher\" content=\"https:\/\/www.facebook.com\/prohoster\" \/>\n\t\t<meta property=\"article:author\" content=\"https:\/\/www.facebook.com\/prohoster\" \/>\n\t\t<!-- All in One SEO -->\n\n","aioseo_head_json":{"title":"\ud83e\udd47HighLoad++, Michail Tjulenev (MongoDB): Kausale Konsistenz: Von der Theorie zur Praxis | ProHoster","description":"Die n\u00e4chste HighLoad++-Konferenz findet am 6. und 7. April 2020 in St. Petersburg statt. Details und Tickets finden Sie unter dem Link. HighLoad++ Sibirien 2019. Saal \u201eKrasnojarsk\u201c. 25. Juni, 12:00 Uhr. Thesen und Pr\u00e4sentation. Es kommt vor, dass praktische Anforderungen mit der Theorie in Konflikt stehen, bei der wichtige Aspekte f\u00fcr kommerzielle Produkte nicht ber\u00fccksichtigt werden. In diesem Vortrag wird der Prozess der Auswahl und Kombination verschiedener Ans\u00e4tze zur Erstellung pr\u00e4sentiert.","canonical_url":"https:\/\/prohoster.info\/de\/blog\/administrirovanie\/highload-mihail-tyulenev-mongodb-causal-consistency-ot-teorii-k-praktike","robots":"max-image-preview:large","keywords":"","webmasterTools":{"miscellaneous":""},"schema":null,"og:locale":"de_DE","og:site_name":"ProHoster | \u041a\u0443\u043f\u0438\u0442\u044c \u043d\u0430\u0434\u0435\u0436\u043d\u044b\u0439 \u0445\u043e\u0441\u0442\u0438\u043d\u0433 \u0434\u043b\u044f \u0441\u0430\u0439\u0442\u043e\u0432 \u0441 \u0437\u0430\u0449\u0438\u0442\u043e\u0439 \u043e\u0442 DDoS, VPS VDS \u0441\u0435\u0440\u0432\u0435\u0440\u044b","og:type":"article","og:title":"\ud83e\udd47HighLoad++, \u041c\u0438\u0445\u0430\u0438\u043b \u0422\u044e\u043b\u0435\u043d\u0435\u0432 (MongoDB): Causal consistency: \u043e\u0442 \u0442\u0435\u043e\u0440\u0438\u0438 \u043a \u043f\u0440\u0430\u043a\u0442\u0438\u043a\u0435 | ProHoster","og:description":"\u0421\u043b\u0435\u0434\u0443\u044e\u0449\u0430\u044f \u043a\u043e\u043d\u0444\u0435\u0440\u0435\u043d\u0446\u0438\u044f HighLoad++ \u043f\u0440\u043e\u0439\u0434\u0435\u0442 6 \u0438 7 \u0430\u043f\u0440\u0435\u043b\u044f 2020 \u0433\u043e\u0434\u0430 \u0432 \u0421\u0430\u043d\u043a\u0442-\u041f\u0435\u0442\u0435\u0440\u0431\u0443\u0440\u0433\u0435. \u041f\u043e\u0434\u0440\u043e\u0431\u043d\u043e\u0441\u0442\u0438 \u0438 \u0431\u0438\u043b\u0435\u0442\u044b \u043f\u043e \u0441\u0441\u044b\u043b\u043a\u0435. HighLoad++ Siberia 2019. \u0417\u0430\u043b \u00ab\u041a\u0440\u0430\u0441\u043d\u043e\u044f\u0440\u0441\u043a\u00bb. 25 \u0438\u044e\u043d\u044f, 12:00. \u0422\u0435\u0437\u0438\u0441\u044b \u0438 \u043f\u0440\u0435\u0437\u0435\u043d\u0442\u0430\u0446\u0438\u044f. \u0411\u044b\u0432\u0430\u0435\u0442, \u0447\u0442\u043e \u043f\u0440\u0430\u043a\u0442\u0438\u0447\u0435\u0441\u043a\u0438\u0435 \u0442\u0440\u0435\u0431\u043e\u0432\u0430\u043d\u0438\u044f \u043a\u043e\u043d\u0444\u043b\u0438\u043a\u0442\u0443\u044e\u0442 \u0441 \u0442\u0435\u043e\u0440\u0438\u0435\u0439, \u0433\u0434\u0435 \u043d\u0435 \u0443\u0447\u0442\u0435\u043d\u044b \u0432\u0430\u0436\u043d\u044b\u0435 \u0434\u043b\u044f \u043a\u043e\u043c\u043c\u0435\u0440\u0447\u0435\u0441\u043a\u043e\u0433\u043e \u043f\u0440\u043e\u0434\u0443\u043a\u0442\u0430 \u0430\u0441\u043f\u0435\u043a\u0442\u044b. \u0412 \u044d\u0442\u043e\u043c \u0434\u043e\u043a\u043b\u0430\u0434\u0435 \u043f\u0440\u0435\u0434\u0441\u0442\u0430\u0432\u043b\u0435\u043d \u043f\u0440\u043e\u0446\u0435\u0441\u0441 \u0432\u044b\u0431\u043e\u0440\u0430 \u0438 \u043a\u043e\u043c\u0431\u0438\u043d\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u044f \u0440\u0430\u0437\u043b\u0438\u0447\u043d\u044b\u0445 \u043f\u043e\u0434\u0445\u043e\u0434\u043e\u0432 \u043a \u0441\u043e\u0437\u0434\u0430\u043d\u0438\u044e","og:url":"https:\/\/prohoster.info\/de\/blog\/administrirovanie\/highload-mihail-tyulenev-mongodb-causal-consistency-ot-teorii-k-praktike","og:image":"https:\/\/prohoster.info\/wp-content\/uploads\/2021\/11\/logo-350.jpg","og:image:secure_url":"https:\/\/prohoster.info\/wp-content\/uploads\/2021\/11\/logo-350.jpg","og:image:width":350,"og:image:height":350,"article:published_time":"2020-02-10T21:00:00+00:00","article:modified_time":"2020-02-18T11:04:37+00:00","article:publisher":"https:\/\/www.facebook.com\/prohoster","article:author":"https:\/\/www.facebook.com\/prohoster"},"aioseo_meta_data":{"post_id":"56365","title":null,"description":null,"keywords":null,"keyphrases":null,"primary_term":null,"canonical_url":null,"og_title":null,"og_description":null,"og_object_type":"default","og_image_type":"default","og_image_url":null,"og_image_width":null,"og_image_height":null,"og_image_custom_url":null,"og_image_custom_fields":null,"og_video":null,"og_custom_url":null,"og_article_section":null,"og_article_tags":null,"twitter_use_og":false,"twitter_card":"default","twitter_image_type":"default","twitter_image_url":null,"twitter_image_custom_url":null,"twitter_image_custom_fields":null,"twitter_title":null,"twitter_description":null,"schema":{"blockGraphs":[],"customGraphs":[],"default":{"data":{"Article":[],"Course":[],"Dataset":[],"FAQPage":[],"Movie":[],"Person":[],"Product":[],"ProductReview":[],"Car":[],"Recipe":[],"Service":[],"SoftwareApplication":[],"WebPage":[]},"graphName":"","isEnabled":true},"graphs":[]},"schema_type":null,"schema_type_options":null,"pillar_content":false,"robots_default":true,"robots_noindex":false,"robots_noarchive":false,"robots_nosnippet":false,"robots_nofollow":false,"robots_noimageindex":false,"robots_noodp":false,"robots_notranslate":false,"robots_max_snippet":null,"robots_max_videopreview":null,"robots_max_imagepreview":"large","priority":null,"frequency":null,"local_seo":null,"seo_analyzer_scan_date":null,"breadcrumb_settings":null,"limit_modified_date":false,"reviewed_by":null,"ai":null,"created":"2021-02-28 19:26:38","updated":"2022-09-29 16:36:31"},"gt_translate_keys":[{"key":"link","format":"url"}],"_links":{"self":[{"href":"https:\/\/prohoster.info\/de\/wp-json\/wp\/v2\/posts\/56365","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/prohoster.info\/de\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/prohoster.info\/de\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/prohoster.info\/de\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/prohoster.info\/de\/wp-json\/wp\/v2\/comments?post=56365"}],"version-history":[{"count":0,"href":"https:\/\/prohoster.info\/de\/wp-json\/wp\/v2\/posts\/56365\/revisions"}],"wp:attachment":[{"href":"https:\/\/prohoster.info\/de\/wp-json\/wp\/v2\/media?parent=56365"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/prohoster.info\/de\/wp-json\/wp\/v2\/categories?post=56365"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/prohoster.info\/de\/wp-json\/wp\/v2\/tags?post=56365"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}