\documentclass[aspectratio=43]{beamer} \usetheme{Berlin} %\usefonttheme{professionalfonts} \usepackage[utf8]{inputenc} \usepackage[T1]{fontenc} \usepackage[french]{babel} \usepackage{mathtools,amssymb} \usepackage{microtype} \usepackage{pgfgantt} \usepackage{adjustbox} \usetikzlibrary{positioning} % \usepackage{qrcode} \title[]{Systèmes centralisés, fédérés et pair à pair : vu par la théorie des graphs} \author{Amaury JOLY} \institute[AMU - Skeptikon - Parsec]{Aix-Marseille université, Skeptikon, Parsec.cloud} \begin{document} \begin{frame}{} \titlepage \end{frame} \note{test} \begin{frame}{Qui suis-je} \begin{itemize} \item \textbf{Doctorant} en informatique distribué \begin{itemize} \item \textit{Étude de la cohérence des données dans les systèmes distribués} \end{itemize} \item Ingénieur R\&D chez \textbf{Parsec.cloud} \item Membre de l'association \textbf{Skeptikon} \end{itemize} \end{frame} \section{Introduction a l'algorithmie distribué} \begin{frame}{Un système distribué c'est quoi} \begin{quote} On définit un système comme un ensemble de processus. On considère qu'un système est dit distribué lorsque plusieurs processus distincts travail à la réalisation d'une tâche commune. \end{quote} \vspace{1em} Par exemple la rédaction de documents collaboratifs (ex: cryptpad, grist, colabora), le chat (ex: matrix, signal, XMPP, IRC, IMAP), le partage d'annuaire de vidéo (ex: PeerTube), la résolution des noms de domaines (DNS). \end{frame} \begin{frame}{Définir un système distribué: le modèle de communication} La recherche traite globalement deux modèles de communication \begin{itemize} \item Shared-Register \pause \resizebox{0.5\linewidth}{!}{% \begin{tikzpicture}[ node distance=1.8cm and 2.4cm, process/.style={draw, circle, thick, minimum size=1cm, font=\small}, mem/.style={draw, thick, rounded corners, minimum width=5cm, minimum height=1.8cm, fill=gray!10}, reg/.style={draw, thin, minimum width=1.1cm, minimum height=0.7cm, font=\scriptsize}, arrow/.style={-Latex, thick} ] % --- Mémoire partagée (abstraction) --- \node[mem] (mem) {}; % Quelques registres logiques dans la mémoire \node[reg] (r1) at ($(mem.west)!0.2!(mem.east)$) {$R_1$}; \node[reg] (r2) at ($(mem.west)!0.5!(mem.east)$) {$R_\dots$}; \node[reg] (r3) at ($(mem.west)!0.8!(mem.east)$) {$R_n$}; \node[font=\scriptsize, below=0.15cm of mem]{Tous les processus voient la même mémoire logique}; % --- Processus concurrents --- \node[process] (p1) [left=of p2] {$P_1$}; \node[process] (p2) [above=1.8cm of mem] {$P_\dots$}; \node[process] (p3) [right=of p2] {$P_n$}; % --- Accès mémoire : opérations read/write --- \draw[arrow] (p1.south) -- (r1.north); \draw[arrow] (p1.south) -- (r2.north); \draw[arrow] (p1.south) -- (r3.north); \draw[arrow] (p2.south) -- (r2.north); \draw[arrow] (p2.south) -- (r1.north); \draw[arrow] (p2.south) -- (r3.north); \draw[arrow] (p3.south) -- (r1.north); \draw[arrow] (p3.south) -- (r2.north); \draw[arrow] (p3.south) -- (r3.north); \end{tikzpicture} } \end{itemize} \end{frame} \begin{frame}{Définir un système distribué: le modèle de communication} \begin{itemize} \item Shared-Register \item \textbf{Message-passing} \centering \resizebox{0.2\linewidth}{!}{% \begin{tikzpicture}[ node distance=2.2cm and 1.4cm, process/.style={draw, circle, thick, minimum size=1cm, font=\small}, state/.style={draw, thin, rounded corners, minimum width=1.6cm, minimum height=0.7cm, font=\scriptsize, fill=gray!10}, msg/.style={-Latex, thick}, netbox/.style={draw, dashed, rounded corners, thick, inner sep=0.4cm} ] % --- Processus avec état local --- \node[process] (p1) {$P_1$}; \node[process] (p2) [above=of p1] {$P_2$}; \node[process] (p3) [right=of p1] {$P_3$}; \node[state] (s1) [below=0.7cm of p1] {état local $S_1$}; \node[state] (s2) [above=0.7cm of p2] {état local $S_2$}; \node[state] (s3) [below=0.7cm of p3] {état local $S_3$}; % --- Messages entre processus --- \draw[msg] (p1) to[bend left=15] node[above, font=\scriptsize]{message $m_1$} (p2); \draw[msg] (p2) to[bend left=15] node[above, font=\scriptsize]{message $m_2$} (p3); \draw[msg] (p3) to[bend left=15] node[above, font=\scriptsize]{message $m_3$} (p1); \end{tikzpicture} }% \end{itemize} \end{frame} \begin{frame}{Définir un système distribué: le modèle de synchronisme} La recherche distingue deux grandes hypothèses de synchronisme : \begin{itemize} \item \textbf{Synchrone} (temps découpé en tours / rounds) \pause \centering \resizebox{0.7\linewidth}{!}{% \begin{tikzpicture}[ x=1.4cm, y=0.9cm, msg/.style={-Latex, thick}, proc/.style={font=\small}, roundline/.style={thick}, sep/.style={dashed, gray} ] % --- Processus --- \node[proc, anchor=east] at (0,0) {$P_1$}; \node[proc, anchor=east] at (0,-1) {$P_2$}; \node[proc, anchor=east] at (0,-2) {$P_3$}; % --- Lignes de temps pour chaque processus --- \foreach \y in {0,-1,-2}{ \draw[roundline] (0.2,\y) -- (3.0,\y); } % --- Séparation en tours synchrones --- \foreach \x/\t in {0.8/1,1.6/2,2.4/3}{ \draw[sep] (\x,0.3) -- (\x,-2.3); \node[font=\scriptsize] at (\x+0.35,0.35) {tour \t}; } % --- Messages livrés dans le tour suivant --- \draw[msg] (0.35,0) .. controls (0.55,-0.2) .. (0.75,-1); % P1 -> P2 dans le tour 1 \draw[msg] (1.0,-1) .. controls (1.2,-1.8) .. (1.4,-2); % P2 -> P3 dans le tour 2 \draw[msg] (1.7,-2) .. controls (1.9,-1.2) .. (2.1,0); % P3 -> P1 dans le tour 3 % --- Légende --- \node[font=\scriptsize, align=center] at (1.6,-2.6){Bornes connues sur les durées de calcul et de communication,\\ tous les processus avancent par tours synchrones}; \end{tikzpicture} } \end{itemize} \end{frame} \begin{frame}{Définir un système distribué: les modèles de synchronisme} \begin{itemize} \item Synchrone \item \textbf{Asynchrone} \end{itemize} \pause \centering \resizebox{0.7\linewidth}{!}{% \begin{tikzpicture}[ x=1.4cm, y=0.9cm, msg/.style={-Latex, thick}, proc/.style={font=\small}, opbox/.style={draw, rounded corners, thick} ] % --- Processus --- \node[proc, anchor=east] at (0,0) {$P_1$}; \node[proc, anchor=east] at (0,-1) {$P_2$}; \node[proc, anchor=east] at (0,-2) {$P_3$}; \pause % --- Lignes de temps pour chaque processus --- \foreach \y in {0,-1,-2}{ \draw[thick] (0.2,\y) -- (3.0,\y); } \pause % --- "Ticks" locaux non alignés (horloges indépendantes) --- \foreach \x in {0.5,1.2,2.3}{ \draw (\x,0.1) -- (\x,-0.1); % P1 } \foreach \x in {0.4,1.5,2.6}{ \draw (\x,-0.9) -- (\x,-1.1); % P2 } \foreach \x in {0.7,1.8,2.1}{ \draw (\x,-1.9) -- (\x,-2.1); % P3 } \pause % --- Messages --- \draw[msg] (0.35,0) -- (0.8,-1); \draw[msg] (0.35,0) -- (2.5,-2); \pause \draw[msg] (1.0,-1) -- (1.8,0); \draw[msg] (1.0,-1) -- (2.2,-2); \pause \draw[msg] (1.4,-2) -- (2.1,0); \draw[msg] (1.4,-2) -- (2.5,-1); \pause % op_1 : diffusion de P1 % commence à x = 0.35 (émission) et finit à x = 2.5 (dernier reçu : P3) \draw[opbox,densely dotted] (0.35,0.25) rectangle (2.5,-0.25); % ligne de vie de P1 en pointillé dans l'intervalle de op_1 \draw[thick,densely dotted] (0.35,0) -- (2.5,0); \node[font=\scriptsize, anchor=west] at (2.55,-0.2) {$op_1$}; \pause % op_2 : diffusion de P2 % commence à x = 1.0 (émission) et finit à x = 2.2 (dernier reçu : P3) \draw[opbox,densely dotted] (1.0,-0.75) rectangle (2.2,-1.25); % ligne de vie de P2 en pointillé dans l'intervalle de op_2 \draw[thick,densely dotted] (1.0,-1) -- (2.2,-1); \node[font=\scriptsize, anchor=west] at (2.25,-1.2) {$op_2$}; \pause % op_3 : diffusion de P3 % commence à x = 1.4 (émission) et finit à x = 2.5 (dernier reçu : P2) \draw[opbox,densely dotted] (1.4,-1.75) rectangle (2.5,-2.25); % ligne de vie de P3 en pointillé dans l'intervalle de op_3 \draw[thick,densely dotted] (1.4,-2) -- (2.5,-2); \node[font=\scriptsize, anchor=west] at (2.55,-2.2) {$op_3$}; \end{tikzpicture} } \end{frame} \begin{frame}{Définir un système distribué: les modèles de synchronisme} \begin{itemize} \item Synchrone \item \textbf{Asynchrone} \end{itemize} \centering \resizebox{0.7\linewidth}{!}{% \begin{tikzpicture}[ x=1.4cm, y=0.9cm, msg/.style={-Latex, thick}, proc/.style={font=\small}, opbox/.style={draw, rounded corners, thick} ] % --- Processus --- \node[proc, anchor=east] at (0,0) {$P_1$}; \node[proc, anchor=east] at (0,-1) {$P_2$}; \node[proc, anchor=east] at (0,-2) {$P_3$}; % --- Lignes de temps pour chaque processus --- \foreach \y in {0,-1,-2}{ \draw[thick] (0.2,\y) -- (3.0,\y); } % op_1 : diffusion de P1 % commence à x = 0.35 (émission) et finit à x = 2.5 (dernier reçu : P3) \draw[opbox,densely dotted] (0.35,0.25) rectangle (2.5,-0.25); % ligne de vie de P1 en pointillé dans l'intervalle de op_1 \draw[thick,densely dotted] (0.35,0) -- (2.5,0); \node[font=\scriptsize, anchor=west] at (2.55,-0.2) {$op_1$}; % op_2 : diffusion de P2 % commence à x = 1.0 (émission) et finit à x = 2.2 (dernier reçu : P3) \draw[opbox,densely dotted] (1.0,-0.75) rectangle (2.2,-1.25); % ligne de vie de P2 en pointillé dans l'intervalle de op_2 \draw[thick,densely dotted] (1.0,-1) -- (2.2,-1); \node[font=\scriptsize, anchor=west] at (2.25,-1.2) {$op_2$}; % op_3 : diffusion de P3 % commence à x = 1.4 (émission) et finit à x = 2.5 (dernier reçu : P2) \draw[opbox,densely dotted] (1.4,-1.75) rectangle (2.5,-2.25); % ligne de vie de P3 en pointillé dans l'intervalle de op_3 \draw[thick,densely dotted] (1.4,-2) -- (2.5,-2); \node[font=\scriptsize, anchor=west] at (2.55,-2.2) {$op_3$}; \end{tikzpicture} } \end{frame} \section{Les différentes architectures de systèmes} \subsection{Les systèmes centralisés} \begin{frame}{Système centralisé} \begin{itemize} \item Architecture client--serveur \item Un seul serveur central maintient l'état \end{itemize} \vspace{0.3cm} \centering \resizebox{0.6\linewidth}{!}{% \begin{tikzpicture}[ node distance=1.8cm and 2.5cm, client/.style={draw, circle, thick, minimum size=1cm, font=\small}, server/.style={draw, thick, rounded corners, minimum width=2.8cm, minimum height=1.2cm, font=\small, fill=gray!10}, msg/.style={-Latex, thick}, resp/.style={Latex-, thick, dashed} ] % --- Serveur central --- \node[server] (srv) at (0,0) {Serveur central}; % --- Clients --- \node[client] (c1) at (-3,0) {$P_1$}; \node[client] (c2) at (0,-2) {$P_2$}; \node[client] (c3) at (3,-0) {$P_3$}; % --- Messages requête / réponse --- \draw[msg] (c1.east) -- (srv.west); \draw[msg] (c2.north) -- (srv.south); \draw[msg] (c3.west) -- (srv.east); \end{tikzpicture} } \end{frame} \begin{frame}{Système centralisé : exécution parallèle des clients} \begin{itemize} \item Requêtes concurrentes côté clients \item Traitement séquentiel côté serveur (ordre total) \end{itemize} \vspace{0.3cm} \centering \resizebox{0.6\linewidth}{!}{% \begin{tikzpicture}[ x=1.4cm, y=0.9cm, msg/.style={-Latex, thick}, proc/.style={font=\small}, opbox/.style={draw, rounded corners, thick, fill=gray!10} ] % --- Processus : serveur + clients (lignes de vie) --- \node[proc, anchor=east] at (0,0) {$Serveur$}; \node[proc, anchor=east] at (0,-1) {$P_1$}; \node[proc, anchor=east] at (0,-2) {$P_2$}; \node[proc, anchor=east] at (0,-3) {$P_3$}; \pause % --- Lignes de temps --- \foreach \y in {0,-1,-2,-3}{ \draw[thick] (0.2,\y) -- (4.0,\y); } \pause % --- Requêtes des clients vers le serveur (légèrement décalées) --- \draw[msg] (0.8,-1) -- (1.2,0) node[midway, left, font=\scriptsize] {$op_1$}; \draw[msg] (0.9,-2) -- (1.3,0) node[midway, left, font=\scriptsize] {$op_2$}; \draw[msg] (1.0,-3) -- (1.4,0) node[midway, left, font=\scriptsize] {$op_3$}; % (On suggère qu'elles sont émises "en parallèle" côté clients.) \pause % --- Traitement séquentiel au serveur : op_1, op_2, op_3 --- % op_1 \node[opbox, minimum width=0.2cm, minimum height=0.5cm] (o1) at (1.8,0) {$op_1$}; % op_2 \node[opbox, minimum width=0.2cm, minimum height=0.5cm, right=0.2cm of o1] (o2) {$op_2$}; % op_3 \node[opbox, minimum width=0.2cm, minimum height=0.5cm, right=0.2cm of o2] (o3) {$op_3$}; % Relier dans l'ordre pour bien montrer la séquentialisation \draw[->, thick] (o1.east) -- (o2.west); \draw[->, thick] (o2.east) -- (o3.west); % --- Réponses (optionnelles, pour fermer la boucle) --- \pause \draw[msg] (o1.south) -- (2,-1); \draw[msg] (o1.south) -- (2,-2); \draw[msg] (o1.south) -- (2,-3); \draw[msg] (o2.south) -- (2.8,-1); \draw[msg] (o2.south) -- (2.8,-2); \draw[msg] (o2.south) -- (2.8,-3); \draw[msg] (o3.south) -- (3.8,-1); \draw[msg] (o3.south) -- (3.8,-2); \draw[msg] (o3.south) -- (3.8,-3); % --- Évolution de l'état (optionnel mais parlant) --- \node[font=\scriptsize, align=left] at (2.7,0.9) {$S_0 \xrightarrow{op_1} S_1 \xrightarrow{op_2} S_2 \xrightarrow{op_3} S_3$}; \end{tikzpicture} } \end{frame} \subsection{Les systèmes pair à pair} \begin{frame}{Système pair à pair} \begin{itemize} \item Pas de serveur central \item Chaque processus entretient son état local en fonction des messages recu. \end{itemize} \vspace{0.3cm} \centering \resizebox{0.6\linewidth}{!}{% \begin{tikzpicture}[ node distance=1.8cm and 2.5cm, peer/.style={draw, circle, thick, minimum size=1cm, font=\small}, link/.style={<->, thick} ] % --- Pairs --- \node[peer] (p1) at (-2,0) {$P_1$}; \node[peer] (p2) at ( 2,0) {$P_2$}; \node[peer] (p3) at ( 0,-2) {$P_3$}; % --- Connexions pair à pair --- \draw[link] (p1) -- (p2); \draw[link] (p1) -- (p3); \draw[link] (p2) -- (p3); \end{tikzpicture} } \end{frame} \begin{frame}{Système pair à pair : exécution parallèle} \begin{itemize} \item Chaque pair exécute des opérations concurrentes \item Pas de serveur central pour imposer un ordre total \end{itemize} \centering \resizebox{0.7\linewidth}{!}{% \begin{tikzpicture}[ x=1.4cm, y=0.9cm, proc/.style={font=\small}, opbox/.style={draw, rounded corners, thick} ] % --- Processus --- \node[proc, anchor=east] at (0,0) {$P_1$}; \node[proc, anchor=east] at (0,-1) {$P_2$}; \node[proc, anchor=east] at (0,-2) {$P_3$}; % --- Lignes de temps pour chaque processus --- \foreach \y in {0,-1,-2}{ \draw[thick] (0.2,\y) -- (3.0,\y); } % op_1 : opération de P1 % commence à x = 0.35 et finit à x = 2.5 \draw[opbox,densely dotted] (0.35,0.25) rectangle (2.5,-0.25); % ligne de vie de P_1 en pointillé dans l'intervalle de op_1 \draw[thick,densely dotted] (0.35,0) -- (2.5,0); \node[font=\scriptsize, anchor=west] at (2.55,-0.2) {$op_1$}; % op_2 : opération de P2 % commence à x = 1.0 et finit à x = 2.2 \draw[opbox,densely dotted] (0.45,-0.75) rectangle (1.2,-1.25); % ligne de vie de P_2 en pointillé dans l'intervalle de op_2 \draw[thick,densely dotted] (1.0,-1) -- (2.2,-1); \node[font=\scriptsize, anchor=west] at (2.25,-1.2) {$op_2$}; % op_3 : opération de P3 % commence à x = 1.4 et finit à x = 2.5 \draw[opbox,densely dotted] (1.4,-1.75) rectangle (2.5,-2.25); % ligne de vie de P_3 en pointillé dans l'intervalle de op_3 \draw[thick,densely dotted] (1.4,-2) -- (2.5,-2); \node[font=\scriptsize, anchor=west] at (2.55,-2.2) {$op_3$}; \end{tikzpicture} } \end{frame} \subsection{Les systèmes fédérés} \begin{frame}{Système fédéré} \begin{itemize} \item Plusieurs serveurs, chacun gère un sous-ensemble de processus \item Les serveurs se synchronisent entre eux (fédération) \end{itemize} \vspace{0.3cm} \centering \resizebox{0.4\linewidth}{!}{% \begin{tikzpicture}[ node distance=1.8cm and 2.5cm, server/.style={draw, thick, rounded corners, minimum width=2.8cm, minimum height=1.2cm, font=\small, fill=gray!10}, client/.style={draw, circle, thick, minimum size=0.9cm, font=\scriptsize}, srvlink/.style={<->, thick} ] % --- Serveurs fédérés --- \node[server] (s1) at (0,1.5) {Serveur $S_1$}; \node[server] (s2) at (-3,-0.5){Serveur $S_2$}; \node[server] (s3) at ( 3,-0.5){Serveur $S_3$}; % --- Processus locaux à chaque serveur --- \node[client] (p1) at (0,3) {$P_1$}; \node[client] (p2) at (-3,-2.5) {$P_2$}; \node[client] (p3) at ( 3,-2.5) {$P_3$}; % --- Liens client -- serveur local --- \draw[-Latex, thick] (p1.south) -- (s1.north); \draw[-Latex, thick] (p2.north) -- (s2.south); \draw[-Latex, thick] (p3.north) -- (s3.south); % --- Fédération entre serveurs --- \draw[srvlink] (s1) -- (s2); \draw[srvlink] (s1) -- (s3); \draw[srvlink] (s2) -- (s3); \end{tikzpicture} } \end{frame} \begin{frame}{Système fédéré : exécution parallèle des serveurs} \begin{itemize} \item Chaque serveur impose un ordre total local sur ses opérations \item Globalement, les opérations sur différents serveurs sont concurrentes \end{itemize} \centering \resizebox{0.7\linewidth}{!}{% \begin{tikzpicture}[ x=1.4cm, y=0.9cm, proc/.style={font=\small}, opbox/.style={draw, rounded corners, thick} ] % --- Processus (serveurs fédérés) --- \node[proc, anchor=east] at (0,0) {$S_1$}; \node[proc, anchor=east] at (0,-1) {$S_2$}; \node[proc, anchor=east] at (0,-2) {$S_3$}; % --- Lignes de temps pour chaque serveur --- \foreach \y in {0,-1,-2}{ \draw[thick] (0.2,\y) -- (3.2,\y); } % op_1 : opération sur S_1 (longue) \draw[opbox,densely dotted] (0.35,0.25) rectangle (2.3,-0.25); \draw[thick,densely dotted] (0.35,0) -- (2.3,0); \node[font=\scriptsize, anchor=west] at (2.35,-0.2) {$op_1$}; % op_2 : opération sur S_2 (décalée, plus courte) \draw[opbox,densely dotted] (0.8,-0.75) rectangle (2.0,-1.25); \draw[thick,densely dotted] (0.8,-1) -- (2.0,-1); \node[font=\scriptsize, anchor=west] at (2.05,-1.2) {$op_2$}; % op_3 : opération sur S_3 (commence plus tard, finit après op_2) \draw[opbox,densely dotted] (1.3,-1.75) rectangle (2.8,-2.25); \draw[thick,densely dotted] (1.3,-2) -- (2.8,-2); \node[font=\scriptsize, anchor=west] at (2.85,-2.2) {$op_3$}; \end{tikzpicture} } \end{frame} \begin{frame}{Jeu : placer les applications dans les architectures} \begin{itemize} \item À quel type d'architecture appartient chaque application ? \end{itemize} \vspace{0.3cm} \centering \resizebox{0.95\linewidth}{!}{% \begin{tikzpicture}[ archibox/.style={draw, rounded corners, thick, minimum width=3.5cm, minimum height=1.6cm, font=\small, align=center, fill=gray!10}, app/.style={draw, rounded corners, thick, minimum width=2.0cm, minimum height=0.8cm, font=\scriptsize, align=center} ] % --- Zones d'architecture --- \node[archibox] (central) at (-4, 1.5) {Centralisé}; \node[archibox] (p2p) at ( 0, 1.5) {Pair à pair}; \node[archibox] (federated) at ( 4, 1.5) {Fédéré}; % --- Jetons d'applications à placer --- \node[app] at (-5, -0.2) {cryptpad}; \node[app] at (-2.5,-0.2) {grist}; \node[app] at ( 0, -0.2) {colabora}; \node[app] at ( 2.5,-0.2) {matrix}; \node[app] at ( 5, -0.2) {signal}; \node[app] at (-5, -1.8) {XMPP}; \node[app] at (-2.5,-1.8) {IRC}; \node[app] at ( 0, -1.8) {IMAP}; \node[app] at ( 2.5,-1.8) {PeerTube}; \node[app] at ( 5, -1.8) {DNS}; \end{tikzpicture} } \end{frame} \begin{frame}{Un petit Quizz} % \qrcode{partici.fi/38956702} \end{frame} \begin{frame} \frametitle{MERCI !} \end{frame} \end{document}