2009-06-11 3 views
6

Mon application s'exécute dans un cluster erlang - avec généralement deux nœuds ou plus. Il y a une surveillance active entre les nœuds (en utilisant erlang: monitor_node) qui fonctionne bien - je peux détecter et réagir au fait qu'un nœud qui était en haut est maintenant en panne.Comment surveiller un nœud erlang distant qui était en panne et qui redémarre

Mais comment puis-je savoir que le noeud a redémarré et est de nouveau en activité? Bien sûr, je peux pinguer périodiquement le nœud jusqu'à ce qu'il soit de nouveau disponible, mais y a-t-il un meilleur moyen que j'ai manqué? Les groupes de processus sont-ils un meilleur moyen d'y parvenir?

(Sous la direction d'ajouter)

Je pense que la réponse à exécuter une technique comme l'élection d'un superviseur est le processus de pensée que je manquais. Je vais examiner cela et marquer cette question comme terminée ....

Répondre

2

Mais comment puis-je savoir que le nœud a redémarré et est de nouveau en activité? Bien sûr, je peux pinguer périodiquement le nœud jusqu'à ce qu'il soit de nouveau disponible, mais y a-t-il un meilleur moyen que j'ai manqué? Les groupes de processus sont-ils un meilleur moyen d'y parvenir?

Juste une idée, mais que diriez-vous d'avoir le nœud de remise en route seexplicitement informer le superviseur noeud/surveillance qu'il a fini de redémarrer et qu'il est à nouveau disponible?

Vous pouvez utiliser un "message de pulsation" récurrent à cette fin, ou proposer un message personnalisé destiné spécifiquement à être envoyé une fois après une initialisation réussie. Quelque chose le long des lignes de:

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

Oui - c'est effectivement ce que le noeud fait lorsqu'il redémarre - il n'y a pas réellement de nœud superviseur en soi, ils sont effectivement des «copains» et le nœud tend la main à ses copains pour déterminer l'état du système (et peut-être copier cet état) quand il démarre. –

+0

Et pour être clair - chaque nœud est égal, alors que faites-vous si vous êtes le premier nœud - vous ne pouvez pas rpc à un nœud, et vous n'avez (bien sûr) aucun PID pour envoyer des messages. MAIS il pourrait simplement traîner et attendre que d'autres nœuds démarrent et le contactent ... –

+2

Il semblerait que vos nœuds soient fondamentalement décentralisés sans aucune forme de nœud central? Je suppose que normalement, vous voudrez avoir au moins un superviseur ou au moins une partie pour le noeud 'maître'. Tous les nœuds peuvent envoyer leurs rapports/messages, c'est-à-dire une forme de "registre de nœuds". Peut-être que vous avez besoin de fournir plus d'informations, je pourrais imaginer qu'on pourrait aussi penser à avoir par convention que chaque nœud devienne un maître s'il n'y a pas de maître déjà. Cela satisferait à l'exigence d'égalité. – none

1

Vous pouvez créer un global_group puis utilisez le global_group: monitor_nodes (true) pour surveiller les autres noeuds du même groupe mondial. Le processus qui surveille les nœuds recevra des messages d'acquittement.

Questions connexes