• Aucun résultat trouvé

3.2 Exemple de plates-formes pour la tolérance aux fautes

3.2.1 Les pionniers : les plates-formes explicites

Plates-formes de synchronisation : ISIS, PSYNC, etc.

ISIS, PSYNC, TRANSISsont des kits de développement d’applications distribuées tolérant les fautes, basés sur des protocoles de multi–diffusion qui permettent l’ordonnancement cohérent d’évènements distribués.

Le premier d’entre eux, ISIS, a été développé autour de Kenneth Birman à l’Université de Cornell sur une période allant de 1981 (début du projet) à 1998 (arrêt de la commercia- lisation d’ISISpar la société Stratus Computer, Inc.). Voici comment ISISa été présenté par

Birman :

Our basic premise is that the complexity of fault–tolerant distributed programs precludes their design and development by non–experts. [...] Alternatives to direct implementation of fault–tolerant systems are needed if fault–tolerance is to gain wide availability.

The ISIS project seeks to address this need by automating the transformation of fault–intolerant program specification into fault-tolerant implementations.

[Birman 1985] La première version d’ISIS fournit des services de multi–diffusion tolérants aux dé- faillances par arrêt organisés en trois primitives [Birman 1985]. Chacune de ces primitives impose des contraintes différentes sur l’ordonnancement respectif de leurs messages à la réception. Le modèle de développement d’ISISest basé sur la notion d’objet résilient, une

entité logicielle distribuée organisée en un certain nombre de répliques fonctionnant selon un mode de réplication passive.

Déjà dans sa première version ISIS fut un projet particulièrement précurseur. On y trouve des notions de langage de description d’interface (IDL) avec les « abstract type specifications ». La notion d’objet résilient annonce les groupes d’objets trouvés par exemple dans le standard FT-CORBA [OMG 2002b]. Les adresses de ces groupes, appelées capacity, annoncent les IOGRs (interoperable object group references) toujours dans FT-CORBA. Dans la foulée d’ISISont été développées d’autres infrastructures similaires, avec de nouveaux choix

d’implémentation pour augmenter leur performance, ou des sémantiques légèrement diffé- rentes pour prendre en charge d’autres modèles de programmation. On peut notamment citer PSYNC [Peterson et al. 1989] ou TRANSIS[Amir et al. 1992].

La limitation des primitives de multi–diffusion proposées par ces différentes plates– formes, et l’impossibilité d’adapter leurs propriétés en fonction du contexte d’opération ont été à l’origine de projets qui ont plus particulièrement recherché la flexibilité tout en gardant les capacités des plates–formes précédentes. CONSUL [Mishra et al. 1993], basé sur PSYNC, HORUS [van Renesse et al. 1996] et ENSEMBLE [van Renesse et al. 1998], suc-

Ces différents projets introduisent la notion de micro–protocole. Les micro–protocoles sont des modules logiciels qui transforment un flux d’événements en entrée en un flux d’événements en sortie en garantissant diverses propriétés d’ordre ou de robustesse. Ils peuvent être assemblés en de multiples combinaisons pour créer des piles de communication personnalisées selon les besoins de l’application. Deux questions en particulier sont abordées pour la réalisation de ces micro–protocoles :

1. Quelle interface générique choisir pour pouvoir composer librement les différents micro–protocoles ?

2. Comment prendre en compte les contraintes de dépendance entre les différents micro– protocoles ?

Pour répondre à la première question, la plupart de ces projets choisissent une forme d’interaction par événements : réception, envoi de message, détection d’une défaillance, en- trée d’un nouveau membre dans un groupe, etc. Le second problème est abordé en décrivant les dépendances entre protocoles sous forme soit d’un ordre partiel (deux protocoles sont reliés si le fonctionnement correcte de l’un assure le fonctionnement correcte du second [Mishra et al. 1993]), ou de manière plus élaborée sous forme de « contrats » conditions– garanties [van Renesse et al. 1998].

ENSEMBLE, le plus récent des projets, propose même un protocole de reconfiguration dynamique de ses piles, PSP (Protocol Switching Protocol), structuré selon un commit en trois phases avec un coordinateur centralisé [van Renesse et al. 1998].

Plates-formes pour la capture d’état

Les approches explicites pour la capture d’état sont pour la plupart implémentées au niveau langage. À la différence des plates-formes axées sur la synchronisation, elles ne précèdent pas les approches de capture d’état intégrée aux plates-formes, mais ont plutôt été développée en parallèle. Nous en donnons ici un bref aperçu et renvoyons le lecteur à [Courtès 2003] pour un état de l’art plus détaillé.

Ces approches requièrent de la part du programmeur d’indiquer explicitement quelles données il souhaite gérer de manière persistante. Le Persistent State Service (PSS) de CORBA, utilise par exemple un langage de description de l’état à sauvegarder appelé PSDL (Persistent State Description Language) pour décrire les attributs de chaque objet distribué qui doivent pouvoir être rendus persistants [OMG 2002f]. Un autre exemple est le langage PS–ALGOL, qui rend possible la manipulation transparente d’objets stockés dans une base de donnée persistante [Atkinson et al. 1983]. Dans son code, le programmeur n’a pas à faire la dis- tinction entre objets persistants et objets « éphémères », mais il doit choisir en amont quels objets seront gérés par la base de données.

Parce qu’elles utilisent une description de l’état à sauvegarder de haut niveau (basée sur le système de types de CORBA pour PSS, ou celui d’Algol pour PS–ALGOL), et font appel à des formats de mise à plat indépendants des plates-formes sous-jacentes, ces ap- proches permettent de transférer des états entre des contextes d’exécution (OS, matériel)

hétérogènes. Le Persistent State Service de CORBA, permet même d’échanger un état entre deux implémentations d’un même service écrites dans des langages différents. Parce qu’elles sont explicites, ces techniques nécessitent cependant de la part du concepteur de préciser en amont du développement quelles données devront être gérées de manière persistante pour permettre des reprises cohérentes. Cette contrainte rend l’adaptation des choix de persistance difficile en cours de projet. Elle ne permet pas non plus de gérer la capture d’état de manière totalement transparente vis-à-vis des aspects fonctionnels de l’application. Enfin, les approches explicites de capture d’état sont mal adaptées à la capture de l’aspect « contrôle » de l’état d’une application (quels traitements sont en cours ? avec quels degrés d’avancement ?), qui est intrinsèquement lié au substrat d’exécution et se prête mal à toute approche déclarative.