VT2017 MemCached

=MemCached=


 * Auteur : Alicia Aubertin
 * Enseignants : Didier Donsez et Georges-Pierre Bonneau
 * Date : 28/09/2017

=Résumé= MemCached est un système de caches logiciels distribués visant à accélerer l'éxécution des applications web dynamiques. Cela est possible via l'utilisation de toute la mémoire disponible en combinant tout les caches des serveurs. Les données sont stockées une seule fois en cache sur l'un des serveurs et sont identifiées par une clé.

Ce sytème est composé d'un logiciel client, qui connait les serveurs et sait vers lequels se diriger pour réclamer une donnée en cache, et d'un logiciel serveur gérant le stockage en cache des données et le nettoyage des caches lorsque les données deviennent obsolètes.

=Abstract= MemCached is a system of software caches aiming to speed up the execution of dynamic web applications. This is possible because all the available memory is used by combining all the server caches. Data is stocked in cache on one and only one of the servers and are identified by a key.

This system is composed of a client software, which knows all the servers and knows which one to turn to to retrieve a specific data, and of a server software managing the caches and their cleaning (or flushing) when data bes=comes out of date.

=Mots-clés=
 * Cache Logiciel
 * Distribué
 * Clé-Valeur
 * Hachage

=Qu'est ce que MemCached ?=

MemCached est un système de caches distribués permettant d'avoir des caches serveurs combinés de taille plus grande que des caches non distribués (voir ci-dessus). C'est un outil destiné aux développeurs d'application web dynamiques pour accélérer et alléger les requêtes vers les bases de donnés, situées sur les serveurs. Il est disponible pour la plupart des langages de programmation utilisés aujourd'hui. Il a pour vocation d'optimiser l'utilisation de la mémoire des caches serveurs (pour ne pas voir de mémoire cache potentiellement utilisable mise de coté) et d'être facile a déployer.

Le développement de cet outil a démarré en 2003 grâce à Brad Fitzpatrick qui l'a conçu pour son site internet LiveJournal (un site de type réseau social). MemCached a tout d'abord été codé en Perl et est aujourd'hui codé en C.

Il est utilisé entre autre par Youtube, Facebook, Twitter et Wikipedia qui sont tous des sites internet travaillant avec des bases de données conséquentes et un grand nombre de requêtes.

Sur Git, le projet a actuellement 111 contributeurs et des développements sont encore en cours.

=Fonctionnement= Les caches "classiques" tels que EHCache, sont des caches locaux au client (ou au serveur) et contiennent les données propres à chaque instance communicante. Il nécessitent la mise en place de système pour garder une cohérence dans les données présentes dans les différentes caches et dans la base de données.

MemCached est un cache distribué qui utilise les caches des différents serveurs connus pour stocker les données avec un système d'association (clé,valeur). Cela permet d'avoir un cache de taille totale plus grande pour tout le système.



Le système est composé d'un logiciel client et d'un logiciel serveur. Le logiciel client connait les serveurs et comporte un algorithme de hachage, permettant de savoir quel est le serveur contenant la donnée demandée à partir de la clé. Le logiciel serveur stocke les données dans le cache et les restitué lorsque cela lui est demandé. Il est également composé d'un système de nettoyage de la mémoire basé sur des timeout.

Les serveurs ne se connaissent pas entre eux, seul les clients connaissent la liste des serveurs qui leur sont accessibles.

=Comparaison=

Points forts et points faibles
Points forts
 * Rapidité de déploiement. MemCached peut être déployé sur un seul serveur et être immédiatement utilisé par l'application alors même que les autres serveurs n'en disposent pas encore.
 * Scalabilité. Rajouter un serveur nécessite uniquement de le faire connaître aux clients comme les serveurs ne se connaissent pas entre eux.
 * Pas de réplication. Les données en cache sont présentes sur un seul serveur et ne nécessitent donc pas d'opérations pour garder une cohérence.

Points faibles
 * Pas de persistance. Les donnée sont effacées si le cache se remplit. Mais ce point n'est négatif que si la persistance est une des propriété que vous souhaitez donner à votre application.
 * Pas de réplication. Cela signifie que si un serveur tombe, ses données en cache sont perdues. Mais comme indiqué ci-dessus c'est aussi un des points forts de MemCached.
 * Pas de sécurité. MemCached ne propose pas de cryptage des données et cette fonctionnalité, si elle est désirée, est à la charge du développeur.

Tableau comparatif de caches logiciels

 * EHCache est le cache logiciel le plus utilisé sous Java, il propose de mettre en place des caches persistants avec de la réplication ou non. Il n'est à ma connaissance disponible que sous Java.
 * Redis n'est pas un cache distribué mais il a la particularité de proposer de mettre en cache des structures de données complexes et pas seulement des String ou des objets sérialisés.
 * Hazelcast peut-être présenté comme un MemCached proposant de mettre en place de la réplication.

Le choix du cache logiciel que vous utiliserez dépend des fonctionnalités dont vous avez besoin et de l'importance que vous donnerez soit à la conservation des données soit à la performance. (Persistance et réplication ou non ?). =Références=
 * https://memcached.org
 * https://github.com/memcached
 * https://blog.octo.com/memcached-une-alternative-aux-caches-classiques/
 * https://en.wikipedia.org/wiki/Memcached
 * https://en.wikipedia.org/wiki/Ehcache
 * https://en.wikipedia.org/wiki/Redis
 * https://en.wikipedia.org/wiki/Hazelcast