2016-04-21 1 views
0

J'ai une question abstraite.Service singleton distribué pour le basculement

J'ai besoin d'un service avec tolérance aux pannes. Le service ne peut être exécuté que sur un nœud à la fois. C'est la clé.

Avec deux noeuds connectés: A et B.

  • Si A est en cours d'exécution du service, B doit attendre.
  • Si A est désactivé, B doit le détecter et démarrer le service.
  • Si A est réactivé, A doit attendre et ne pas exécuter le service.
  • etc. (Si B est désactivé, A commence, si A est désactivé B commence)

Je pense sur le protocole battement de coeur pour la synchronisation l'état des noeuds et détecter les délais d'attente, mais il y a beaucoup de conditions de course.

Je peux ajouter un troisième noeud avec un verrou global, mais je ne suis pas sûr de la façon de le faire.

Quelqu'un sait-il un algorithme bien connu pour le faire? Ou mieux Y at-il un logiciel open source qui me permet de contrôler ce genre de choses?

Merci

+0

Quelles sont les ressources exclusives? Est-ce une entrée ou une sortie qui doit être exclusive? Pourquoi ne pas courir parallèlement de manière redondante? – stefan

+0

Il existe des dizaines d'exemples de ressources exclusives: un service externe qui ne prend en charge qu'une seule connexion par client, un service de tickets, un service qui gère une partie de l'IoT (matériel) ... – Garet

Répondre

1

Si vous pouvez fournir une sorte de mémoire partagée entre les nœuds, puis il y a l'algorithme classique qui résout ce problème, appelé Peterson's algorithm.

Il est basé sur deux variables supplémentaires, appelées flag et turn. Turn est une variable entière dont la valeur représente un index de noeud autorisé à être actif pour le moment. En d'autres termes, turn=1 indique que le nœud n ° 1 a le droit d'être actif et que l'autre nœud devrait attendre. En d'autres termes, c'est à son tour d'être actif - c'est de là que vient son nom.

Flag est un tableau booléen où flag[i] indique que le i-ème nœud se déclare prêt à l'emploi. Dans votre configuration, flag[i]=false signifie que le i-ème nœud est en panne. La partie clé de l'algorithme est qu'un nœud qui est prêt pour le service (c'est-à-dire) doit attendre jusqu'à ce qu'il obtienne turn.

L'algorithme est à l'origine développé pour résoudre un problème d'exécution critical section sans conflit. Cependant, dans votre cas, une section critique exécute simplement le service. Vous devez juste vous assurer qu'avant la désactivation du nième nœud, le paramètre flag[i] est défini sur false. Ceci est certainement une partie délicate car si un nœud se bloque, il ne peut évidemment pas définir de valeur. J'irais ici avec une sorte de battement de coeur. En ce qui concerne le logiciel open source qui résout des problèmes similaires, essayez de rechercher le "basculement de cluster". Lire à propos de Google's Paxos et Google FileSystem. Il y a beaucoup de solutions, mais si vous voulez implémenter quelque chose par vous-même, j'essaierais l'algorithme de Peterson. Dites-nous un peu plus ce que font vos services.