大规模网站sesson会话保持思路及实践配置
Posted vijayfly
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了大规模网站sesson会话保持思路及实践配置相关的知识,希望对你有一定的参考价值。
1.需求:
请教个问题:
我用lvs的rr模式,(考虑过 ipvsadm -p,但是这样就失去了负载均衡的意义感觉),后端有10台web,用一台memcached专门用于存储session文件,但是现在问题是,客户端请求第一次被轮训到 web A服务器,A可以获取到本次回话的session ID,从而可以从memcached里通过sessionID获取到这次回话的session ID,而第二次请求轮训到B服务器,因为第一次请求没经过web B,他不知道session ID啊,所以他从memcached中获取不到session ID。这就是现在遇到的问题。做了基于cookie的sessionID,但是考虑到客户端会禁用cookie,所以又难办了。 有啥办法呢? 谁能帮忙解答下.
2.解决方案:
a.中小企业方案:
把所有应用服务器sesson会话统一放到memcached里,web读取都读共享memcached,就保持一致了。php程序,php.ini里配,当然了,lvs -p,nginx ip_hash等等也是部分网友实现的思路。
企业集群共享会话实现架构图如下:
b.门户网站方案:
基于client cookie的sessionID是门户网站经常采用的,效率高,安全性一般,另外cookie的数量很有限,如果不够,可以通过多值cookie解决,例如淘宝就是这么干的。
企业集群clinet会话实现架构图如下:
3.大规模网站sesson会话共享思路及实践配置
可以直接用memcached来作PHP的session.save_handler解决sesson共享问题 1. 安装memcached服务端软件 略,见老男孩培训相关视频教程或谷歌搜下安装。 注意:memcached用libevent来作事件驱动,所以要先安装libevent。 2. 安装memcache客户端件 略,见老男孩培训相关视频教程或谷歌搜下安装。 3. 真正配置的开始 修改配置文件,在php.ini中全局设置: web集群session共享存储设置: 默认php.ini中session的类型和配置路径: #session.save_handler = files #session.save_path = "/tmp" 修改成如下配置: session.save_handler = memcache session.save_path = "tcp://10.0.0.18:11211" 提示: 1)10.0.0.18:11211 为memcached数据库缓存的IP及端口。 2)上述适合LNMP,LAMP环境。 3)memcached服务器也可以是多台通过hash调度。 4、用memcached来存储session特点: 优点: 1)读写速度上会比普通files时快很多。 2)可以解决多个服务器共用session的难题。 缺点: 1)session数据都保存在memory中,持久化方面有所欠缺,但对session数据来说不是问题。 2)单点,部署多台,也无法数据同步。通过hash算法分配依然有sesson丢失的问题。 5、大规模企业解决思路: 2)可以用其他的持久化系统存储sessons,例如:redis,ttserver,替代memcached。 3)高性能高并发场景,cookies效率比session要好很多,因此,大网站都会用cookies解决会话共享问题。 4)有初级运维网友通过牺牲LB的负载均衡的策略实现,例如:lvs -p,nginx ip_hash等,这些不是好的方法。
以上是关于大规模网站sesson会话保持思路及实践配置的主要内容,如果未能解决你的问题,请参考以下文章
apache反向代理tomcat的两个代理模式及相关的会话保持配置示例