最近一个项目的服务器老是出现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像一个共享存储一样。

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

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

  1. RabbitMQ3.6.3集群搭建+HAProxy1.6做负载均衡

    目录 [TOC] 1.基本概念 1.1.RabbitMQ集群概述   通过 Erlang 的分布式特性(通过 magic cookie 认证节点)进行 RabbitMQ 集群,各 RabbitMQ 服 ...

  2. 死磕nginx系列--使用nginx做负载均衡

    使用nginx做负载均衡的两大模块: upstream 定义负载节点池. location 模块 进行URL匹配. proxy模块 发送请求给upstream定义的节点池. upstream模块解读 ...

  3.  RabbitMQ3.6.3集群搭建+HAProxy1.6做负载均衡

    目录 目录 1.基本概念 1.1.RabbitMQ集群概述 1.2.软件负载均衡器HAProxy 2.RabbitMQ的配置步骤 2.1.安装 Erlang.RabbitMQ 2.2.修改 /etc/ ...

  4. 消费者用nginx做负载均衡,提供者用zookeeper自带功能实现负载均衡

    公司的项目基于阿里的Dubbo微服务框架开发.为了符合相关监管部门的安全要求,公司购买了华东1.华东2两套异地服务器,一套是业务服务器,一套是灾备服务器.准备在这两套服务器上实现Dubbo的分布式服务 ...

  5. nginx反向代理做负载均衡以及使用redis实现session共享配置详解

    1.为什么要用nginx做负载均衡? 首先我们要知道用单机tomcat做的网站,比较理想的状态下能够承受的并发访问在150到200, 按照并发访问量占总用户数的5%到10%技术,单点tomcat的用户 ...

  6. 在Linux上使用Nginx为Solr集群做负载均衡

    在Linux上使用Nginx为Solr集群做负载均衡 在Linux上搭建solr集群时需要用到负载均衡,但测试环境下没有F5 Big-IP负载均衡交换机可以用,于是先后试了weblogic的proxy ...

  7. 使用nginx做负载均衡的session共享问题

    查了一些资料,看了一些别人写的文档,总结如下,实现nginx session的共享PHP服务器有多台,用nginx做负载均衡,这样同一个IP访问同一个页面会被分配到不同的服务器上,如果session不 ...

  8. tomcat 7 用mod_jk做 负载均衡

    在Win7中使用apache为tomcat做负载均衡,各组件及版本如下: 两个tomcat v 7.0.57 一个apache v 2.2.14 一个mod_jk v 1.2.33(for windo ...

  9. nginx做负载均衡配置文件

    nginx做负载均衡是在反向代理的基础上做的,代码如下: ## Basic reverse proxy server ## ## Apache backend for www.baidu.com ## ...

随机推荐

  1. The Triangle 经典DP

    题意:数塔问题 思路:1:递归.2:递推.3:记忆化搜索.<刘汝佳,第九章> #include<iostream> #include<cstdio> #includ ...

  2. Android安全讲座第九层(二) 内存dump

    近来android上越来越多的应用对自身的保护机制加强了重视,主要表现在几个方面. 1 dex加壳 2 so加壳 3 dex藏在so中,在适当的时候释放. 这是技术上一个进步,并且还有一些专业的公司提 ...

  3. 线程pthread_create()、pthread_exit()、pthread_join()、pthread_cancel()

  4. Fox And Two Dots

    B - Fox And Two Dots Time Limit:2000MS     Memory Limit:262144KB     64bit IO Format:%I64d & %I6 ...

  5. MySQL:MySQL的基本操作

    1.数据库登录 格式:mysql -h主机地址 -u用户名 -p用户密码 -P端口 -D数据库 -e “SQL内容” [root@wulaoer ~]# mysql -uroot -p  2.修改密码 ...

  6. android4.0 的图库Gallery2代码分析(三) 之Applition的初始化准备

    Applition的初始化准备 图库的一切动作都明显地起源于Application.这是区别与其他那种感觉不到Application存在,仅仅感觉到Activity存在的简单应用的一个特点. 图库的a ...

  7. CodeForces 660D Number of Parallelograms

    枚举两点,确定一条线段,计算每条线段的中点坐标. 按线段中点坐标排个序.找出每一种坐标有几个. 假设第x种坐标有y个,那么这些线段可以组成y*(y-1)/2种平行四边形. 累加即可. #include ...

  8. 配置 nginx location 实时查看 php-fpm 的状态

    在Nginx.conf 里配置 location ~ ^/status$ { include fastcgi_params; fastcgi_pass 127.0.0.1:9000; fastcgi_ ...

  9. URL中有中文字符,转码方法

    服务端返回的urlString里面有时含有中文,使用 [NSURL URLWithString:urlString]生成URL对象时,iOS客户端不能正确进行网络请求,网上找到的URLEncode方法 ...

  10. python mysql 2014 Commands out of sync; you can't run this command now

    这个问题出现再 mysql和c  的api. 简单的解决方法是不使用api直接把整个连接和命令传过去. 例如,cmd = 'mysql -h 192.168.32.210 -P 3316 -u bfd ...