Failover: Perfektionismus und
 Faulheit bringen uns um

Im Sommer sinken traditionell sowohl die KĂ€uferaktivitĂ€t als auch die IntensitĂ€t der Änderungen an der Infrastruktur von Webprojekten, sagt uns Captain Offensichtlich. Einfach weil selbst ITler manchmal in den Urlaub fahren. Und auch CTOs. Umso schwieriger ist es fĂŒr die, die am Posten bleiben, aber darum geht es jetzt nicht: vielleicht ist genau deshalb der Sommer die beste Zeit, um ungestört ĂŒber das bestehende Reservierungsschema nachzudenken und einen Plan zu seiner Verbesserung zu erstellen. Und dabei wird euch die Erfahrung von Egor Andreev aus AdminDivision, die er auf der Konferenz Uptime day.

Beim Aufbau von Backup-Plattformen und bei der Reservierung gibt es mehrere Fallen, in die man tappen kann. Und in diese darf man auf keinen Fall tappen. Und es sind uns dabei, wie in vielen anderen Dingen, Perfektionismus und
 Faulheit im Weg. Wir versuchen, alles perfekt zu machen, und das muss nicht sein! Wir mĂŒssen nur bestimmte Dinge tun, aber sie richtig machen und bis zum Ende bringen, damit sie gut funktionieren.

Failover ist kein lustiges Gadget, „nur damit es vorhanden ist“; es ist etwas, das genau eines tun sollte – die Ausfallzeiten zu minimieren, damit der Dienst, das Unternehmen, weniger Geld verliert. Und bei allen Methoden der Reservierung schlage ich vor, im folgenden Kontext zu denken: Wo ist das Geld?

Failover: Perfektionismus und
 Faulheit bringen uns um

Die erste Falle: Wenn wir große, zuverlĂ€ssige Systeme aufbauen und uns mit der Reservierung beschĂ€ftigen – verringern wir die Anzahl von AusfĂ€llen. Das ist ein schrecklicher Irrtum. Wenn wir uns mit der Reservierung beschĂ€ftigen, erhöhen wir wahrscheinlich die Anzahl der AusfĂ€lle. Und wenn wir alles richtig machen, verringern wir insgesamt die Ausfallzeit. Es wird mehr AusfĂ€lle geben, aber sie werden mit geringeren Kosten eintreten. Denn was ist Reservierung? – Es ist eine Komplikation des Systems. Jede Komplikation ist schlecht: Wir haben mehr Schrauben, mehr ZahnrĂ€der, kurz gesagt, mehr Elemente – und damit eine höhere Wahrscheinlichkeit fĂŒr Fehlfunktionen. Und sie werden wirklich kaputtgehen. Und sie werden hĂ€ufiger kaputtgehen. Ein einfaches Beispiel: Angenommen, wir haben eine Website mit PHP, MySQL. Und diese muss dringend reserviert werden.

Nun, wir nehmen die zweite Plattform und bauen ein identisches System
 Die KomplexitĂ€t verdoppelt sich — wir haben zwei EntitĂ€ten. DarĂŒber hinaus fĂŒgen wir eine bestimmte Logik fĂŒr den DatenĂŒbertrag von einer Plattform zur anderen hinzu — also Datenreplikation, das Kopieren von Statischer und so weiter. Die Logik der Replikation ist in der Regel sehr komplex, deshalb kann die gesamte SystemkomplexitĂ€t nicht nur um das 2-fache, sondern um das 3-, 5- oder 10-fache höher sein.

Die zweite Falle: Wenn wir wirklich große und komplexe Systeme erstellen, trĂ€umen wir davon, was wir letztendlich erreichen wollen. VoilĂ : Wir wollen ein superzuverlĂ€ssiges System, das ĂŒberhaupt keine Ausfallzeiten hat, in einer halben Sekunde (oder besser noch sofort) umschaltet, und beginnen, unsere TrĂ€ume in die RealitĂ€t umzusetzen. Aber auch hier gibt es einen Unterschied: Je geringer die gewĂŒnschte Umschaltzeit, desto komplizierter wird die Systemlogik. Je komplizierter wir diese Logik gestalten, desto hĂ€ufiger wird das System ausfallen. Und man kann in eine sehr unangenehme Situation geraten: Wir versuchen mit aller Kraft, die Ausfallzeit zu verringern, aber in Wirklichkeit komplizieren wir alles und wenn etwas schiefgeht, wird die Ausfallzeit am Ende lĂ€nger sein. Oft denkt man sich: HĂ€tte ich doch besser nicht reserviert. Es wĂ€re besser gewesen, wenn es nur eins gegeben hĂ€tte, das mit einer klaren Ausfallzeit arbeitet.

Wie kann man dem begegnen? Man muss aufhören, sich selbst zu belĂŒgen, aufhören, sich einzureden, dass wir hier jetzt ein Raumschiff bauen werden, und realistisch verstehen, wie lange das Projekt dauern kann. Und nach dieser maximalen Zeit werden wir entscheiden, mit welchen Methoden wir die ZuverlĂ€ssigkeit unseres Systems erhöhen werden.

Failover: Perfektionismus und
 Faulheit bringen uns um

Es ist Zeit fĂŒr "Geschichten aus dem Leben"
 aus dem echten Leben, natĂŒrlich.

Beispiel Nummer eins

Stellen Sie sich die Website einer Rohrleitungsfabrik Nr. 1 in der Stadt N vor. In großen Buchstaben steht dort – ROHRLEITUNGSFABRIK Nr. 1. Etwas weiter unten steht der Slogan: „Unsere Rohre sind die rundesten Rohre in N“. Und ganz unten die Telefonnummer des GeschĂ€ftsfĂŒhrers und sein Name. Wir verstehen, dass wir reservieren mĂŒssen – das ist eine sehr wichtige Angelegenheit! Wir beginnen zu untersuchen, woraus das besteht. HTML-Statik – das heißt, ein paar Bilder, auf denen der GeschĂ€ftsfĂŒhrer, wie es scheint, am Tisch in der Sauna mit seinem Partner ĂŒber einen weiteren Deal diskutiert. Wir beginnen ĂŒber die Leerzeit nachzudenken. Uns kommt in den Sinn: Man muss da fĂŒnf Minuten liegen, nicht mehr. Und dann die Frage: Wie viele VerkĂ€ufe gab es von dieser Website ĂŒberhaupt? Wie viele? Was bedeutet „null“? Es bedeutet: Denn alle vier GeschĂ€fte des letzten Jahres hat der GeschĂ€ftsfĂŒhrer am selben Tisch mit denselben Personen gemacht, mit denen sie in die Sauna gehen. Und wir verstehen, dass es nichts Schlimmes sein wird, wenn die Website einen Tag lang liegt.

Aus den Eingaben ergibt sich, dass es einen Tag fĂŒr die EinfĂŒhrung dieser Geschichte gibt. Wir beginnen, ĂŒber das Reservierungsschema nachzudenken. Und wĂ€hlen das idealste Schema fĂŒr die Reservierung in diesem Beispiel: Wir verwenden keine Reservierung. Das ganze Ding kann von jedem Administrator in einer halben Stunde mit Pausen hochgefahren werden. Einen Webserver aufsetzen, die Dateien hochladen – das war's. Es funktioniert. Man muss nichts ĂŒberwachen, nichts besonders beachten. Das heißt, die Schlussfolgerung aus Beispiel eins ist ziemlich offensichtlich: Dienste, die nicht reserviert werden mĂŒssen – mĂŒssen nicht reserviert werden.

Failover: Perfektionismus und
 Faulheit bringen uns um

Beispiel Nummer zwei

Unternehmensblog: speziell geschulte Personen schreiben dort Nachrichten, hier haben wir an dieser Ausstellung teilgenommen, und hier haben wir ein weiteres neues Produkt herausgebracht und so weiter. Angenommen, es handelt sich um standardmĂ€ĂŸiges PHP mit WordPress, eine kleine Datenbank und ein bisschen Statische. NatĂŒrlich kommt einem wieder der Gedanke, dass man auf keinen Fall inaktiv bleiben darf – „nicht lĂ€nger als fĂŒnf Minuten!“, all das. Aber lassen Sie uns weiterdenken. Was macht dieser Blog? Er erhĂ€lt Besucher von Yandex, von Google aufgrund bestimmter Anfragen, organisch. Toll. Und wie stehen die VerkĂ€ufe in Zusammenhang damit? Erkenntnis: nicht wirklich. Der Werbe-Traffic fließt auf die Hauptseite, die auf einem anderen Server lĂ€uft. Wir fangen an, ĂŒber ein Schema zur Sicherung des Blogs nachzudenken. Im Idealfall sollte es in ein paar Stunden hochgefahren werden, und es wĂ€re gut, sich darauf vorzubereiten. Es wĂ€re sinnvoll, in einem anderen Rechenzentrum einen Server zu mieten und dort eine Umgebung zu installieren, also Webserver, PHP, WordPress, MySQL, und das Ganze im Leerlauf zu belassen. In dem Moment, in dem wir feststellen, dass alles kaputt ist, mĂŒssen wir zwei Dinge tun – ein MySQL-Dump von 50 MB einspielen, das geht in einer Minute, und eine bestimmte Anzahl an Bildern aus dem Backup dort einspielen. Das ist auch nicht viel. So kann in einer halben Stunde alles wieder hochgefahren werden. Keine Replikationen oder, Gott bewahre, automatisches Failover. Fazit: Das, was wir schnell aus dem Backup wiederherstellen können, muss nicht gesichert werden.

Failover: Perfektionismus und
 Faulheit bringen uns um

Beispiel Nummer drei, etwas komplizierter.

Onlineshop. PHP mit Open Heart, etwas angepasst, MySQL mit einer soliden Datenbasis. Ziemlich viel Statische (denn in einem Onlineshop gibt es schöne HD-Bilder und all das), Redis fĂŒr die Sitzung und Elasticsearch fĂŒr die Suche. Wir beginnen, ĂŒber Ausfallzeiten nachzudenken. Und hier ist es natĂŒrlich offensichtlich, dass ein Tag, an dem der Onlineshop keine Einnahmen hat, nicht unproblematisch sein kann. Je lĂ€nger er liegt, desto mehr Geld verlieren wir. Es wird Zeit, sich zu beeilen. Aber wie viel? Ich denke, wenn wir eine Stunde aussetzen, wird niemand verrĂŒckt spielen. Ja, wir werden etwas verlieren, aber wir fangen an, intensiv zu arbeiten – das wird nur schlimmer. Wir definieren das auszuhaltende Maß an Ausfallzeit pro Stunde.

Wie kann man das alles reservieren? Ein Auto wird in jedem Fall benötigt: eine Stunde Zeit ist ziemlich wenig. Mysql: hier ist bereits eine Replikation notwendig, eine echte Replikation, denn in einer Stunde wird wahrscheinlich kein Dump von 100 GB in die Datenbank geladen. Statische Inhalte, Bilder: auch hier könnten in einer Stunde möglicherweise keine 500 GB ĂŒbertragen werden. Daher ist es besser, die Bilder sofort zu kopieren. Redis: hier wird es interessanter. In Redis liegen die Sessions — wir können sie einfach nicht ablegen. Denn das wĂ€re nicht gut: alle Benutzer wĂŒrden ausgeloggt werden, die Warenkörbe wĂ€ren leer usw. Die Leute mĂŒssten ihren Benutzernamen und ihr Passwort erneut eingeben, und viele könnten abspringen und den Kauf nicht abschließen. Wiederum wĂŒrde die Conversion sinken. Auf der anderen Seite ist Redis direkt aktuell, mit den zuletzt angemeldeten Benutzern, wahrscheinlich auch nicht notwendig. Ein guter Kompromiss wĂ€re, Redis zu ĂŒbernehmen und ihn aus einem Backup wiederherzustellen, von gestern oder, falls es jede Stunde gemacht wird, von vor einer Stunde. GlĂŒcklicherweise besteht die Wiederherstellung aus einem einzigen Datei. Und die interessanteste Geschichte ist Elasticsearch. Wer hat jemals die MySQL-Replikation hochgefahren? Wer hat jemals die Elasticsearch-Replikation hochgefahren? Und bei wem hat sie danach normal funktioniert? Ich meine damit: wir sehen in unserem System eine Art EntitĂ€t. Sie scheint nĂŒtzlich zu sein — aber sie ist komplex.
Schwierig in dem Sinne, dass unsere Ingenieure keine Erfahrung damit haben. Entweder gibt es negative Erfahrungen oder wir verstehen, dass dies eine ziemlich neue Technologie mit Nuancen oder UnzulĂ€nglichkeiten ist. Wir denken... Mist, Elasticsearch ist auch groß, es dauert lange, es aus einem Backup wiederherzustellen, was sollen wir tun? Wir verstehen, dass Elasticsearch in unserem Fall fĂŒr die Suche verwendet wird. Und wie verkauft unser Online-Shop? Wir gehen zu den Marketing-Leuten und fragen, woher die Leute kommen. Sie antworten: "90 % kommen direkt von Yandex-Markt auf die Produktseite." Und entweder kaufen sie oder nicht. Folglich benötigt nur 10 % der Nutzer die Suche. Und die Replikation von Elasticsearch aufrechtzuerhalten, besonders zwischen verschiedenen Rechenzentren in verschiedenen Zonen, hat wirklich viele Nuancen. Was ist die Lösung? Wir nehmen Elasticsearch auf einer reservierten FlĂ€che und tun nichts damit. Wenn sich die Sache hinzieht, werden wir ihn irgendwann spĂ€ter vielleicht wieder hochfahren, aber das ist nicht sicher. Letztendlich ist das Fazit mehr oder weniger dasselbe: Dienste, die keine finanziellen Auswirkungen haben, reservieren wir, wie gesagt, nicht. Damit das Schema einfacher bleibt.

Failover: Perfektionismus und
 Faulheit bringen uns um

Beispiel Nummer vier, noch schwieriger.

Integrator: Verkauf von Blumen, Taxiruf, Warenverkauf, kurz gesagt, alles Mögliche. Eine ernsthafte Sache, die rund um die Uhr fĂŒr eine große Anzahl von Nutzern arbeitet. Mit einem vollstĂ€ndigen und interessanten Stack, wo interessante Datenbanken, Lösungen, hohe Lasten vorhanden sind, und das wichtigste, lĂ€nger als 5 Minuten auszufallen, tut wirklich weh. Nicht nur, weil die Leute nicht kaufen, sondern weil die Leute sehen, dass dieses Ding nicht funktioniert, enttĂ€uscht sind und beim nĂ€chsten Mal vielleicht ĂŒberhaupt nicht zurĂŒckkommen.

Okay. FĂŒnf Minuten. Was machen wir damit? In diesem Fall bauen wir ernsthaft, mit vollem Budget, eine echte Backup-Plattform auf, mit Replikationen von allem und jedem, und möglicherweise automatisieren wir auch das Umschalten auf diese Plattform so weit wie möglich. Und zusĂ€tzlich dazu sollte man nicht vergessen, eine wichtige Sache zu tun: nĂ€mlich ein Umschaltprotokoll zu schreiben. Das Protokoll kann, selbst wenn bei Ihnen alles automatisiert ist, sehr einfach sein. Aus der Reihe „Dieses Ansible-Szenario starten“, „In Route 53 diese Option aktivieren“ und so weiter – es sollte aber eine genaue Liste von Schritten sein.

Und irgendwie ist alles klar. Die Replikation umzuschalten ist eine triviale Aufgabe, oder sie schaltet sich von selbst um. Den Domainnamen im DNS umzuschreiben gehört ebenfalls dazu. Das Problem ist, dass bei einem derartigen Projektversagen Panik ausbricht, und selbst die stĂ€rksten, erfahrensten Administratoren können davon betroffen sein. Ohne eine klare Anleitung „Öffnen Sie das Terminal, gehen Sie hierhin, die Adresse unseres Servers bleibt die gleiche“ ist es schwierig, die 5 Minuten, die fĂŒr die Wiederherstellung vorgesehen sind, einzuhalten. Und dazu kommt, dass es einfach ist, einige Änderungen in der Infrastruktur zu fixieren, wĂ€hrend wir diese Vorschrift verwenden, beispielsweise — und die Vorschrift entsprechend zu Ă€ndern.
Na ja, und wenn das Reservierungssystem sehr komplex ist und wir an einem bestimmten Punkt einen Fehler gemacht haben, können wir auch unser Backup-System außer Gefecht setzen und darĂŒber hinaus die Daten auf beiden Plattformen verderben – das wĂ€re wirklich traurig.

Failover: Perfektionismus und
 Faulheit bringen uns um

Beispiel Nummer fĂŒnf, völliger Hardcore.

Ein internationaler Service mit Hunderten Millionen Nutzern weltweit. Alle Zeitzonen, die es gibt, Highload auf maximalem Niveau, darf absolut nicht ausfallen. Eine Minute – und es wird traurig. Was tun? Wieder vollstĂ€ndig reservieren. Wir haben alles getan, was im vorherigen Beispiel erwĂ€hnt wurde, und noch ein bisschen mehr. Eine ideale Welt, und unsere Infrastruktur – sie ist in jeder Hinsicht DevOps IaaC. Das heißt, alles ist in git, und man muss nur einen Knopf drĂŒcken.

Was fehlt? Einzig unser Training. Ohne das geht es nicht. Es scheint, als wĂ€re bei uns alles perfekt, wir haben wirklich alles unter Kontrolle. Wir drĂŒcken den Knopf, alles passiert. Selbst wenn es so ist – und wir wissen, dass es so nicht sein kann – interagiert unser System mit anderen Systemen. Zum Beispiel mit DNS von Route 53, S3-Speichersystemen oder der Integration mit bestimmten APIs. Alles in diesem gedanklichen Experiment vorherzusehen, ist uns nicht möglich. Und solange wir nicht wirklich den Hebel umlegen – werden wir nicht wissen, ob es funktioniert oder nicht.

Failover: Perfektionismus und
 Faulheit bringen uns um

Das wĂ€re wohl alles. Seien Sie fleißig und ĂŒbertreiben Sie es nicht. Möge der Uptime mit Ihnen sein!

Quelle: habr.com

60GB SSD 8Gb DDR4