Branch
Hash :
94046104
Author :
Thomas de Grivel
Date :
2020-02-24T15:19:27
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114
\chapter{Cluster}
\section{Pr\'esentation g\'en\'erale et d\'efinition du cluster}
Un cluster est un groupe de serveurs ind\'ependants fonctionnant comme un seul
et m\^eme syst\`eme.
Un client dialogue avec un cluster comme s'il s'agissait
d'une machine unique. Ce syst\^eme permet donc d'augmenter consid\'erablement
les performances lors du traitement d\'esir\'e. \\
\section{Rappel du fonctionnement g\'en\'eral}
Le cluster est divis\'e en deux parties :
Un client, lanc\'e sur la machine sur laquelle on veut utiliser patchwork13, et
un nombre ind\'efini de serveurs qui sont l\`a pour faire les t\^aches de
traitement demand\'ees par le client. \\
La communication entre le client et les servers s'effectue en deux temps :
\begin{itemize}
\item une identification en UDP (broadcast)
\item Connection et dialogue entre client et server en TCP
\end{itemize}
\section{Fonctions disponibles \`a travers le cluster}
\begin{itemize}
\item Une fonction de creation de patch
\item Une fonction detruisant un patch
\item Une fonction qui demande \`a un server de demarr\'e un patch pr\'ecis
qu'il h\'eberge.
\item Une fonction permettant l'arr\^et d'un patch
\item Une fonction connectant localement deux patchs
\item Une fonction permettant de connecter des patchs se trouvant sur des
machines diff\'erentes
\item Une fonction qui demande de pomper \`a tous les pr\'ed\'ecesseurs du
patchs vis\'e.
\item Une fonction permettant l'envoi de buffers
\item Une nouvelle fonction send
\end{itemize}
\section{Descriptif des fonctions et des m\'ecanismes du cluster}
\begin{itemize}
\item Lors de la demande de cr\'eation de patch par le client, ce dernier
envoie au server l'entier lui permettant de savoir qu'on lui demande cette
t\^ache, ainsi que le chemin du patch, et pour finir son nom. Avec cel\`a, le
server utilise une fonction du noyau pour cr\'eer le patch demand\'e. Par
a suite, le server renvoye au client un pointeur sur le patch qu'il vient de
cr\'eer pour d\'etenir une liste des patchs lanc\'es sur chaque server.
\newline
\item Pour d\'etruire un patch, le client envoye l'ID du message correspondant
au server, ainsi que le pointeur sur le patch voulu. La suppression devient
effective gr\^ace \`a un appel sur une fonction du noyau.
\newline
\item Pour demander \`a un client de d\'emarrer un patch, il suffit de
pr\'eciser, en plus de l'ID du message, le temps auquel il faut lancer le
patch.
\newline
\item Arr\^eter un patch n\'ecessite simplement d'envoyer un pointeur sur le
patch concern\'e au client, qui sera arr\^t\'e gr\^ace \`a un appel sur une
fonction du noyau.
\newline
\item Le transfert de buffer qui a \'et\'e ecrit permet l'envoi de n'importe
quel type de donn\'ee ('a). Le principe est d'utiliser des unions,
repr\'esentant chacune un bloc du buffer. Notre buffer est donc un
encha\^inement d'unions dans la m\'emoire. Pour conn\^itre la taille \'a
recevoir, le premier block contient la taille totale du buffer.
\newline
\item La fonction permettant de connecter deux servers entre eux est plus
compliqu\'e qu'un simple appel des fonctions du noyau. Il a fallu se tourner
les meninges serieusement pour la pondre. Elle doit permettre de rendre
transparent la connection de deux patchs entre deux serveurs. Le serveur 1 par
la demande du client va etablir une connection sur le serveur 2 classiquement
en tcp puis lui envoyer les donn\'ees n\'ecessaires soit le nom de l'output et
le pointeur du patch. Ensuite il faut cr\'er un patch permettant le transit
des donn\'ees entre les deux patchs puis le connecter au patch du serveur 1
c\^ot\'e input du patch. Ce patch a donc une sortie qui renvoit n'importe
quelle donn\'ee et qui permet de tout transiter avec les fonctions d'envoi et
de r\'eception de grosse donn\'ees. Pour le pump tout va se faire en
transparent, lorsque le patch pr\'ec\'edent demandera un pump du fameux patch
alors il demandera de pumper avec un message r\'eseau au patch du serveur 2
puis se mettra en attente des donn\'ees qui arriveront sur la sortie du path
du serveur 2 et qui ressortiront directement sur l'output du patch de
transmission.
\newpage
\item La connection localement de deux patchs fonctionnent en prenant un
pointeur et une cha\^ine par sortie et entr\'ee \`a connecter, cela permet de
trouver le pointeur sur l'entr\'ee et la sortie n\'ecessaire \`a la fonction
du noyau permettant de les relier.
\newline
\item \'Etant donn\'e que la fonction send d'UNIX ne garantit pas que toutes
les
donn\'ees ont \'et\'e emvoy\'ees (embetant si on a des pertes lors d'envoi de
gros buffers), nous avons d\^u nous appuyer sur cette fonction pour en cr\'eer
une nouvelle permettant de tout envoyer.
\end{itemize}
\section{Ce qu'il est possible de faire gr\^ace au cluster}
Au moment o\`u nous r\'edigeons ces lignes, nous sommes capables de faire
fonctionner plusieurs patchs sur diff\'erents server, le tout contr\^ol\'e
par le client.
Par exemple (ce qui vous \`a \'et\'e pr\'esent\'e \`a cette soutenance),
on peut faire jouer un son sur tous les ordinateurs d'epita en m\^eme temps,
ou encore de mixer du son et que chaque server du cluster h\'eberge un patch,
ou plusieurs patchs appartenant au patchwork du client.