Dès lors qu’une architecture web doit grossir se pose le problème de l’accès aux sessions. Avec un seul serveur web, pas de soucis, les sessions PHP sont stockées comme fichiers sur le disque dur local. Mais pour répondre à des exigences de haute disponibilité ou de montée en charge, il est nécessaire de prévoir une infrastructure avec au moins 2 serveurs web couplés un load balancer comme LVS ou du Round Robin DNS. Ce pose alors le problème d’accès aux sessions utilisateurs. Une même session doit être accessible depuis les X serveurs web de l’infrastructure. Un serveur memcached et une configuration adéquate de PHP résout parfaitement ce problème.
Parmi les solutions de partir de sessions PHP, je déconseille vivement:
Définition officielle : "memcached is a high-performance, distributed memory object caching system, generic in nature, but intended for use in speeding up dynamic web applications by alleviating database load". Un service réseau de haute performance destiné à stoquer des objets (tout et n’importe quoi) en mémoire. Il convient très bien à un utilisation dans un environnement web dymanique et permet d’alléger la charge de base de données.
Dans le cas présent, memcached ne sera utiliser que pour stocker les sessions PHP. On pourrait aussi l’utiliser pour partager des ressources graphiques, pour stocker des rendus HTML pré calculés de page web (cache), etc
Le service memcached sera indispensable au bon fonctionnement du système. Autant l’installer sur le serveur qui est déjà indispensable : le serveur de base données. Il faut éviter les "single points of failure".
Télécharger le RPM : memcached (DAG)
rpm -Uvh memcached-xxx.rpm chkconfig memcached on /etc/init.d/memcached start
La configuration par défaut devrait suffire, au besoin, jeter un oeil au fichier : /etc/sysconfig/memcached
Le module PHP memcache permet de stocker les sessions sur un serveur memcached de façon automatique. Aucune modification des sites web ne sera nécessaire, juste un peu de configuration.
Télécharger le RPM : php-pecl-memcache (DAG)
rpm -Uvh php-pecl-memcache-xxx.rpmLe package installe un fichier de configuration : /etc/php.d/memcache.ini. Les valeurs par défaut devrait convenir à la majorité des systèmes. Il suffit d’y modifier l’adresse IP du serveur memcached.
# exemple avec l'adresse 10.1.1.10 du serveur memcached session.save_path="tcp://10.1.1.4:11211?persistent=1&weight=1&timeout=1&retry_interval=15";
Après avoir redémarrer apache.
/etc/init.d/httpd restart
Tester une page web qui fait appel aux sessions, cela devrait fonctionner et le répertoire/var/lib/php/session rester vide.
Afficher le contenu brut d’une session :
connect(MEMCACHED_IP, 11211) or die ('Connexion impossible'); var_dump ($memcache->get(SESSION_ID)); ?>
Sur ce blog j'expose mes expériences des tous les jours. Principalement axées autour du monde du logiciel libre, il peut aussi m'arriver de parler de faits d'actualités qui m'intéresse. Bonne lecture et n'hésitez pas à commenter ou à m'écrire
Dieng
juin 27th, 2008 at 15:57
De ce que j’ai compris toutes les données de session sont stockées dans le serveur memcache. Mais que se passe-t-il, si le serveur tombe en rad?
Pierre-Yves
juin 27th, 2008 at 16:52
Si le serveur où se trouve le service memcache tombe, les pages faisant appels aux sessions moulineront jusqu’au timeout. C’est pour cela que je recommande d’installer memcache sur un serveur vital afin de ne pas multiplier les serveurs “single point of failure”. Le serveur faisant office de serveur de base de données me semble un choix judicieux. Sans base, le site est déjà inutilisable, donc rien de grave d’avoir memcache inaccessible à ce moment là.