web集群时session共享
一、为什么要共享session?
(1)首先要想知道为什么要session共享,必须先了解一下session原理,这样有助于我更好的了解session的共享,
默认情况下,php的session文件是保存在磁盘文件中。在php.ini配置文件中的配置项如下:
session.save_handler = files
session.save_path = "N;/path"
第一个配置项是指定使用files(文件形式)存储session数据。
第二个参数指定保存的路径。N表示生成多少级目录(不放到一个目录下,分散到多个磁盘目录中去)
session原理详解链接 http://www.cnblogs.com/wangtao_20/archive/2011/02/16/1955659.html
(2)我的理解是单一后端服务器是不存在session共享问题的。因为session数据保存在一台服务器上。但是做了web集群后,因为通过负载均衡,同一个IP访问同一个页面会被分配到不同的服务器上,
如果session不同步的话,一个登录用户,一会是登录状态,
一会又不是登录状态。这样子登录保存的session数据就需要进行共享了。
下图来自互联网:
二、session共享的方法
(1)session保存在数据库
我理解本质是:自己写程序(php,java都可以实现,反正是保存在数据库中)模拟实现session的机制。
具体为,把以前存储在文件中的session数据存储到数据库中去,那么这样做,其实就不用到php内置的session机制了(像session_start()之类的函数都不需要去用了)。写程序要模拟的是,从数据库拿session数据,约定什么情况下数据过期了然后自动清理,
这里是指删除数据库中的行。保存在文件中的时候,php有垃圾回收机制会去自动清理过期的session文件。
多服务器session同步的两种方法:
1,用一个低端电脑建个数据库专门存放web服务器的session,或者,把这个专门的数据库建在文件服务器上,用户访问web服务器时,会去这个专门的数据库check一下session的情况,以达到session同步的目的。
2,这种方法是把存放session的表和其他数据库表放在一起,如果MySQL也做了集群了话,每个mysql节点都要有这张表,并且这张session表的数据表要实时同步。
优点:扩展性很强,可以随意增加WEB而不受影响。放在数据库里面安全方面好。
缺点:用数据库来同步session,访问量小没有问题,如果大流量网站的话会加大数据库的压力,因为所有对session的操作都要进行数据库的操作。数据库本来就是容易产生瓶颈的地方,
如果把session还放到数据库里面,无疑是雪上加霜。高并发访问的情况下,会出现很大的性能问题。
(2)session数据存储到客户端的cookie中
这样子,就不需要涉及到数据共享了。a客户端请求的时候,原来生成在服务器的数据生成到浏览器的cookie中,根据cookie中的数据识别用户。
php由原来的”从本地(也就是服务器)磁盘上读取session数据”转变为”浏览器的cookie中读取数据”,这样子,
在多台php服务器负载均衡的情况下,即便第一秒请求是a服务器,第二秒请求是b服务器,都不需要管哪台服务器了。反正都是读取客户端上的cookie数据。
一般是把session数据按照自己定义的加密规则,加密后后存在cookie中。
优点:服务器的压力减小了,因为session数据不存在服务器磁盘上。根本就不会出现session读取不到的问题。
缺点:网络请求占用很多。每次请求时,客户端都要通过cookie发送session数据给服务器;另外,浏览器对cookie的大小存在限制。每个浏览器限制是不同的。
第二方面是安全问题:把session数据放到客户端,一般session中存的都是重要性数据(帐号、昵称、用户id等),会存在安全问题。
(3)用Nosql数据库Redis或者memcache同步session,基于内存存储数据的性能很高,用户并发量很大的时候尤其合适
主要是利用内存的数据读取速度是很快的,与磁盘读取的速度不是一个数量级的。
使用内存存储:方便统计在线人数,内存的速度比磁盘访问快、内存数据库系统能够控制内存中的过期数据自动失效(刚好符合session过期需要)。
Redis或memcache可以做分布式,如果没有这功能,他也不能用来做session同步。他可以把web服务器中的内存组合起来,成为一个"内存池",不管是哪个服务器产生的sessoin都可以放到这个"内存池"中,其他的都可以使用。
优点:以这种方式来同步session,不会加大数据库的负担,并且安全性比用cookie大大的提高,把session放到内存里面,比从文件中读取要快很多。
缺点:redis或memcache把内存分成很多种规格的存储块,有块就有大小,这种方式也就决定了,memcache不能完全利用内存,会产生内存碎片,如果存储块不足,还会产生内存溢出。
==========================我是知识的搬运工========================