是否可以使用一组memcache守护进程来更有效地共享会话?

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

我replace了:

 session.save_handler = files 

有:

 session.save_handler = memcache 

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

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

并在奴隶networking服务器上,我设置session.save_path指向主:

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

工作完成,我testing了它,它工作。 但…

显然,使用memcache意味着会话在RAM中,如果一台机器重启或memcache守护进程崩溃,会丢失 – 我有点担心,但我更担心两个networking服务器之间的networkingstream量(尤其是我们扩大规模),因为每当有人负载均衡到奴隶的networking服务器,他们的会话将通过networking从主networking服务器获取。 我想知道是否可以定义两个save_paths以便机器在使用networking之前查看自己的会话存储。 例如:

主:

 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%的时间节省networkingstream量。 或者,这种技术仅用于故障转移(例如,当一个memcache守护进程不可达时)?

注意 :我没有真正具体询问memcache复制 – 更多关于PHP memcache客户端是否可以在池中每个memcache守护进程内达到峰值的信息,返回一个会话(如果find一个会话),并且只会创build一个新会话(如果找不到一个会话在所有的商店。 正如我正在写这个,我想我从PHP问一点,哈哈…

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

免责声明:如果你不经过大量的testing,就会生气地听我说,并且得到合格的人的第二意见 – 我是这个游戏的新手

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

在做了一些testing和研究之后,我得出结论:你可以使用memcache在服务器之间共享会话,但是你可能不想这么做 – 它似乎并不stream行,因为它不能像使用共享数据库不那么健壮。 我会很感激这个反馈,所以我可以了解更多…

除非你有一个PHP应用程序,否则忽略以下内容:


技巧1:如果您想使用memcache在两台服务器之间共享会话,请执行以下操作:

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

 session.save_handler = memcache 

在networking服务器1(IP:192.168.0.1)上:

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

在networking服务器2上(IP:192.168.0.2):

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

技巧2:如果您想使用memcache在两台服务器之间共享会话,并具有故障转移支持,请执行以下操作:

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

 memcache.hash_strategy = consistent memcache.allow_failover = 1 

在networking服务器1(IP:192.168.0.1)上:

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

在networking服务器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:如果您想使用memcache共享会话,并具有透明的故障转移支持:

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

 memcache.session_redundancy=2 

笔记:

  • 这使得PHP memcache客户端将会话写入2台服务器。 你得到了冗余(比如RAID-1),这样写入就会被发送到n个镜像,失败的get's被镜像重试。 这意味着在一个memcache守护进程失败的情况下,用户不会松动他们的会话。
  • 镜像写入是并行完成的(使用非阻塞IO),所以速度性能不应该随着镜像数量的增加而下降。 但是,如果您的memcache镜像分布在不同的机器上,networkingstream量将会增加。 例如,使用本地主机和避免networking访问的可能性不会再有50%。
    • 显然,写入复制的延迟可能会导致检索旧数据,而不是caching未命中。 问题是这对您的应用程序是否重要? 你多久写一次会话数据?
  • memcache.session_redundancy用于会话冗余,但也有一个memcache.redundancy ini选项,可供PHP应用程序代码使用,如果您希望它具有不同级别的冗余。
  • 您需要PHP memcache客户端的最新版本(目前仍处于testing阶段 ) – pecl版本3.0.3为我工作。

Re:上面的提示3(对于碰巧遇到这个问题的任何人,通过谷歌),至less目前为了这个工作,你必须使用memcache.session_redundancy = N+1为您的池中的N个服务器 ,至less这似乎是工作的最低阈值。 (在debian stable上用php 5.3.3testing,pecl memcache 3.0.6,两个memcached服务器, session_redundancy=2会在save_pathclosures第一个服务器时save_pathsession_redundancy=3正常。

这似乎是在这些错误报告中捕获的:

与上面显示的php.ini设置一起确保以下设置:

 memcache.allow_failover = 1 memcache.hash_strategy = 'consistent' 

然后,您将获得完整的故障转移和客户端冗余。 使用这种方法的警告是,如果memcached在本地主机上,那么在php memcache客户端尝试在session.save_path中指定的池中的下一个服务器之前总会有读取未命中

请记住,这会影响在您的Web服务器上运行的php memcache客户端的全局设置。

memcached不能这样工作(如果我错了,请纠正我)

如果您希望应用程序具有冗余会话存储,则必须创build一些可以更改/添加/删除条目到两个memcached实例的内容。 memcached不处理这个,它提供的唯一的东西就是密钥哈希存储。 所以没有复制,同步,没有什么,虚无</s> </s>。

我希望在这个问题上我没有错,但是这就是我所知道的memcached,自从我触及它几年以来。

memcached不会复制,但是repcached (修补过的memcached)。 但是,如果您已经在使用mysql,那么为什么不直接在master-master复制中使用其复制function,并获得完整数据复制的好处。

C。