¿Cómo funciona la detección de nodos terminados en Erlang? ¿Cómo influye net_ticktime en el control de la vida del nodo en Erlang?
monitoring distributed (1)
Establecí el valor de net_ticktime en 600 segundos.
net_kernel:set_net_ticktime(600)
En la documentación de Erlang para net_ticktime = TickTime:
Especifica el tiempo tic net_kernel. TickTime se da en segundos. Una vez cada TickTime / 4 segundos, todos los nodos conectados están marcados (si se ha escrito algo más en un nodo) y si no se ha recibido nada de otro nodo dentro de los últimos cuatro (4) tics veces ese nodo se considera inactivo. Esto asegura que los nodos que no responden, por razones tales como errores de hardware, se consideran inactivos.
El tiempo T, en el que se detecta un nodo que no responde:
MinT < T < MaxT where:
MinT = TickTime - TickTime / 4
MaxT = TickTime + TickTime / 4
TickTime es por defecto 60 (segundos). Por lo tanto, 45 <T <75 segundos.
Nota: Normalmente, un nodo de terminación se detecta inmediatamente.
Mi problema: Mi TickTime es 600 (segundos). Por lo tanto, 450 (7.5 minutos) <T <750 segundos (12.5 minutos). Aunque, cuando establezco net_ticktime en todos los nodos distribuidos en Erlang para el valor 600 cuando falla algún nodo (por ejemplo, cuando cierro el shell de Erlang), los otros nodos reciben el mensaje inmediatamente y no según la definición de ticktime.
Sin embargo, se observa que normalmente se detecta un nodo de terminación de inmediato, pero no pude encontrar la explicación (ni en la documentación de Erlang, ni en el ebook Erlang u otras fuentes basadas en Erlang) de este principio de respuesta inmediata para la terminación de nodo en Erlang distribuido. ¿Los nodos en el entorno distribuido se activan periódicamente con intervalos más pequeños que net_ticktime
o el nodo de terminación envía algún tipo de mensaje a otros nodos antes de que finalice? Si envía un mensaje, ¿hay algún escenario en el que el nodo de terminación no pueda enviar este mensaje y se le debe hacer un ping para investigar su vivacidad?
También se señala en la documentación de Erlang que Distributed Erlang no es muy escalable para clústeres de más de 100 nodos, ya que cada nodo mantiene enlaces a todos los nodos del clúster. ¿Se ha modificado el algoritmo para investigar la vitalidad de los nodos (pinging, anunciar la terminación) con el aumento del tamaño del clúster?
Cuando dos nodos de Erlang se conectan, se establece una conexión TCP entre ellos. La falla que induce hará que el SO subyacente cierre la conexión, notificando de manera efectiva al otro nodo muy rápidamente.
El tic de la red se utiliza para detectar una conexión a un nodo distante que parece estar activo, pero que en realidad no está pasando el tráfico, como puede ocurrir cuando un evento de red aísla un nodo.
Si desea simular una falla que requeriría una marca para detectar, use un firewall para bloquear el tráfico en la conexión creada cuando los nodos primero hacen ping.