PHP做负载均衡回话保持问题参考

最近一个项目的服务器老是出现Session数据丢失问题,导致用户莫名其妙的退出,原因是太相信我们的运维人员所谓的负载均衡会话保持的概念。会话保持
的原理就是负载均衡通过Cookie来分发那个客户连接被路由到那台后端具体服务器,例如后端有两台服务器,负载均衡将会将所有的请求平均分配对应后端两
台服务器的cookie标识,后面的请求都会路由到具体的某台服务器上。但绝对不是万能的,我们就是因为太相信这个,才导致问题持续了很久没有发现具体的
原因。至于为什么不能保持会话,我到现在还没有想明白,也没有具体追问我们的运营人员。等有时间具体研究,这里只是提醒大家不要假设负载均衡会为你稳定地
保持会话,因为此类问题在用户量越大的时候越容易出现,出现的概率达到1%-2%,这对大规模的实时性项目是不能容忍的,例如在线集体考试。


么在上述问题的前提下,很多朋友首先想到的是Cluster,特别是搞JavaEE开发的人,但内存复制型的Cluster配置还是比较复杂的,效率不一
定能达到我们想象的效果,其Session的恢复机制还是牵涉到存储的问题。在PHP环境下大多数人直接默认采用PHP的文件Session存储策略,我
跟踪了一下PHP的Session创建机制,一下子让人毛色洞开,PHP在接收到一个用户请求时,首先从请求的Cookie里面拿Session
ID,只要拿到,不管三七二十一,就认定这个Session ID了,即使当前没有发现具体的Session存在,它也会为你创建一个对应该Session
ID的会话。不像很多JavaEE应用服务器,只要没有Session,才不管你客户端传过来什么,它都独立会新建一个。PHP就Session处理这一
点,我们就可以做容错形式的集群了,最简单的方法就是让后端的多台服务器共享同一个Session存储区。就这么简单,简单的简直让人不可思议。

那很多人担心的是是否会发生Session存储文件读取锁定、等冲突呢?我的回答是,不会,如果会的话,单台机器也会。


件存储Session最大问题是每次一个请求发生,并且调用了session_start(),都会打开一次该文件,并且读取其中的内容到内存,当然向
Session写也是这样,所以很多对吞吐能力要求高的PHP配置中可能会采用Memcache等内存机制,但可以肯定地说,我们也可以像共享硬盘一样共
享Memcache,其核心的难点应该是如何让Memcache像一个共享存储一样。

一头雾水的问题终于解决了,我们解决这个问题最痛苦的是日志机制不完整,跨部门多,导致发现问题周折,但总算解决了,分享出来供大家参考,不要走我们的老路。

时间: 2024-11-08 15:42:07

PHP做负载均衡回话保持问题参考的相关文章

Windows平台下利用APM来做负载均衡方案 - 负载均衡(下)

概述 我们在上一篇Windows平台分布式架构实践 - 负载均衡中讨论了Windows平台下通过NLB(Network Load Balancer) 来实现网站的负载均衡,并且通过压力测试演示了它的效果,可以说还是非常的理想的.同时我们也收集到了不少的问题,比如说如何在这种分布式的架构下使用Session,NLB中有一台服务器挂掉了会导致对外暴露的地址无法访问,如果实现服务器之间的同步,如果更好的进行热修复等等,还有我们在上一篇中也提到了NLB所提供的功能是非常简单的,为了回答我们前面提到的问题

Nginx做负载均衡时session共享问题详解

用nginx做负载均衡时,同一个IP访问同一个页面会被分配到不同的服务器上,如果session不同步的话,就会出现很多问题,比如说最常见的登录状态. 再者Nginx连接Memcached集群时,Nignx的请求从memcached服务器中根据key获得了value则直接返回value,如果没有获得到value则去MySQL中查询再返回. location / { set $memcached_key "$request_uri"; #设置请求memcached服务器的key memca

nginx tomcat做负载均衡

之前使用nginx做过web反向代理,没有做过负载均衡,今天有个同学需要做tomcat的负载均衡,我也研究下. 一共是2个机器,一个物理机(win7)上面部署2个tomcat,使用不同的端口启动.vm中的虚拟机放(centos)nginx,给tomcat做负载均衡. inux ip: 192.168.37.129 win ip: 192.168.37.1 首先保证两个主机可以互ping,响应的端口开放. nginx上使用80 tomcat1 使用8081 tomcat2使用8080 nginx,

mysql集群一:主从复制,通过mysql-proxy做负载均衡

mysql集群架构方式很多,根据不同的需求做不一样的架构,简单一点的就是mysql的replication,也就是Mysql的复制功能,模式有:master-slaves,master-slaves-slaves,master-master-slaves等可以有多个分层,那么现在我所要说的是master-slaves的模式(其他的模式原理基本都一样),然后再通过mysql官方提供的Mysql-proxy实现读写分离,达到负载均衡的效果. 环境: 主机:master:192.168.1.109,s

nginx在varnish后端做负载均衡,后端tomca获取客户端真实IP

nginx在varnish后端做负载均衡,后端tomca获取客户端真实IP 1.设置nginx配置文件    首先要确定nginx做负载均衡,在安装时把http_realip_module 安装上了.    查看方法: /usr/local/nginx/sbin/nginx -V   配置nginx.conf    vim /usr/local/nginx/conf/nginx.conf   加入 set_real_ip_from 192.168.88.131;      重新加载nginx:

使用haproxy做负载均衡时保持客户端真实的IP

haproxy里添加设置项 option forwardfor option httpclose apache的日志格式修改 LogFormat "MY IP=%{X-Forwarded-For}i AAA %h %u %t" cookie_log 这样%{X-Forwarded-For} 就可以显示用户的真实IP,而%h是显示做负载均衡的haproxy的IP. 如果是公司内部系统都是为这个正式IP另外定义了一个名字ORIG_CLIENT_IP,则可以修改转发的名字. option f

使用nginx做负载均衡造成的session共享问题

PHP服务器有多台,用nginx做负载均衡,这样同一个IP访问同一个页面会被分配到不同的服务器上,如果session不同步的话,就会出现很多问题,比如说最常见的登录状态,下面提供了几种方式来解决session共享的问题: 1.不使用session,换用cookie session是存放在服务器端的,cookie是存放在客户端的,我们可以把用户访问页面产生的session放到cookie里面,就是以cookie为中转站.你访问web服务器A,产生了session然后把它放到cookie里面,当你的

tomcat 7 用mod_jk做 负载均衡

在Win7中使用apache为tomcat做负载均衡,各组件及版本如下: 两个tomcat v 7.0.57 一个apache v 2.2.14 一个mod_jk v 1.2.33(for windows i386 httpd 2.2.x),下载地址:http://archive.apache.org/dist/tomcat/tomcat-connectors/jk/binaries/windows/tomcat-connectors-1.2.33-windows-i386-httpd-2.2.

Nginx+tomcat 做负载均衡

架构描述 前端一台nginx服务器做负载均衡器,后端放N台tomcat组成集群处理服务,通过nginx转发到后面(注:没做动静分离,静态动态全部都转给tomcat) 优点:实现了可弹性化的架构,在压力增大的时候可以临时添加tomcat服务器添加到这个架构里面去 一,配置nginx 1,  下载包 Wget http://sysoev.ru/nginx/nginx-0.6.32.tar.gz ftp://ftp.csx.cam.ac.uk/pub/software/programming/pcre