分布式中的共享session

 费德  2016/06/08 23:24  146 次

一、session的本质
先摘录一段来自其他同行的博客片段介绍下session:

session被用于表示一个持续的连接状态,在网站访问中一般指代客户端浏览器的进程从开启到结束的过程。session其实就是网站分析的访问(visits)度量,表示一个访问的过程。

session的常见实现形式是会话cookie(session cookie),即未设置过期时间的cookie,这个cookie的默认生命周期为浏览器会话期间,只要关闭浏览器窗口,cookie就消失了。实现机制是当用户发起一个请求的时候,服务器会检查该请求中是否包含

sessionid,如果未包含,则系统会创造一个名为JSESSIONID的输出 cookie返回给浏览器(只放入内存,并不存在硬盘中),并将其以HashTable的形式写到服务器的内存里面;当已经包含sessionid是,服务端会检查找到与该session相匹配的信息,如果存在则直接使用该sessionid,若不存在则重新生成新的 session。这里需要注意的是session始终是有服务端创建的,并非浏览器自己生成的。 但是浏览器的cookie被禁止后session就需要用get方法的URL重写的机制或使用POST方法提交隐藏表单的形式来实现。

二、session的共享问题

首先我们应该明白,为什么要实现共享,如果你的网站是存放在一个机器上,那么是不存在这个问题的,因为会话数据就在这台机器,但是如果你使用了负载均衡把请求分发到不同的机器呢?这个时候会话id在客户端是没有问题的,但是如果用户的两次请求到了两台不同的机器,而它的session数据可能存在其中一台机器,这个时候就会出现取不到session数据的情况,于是session的共享就成了一个问题。
业内通用解决方法为:将session保存到memcache服务器(以php为例)
这样的做的原因的是,memcached是高并发的缓存软件,相比于session的文件存储速度快的多得多,这里我们简单的介绍下两种设置session存储在memcached服务器中的方法。
打开 php.ini 文件,修改下面两个参数:

session.save_handler = memcache  
session.save_path = "tcp://Mem服务器1:端口号,tcp://Mem服务器2:端口号..."  

方式二:
在 php 文件中使用 ini_set 函数,进行配置,此方法会解决共享服务器的 php 的配置问题

<?php  
....  
ini_set("session.save_handler", "memcache");  
ini_set("session.save_path", "tcp://Mem服务器1:端口号,tcp://Mem服务器2:端口号...");  
....  

 作者:费德

少年费德的奇幻漂流

本博客如无特殊说明皆为原创,转载请注明来源:分布式中的共享session

添加新评论