Claustro -> gestión de clúster OTP fácil

Casi todas las aplicaciones comerciales exitosas, tarde o temprano, entran en una fase cuando se requiere escala horizontal. En muchos casos, simplemente puede iniciar una nueva instancia y reducir la carga promedio. Pero hay casos menos triviales en los que debemos asegurarnos de que los diferentes nodos se conozcan y distribuyan con precisión la carga de trabajo.


Claustro


Dio la casualidad de que erlang , que elegimos por su buena sintaxis y exageración, tiene soporte de primera clase para sistemas distribuidos . En teoría, esto suena generalmente trivial:


La mensajería entre procesos en diferentes nodos, así como entre enlaces y monitores es transparente [...]

En la práctica, las cosas son un poco más complicadas. Erlang distribuido se desarrolló cuando "contenedor" significaba una caja de hierro tan grande para el transporte, y "acoplador" era simplemente sinónimo de un cargador de puertos. En IP4 había muchas direcciones desocupadas, en las brechas de red: las ratas que se roían generalmente eran las culpables, y el tiempo de actividad promedio de un sistema de producción se midió durante décadas.


, , erlang , IP- , . , erlang, , .


: libcluster. , ,  — , .  —  . , , . .



, , :


  • , erlang;
  • ( , , , );
  • , :nonode@nohost;
  • , .

, , :nonode@nohost, - test_cluster_task, docker-compose up --scale my_app=3 , - . , , mnesia — , - .


Cloister , : . , , , CS . , . , .



Cloister , (assembly and maintainance) , Cloister.Manager .


, config, :


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

: Cloister OTP :my_app, erlang service discovery , , MyApp.Listener ( @behaviour Cloister.Listener) . .


, Cloister , ( , .) , , . ( , ), MyApp.Listener.on_state_change/2. , %Cloister.Monitor{status: :up}, : «, ».


consensus: 3 , , , status: :rehashingstatus: :up .


, consensus: 1 Cloister , :nonode@nohost, :node@host, :node@host.domain — , (:none | :shortnames | :longnames).



, mnesia. on_state_change/2. , , , mnesia Cloister.


Cloister , . , , , IP- , , , /. , :nonode@nohost. .


, MyApp.Listener, , . , libcluster, , . , , , -.




Nota: en este punto en el original estaba la frase "¡Feliz agrupación!", Y Yandex, que traduzco (para no escalar los diccionarios yo mismo), me ofreció la opción "¡Feliz agrupación!" Quizás la mejor traducción, especialmente a la luz de la situación geopolítica actual, es imposible de imaginar.


All Articles