Fast jede erfolgreiche GeschĂ€ftsanwendung gelangt frĂŒher oder spĂ€ter in eine Phase, in der horizontale Skalierung erforderlich ist. In vielen FĂ€llen kann man einfach einen neuen Instanz starten und die durchschnittliche Last reduzieren. Es gibt jedoch auch weniger triviale FĂ€lle, in denen wir sicherstellen mĂŒssen, dass die verschiedenen Knoten voneinander wissen und die Arbeitslast sorgfĂ€ltig verteilt wird.

So kam es gelegen, dass erlang, das wir wegen seiner angenehmen Syntax und des Hypes, der darum gemacht wurde, gewÀhlt haben, eine erstklassige . In der Theorie klingt das ziemlich trivial:
Die Kommunikation zwischen Prozessen auf verschiedenen Knoten sowie zwischen Links und Monitoren ist transparent [âŠ]
In der Praxis ist alles etwas komplizierter. Verteilt erlang wurde entwickelt, als 'Container' eine groĂe Eisenkiste fĂŒr den Transport bedeutete und 'Docker' einfach ein Synonym fĂŒr einen Hafenarbeiter war. In IP4 gab es viele ungenutzte Adressen, die GrĂŒnde fĂŒr NetzwerkausfĂ€lle waren in der Regel durch Kabel, die von Ratten durchgebissen wurden, und die durchschnittliche Betriebszeit eines Produktionssystems wurde in Jahrzehnten gemessen.
Jetzt sind wir alle unvorstellbar selbstgenĂŒgsam, verpackt und fĂŒhren eine verteilte erlang in einer Umgebung aus, in der dynamische IP-Adressen nach dem Prinzip des groĂen Zufalls vergeben werden, und Knoten zu erscheinen und zu verschwinden scheinen, wann immer der Planungsalgorhythmus es wĂŒnscht. Um einen Haufen wiederverwendbaren Codes in jedem Projekt, das eine verteilte erlangausfĂŒhrt, zu vermeiden, ist UnterstĂŒtzung erforderlich.
Hinweis: Ich weiĂ, dass es gibt. Es ist wirklich cool, hat ĂŒber tausend Sterne, der Autor ist in der Community bekannt und so weiter. Wenn dir die Möglichkeiten, die dieses Paket zur Erstellung und Wartung eines Clusters bietet, ausreichen â ich freue mich fĂŒr dich. Leider brauche ich viel mehr. Ich möchte die Konfiguration im Detail steuern und kein auĂenstehender Zuschauer im Theater der Cluster-Neugestaltung sein.
Anforderungen
Was ich persönlich brauchte, war eine Bibliothek, die die Verwaltung des Clusters ĂŒbernimmt und folgende Eigenschaften hat:
- transparente Funktion sowohl mit einer fest codierten Liste von Knoten als auch mit dynamischer Entdeckung ĂŒber Dienste erlang;
- voll funktionsfĂ€higer RĂŒckruf bei jeder Ănderung der Topologie (Knoten dorthin, Knoten dorthin, NetzwerkinstabilitĂ€ten, Splits);
- transparente Schnittstelle zum Starten eines Clusters mit langen und kurzen Namen, wie bei
:nonode@nohost; - Out-of-the-Box Docker-UnterstĂŒtzung, ohne Infrastrukturcode schreiben zu mĂŒssen.
Das bedeutet, dass ich, nachdem ich die Anwendung lokal in :nonode@nohost, oder in einer kĂŒnstlich verteilten Umgebung durch , einfach ausfĂŒhren möchte docker-compose up --scale my_app=3 und sehen möchte, wie es drei Instanzen in Docker ohne Ănderungen am Code ausfĂŒhrt. Ich möchte auch, dass abhĂ€ngige Anwendungen, wie zum Beispiel mnesia â wenn sich die Topologie Ă€ndert, das Cluster hinter den Kulissen live neu konfiguriert wird, ohne dass ein zusĂ€tzlicher Schubs von der Anwendung notwendig ist.
Cloister wurde nicht als Alleskönner-Bibliothek gedacht: von ClusterunterstĂŒtzung bis zur Kaffeezubereitung. Es ist keine Allheilmittel, die versucht, alle möglichen FĂ€lle abzudecken, oder eine akademisch vollstĂ€ndige Lösung im Sinne, den Theoretiker von CS in diesen Begriff einlegt. Diese Bibliothek hat einen sehr klaren Zweck, aber sie soll ihre nicht allzu groĂe Aufgabenmenge perfekt erfĂŒllen. Dieser Zweck besteht darin, vollstĂ€ndige Transparenz zwischen der lokalen Entwicklungsumgebung und einer verteilten elastischen Umgebung mit feindlichen Containern zu gewĂ€hrleisten.
Der gewÀhlte Ansatz
Cloister soll als Anwendung ausgefĂŒhrt werden, obwohl erfahrene Benutzer die Möglichkeit haben, den Cluster manuell zu bauen und zu verwalten, indem sie direkt Cloister.Manager im Baum der Aufseher der Zielanwendung starten.
Bei der AusfĂŒhrung als Anwendung verlĂ€sst sich die Bibliothek auf config, aus dem sie die folgenden Hauptwerte liest:
config :cloister,
otp_app: :my_app,
sentry: :"cloister.local", # oder ~w|n1@foo n2@bar|a
consensus: 3, # Anzahl der Nodes, die berĂŒcksichtigt werden sollen
# das Cluster ist aktiv
listener: MyApp.Listener # Listener, der aufgerufen wird, wenn
# sich der Ring geĂ€ndert hatDie oben genannten Parameter bedeuten wörtlich folgendes: Cloister wird fĂŒr die OTP-Anwendung verwendet :my_app, nutzt Erlang-Dienstentdeckung zum Verbinden von Knoten, mindestens drei, und MyApp.Listener Modul (implementiert ) ist konfiguriert, um Benachrichtigungen ĂŒber Ănderungen der Topologie zu empfangen. Eine detaillierte Beschreibung der vollstĂ€ndigen Konfiguration finden Sie in .
Mit dieser Konfiguration wird die Anwendung Cloister schrittweise gestartet , wobei der Startprozess der Hauptanwendung bis zum Erreichen eines Konsenses (drei Knoten sind verbunden und verknĂŒpft, wie im obigen Beispiel) verschoben wird. Dies gibt der Hauptanwendung die Möglichkeit zu vermuten, dass der Cluster bereits verfĂŒgbar ist, wenn sie gestartet wird. Bei jeder Ănderung der Topologie (es wird viele geben, da die Knoten nicht vollstĂ€ndig synchron gestartet werden) wird ein Handler aufgerufen. . In den meisten FĂ€llen fĂŒhren wir eine Aktion aus, sobald wir eine Statusmeldung erhalten. %Cloister.Monitor{status: :up}, was bedeutet: âHallo, der Cluster ist zusammengestellt.â
In den meisten FĂ€llen ist die Einstellung consensus: 3 optimal, denn selbst wenn wir erwarten, dass sich mehr Knoten anschlieĂen, wird der Callback durchlaufen. status: :rehashing â status: :up fĂŒr jeden neu hinzugefĂŒgten oder entfernten Knoten.
Beim Start im Entwicklungsmodus genĂŒgt es, einfach consensus: 1 und Cloister festzulegen, und es wird freudig die Wartezeit auf die Clusterbildung ĂŒberspringen und sehen, :nonode@nohost, oder :node@host, oder :node@host.domain â abhĂ€ngig davon, wie der Knoten konfiguriert wurde (:none | :shortnames | :longnames).
Verwaltung verteilter Anwendungen
Verteilte Anwendungen sind in der Regel nicht isoliert und beinhalten oft ebenfalls verteilte AbhĂ€ngigkeiten wie mnesia. Es ist einfach, ihre Rekonfiguration aus demselben Callback on_state_change/2zu verwalten. Hier ist beispielsweise eine ausfĂŒhrliche Beschreibung, wie man mnesia zur Laufzeit in .
Ă€ndern kann. Der Hauptvorteil der Nutzung Cloister besteht darin, dass es alle notwendigen Operationen zur Neuordnung des Clusters nach einer Ănderung der Topologie durchfĂŒhrt. unter der HaubeDie Anwendung wird einfach in einer bereits vorbereiteten verteilten Umgebung gestartet, mit allen verbundenen Knoten, unabhĂ€ngig davon, ob wir die IP-Adressen und damit die Knotennamen im Voraus kennen oder ob sie dynamisch zugewiesen/Ă€ndern wurden. Das erfordert keine speziellen Docker-Konfigurationseinstellungen, und aus Sicht des Anwendungsentwicklers gibt es keinen Unterschied zwischen dem Start in einer verteilten Umgebung oder lokal auf :nonode@nohost. Weitere Informationen dazu finden Sie in .
Trotz der Tatsache, dass eine komplexe Handhabung von TopologieĂ€nderungen durch eine eigene Implementierung möglich ist, können immer GrenzfĂ€lle auftreten, in denen diese BibliotheksbeschrĂ€nkungen und ein voreingenommener Ansatz zur Konfiguration zum Stolperstein bei der Implementierung werden. Das ist in Ordnung, nehmen Sie einfach das oben Genannte. MyApp.Listener. libcluster, die universeller ist, oder sogar den Low-Level-Cluster selbst zu bearbeiten. Ziel dieser Bibliothek ist es nicht, alle möglichen Szenarien abzudecken, sondern das gĂ€ngigste Szenario ohne unnötige Schmerzen und umstĂ€ndliches Kopieren und EinfĂŒgen zu nutzen.
Hinweis: An dieser Stelle war im Original die Phrase âHappy clustering!â, und Yandex, das ich benutze (ich kann ja nicht selbst in WörterbĂŒchern suchen), hat mir die Option âS glĂŒcklichen Clustering!â vorgeschlagen. Ein besserer Ăbersetzung wĂ€re wohl gerade im Hinblick auf die aktuelle geopolitische Situation unmöglich.
Quelle: habr.com
