erlang distributed failover

¿Cómo iniciar la aplicación Erlang distribuida sin iniciar dependencias en cada nodo?



distributed failover (1)

Traté de ejecutar una aplicación simple de forma distribuida para probar las funciones de recuperación de fallas pero fallé.

Lo que quiero:

La aplicación es myapp_api con una API de descanso, tiene la aplicación myapp como una dependencia. Quiero iniciar myapp_api en 3 nodos, quiero que toda la aplicación ( myapp_api + myapp ) funcione solo en un nodo al mismo tiempo.

Qué está mal:

La aplicación principal ( myapp_api ) funciona como se esperaba: solo en un nodo con failover y takeover. Pero por alguna razón dependía que myapp siempre comenzara en cada nodo. Quiero que funcione solo en un nodo al mismo tiempo.

Lo que hago:

Mi configuración para el primer nodo como ejemplo.

[ {kernel, [{distributed, [{myapp_api, 1000, [''n1@myhost'', {''n2@myhost'', ''n3@myhost''}]}]}, {sync_nodes_optional, [''n2@myhost'', ''n3@myhost'']}, {sync_nodes_timeout, 5000} ]} ].

erl -sname nI -config nI.config -pa apps/*/ebin deps/*/ebin -s myapp_api en cada nodo.


Ahora esto se vuelve un poco confuso porque dices:

Quiero iniciar myapp_api en 3 nodos, quiero que toda la aplicación (myapp_api + myapp) funcione solo en un nodo al mismo tiempo.

y agregas:

La aplicación principal (myapp_api) funciona como se esperaba: solo en un nodo con failover y takeover. Pero por alguna razón dependía que myapp siempre comenzara en cada nodo.

En el primer párrafo dices que myapp_api debería ejecutarse en todas partes, en la segunda cita dices que funciona según lo previsto arrancando en un nodo a la vez.

Asumiré aquí que quiere que toda la configuración sea una conmutación por error, no solo la aplicación de nivel superior y me confunde en el primer párrafo.

El archivo de configuración que usas muestra lo que sucede:

[{kernel, [{distributed, [{myapp_api, 1000, [''n1@myhost'', {''n2@myhost'', ''n3@myhost''}]}]}, {sync_nodes_optional, [''n2@myhost'', ''n3@myhost'']}, {sync_nodes_timeout, 5000} ]}].

Lo importante es que myapp_api tiene myapp_api los nodos [''n1@myhost'', {''n2@myhost'', ''n3@myhost''}] . Esta orden significa que se ejecuta en n1@myhost con la máxima prioridad, y luego en los otros nodos con la misma prioridad si hay una conmutación por error.

El problema es que ninguna de las dependencias se distribuye de la misma manera y, por lo tanto, se puede esperar que se ejecute en todas partes.

Solo deberías expandir ese archivo de configuración para que funcione. Aquí lo hice y lo reinventé para mostrar mejor su estructura:

[{kernel, [{distributed, [ {myapp_api, 1000, [''n1@myhost'', {''n2@myhost'', ''n3@myhost''}]}, {myapp, 1000, [''n1@myhost'', {''n2@myhost'', ''n3@myhost''}]}, ]}, {sync_nodes_optional, [''n2@myhost'', ''n3@myhost'']}, {sync_nodes_timeout, 5000} ]}].

No lo he probado directamente, pero estoy bastante seguro de que esto funcionará.

Si lo que deseaba era que myapp_api estuviera en todas partes excepto que myapp ejecutara en un solo lugar, podría usar el registro global , darle un nombre al proceso público de myapp , obtener myapp_api para llamar a estos. myapp_api luego podría enrutar el tráfico a cualquier lugar donde myapp esté cuando sea compatible con la siguiente configuración:

[{kernel, [{distributed, [ {myapp, 1000, [''n1@myhost'', {''n2@myhost'', ''n3@myhost''}]}, ]}, {sync_nodes_optional, [''n2@myhost'', ''n3@myhost'']}, {sync_nodes_timeout, 5000} ]}].

(Vea cómo myapp es la única aplicación que obtiene un perfil de distribución; otras aplicaciones se ejecutarán en todos los nodos)