最近一个项目的服务器老是出现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. 计算n!的位数<Math>

    题意:如题目. 方法一:<TLE> * 可设想n!的结果是不大于10的M次幂的数,即n!<=10^M(10的M次方),则不小于M的最小整数就是 n!的位数,对 * 该式两边取对数,有 ...

  2. (转) hadoop 一个Job多个MAP与REDUCE的执行

    http://blog.csdn.net/chaoping315/article/details/6221440 在hadoop 中一个Job中可以按顺序运行多个mapper对数据进行前期的处理,再进 ...

  3. Android学习之Service(1)--->Started方式

    界面退出后进程程序还在运行,不会被杀死,如音乐播发器.后台下载等 注:本文只讨论Started方式 main.xml代码分析 <?xml version="1.0" enco ...

  4. Java中的随机数生成器:Random,ThreadLocalRandom,SecureRandom

    Java中的随机数生成器:Random,ThreadLocalRandom,SecureRandom 文中的 Random即:java.util.Random,ThreadLocalRandom 即: ...

  5. DataGridView如何实现列标头带数据筛选功能,就象Excel高级筛选功能一样

    '近日有本论坛网友问:DataGridView如何实现列标头带数据筛选功能,就象Excel高级筛选功能一样 '今晚正好闲着没事,加之以前也没用到过这个需求,所以就写了个模拟功能,供各位坛友酌情参考. ...

  6. WEKA使用教程(经典教程转载)

    http://blog.csdn.net/yangliuy/article/details/7589306 WEKA使用教程(经典教程转载) 标签: lift算法csv数据挖掘class任务 2012 ...

  7. bzoj 3879 虚树

    题目大意: 给一个字符串,多次询问k个后缀,求它们两两间LCP长度总和 分析: 转化为后缀树,用虚树求 注意: 后缀树中代表后缀的点都是叶子节点 题目中取模并没有卵用 #include <cst ...

  8. Java——异常谜题

    1.谜题36  try和finally语句,代码如下,判断输出 public class Indecisive { public static void main(String[] args) { S ...

  9. (中等) Hiho 1232 Couple Trees(15年北京网络赛F题),主席树+树链剖分。

    "Couple Trees" are two trees, a husband tree and a wife tree. They are named because they ...

  10. Nginx 虚拟主机下支持Pathinfo并隐藏入口文件的完整配置

    server { listen 80; server_name zuqiu.com; # 设置你的域名 index index.html index.htm index.php; root D:/wn ...