Un service qui tient sur plusieurs machines
Un système distribué est un ensemble de machines reliées par un réseau qui se présentent comme un seul service. Elles se partagent le travail pour aller plus vite, garder plus de données et continuer quand l’une d’elles tombe en panne.
Le jour de la mise en vente d’un concert, une billetterie reçoit 4 000 demandes par seconde. Une seule machine ne suit pas, et si elle s’arrête, plus personne n’achète de billet.
À la fin de cette leçon
Remarque
Je peux dire pourquoi un service tourne sur plusieurs machines et ce qui peut mal tourner.
Mots clés
| Mot | Ce que ça veut dire |
|---|---|
| Système distribué | des machines en réseau qui forment un seul service |
| Nœud | une machine du système |
| Latence | le temps qu’une demande met pour aller et revenir |
| Panne partielle | une partie du système s’arrête, le reste continue |
| Disponibilité | la part du temps où le service répond |
Les cellules que les étudiants remplissent restent vides dans cet aperçu.
Trois raisons de répartir un service
Il y a trois raisons de passer à plusieurs machines. La première est la vitesse : chaque machine traite une part des demandes. La deuxième est la taille : les données ne tiennent plus sur un seul disque.
La troisième est la panne : si une machine s’arrête, une autre prend sa place. Une seule machine, même très puissante, n’offre aucune de ces trois choses.
Exemple : dimensionner la billetterie
| Besoin | Une machine fait | Il faut donc |
|---|---|---|
| 4 000 demandes par seconde | 500 par seconde | 4 000 divisé par 500 : 8 machines |
| 6 To de billets et d’historique | 2 To par disque | 6 divisé par 2 : 3 machines |
| Rester ouvert si une machine tombe | Rien | Au moins une machine en plus |
Les cellules que les étudiants remplissent restent vides dans cet aperçu.
Fabriquer un petit client nommé v
v() ( printf '%s\r\n' "$*" | nc -w 1 valkey 6379 )Affichée ici, non exécutée. Créez un compte gratuit pour appuyer sur Exécuter et la saisir dans le terminal de votre propre labo.
Demander si l’autre machine répond
v PINGAffichée ici, non exécutée. Créez un compte gratuit pour appuyer sur Exécuter et la saisir dans le terminal de votre propre labo.
Lui confier le nombre de billets
v SET dist:billets:concert 120Affichée ici, non exécutée. Créez un compte gratuit pour appuyer sur Exécuter et la saisir dans le terminal de votre propre labo.
Le lui redemander
v GET dist:billets:concertAffichée ici, non exécutée. Créez un compte gratuit pour appuyer sur Exécuter et la saisir dans le terminal de votre propre labo.
Parler à une autre machine prend du temps
Dans le labo, votre terminal et le magasin Valkey sont deux machines. Chaque commande traverse un réseau, puis revient avec la réponse. Ce temps d’aller et retour s’appelle la latence.
Dans un seul programme, lire une valeur est presque immédiat. Entre deux machines, chaque échange coûte du temps, et ce coût grandit avec la distance.
Exemple : des ordres de grandeur
| Trajet | Temps d’aller et retour |
|---|---|
| Lire une variable en mémoire | moins d’une microseconde |
| Deux machines dans la même salle | environ 0,5 ms |
| Paris et Francfort | environ 10 ms |
| Paris et Tokyo | environ 230 ms |
Les cellules que les étudiants remplissent restent vides dans cet aperçu.
Une panne partielle est la règle, pas l’exception
Dans un système distribué, une machine peut tomber pendant que les autres marchent. C’est une panne partielle. Un câble peut aussi couper, et chacun croit alors que l’autre est mort.
La disponibilité dépend de la façon dont les machines sont liées. Si toutes sont nécessaires, il suffit qu’une tombe pour tout arrêter. Si une seule suffit, il faut que toutes tombent.
Exemple : trois machines à 90 % chacune
| Cas | Calcul | Disponibilité du service |
|---|---|---|
| Les trois sont nécessaires | 0,9 × 0,9 × 0,9 | 72,9 % |
| Une seule suffit | 1 moins (0,1 × 0,1 × 0,1) | 99,9 % |
| Une machine seule | 0,9 | 90 % |
Les cellules que les étudiants remplissent restent vides dans cet aperçu.
Que gagne-t-on à ajouter une machine ?
# Une machine est disponible 99 jours sur 100. Que gagne-t-on à en ajouter ?
dispo = 0.99
panne = 1 - dispo
for machines in [1, 2, 3]:
toutes = dispo ** machines
une = 1 - panne ** machines
print(machines, "machine(s) : toutes", round(toutes, 4), "une seule suffit", round(une, 6))
# Remplacez 0.99 par 0.9 puis relancez.
Une erreur fréquente
Attention
On croit souvent que plus de machines donne toujours un service plus fiable. Cela n’est vrai que si une seule suffit pour répondre. Si toutes sont nécessaires, chaque machine ajoutée est une panne possible de plus.