2009-06-11 8 views
6

Mi aplicación se ejecuta en un clúster de erlang, generalmente con dos o más nodos. Hay un monitoreo activo entre los nodos (usando erlang: nodo_de_monitor) que funciona bien: puedo detectar y reaccionar al hecho de que un nodo que estaba arriba ahora está inactivo.Cómo supervisar un nodo de erlang remoto que estaba inactivo y se está reiniciando

Pero, ¿cómo puedo saber que el nodo se ha reiniciado y está de nuevo en funcionamiento? Por supuesto, puedo hacer ping periódicamente en el nodo hasta que vuelva a funcionar, pero ¿hay alguna forma mejor que me haya pasado por alto? ¿Los grupos de procesos son una mejor forma de lograr esto?

(Editado para añadir)

Creo que la respuesta para realizar una técnica como la elección de un supervisor es el proceso de pensamiento que me estaba perdiendo. Analizaré eso y marcaré esta pregunta como hecha ...

Respuesta

2

Pero, ¿cómo puedo saber que el nodo se ha reiniciado y ha vuelto a funcionar? Por supuesto, puedo hacer ping periódicamente en el nodo hasta que vuelva a funcionar, pero ¿hay alguna forma mejor que me haya pasado por alto? ¿Los grupos de procesos son una mejor forma de lograr esto?

Sólo una idea, pero ¿qué hay de tener el nodo rearranque explícitamente informar al nodo de supervisión/monitorización que ha terminado de volver a arrancar y que esté disponible de nuevo?

Puede utilizar un "mensaje de latido" recurrente para este propósito o crear un mensaje personalizado específicamente destinado a ser enviado una vez después de la inicialización exitosa. Algo a lo largo de las líneas de:

start(SupervisorPID) -> 
    SuperVisorPID ! {hello, MyPID}; 
    mainloop(). 
+0

Sí, esto es realmente lo que hace el nodo cuando se reinicia: en realidad no hay ningún nodo supervisor per se, son efectivamente "amigos" y el nodo se comunica con sus amigos para determinar el estado del sistema (y quizás copiando ese estado) cuando se inicia. –

+0

Y, para que quede claro, cada nodo es igual, ¿qué haces si eres el primer nodo activo? No puedes convertir rpc a ningún nodo, y no tienes (por supuesto) ningún PID para enviar mensajes. PERO podría simplemente esperar y esperar que cualquier otro nodo se inicie y se contacte con él ... –

+2

Parece que sus nodos están básicamente descentralizados sin ninguna forma de nodo central? Supongo que normalmente querrá tener al menos un supervisor o al menos algunos para el nodo 'maestro'. Todos los nodos pueden enviar sus informes/mensajes, es decir, alguna forma de "registro de nodos". Tal vez necesites proporcionar más información, podría imaginar que uno también podría pensar en tener por convención que cada nodo se convierta en maestro si ya no hay un maestro. Eso satisfaría el requisito de igualdad. – none

1

Se puede crear un global_group continuación, utilizar el global_group: monitor_nodes (true) para monitorear los otros nodos dentro de un mismo grupo global. El proceso que está monitoreando los nodos recibirá mensajes de nodo y de nodo.

Cuestiones relacionadas