SESSION共享解决方案探讨
session共享方案一般是,当有多台php服务器的时候需要到。
Php 默认 session是存储在本地以文件的形式,如果是多台服务器需要解决每一个请求都能拿到session,所以有了session共享方案。
方案一:
将session改为cookie存储到浏览器客户端(按照自定义的加密规则加密后存储,使用时解密)这样就不需要服务器操作什么了,每次都是从cookie中拿数据!
优点:
减少服务器的压力,不需要在服务器端考虑session共享机制
缺点:
网络成本高,每次请求都要将cookie发给服务器,增加贷款成本,如果并发小的请情况下可以考虑。
安全性问题,存储在浏览器客户端本身就不安全
不同浏览器对cookie大小有做限制,甚至还有不启用cookie的浏览器
方案二:(sticky模式)又叫粘性模式
制定一个规则每一个用户只访问固定的服务器,比如user1只访问第一台服务器,user2只访问第二台服务器
具体规则:
1、如果服务器较少比如两台,直接根据奇数偶数的规则分配不同的服务器即可
2、如果服务器众多,同事用户id是int类型(如果不是可以根据用户创建时间) 可以用id进行分段,比如说 userId 从1到10000的用户访问第一台服务器,10000-20000的用户访问第二台服务器,以此类推
有点:
简单方便
缺点:
没有实现真正的负载均衡,如果第一台服务器挂掉了那么本该访问第一台服务器的所有用户是不是都不能访问了,如果你说,1不能访问了,那就判断让他访问2呗,是的这就是负载均衡的目的,但是2上面并没有他的session信息,又要重新登陆了。
方案三:复制模式
定期同步服务器session文件夹内容到不同的服务器上,例如rsync工具
缺点:
速度慢,容易造成同步延迟
优点:简单
方案四:session服务中间层模式
建立单独的session服务器,所有的php服务器(或者java这里之探讨方案不存在语言问题)都去请求这个session服务器即可。
session服务器存储方法:
1、可以以文件的形式存储,也是php的默认存储方式 (并发量大,有待商榷,磁盘是瓶颈)
2、模拟session实现机制,自行开发存储到数据库 (并发量大,有待商榷,数据库的性能并不高)
3、存储memcached redis 等nosql数据库里(推荐)