Nous passons d'une configuration à un serveur Web à une configuration à deux serveurs Web et je dois commencer à partager des sessions PHP entre les deux machines à charge équilibrée. Nous avons déjà installé ( et commencé ) memcached et j'ai donc été agréablement surpris de pouvoir partager des sessions entre les nouveaux serveurs en changeant seulement 3 lignes dans le fichier ( session.save_handler et session.save_path ):php.ini
J'ai remplacé:
session.save_handler = files
avec:
session.save_handler = memcache
Ensuite, sur le serveur Web principal, j'ai défini le session.save_path
pointeur sur localhost:
session.save_path="tcp://localhost:11211"
et sur le serveur Web esclave, je mets le session.save_path
pointeur vers le maître:
session.save_path="tcp://192.168.0.1:11211"
Travail fait, je l'ai testé et ça marche. Mais...
Évidemment, utiliser memcache signifie que les sessions sont en RAM et seront perdues si une machine est redémarrée ou si le démon memcache se bloque - cela m'inquiète un peu, mais je suis un peu plus inquiet pour le trafic réseau entre les deux serveurs Web (surtout que nous évoluons) car chaque fois que quelqu'un est équilibré en charge sur le serveur Web esclave, ses sessions sont récupérées sur le réseau depuis le serveur Web maître. Je me demandais si je pouvais en définir deux save_paths
pour que les machines regardent dans leur propre stockage de session avant d'utiliser le réseau. Par exemple:
Maîtriser:
session.save_path="tcp://localhost:11211, tcp://192.168.0.2:11211"
Esclave:
session.save_path="tcp://localhost:11211, tcp://192.168.0.1:11211"
Est-ce que cela partagerait avec succès des sessions sur les serveurs ET aiderait les performances? c'est à dire économiser du trafic réseau 50% du temps. Ou cette technique est-elle uniquement destinée aux basculements (par exemple, lorsqu'un démon memcache est inaccessible)?
Remarque : je ne pose pas vraiment de question sur la réplication de memcache - plus sur si le client PHP memcache peut atteindre son pic à l'intérieur de chaque démon memcache dans un pool, retourner une session s'il en trouve une et créer seulement une nouvelle session s'il n'en trouve pas une dans tous les magasins. Alors que j'écris ceci, je pense que je demande un peu trop à PHP, lol ...
Supposons : pas de sessions persistantes, équilibrage de charge à tour de rôle, serveurs LAMP.
Réponses:
Avertissement: vous seriez fou de m'écouter sans faire une tonne de tests ET obtenir une 2e opinion de quelqu'un de qualifié - je suis nouveau dans ce jeu .
L'idée d'amélioration de l'efficacité proposée dans cette question ne fonctionnera pas. La principale erreur que j'ai commise a été de penser que l'ordre de définition des magasins memcached dans le pool dicte une sorte de priorité. Ce n'est pas le cas . Lorsque vous définissez un pool de démons mis en mémoire (par exemple en utilisant
session.save_path="tcp://192.168.0.1:11211, tcp://192.168.0.2:11211"
), vous ne pouvez pas savoir quel magasin sera utilisé. Les données sont réparties uniformément, ce qui signifie qu'un élément peut être stocké dans le premier, ou ce peut être le dernier (ou les deux si le client memcache est configuré pour se répliquer - notez que c'est le client qui gère la réplication, le serveur memcached le fait pas le faire lui-même). Dans les deux cas, l'utilisation de localhost comme premier du pool n'améliorera pas les performances - il y a 50% de chances de toucher l'un ou l'autre magasin.Après avoir fait un peu de tests et de recherches, j'ai conclu que vous POUVEZ partager des sessions sur plusieurs serveurs en utilisant memcache MAIS vous ne le voulez probablement pas - cela ne semble pas être populaire car il ne s'adapte pas aussi bien que l'utilisation d'un partage base de données à elle n'est pas aussi robuste. J'apprécierais vos commentaires à ce sujet afin que je puisse en savoir plus ...
Astuce 1: Si vous souhaitez partager des sessions sur 2 serveurs à l'aide de memcache:
Assurez-vous d'avoir répondu Oui à « Activer la prise en charge du gestionnaire de sessions memcache? » Lorsque vous avez installé le client PHP memcache et ajoutez ce qui suit dans votre
/etc/php.d/memcache.ini
fichier:Sur le serveur Web 1 (IP: 192.168.0.1):
Sur le serveur Web 2 (IP: 192.168.0.2):
Astuce 2: Si vous souhaitez partager des sessions sur 2 serveurs à l'aide de memcache ET prendre en charge le basculement:
Ajoutez les éléments suivants à votre
/etc/php.d/memcache.ini
fichier:Sur le serveur Web 1 (IP: 192.168.0.1):
Sur le serveur Web 2 (IP: 192.168.0.2):
Remarques:
session.save_path
sur tous les serveurs.Astuce 3: Si vous souhaitez partager des sessions à l'aide de memcache ET avoir un support de basculement transparent:
Identique à l'astuce 2, sauf que vous devez ajouter ce qui suit à votre
/etc/php.d/memcache.ini
fichier:Remarques:
get's
soient réessayés sur les miroirs. Cela signifie que les utilisateurs ne perdent pas leur session en cas de défaillance d'un démon memcache.memcache.session_redundancy
est pour la redondance de session mais il y a aussi unememcache.redundancy
option ini qui peut être utilisée par votre code d'application PHP si vous voulez qu'il ait un niveau de redondance différent.la source
ext/memcache
version 3.x. Nous jouons également avec cette option et j'ai décidé de parcourir la liste des serveurs et d'y écrire moi-même.Re: Astuce 3 ci-dessus (pour toute autre personne rencontrant cela via google), il semble qu'au moins actuellement pour que cela fonctionne, vous devez utiliser
memcache.session_redundancy = N+1
pour N serveurs dans votre pool , au moins cela semble être le seuil minimum valeur qui fonctionne. (Testé avec php 5.3.3 sur debian stable, pecl memcache 3.0.6, deux serveurs memcached. Échoueraient dès que j'éteindraissession_redundancy=2
le premier serveur dans lesave_path
,session_redundancy=3
fonctionne très bien.)Cela semble être capturé dans ces rapports de bogues:
la source
Avec les paramètres php.ini indiqués ci-dessus, assurez-vous que les paramètres suivants sont également définis:
Vous obtiendrez alors un basculement complet et une redondance côté client. La mise en garde avec cette approche est que si memcached est en panne sur localhost, il y aura toujours un échec de lecture avant que le client php memcache n'essaye le serveur suivant dans le pool spécifié dans session.save_path
Gardez à l'esprit que cela affecte les paramètres globaux du client php memcache exécuté sur votre serveur Web.
la source
consistent
judicieux d' utiliser une stratégie de hachage étant donné que lesession.save_path
est différent sur chaque serveur Web?memcached ne fonctionne pas de cette façon (veuillez me corriger si je me trompe!)
Si vous souhaitez que votre application dispose d'un stockage de session redondant, vous devez créer quelque chose qui modifie / ajoute / supprime des entrées pour les deux instances memcached. memcached ne gère pas cela, la seule chose qu'il fournit est un stockage de hachage de clé. Donc pas de réplication, de synchronisation, rien, nada.
J'espère que je ne me trompe pas sur cette question, mais c'est ce que je sais de memcached, cela fait quelques années que je l'ai touché.
la source
memcached ne se réplique pas hors de la boîte, mais repcached (un memcached patché) le fait. Cependant, si vous utilisez déjà mysql, pourquoi ne pas simplement utiliser sa fonctionnalité de réplication avec la réplication maître-maître et bénéficier de la réplication complète des données.
C.
la source