Cloister → semplice gestione di cluster OTP

Quasi ogni applicazione cummerciale riescita prima o dopu entra in una fase induve a scala horizontale hè necessaria. In parechji casi, pudete solu inizià una nova istanza è riduce a media di carica. Ma ci sò ancu casi menu triviali induve avemu bisognu di assicurà chì i diversi nodi cunnosci l'un l'altru è distribuisce cù cura a carica di travagliu.

Cloister → semplice gestione di cluster OTP

Hè risultatu cusì furtunatu chì Erlang, chì avemu sceltu per a so sintassi piacevule è l'hype intornu à ellu, hà una prima classa supportu per i sistemi distribuiti. In teoria, questu sona cumplettamente triviale:

U messagiu chì passa trà prucessi in diversi nodi, è ancu trà ligami è monitori, hè trasparente [...]

In pratica, tuttu hè un pocu più cumplicatu. Distribuitu Erlang hè statu sviluppatu quandu "container" significava una grande scatula di ferru per u trasportu, è "docker" era solu un sinonimu di longshoreman. IN IP4 ci era assai indirizzi unccupied, rupture di rete sò generalmente causati da i surci chì masticanu à traversu u cable, è a media di uptime di u sistema di produzzione hè stata misurata in decennii.

Avà simu tutti incredibbilmente autosufficienti, imballati è in esecuzione distribuiti Erlang in un ambiente induve l'indirizzi IP dinamichi sò distribuiti nantu à u principiu di una grande casualità, è i nodi ponu appare è sparisce à u capriccio di u taccu di manca di u scheduler. Per evitari pile di codice boilerplate in ogni prughjettu chì eseguisce un distribuitu Erlang, per cumbatte l'ambienti ostili, l'aiutu hè necessariu.

Vita: Sò cuscente chì ci hè libcluster. Hè veramente cool, hà più di mille stelle, l'autore hè famosu in a cumunità, è tuttu ciò. Se i metudi offerti da stu pacchettu per creà è mantene un cluster sò abbastanza per voi, sò felice per voi. Sfurtunatamente, aghju bisognu di più. Vogliu cuntrullà a cunfigurazione in dettagliu è micca esse un spettatore esterno in u teatru di riurganizazione di cluster.

esigenze

Ciò chì personalmente avia bisognu era una biblioteca chì ripiglià a gestione di u cluster è avè e seguenti proprietà:

  • travagliu trasparente cù una lista di nodi codificata dura è una scuperta dinamica attraversu i servizii Erlang;
  • callback cumplettamente funzionale per ogni cambiamentu di topologia (node ​​quì, node quì, inestabilità di a rete, splits);
  • interfaccia trasparente per lancià un cluster cù nomi longhi è brevi, cum'è cù :nonode@nohost;
  • Supportu Docker fora di a scatula, senza avè da scrive codice di infrastruttura.

L'ultimu significa chì dopu avè pruvatu l'applicazione in u locu :nonode@nohost, o in un ambiente distribuitu artificialmente utilizendu test_cluster_task, Vogliu solu curriri docker-compose up --scale my_app=3 è vede cumu eseguisce trè istanze in docker senza cambiamenti di codice. Vogliu ancu appiicazioni dipendenti cum'è mnesia - quandu a topulugia cambia, daretu à e scene ricustruiscenu u cluster in diretta senza alcun calciu supplementu da l'applicazione.

U Claustru ùn era micca pensatu à esse una biblioteca capace di tuttu da sustene un cluster à fà u caffè. Ùn hè micca una bala d'argentu chì hà u scopu di copre tutti i casi pussibuli, o esse una suluzione accademica cumpleta in u sensu chì i teoristi da CS mette in stu termini. Questa biblioteca hè pensata per serve un scopu assai chjaru, ma fà u so travagliu micca troppu grande perfettamente. Stu scopu serà di furnisce una trasparenza cumpleta trà l'ambiente di sviluppu lucale è un ambiente elasticu distribuitu pienu di cuntenituri ostili.

Approcciu sceltu

U Claustru hè destinatu à esse eseguitu cum'è una applicazione, anche se l'utilizatori avanzati ponu travaglià cù l'assemblea è u mantenimentu di u cluster manualmente eseguendu direttamente. Cloister.Manager in l'arburu supervisore di l'applicazione di destinazione.

Quandu eseguite cum'è una applicazione, a biblioteca si basa config, da quale leghje i seguenti valori basi:

config :cloister,
  otp_app: :my_app,
  sentry: :"cloister.local", # or ~w|n1@foo n2@bar|a
  consensus: 3,              # number of nodes to consider
                             #    the cluster is up
  listener: MyApp.Listener   # listener to be called when
                             #    the ring has changed

I paràmetri sopra significa literalmente i seguenti: U Claustru utilizatu per l'applicazione OTP :my_app, usa scuperta di serviziu erlang per cunnette i nodi, almenu trè, è MyApp.Listener modulu (implementazione @behaviour Cloister.Listener) hè cunfiguratu per riceve notificazioni nantu à i cambiamenti di topologia. Una descrizzione dettagliata di a cunfigurazione cumpleta pò esse truvata in ducumentazione.

Cù sta cunfigurazione, l'applicazione U Claustru sarà lanciari in tappe, ritardà u prucessu di inizià l'applicazione principale finu à chì u cunsensu hè righjuntu (trè nodi sò cunnessi è cunnessi, cum'è in l'esempiu supra.) Questu dà l'applicazione principale l'uppurtunità di assume chì quandu principia, u cluster hè digià dispunibule. Ogni volta chì a topologia cambia (ci saranu assai, perchè i nodi ùn cumincianu micca in modu sincronu), u gestore serà chjamatu. MyApp.Listener.on_state_change/2. A maiò parte di u tempu facemu una azzione quandu avemu ricevutu un missaghju di statutu %Cloister.Monitor{status: :up}, chì significa: "Hello, u cluster hè assemblatu".

In a maiò parte di i casi, a stallazione consensus: 3 hè ottimale perchè ancu s'è aspittemu più nodi per cunnette, u callback passerà status: :rehashingstatus: :up nant'à ogni nodu novu aghjuntu o eliminatu.

Quandu principia in u modu di sviluppu, basta à stabilisce consensus: 1 и U Claustru saltarà felice l'attesa per l'assemblea di u cluster quandu vede :nonode@nohosto :node@hosto :[email protected] - secondu cumu u node hè statu cunfiguratu (:none | :shortnames | :longnames).

Gestione di l'applicazioni distribuite

L'applicazioni distribuite micca in un vacuum includenu generalmente dipendenze distribuite, cum'è mnesia. Hè faciule per noi di trattà a so ricunfigurazione da a stessa callback on_state_change/2. Quì, per esempiu, hè una descrizzione dettagliata di cumu cunfigurà mnesia nantu à a mosca in ducumentazione U Claustru.

U vantaghju principali di usu U Claustru hè chì eseguisce tutte l'operazioni necessarie per ricustruisce u cluster dopu un cambiamentu di topulugia sottu à u cappucciu. L'appiecazione simpricimenti eseguisce in un ambiente distribuitu digià preparatu, cù tutti i nodi cunnessi, a priscinniri di s'ellu cunnosci l'indirizzi IP è dunque i nomi di i nodi in anticipu, o sò stati assignati / cambiati dinamicamente. Questu ùn esige assolutamente micca paràmetri di cunfigurazione speciale di docker è da u puntu di vista di u sviluppatore di l'applicazione, ùn ci hè micca differenza trà eseguisce in un ambiente distribuitu o in un locu locale. :nonode@nohost. Pudete leghje più nantu à questu in ducumentazione.

Ancu se a gestione cumplessa di i cambiamenti di topologia hè pussibule attraversu una implementazione persunalizata MyApp.Listener, Ci ponu sempre esse casi di punta induve queste limitazioni di a biblioteca è i preghjudizii di cunfigurazione pruvucanu à esse i basi di l'implementazione. Va bè, basta piglià u sopra libcluster, chì hè più generale, o ancu manighjà u cluster di bassu livellu stessu. L'ughjettu di sta libreria di codice ùn hè micca di copre ogni scenariu pussibule, ma di utilizà u scenariu più cumuni senza dolore innecessariu è còmpiu-incollà ingombrante.

Nutate bè: à questu puntu in l'uriginale ci era a frasa "Happy clustering!", è Yandex, cù quale aghju traduttu (ùn aghju micca à passà per i dizziunarii stessu), m'hà offertu l'opzione "Happy clustering!" Hè forse impussibile di imaginà una traduzzione megliu, soprattuttu in vista di a situazione geopulitica attuale.

Source: www.habr.com

Add a comment