S'abonner au Flux RSS

Mot-clé - memcached

Fil des billets - Fil des commentaires

mardi, novembre 13 2012

Session PHP redondées dans memcache

Pour partager les sessions PHP entre les serveurs web au sein d'un cluster il est fréquent d'utiliser le stockage des dites sessions dans un backend memcache. Si ce partage permet de servir un même client depuis n'importe quel serveur tout en conservant ses sessions cela introduit néanmoins un SPOF dans l'architecture, on va voir dans ce billet qu'il est possible de gérer le failover avec 2 ou plus serveurs memcache.

PHP gère depuis la version 3.0.0. de la librairie php-memcache le paramètre memcache.redundancy qui bien que non documenté est déjà fonctionnel, le principe est d'associer ce paramètre à memcache.allow_failover et de définir plusieurs serveurs memcache pour le stockage des sessions.

Dans l'exemple suivant on configure php pour utiliser 2 serveurs qui ont pour ip 10.0.42.1 et 10.0.42.2

; On indique à php de gérer les sessions dans memcache
session.save_handler = memcache

; le save_path est composé des adresses des 2 serveurs
; séparées par une virgule
session.save_path = "udp://10.0.42.1:11211?persistent=1&weight=1&timeout=1&retry_interval=15,udp://10.0.42.2:11211?persistent=1&weight=1&timeout=1&retry_interval=15"

; permet d'avoir les clés indiques sur tous les serveurs
memcache.hash_strategy = consistent

; force php à lire/écrire sur un autre serveur en cas de
; défaillance du premier appelé
memcache.allow_failover = 1

; nb de serveurs memcache + 1
memcache.session_redundancy=3

L'explication de session_redundancy qui vaut le nombre de serveurs memcache + 1 est issue de ce document

Dorénavant si l'un des serveurs memcache est coupé les sessions sont sauvegardées, et à son retour il récupérera les sessions utilisées au fil de l'eau. Cette solution est satisfaisante dans le cas des sessions à durée de vie limitée ; pour une durée de 30 minutes il vous faudra ne pas couper les 2 serveurs memcache à moins de 30 minutes d'intervalles afin d'avoir toujours les sessions actives dans l'un des memcache. Pour conserver des sessions ad vitam aeternam il faudra se tourner vers un stockage dans une base de données ou s'assurer de répliquer le serveur memcache renaissant avec les données du serveur actif.

vendredi, octobre 23 2009

Intégrer memcached et mysql

Je vais décrire ici une technique pour mettre en cache mémoire, à l'aide de memcached les données d'une base mysql sans modifier le code applicatif. La technique consiste à utiliser mysql-proxy et la librairie lua mysql-proxy-cache. Cette description se base sur une Debian Lenny.

On débute par l'installation de memcached

aptitude install memcached

Ensuite nous allons installer les paquets nécessaire pour satisfaire les dépendances de la librairie.

aptitude install lua5.1 liblua5.1-md5-0 liblua5.1-socket2 luarocks

La librairie luamemcached n'est pas actuellement dans les repository officiel mais il existe néanmoins un paquet debian.

wget http://luaforge.net/frs/download.php/4041/liblua5.1-memcached0.deb
dpkg -i liblua5.1-memcached0.deb

Pour la librairie mysql-proxy-cache qui nous intéresse ici nous pouvons la récupérer par git ou directement à l'adresse http://github.com/clofresh/mysql-proxy-cache/raw/master/mysql-proxy-cache.lua.

A partir de ce point nous considérons que le fichier lua a été sauvegardé dans /usr/share/mysql-proxy/mysql-proxy-cache.lua

Modifions maintenant le fichier de configuration de mysql-proxy pour que celui-ci se lance au démarrage et qu'il intègre la nouvelle librairie, la configuration se fait dans /etc/default/mysql-proxy.

ENABLED="true"
OPTIONS="--proxy-lua-script=/usr/share/mysql-proxy/mysql-proxy-cache.lua"

Il reste à démarrer mysql-proxy avec le script d'init standard

/etc/init.d/mysql-proxy start

C'est désormais opérationnel, par défaut les résultats seront cachés pour une durée de 30 secondes. Le cache n'est pas dynamique dans le sens ou une donnée écrite ne sera pas rendue immédiatement, mais seulement au bout de 30 secondes, prenez garde donc si vous augmentez cette valeur.

Pour vérifier que memcached est bien actif, vous pouvez vous connecter en telnet sur son port d'écoute (11211) et taper la commande stats, vous obtiendrez quelque chose comme :

stats
STAT pid 2539
STAT uptime 21318
STAT time 1256336412
STAT version 1.2.2
STAT pointer_size 32
STAT rusage_user 0.040002
STAT rusage_system 0.120007
STAT curr_items 3
STAT total_items 15
STAT bytes 50447
STAT curr_connections 2
STAT total_connections 651
STAT connection_structures 17
STAT cmd_get 1450
STAT cmd_set 15
STAT get_hits 1435
STAT get_misses 15
STAT evictions 0
STAT bytes_read 151263
STAT bytes_written 45156032
STAT limit_maxbytes 67108864
STAT threads 1

Happy hacking !

vendredi, octobre 16 2009

Backport lenny des librairies redis

Le backport pour lenny des librairies d'accès à redis est disponible sur mon dépôt. Redis est une base de données cléf-valeur fonctionnant en mémoire, au même titre que memcached, avec une fonctionnalité intéressante de persistance des données entre deux redémarrage du service. Redis écrivant ses données sur disque à interval régulier.

En plus de la doc est du serveur les librairies sont disponibles pour php, perl, python et erlang.

  • erlang-redis_1.01-1_i386.deb
  • libphp-redis_1.01-1_i386.deb
  • libredis-perl_1.01-1_i386.deb
  • python-redis_1.01-1_all.deb
  • redis-doc_1.01-1_all.deb
  • redis-server_1.01-1_i386.deb