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不能完全利用内存,会产生内存碎片,如果存储块不足,还会产生内存溢出。

    ==========================我是知识的搬运工======================== 

  

 

 

    

 

posted @ 2016-10-12 18:56  ″记录点滴  阅读(2639)  评论(0编辑  收藏  举报