Previous Up Next

Chapter 11  Systèmes tolérants aux pannes

Peut on ``implémenter'' certaines fonctions sur une architecture distribuée donnée, même si des processeurs peuvent tomber en panne?

En fait, la réponse dépend assez finement de l'architecture, et des fonctions que l'on cherche à implémenter. On verra qu'une fonction aussi simple que le consensus ne peut pas être implémentée sur un système à mémoire partagée asynchrone (avec lecture et écriture atomique). Ceci est un résultat relativement récent [FLP82]. La plupart des autres résultats datent des années 90 pour les plus vieux.

11.1  Tâches de décision

Chaque problème que nous allons nous poser sera exprimé sous la forme suivante. Pour chaque processeur P0,...,Pn-1, on va se donner un ensemble de valeurs initiales possibles, pour le ou les registres locaux à ces processeurs, dans un domaine de valeurs K=IN ou IR etc. Ceci formera un sous-ensemble I de Kn. De façon similaire, on se donne un ensemble de valeurs finales possibles J dans Kn.

Enfin, on se donne une fonction, la fonction de décision d: I ® Ã( J) associant à chaque valeur initiale possible, l'ensemble des valeurs finales acceptables.

Prenons l'exemple classique du consensus (voir figure 11.1 et 11.2). Chaque processeur démarre avec une valeur locale, ici un entier. Ceux-ci doivent ensuite communiquer afin de se mettre tous d'accord sur une valeur. Cela veut dire que chacun doit terminer son exécution, en temps fini, soit en ayant planté, soit en ayant une valeur locale qui est une de celles qu'avait un des processeurs au début de l'exécution, et tous les autres processeurs ``vivants'' doivent avoir la même valeur locale. Aux figures 11.1 et 11.2 on a trois processus, l'un avec la valeur 5, l'autre avec 7 et enfin le troisième avec 11. Tous se mettent d'accord sur la valeur 7. Le consensus est un problème essentiel dans les systèmes distribués tolérants aux pannes. Imaginez en effet que l'on ait plusieurs unités de calcul qui doivent contrôler le même appareillage critique, du fait que l'on ne peut pas se permettre qu'une panne vienne arrêter son bon fonctionnement. Il faut néanmoins assurer une certaine cohérence des décisions faites par ces unités redondantes, et ceci peut être fait, par exemple, en faisant en sorte que tous les processus encore vivants se mettent d'accord sur une valeur de commande, que l'un au moins d'entre eux avait calculé. Bien sûr ceci est une abstraction d'un problème en général bien plus complexe, mais la formulation du problème du consensus permet de bien comprendre la difficulté de contrôle d'un système distribué, en présence de pannes.


Figure 11.1: Le problème du consensus (sans panne).




Figure 11.2: Le problème du consensus (avec panne).


Le problème du consensus se traduit formellement de la façon suivante:

11.2  ``Géométrisation'' du problème

On va voir que l'on peut donner aux ensembles de valeurs d'entrée et de sortie une structure géométrique, généralisant celle de graphe, qui s'appelle un ensemble simplicial. Selon le type d'architecture, toutes les fonctions ne pourront pas être programmées, à cause de contraintes géométriques sur les fonctions de décision. Ceci est en fait très similaire à des résultats classiques de géométrie, comme le théorème du point fixe de Brouwer.

11.2.1  Espaces simpliciaux d'états

On va représenter les états des processeurs, à un instant donné de l'exécution de leur protocole d'échange de données, de la façon suivante. On associera un point dans un espace euclidien de dimension suffisante, à toute valeur locale que l'on trouvera sur un processeur donné. Par exemple, l'unique point de la figure 11.3 représente l'état du processeur P1, dans lequel l'entier local vaut 7.

L'état commun à deux processeurs, à un instant donné, sera représenté par l'arc reliant les états locaux de chacun des deux processeurs, comme cela est montré par exemple à la figure 11.4. Un ensemble d'états de deux processeurs sera représenté comme à la figure 11.5: on a ici quatre états de la paire de processeurs P0, P1, un dans lequel on a la valeur 0 sur P0 et 0 sur P1, un autre où P0 a la valeur 0 et P1 a la valeur 1, un troisième où P0 a la valeur 1 et P1 la valeur 0, et enfin un dernier où P0 a la valeur 1 et P1 la valeur 1. Ce sont en fait les quatre états initiaux possibles quand on a deux processeurs qui doivent résoudre le ``consensus binaire'', c'est-à-dire le consensus dans le cas où les valeurs locales sont constituées d'un seul bit. On remarquera que ce faisant, on a représenté les états initiaux par un graphe. C'est le cas encore à la figure 11.6, qui décrit les deux états finaux possibles du consensus binaire, ou à la figure 11.7 qui décrit les trois états finaux possibles du ``pseudo-consensus'' binaire. Dans le cas du pseudo-consensus, on s'autorise un seul des deux états possibles ou les deux processeurs n'ont pas la même valeur finale, mais pas l'autre.


Figure 11.3: Un état local.




Figure 11.4: Un état composé de deux états locaux.




Figure 11.5: Etats initiaux pour le consensus binaire à deux processus.




Figure 11.6: Etats finaux pour le consensus binaire à deux processus.




Figure 11.7: Etats finaux pour le pseudo-consensus binaire.


La généralisation de cette représentation des états des processeurs, sous forme de graphe, est très simple. L'état global de trois processus sera représenté par l'enveloppe convexe des trois points qui sont les états locaux de chacun des trois processus, comme à la figure 11.8. Pour n processus en général, l'état global sera représenté par l'enveloppe convexe de n points distincts, ce que l'on appelle un n-simplexe: pour n=3 c'est un triangle, pour n=4 c'est un tétraèdre etc.


Figure 11.8: Etat global de trois processus.


De même que dans le cas n=2, certaines faces d'un n-simplexe, qui sont des m-simplexes, c'est-à-dire qui représentent les états locaux d'un sous-groupe de m processeurs, peuvent être communes à plusieurs n-simplexes, voir par exemple l'ensemble d'états représenté géométriquement à la figure 11.9. Ces collages de n-simplexes le long de leurs faces sont ce que l'on appelle en général un ensemble simplicial. Il y a une très riche théorie des ensembles simpliciaux, aussi bien combinatoire que topologique. En effet, on peut toujours associer un ensemble simplicial à tout espace topologique, et à ``déformation'' près (homotopie), la théorie des ensembles simpliciaux est équivalente à celle des espaces topologiques. On utilisera plus loin des intuitions topologiques quand on aura à décrire certains ensembles simpliciaux.


Figure 11.9: Ensemble d'états globaux.


Avec cette représentation des états, la spécification d'une tâche de décision devient une relation ``graphique'' comme à la figure 11.10, dans le cas du consensus binaire. Les états globaux en relations sont indiqués par les flèches en pointillé. Ainsi, le ``segment'' ((P,0),(Q,1)) peut être mis en relation par d avec ((P,0),(Q,0)) où ((P,1),(Q,1)).


Figure 11.10: Spécification du consensus.


11.2.2  Protocoles

Un protocole est un programme fini, commençant avec des valeurs d'entrée, faisant un nombre fixé d'étapes, et s'arrêtant sur une valeur de décision.

Le protocole à information totale est celui où la valeur locale est l'historique complet des communications. Le protocole ``générique'' est, en pseudo-code:
s = empty;
for (i=0; i<r; i++) {
  broadcast messages;
  s = s + messages received;
}
return delta(s);
A chaque tour de boucle correspond un ensemble d'états accessibles, représentés géométriquement, comme aux figures 11.12, 11.13, 11.14. Ceci dépend essentiellement du modèle de communication que l'on a, et sera développé dans deux cas aux sections 11.3 et 11.4.

11.2.3  Stratégie de preuve

Grâce à ces représentations géométriques, on va pouvoir déterminer si une tâche de décision peut être implémentée ou pas sur une architecture, et si oui, combien d'échanges de messages, ou d'écritures et lectures sont nécessaires pour résoudre le problème. Toutes ces questions vont être résolues un peu de la même manière.

Il faut d'abord remarquer que la fonction delta dans le protocole générique, est, mathématiquement parlant, une fonction d: P ® O allant du protocole à information totale au complexe de sortie. Cette fonction est en fait une fonction simpliciale (car elle est définie sur les points, puis étendue sur les enveloppes convexes), c'est-à-dire que ``topologiquement'' (entre les réalisations géométriques, c'est-à-dire les représentations graphiques que l'on en fait dans un espace Rn), ce sont les analogues de fonctions continues. Elle doit également respecter la relation de spécification du problème D, c'est-à-dire que pour tout x Î I, pour tout y Î P(I), x D (d(y)).

On va essayer de trouver une obstruction topologique à l'existence d'une telle fonction simpliciale (pour une étape k donnée). Cela est résumé à la figure 11.11.


Figure 11.11: Stratégie de preuve.


Sans vouloir définir de façon générale ce que l'on entend par obstruction topologique, il nous faut quand même expliciter les cas d'intérêt pour la suite de la formalisation. Quand on dit ici obstruction topologique, cela veut dire obstruction à l'existence d'une fonction continue f d'un espace topologique (typiquement ici ce sera la réalisation géométrique d'un espace simplicial d'états) X vers un espace topologique Y vérifiant certaines conditions. Par exemple, si on impose f(x0)=y0 et f(x1)=y1 avec x0 et x1 dans la même composante connexe et y0 et y1 qui ne sont pas dans la même composante connexe, alors un tel f continu ne peut pas exister (car l'image d'une composante connexe par une fonction continue est une composante connexe). De même, si f va de la n-sphère pleine (le n-disque) vers la n-sphère vide, de telle façon que f est l'identité sur la n-sphère vide, alors f ne peut pas être continue. Cela est lié à la notion de n-connexité, qui est une généralisation de la connexité. Déjà, la 1-connexité (ou simple connexité) est un invariant plus subtil que la connexité (ou 0-connexité), par exemple le cercle est connexe mais pas 1-connexe. Dit de façon brève, la n-sphère vide est (n-1)-connexe (la 0-connexité correspond à la connexité habituelle) et pas n-connexe, alors que la n-sphère pleine est n-connexe.

11.3  Cas du modèle synchrone à passage de messages

Prenons l'exemple d'une architecture dans laquelle les informations transitent par passage de message synchrone. A chaque étape, chaque processeur diffuse sa propre valeur aux autres, dans n'importe quel ordre. Chaque processeur reçoit les valeurs diffusées et calcule une nouvelle valeur locale.

On va également supposer que l'on ne se préoccupe que des pannes ``crash'' des processeurs, et non pas de pannes ``byzantines''. Une panne crash implique qu'un processeur n'envoie ni ne calcule plus rien, de façon brusque. Par contre, lors d'une panne byzantine (que nous n'étudierons pas ici), un processeur en panne continue à envoyer des données, mais qui n'ont éventuellement aucun sens. Ces plantages peuvent arriver à n'importe quel moment, même en cours du broadcast.

A chaque protocole, on va associer un ensemble simplicial, de la même façon qu'on l'a fait pour les entrées et les sorties, qui sera la représentation des états accessibles depuis les états initiaux, à une étape donnée. C'est ce que l'on appelle le complexe de protocole. De fait, cet ensemble simplicial est constitué de: En fait, il s'agit d'un opérateur, prenant un état d'un certain nombre de processeurs, et renvoyant les états accessibles après une étape. Il suffit ensuite d'itérer cet opérateur afin de trouver les états accessibles après un nombre d'étapes quelconque.


Figure 11.12: Complexe de protocole dans le cas synchrone (2 processus).


Dans le modèle synchrone, à l'étape 1 (voir la figure 11.12), soit aucun processus n'est mort, donc tout le monde a reçu le message des autres (d'où le segment central), soit un processus est mort, d'où les deux points comme états possibles.


Figure 11.13: Complexe de protocole dans le cas synchrone (3 processus).




Figure 11.14: Complexe de protocole dans le cas synchrone, deuxième étape (3 processus).




Figure 11.15: Collage de deux simplexes.


Figure 11.16: Construction du complexe de protocole par collage.


On va faire ici une application simple de cette stratégie de preuve. On considère le problème du consensus binaire entre trois processus, dans le modèle synchrone (et passage de messages) Le complexe d'entrée est composé de 8 triangles: (0,0,0), (0,0,1), (0,1,0), (0,1,1), (1,0,0), (1,0,1), (1,1,0) et (1,1,1). Il est en fait homéomorphe à une sphère (une seule composante connexe): les quatre premiers triangles déterminent l'hémisphère ``nord'' alors que les quatre derniers déterminent l'hémisphère ``sud''. Le complexe de sortie est composé de deux triangles: (0,0,0) et (1,1,1) (donc, deux composantes connexes).

Considérons une seule étape de communication, comme à la figure 11.17. Le simplexe (0,0,0) de l'hémisphère nord du complexe d'entrée se mappe sur la région du complexe de protocole entourée de pointillés, à la figure 11.17. Alors que le simplexe (1,1,1) se mappe sur la région du complexe de protocole entourée de pointillés, à la figure 11.18. Comme ces deux simplexes sont connexes dans le complexe d'entrée, il est facile de démontrer que, après une étape, leurs images dans le complexe de protocole sont aussi connexes. Or la fonction de décision d doit envoyer la première région sur le simplexe (0,0,0) du complexe de sortie, et la deuxième région sur le simplexe (1,1,1) du complexe de sortie. Comme on le voit à la figure 11.19, ceci est impossible car d doit être simpliciale (c'est à dire continue en un certain sens), donc doit préserver la connexité, et ces deux simplexes ne sont pas connexes dans le complexe de sortie! Cela prouve l'impossibilité dans ce modèle de résoudre le consensus en une étape.


Figure 11.17: Application de la stratégie de preuve.




Figure 11.18: Application de la stratégie de preuve.


On considère au plus n-2 plantages, comme à la figure 11.19.


Figure 11.19: Application de la stratégie de preuve.


On peut prouver de façon plus générale que, dans tout complexe de protocole à jusqu'à l'étape n-2, le sous-complexe où les processus ont tous 0 comme valeur locale, et le sous-complexe où les processus ont tous 1 comme valeur locale, sont connexes. Par le même raisonnement, il s'en suit aisément qu'on ne peut pas résoudre le problème du consensus en moins de n-2 étapes.

De façon encore plus générale, dans le modèle par passage de message synchrone où on s'autorise au plus k pannes, au bout de r étapes, on a P(Sn-1) qui est (n-rk-2)-connexe. Cela implique la borne de n-1 pour résoudre le consensus (pour k=1).

11.4  Cas du modèle asynchrone à mémoire partagée



Figure 11.20: Une machine distribuée asynchrone à mémoire partagée


On suppose que l'on dispose d'une machine comme à la figure 11.20, dans laquelle n processus partagent une mémoire de taille infinie, partitionnée de la manière suivante. Chaque processus peut écrire de façon atomique sur sa partie (update) et lire de façon atomique toute la mémoire partagée dans sa propre mémoire locale. C'est un modèle équivalent, en ce qui nous concerne, au modèle plus classique de lecture/écriture atomique en mémoire partagée (sans partitionnement). On cherche maintenant des protocoles sans attente, c'est-à-dire robustes jusqu'à n-1 pannes.


Figure 11.21: Le complexe de protocole dans le cas asynchrone (deux processus).




Figure 11.22: Le complexe de protocole dans le cas asynchrone (trois processus).


On a le théorème suivant, que l'on ne prouvera pas, et qui est du à Maurice Herlihy et Sergio Rajsbaum (voir par exemple [HR00]):

Théorème
Les complexes de protocoles sans-attente, pour le modèle mémoire partagée asynchrone avec lecture/écriture atomique sont (n-1)-connexes (aucun trou en toutes dimensions) quel que soit le nombre d'étapes considérées.

.2cm

On va faire une application de ce théorème au problème du k-consensus. Il s'agit en fait d'une généralisation du problème du consensus: les processus encore vivants doivent terminer leur exécution avec au plus k valeurs différentes, prises dans l'ensemble des valeurs initiales.


Figure 11.23: Complexe de sortie, pour n=3 et k=2.


Le complexe de sortie, illustré à la figure 11.23 est composé de 3 sphères collées ensemble, moins le simplexe formé des 3 valeurs distinctes. Il n'est pas simplement connexe.

On va utiliser un outil classique de la topologie algébrique combinatoire. Commençons par subdiviser un simplexe. On donne ensuite une couleur distincte à chaque coin du simplexe. Pour les autres points du bords du simplexe, on donne la couleur d'un des coins. On colorie les points intérieurs par n'importe quelle couleur. Ceci est illustré à la figure 11.24.


Figure 11.24:


Figure 11.25:


Alors, comme illustré à la figure 11.25, il y a au moins un simplexe qui possède toutes les couleurs (lemme de Sperner).

On va colorier chaque point des complexes d'entrée et de protocole de la façon suivante: chaque processus est colorié avec la couleur correspondant à son entrée. Chaque point du complexe de protocole est colorié par sa décision.

Pour ce qui est du complexe de protocole, regardons comment se fait le coloriage en petite dimension. Quand on considère l'exécution d'un seul processeur, la couleur est imposée: en effet, le processus ne peut choisir que la couleur qu'il avait au départ. Quand on considère l'exécution de deux processeurs, comme à la figure 11.26, le complexe de protocole correspondant est connexe, et tous les points doivent être d'une des deux couleurs de départ.


Figure 11.26: Coloriage du complexe de protocole en dimension 2.


De façon générale, comme le complexe de protocole est simplement connexe, on peut ``remplir'' l'intérieur des chemins combinatoires. Les coins du complexe de protocole sont coloriés avec la valeur initiale sur ces processeurs (voir remarque en dimension 1). Il nous reste seulement à appliquer le lemme de Sperner. On en déduit qu'il existe un simplexe qui a toutes les 3 couleurs. Ce simplexe correspondrait à une exécution du protocole dans laquelle les trois processeurs décideraient trois valeurs différentes, ce qui contredit l'hypothèse du 2-consensus!

En fait, on a un résultat très général concernant le modèle asynchrone:

Théorème
Une tâche de décision peut être calculée dans le modèle asynchrone si et seulement si il existe une fonction simpliciale µ allant d'une subdivision du complexe d'entrée vers le complexe de sorte, et qui respecte la spécification D.

Le principe de la preuve est le suivant.

Commençons par l'implication vers la droite. On peut démontrer (en utilisant la suite exacte de Mayer-Vietoris), que le complexe de protocole est, à chaque étape, (n-1)-connexe. Cela permet de plonger (par une fonction simpliciale) n'importe quelle subdivision du complexe d'entrée dans le complexe de protocole, pour une étape assez grande. Enfin, on sait que si une tâche de décision peut être résolue, alors on a une fonction simpliciale du complexe de protocole vers le complexe de sortie.

Dans l'autre sens, on peut prouver que l'on peut réduire n'importe quelle tâche de décision au problème de l'accord (ou consensus) sur un simplexe. Ceci se fait en utilisant l'algorithme du ``participating set'' de [BG93]. Cette tâche de décision commence par les coins d'un simplexe subdivisé, et doit terminer sur les points d'un seul simplexe de la subdivision.

Montrons comment cela se passe avec deux processus. Le programme suivant:
P = update; P' = update;
    scan;     scan;
    case (u,v) of     case (u,v) of
    (x,y'): u=x';update;[]     (x,y'): v=y;update;[]
    default: update     default: update
opère la transformation géométrique illustrée à la figure 11.27, c'est-à-dire qu'elle subdivise un segment en trois segments. En fait, c'est exactement le code qui implémente le pseudo-consensus binaire entre deux processeurs.


Figure 11.27: Subdivision d'un segment en trois segments.


Cela est facile à voir, en utilisant la sémantique des opérations de lecture/écriture atomiques. En fait, on n'a que trois traces intéressantes possibles, correspondant aux trois segments:

11.5  Autres primitives de communication

Les modèles vus précédemment sont un peu idéalisés. Les systèmes multi-processeurs modernes offrent bien d'autres mécanismes de synchronisation: test&set, fetch&add, compare&swap, files d'attentes etc.

A chacun de ces mécanismes nouveaux, correspond d'autres résultats (et bien sûr d'autres complexes de protocoles). Par exemple, on peut résoudre le problème du consensus entre deux processus, avec test&set, ou encore avec une file d'attente (avec push et pop atomiques), voir [Lyn96].


Figure 11.28: Complexe de protocole pour test&set, dans le cas de trois processus.


Dans le cas de test&set par exemple, les complexes de protocoles sont tous (n-3)-connexes. On en déduit bien évidemment que le consensus entre deux processus est implémentable, et donc que c'est une primitive ``plus puissante'' que la lecture/écriture atomique. Mais on en déduit aussi assez facilement que le consensus entre trois processus n'est pas implémentable.

11.6  Quelques références

Ce domaine démarre vraiment en 1985 avec la preuve de Fisher, Lynch et Patterson (``FLP''), qu'il existe des tâches de décision simples qui ne peuvent pas être implémentées sur un système simple de passage de messages, quand on veut qu'elles soient robustes à une panne crash.

Plus tard, ce sont Biran, Moran et Zaks à PoDC'88 qui trouveront la caractérisation des tâches de décision qui peuvent être implémentées sur un système simple de passage de messages, en s'autorisant jusqu'à une panne crash. L'argument utilise une notion de ``similarity chain'' que l'on pourrait concevoir comme étant une version unidimensionnelle des arguments que nous avons développés précédemment. Puis à PoDC'1993, et de façon indépendante, Borowsky et Gafni, Saks et Zaharoglou et enfin Herlihy et Shavit ont trouvé des bornes inférieures pour le problème du k-consensus (d'abord proposé par Chaudhuri en 1990). Cette borne est en général de ë f/k û + 1 étapes dans le modèle synchrone. Nous avons essentiellement suivi ici les méthodes de preuve de Herlihy et Shavit.

Après cela, Attiya, BarNoy, Dolev et Peleg ont pu caractériser la tâche de renommage, dans JACM 1990. Cette tâche, ou plus généralement la tâche de (n+1,K)-renommage commence avec n+1 processus qui ont chacun un nom unique dans 0,...,N. On leur demande de se communiquer des informations afin de changer leur nom, en un nom unique dans 0,...,K avec n£ K <N. Ils ont montré que dans le modèle passage par messages, il y a une solution sans attente pour K³ 2n+1, et aucune pour K £ 2n.

Herlihy et Shavit dans STOC'93 ont prouvé que ce résultat est encore valide dans le modèle asynchrone (ce qui leur a valu le prix Gödel en 2004).

La caractérisation complète des tâches de décision calculables sans attente dans le modèle asynchrone se trouve dans ``The topological structure of asynchronous computability'', M. Herlihy and N. Shavit, J. of the ACM, 2000. On reporte le lecteur au livre très complet de Lynch, ``Distributed Algorithms'' (1996) pour plus de détails. Disons enfin que la représentation géométrique utilisée dans ce chapitre et celle des ``progress graphs'' brièvement développée à la section 5.4.2 est liée, voir par exemple [Gou03].


Previous Up Next