Définition : Un système distribué est un ensemble de programmes informatiques qui utilisent des ressources informatiques sur plusieurs nœuds de calcul distincts pour atteindre un objectif commun et partagé. Les systèmes distribués visent à éliminer les goulots d’étranglement ou les points centraux de défaillance d’un système. — Atlassian
La notion de nœud est vague et a évolué avec le temps. Il peut s’agir d’une machine physique, d’une machine virtuelle ou même d’un processus d’un système. Pour cette définition, un nœud est une machine physique.
Le contraire d’un système distribué est un système centralisé. Dans celui-ci, il n’y a qu’un seul nœud qui s’occupe de maintenir l’état et de répondre aux clients (machines ou utilisateurs). Par définition, il est donc un Single Point Of Failure.
Voici quelques exemples d’architectures distribuées :
- Modèle d’acteur
- Peer-to-peer
- Microservices
- Event driven
- Master-slave …
Objectif
Le système distribué permet le scaling horizontal (scale out). Le scaling horizontal, c’est quand on augmente les performances d’un système en augmentant le nombre de nœuds. À l’inverse, le scaling vertical (scale up) est l’augmentation des performances d’un système en améliorant son hardware (RAM, CPU, GPU…) ou sa bande passante. Le second étant bien plus limité que le premier.
Le système distribué le plus simple
Le système distribué le plus simple est donc composé de 2 nœuds qui sont une copie l’un de l’autre. Si l’un défaille, l’autre prend le relais. Évidemment, cette approche est naïve et ne scalera que très peu : dès qu’il sera impossible pour un nœud de stocker l’entièreté des données, il ne sera plus possible d’uniquement faire des copies : il faudra fragmenter les données en shard.
Le système distribué le plus complexe
Un système distribué bien conçu peut ajouter ou supprimer des nœuds à la volée en fonction de la demande. Il s’occupera de faire les migrations de données automatiquement et aucune intervention humaine n’est requise. Les clouds (AWS, GCP, Azure, etc.) sont des exemples concrets de systèmes distribués complexes.
Avantages
- Partage de la charge
- Meilleure disponibilité
- Traitement simultané
- Évolutivité
- Résilience (tolérance aux pannes)
- Redondance des données
Inconvénients
- Conception plus complexe
- Réplication des données sur plusieurs nœuds
- Agrégation des données venant de plusieurs nœuds
- Sharding des données entre plusieurs nœuds
- Gestion des latences entre chaque nœud
- Gestion du fallback en cas de nœuds arrêtés
- Gestion des conflits quand 2 nœuds reçoivent des données contradictoires
- Logging / Débogage plus complexe
- Tests plus complexes
- Déploiements plus complexes
- Nécessite souvent une équipe DevOps