Utiliser memcache comme magasin de session?
J'ai actuellement un problème énorme. Il y a deux jours mon site en cours d'exécution sur un serveur en était trop, j'ai donc acheté deux de plus et les a regroupés (rsync et d'équilibrage de charge).
Ensuite, je commence à remarquer qu'un utilisateur aurait frappé le serveur 1 et ensuite sur la prochaine demande de frapper server3 mais que leur session était encore sur server1 au lieu de server3 et ils n'étaient plus connecté.
M'a recommandé d'utiliser memcache pour la session de magasins.
Mon script utilise déjà $_SESSION
.
- Pouvons-nous obtenir de memcache installé et activer le gestionnaire de session de soutien et de jeu de
session.save_handler = "memcache"
pour forcer php à utiliser memcache? - Est-il de l'application de la programmation qui doit être fait pour utiliser memcache?
- Va ce résoudre mon session entre le serveur de l'enjeu?
- Sont la session magasins stocké sur tous les serveurs quand ils sont créés ou est un comme un maître, memcache serveur?
Je suis en utilisant le codeiginiter cadre
source d'informationauteur William Smith
Vous devez vous connecter pour publier un commentaire.
Vous devrez configurer memcache pour s'exécuter sur l'un des serveurs et ont tous les serveurs utilisent la même memcache exemple pour les sessions. Sinon, si ils gèrent leur propre memcache exemple, vous aurez le même problème qu'avant.
Autres que la configuration de memcache en conséquence et de dire à PHP pour l'utiliser comme votre gestionnaire de session, vous ne devriez pas avoir à apporter des modifications à votre code.
~
De clarifier les conseils que j'ai donné ici, si vous regroupez tous les trois serveurs en une seule piscine, vous n'aurez pas de problèmes tant que chaque PHP exemple les références de ces serveurs dans le même ordre. memcache utilise côté client de hachagede sorte que vous serez assuré que la même clé est lue /écrite sur le même serveur. Bien sûr, si vous modifiez cette liste, alors, séances deviendra caduque.
La memcache développeurs n'ont même pas vous recommandons d'utiliser memcache pour le stockage des données de session, car il n'est pas persistante, et donc si vous devez redémarrer memcache (ou quelque chose se passe), puis l'ensemble de vos utilisateurs seront connectés.
Il y a deux parties à la question:
La façon de traiter avec demande d'aller à différents serveurs?
C'est votre équilibreur de charge/reverse-proxy. Il est courant de faire des clients en tenir à un serveur, généralement, par une adresse IP ou un transparent cookie défini par le proxy. Cependant, il n'est pas nécessaire pour le client de la viscosité pour le bien de sessions si vous avez distribué session magasin, ce qui nous amène à memcache.
Comment utiliser memcache pour le stockage de session sur plusieurs serveurs?
memcache a une bonne shared-nothing architecture distribuée, de sorte que la plupart de l'intelligence est au client final. Donc, ce que vous devriez faire est d'aller de l'avant et utiliser le memcache de stockage de session, mais au lieu de pointer sur un serveur, point à TOUS d'entre eux. Ce qui est couvert dans les docs. Dans votre php.ini vous devez le régler session.save_path à la liste des serveurs memcached, par exemple
server1:11211, server2:11211
.Être conscient qu'il y a deux distincts client de memcache bibliothèques disponibles en PHP appelé
memcache
etmemcached
et ils ont une syntaxe différente pour cette propriété.En raison de la manière que memcache fonctionne, vous n'avez pas de soins où vos données de session est stocké - il est pris en charge pour vous.
Comme NathanD points, memcache est instable et perd des données sur un redémarrage, et lorsque vous avez plusieurs serveurs, cela signifierait que certains (mais pas tous) de vos utilisateurs seront connectés si l'on a été redémarré. Si un serveur tombe complètement en panne votre stockage de session restera de travail. Les utilisateurs dont les données de session a été sur les morts serveur sera lancé, mais ils peuvent se connecter et se poursuivre sans que le serveur ne soit présent.
Deux grands memcache PHP extensions PECL ont les gestionnaires de session. Soit vous demandera d'installer un module PECL avant de l'utiliser.
La Memcache extension PECL gestionnaire de session est activée avec les suivants en php.ini:
La Memcached extension PECL gestionnaire de session est activée avec les suivants en php.ini:
Noter que l'extension Memcache s'affiche pour permettre à plus de la configuration de la Memcache environnement.
Vous voulez être prudent à ce sujet. Une chose à être attention à ne pas l'hôte de la session des informations avec d'autres non-les données de session. Ce n'est pas le plus gros contrat de vider votre cache lorsqu'elle ne contient vos propres données du site, mais vous ne voulez pas effacer les gens de séances avec elle.
Aussi longtemps que vous êtes à l'aide de la même clé avec memcache, vous devez tirer le même serveur à chaque fois. De sorte que le problème devrait disparaître.
il est préférable d'utiliser memcachedb comme un stockage persistant pour memcache lui-même ou même de l'utiliser le plus intelligemment redis que je recommande fortement, dans votre cas,
Vous pouvez également écrire vos sessions SQL DB. Cela permettra également de vous donner persistante des sessions sur les serveurs. Voir le tutoriel ci-dessous: http://culttt.com/2013/02/04/how-to-save-php-sessions-to-a-database/
Si vous insistez sur l'exécution des sessions dans memcached (afin d'avoir de meilleures performances, mais la baisse de la cohérence), vous pouvez simplement réécrire son code dans quelques endroits
Vous pouvez synchroniser les fichiers de sessions. Je le fais sur mes deux serveurs à charge équilibrée.
Sur Ubuntu et un tas d'un autre linux, les sessions sont stockées dans
/var/lib/php5
.J'ai suivi les étapes de plus, ici, sur le super-Utilisateurle montage de la session PHP dossier à partir d'un serveur sur l'autre.