php – 可以使用memcache守护程序池来更有效地共享会话吗?

我们正在从1个Web服务器设置转移到两个Web服务器设置,我需要开始在两个负载平衡机器之间共享 PHP会话.我们已经安装了 memcached(并且已经启动),所以我很高兴我可以通过更改php.ini文件中的3行( session.save_handlersession.save_path)来完成新服务器之间的共享会话:

我换了:

session.save_handler = files

有:

session.save_handler = memcache

然后在主Web服务器上,我将session.save_path设置为指向localhost:

session.save_path="tcp://localhost:11211"

在slave webserver上我将session.save_path设置为指向master:

session.save_path="tcp://192.168.0.1:11211"

完成工作,我测试了它,它的工作原理.但…

显然使用memcache意味着会话在RAM中并且如果机器重新启动或者memcache守护程序崩溃将丢失 – 我有点担心这一点但我更担心两个Web服务器之间的网络流量(特别是我们扩大规模)因为每当有人负载平衡到从属web服务器时,他们的会话将从主网络服务器通过网络获取.我想知道是否可以定义两个save_path,以便机器在使用网络之前查看自己的会话存储.例如:

主:

session.save_path="tcp://localhost:11211,tcp://192.168.0.2:11211"

奴隶:

session.save_path="tcp://localhost:11211,tcp://192.168.0.1:11211"

这会成功地跨服务器共享会话并帮助提高性能吗?即50%的时间节省网络流量.或者这种技术仅用于故障转移(例如,当一个memcache守护程序无法访问时)?

注意:我并没有特别询问有关memcache复制的内容 – 更多关于PHP内存缓存客户端是否可以在池中的每个memcache守护程序内达到峰值,如果找到一个会话则返回会话,如果找不到会话则仅创建一个新会话在所有商店.在我写这篇文章的时候,我在想我是从PHP那里问了一下,哈哈…

假设:没有粘性会话,循环负载平衡,LAMP服务器.

免责声明:如果没有进行大量的测试并且从合格的人那里得到第二意见,你会生气地听我说 – 我是这个游戏的新手.

这个问题中提出的效率改进想法是行不通的.我犯的主要错误是认为memcached存储在池中定义的顺序决定了某种优先级.不是这种情况.定义一个memached守护程序池时(例如,使用session.save_path =“tcp://192.168.0.1:11211,tcp://192.168.0.2:11211”),您无法知道将使用哪个存储.数据是均匀分布的,这意味着项目可能存储在第一个项目中,或者它可能是最后一个项目(或者如果memcache客户端配置为复制,则可能两者都有 – 请注意它是处理复制的客户端,memcached服务器执行复制不要自己做).无论哪种方式都意味着使用localhost作为池中的第一个将不会提高性能 – 有50%的机会击中任一商店.

做了一些测试和研究之后我得出结论,你可以使用memcache在服务器之间共享会话但是你可能不想这样 – 它似乎不受欢迎,因为它不像使用共享那样扩展它的数据库不够强大.我很感激这方面的反馈,所以我可以了解更多……

Ignore the following unless you have a PHP app:

提示1:如果要使用memcache在两台服务器之间共享会话:

确保您回答“是”以“启用memcache会话处理程序支持?”安装PHP memcache客户端并在/etc/php.d/memcache.ini文件中添加以下内容时:

session.save_handler = memcache

在网络服务器1(IP:192.168.0.1)上:

session.save_path="tcp://192.168.0.1:11211"

在网络服务器2上(IP:192.168.0.2):

session.save_path="tcp://192.168.0.1:11211"

技巧2:如果要使用内存缓存在两台服务器之间共享会话并具有故障转移支持:

将以下内容添加到/etc/php.d/memcache.ini文件中:

memcache.hash_strategy = consistent
memcache.allow_failover = 1

在网络服务器1(IP:192.168.0.1)上:

session.save_path="tcp://192.168.0.1:11211,tcp://192.168.0.2:11211"

在网络服务器2上(IP:192.168.0.2):

session.save_path="tcp://192.168.0.1:11211,tcp://192.168.0.2:11211"

笔记:

>这突出了我在原始问题中犯的另一个错误 – 我没有在所有服务器上使用相同的session.save_path.
>在这种情况下,“故障转移”意味着如果一个memcache守护程序失败,PHP memcache客户端将开始使用另一个.即任何在商店中遇到失败会话的人都将被注销.它不是透明的故障转移.

技巧3:如果要使用内存缓存共享会话并具有透明的故障转移支持:

与提示2相同,但您需要将以下内容添加到/etc/php.d/memcache.ini文件中:

memcache.session_redundancy=2

笔记:

>这使得PHP memcache客户端将会话写入2台服务器.您获得冗余(如RAID-1),以便将写入发送到n个镜像,并在镜像上重试失败的get.这意味着用户在一个memcache守护程序失败的情况下不会松开会话.
>镜像写入是并行完成的(使用非阻塞IO),因此速度性能不应随着镜像数量的增加而下降.但是,如果您的memcache镜像分布在不同的计算机上,网络流量将会增加.例如,不再有50%的机会使用localhost并避免网络访问.

>显然,写入复制的延迟可能导致检索旧数据而不是缓存未命中.问题是这对您的申请是否重要?你多久写一次会话数据?

> memcache.session_redundancy用于会话冗余,但还有一个memcache.redundancy ini选项,如果您希望它具有不同级别的冗余,则可以由程序代码使用.
>您需要PHP memcache客户端的最新版本(目前仍处于测试阶段) – Version 3.0.3 from pecl为我工作.

相关文章

文章浏览阅读8.4k次,点赞8次,收藏7次。SourceCodester Onl...
文章浏览阅读3.4k次,点赞46次,收藏51次。本文为大家介绍在...
文章浏览阅读1.1k次。- php是最优秀, 最原生的模板语言, 替代...
文章浏览阅读1.1k次,点赞18次,收藏15次。整理K8s网络相关笔...
文章浏览阅读1.2k次,点赞22次,收藏19次。此网络模型提供了...
文章浏览阅读1.1k次,点赞14次,收藏19次。当我们谈论网络安...