好的,所以我有一个非常罕见的负载平衡PHP网站的独特场景.无赖是 - 它不习惯负载平衡.现在我们开始遇到问题......
目前唯一的问题是PHP会话.当然没有人首先想到这个问题所以PHP会话配置保持默认值.因此,两个服务器都有自己的一小部分会话文件,并且有一个用户将下一个请求抛给另一个服务器,因为它没有在第一个服务器上创建的会话.
现在,我一直在阅读PHP手册,了解如何解决这种情况.在那里我发现了很好的功能session_set_save_handler()
.(而且,巧合的是,关于SO的这个主题)整洁.除了我必须在网站的所有页面中调用此功能.未来页面的开发人员也必须记住一直调用它.感觉有点笨拙,更不用说可能违反了十几种最好的编码习惯.如果我可以翻转一些全局配置选项和Voilà会更好- 会话全部神奇地存储在DB或内存缓存中.
关于如何做到这一点的任何想法?
auto_prepend
指出的选项看起来很有希望 - 但这会让人觉得重新发明轮子.:P
auto_prepend
选项session_set_save_handler()
在每个脚本中插入一个调用并编写我自己的数据库容器,可能会调用以memcached
获得更好的性能.很公平.
是否还有一些方法可以避免自己编码?像一些着名且经过良好测试的PHP插件?
很久以后添加了很多:这就是我最终的方式:如何在PHP + MySQL中正确实现自定义会话持久化?
此外,我只是在所有页面中手动包含会话处理程序.
您可以将PHP设置为处理数据库中的会话,因此所有服务器共享相同的会话信息,因为所有服务器都使用相同的数据库.
可以在这里找到一个很好的教程.
我们处理这个的方式是通过memcached.所需要的只是更改php.ini,类似于以下内容:
session.save_handler = memcache session.save_path = "tcp://path.to.memcached.server:11211"
我们使用AWS ElastiCache,因此服务器路径是一个域,但我确信它对于本地memcached也是类似的.
此方法不需要任何应用程序代码更改.
您没有提到您用于负载平衡的技术(软件,硬件等); 但无论如何,您的问题的解决方案是在负载均衡器上使用"粘性会话".
总之,这意味着当来自"新"访问者的第一个请求进入时,会从群集中为他们分配一个特定的服务器:然后将会话生命周期的所有未来请求定向到该服务器.实际上,这意味着在单个服务器上编写的应用程序可以扩展到平衡环境,代码更改为零/很少.
如果您使用的是硬件平衡器,例如Radware设备,则粘性会话将配置为群集设置的一部分.硬件设备通常会为您提供更细粒度的控制:例如,为新用户分配哪个服务器(他们可以检查健康状况等,并选择最健康/最少使用的服务器),以及更多控制服务器时发生的情况失败并退出群集.硬件平衡器的缺点是成本 - 但它们是值得的imho.
至于软件平衡器,它取决于您使用的是什么.对于Apache,在mod_proxy上有一个stickysession属性 - 并且有很多文章通过谷歌来使这个与php会话一起工作(例如)
编辑:从原始问题后发布的其他评论中,听起来您的"平衡"是通过循环DNS完成的,因此上述内容可能不适用.我将不再进一步评论并开始对抗循环dns的火焰.