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.
Hè risultatu cusì furtunatu chì Erlang, chì avemu sceltu per a so sintassi piacevule è l'hype intornu à ellu, hà una prima classa
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
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
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
Cù sta cunfigurazione, l'applicazione U Claustru sarà MyApp.Listener.on_state_change/2
%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: :rehashing
→ status: :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@nohost
o :node@host
o :[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
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
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