zoukankan      html  css  js  c++  java
  • 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不能完全利用内存,会产生内存碎片,如果存储块不足,还会产生内存溢出。

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

      

        

  • 相关阅读:
    Atiitt 关于不可替代性的思索 目录 1.1. 不可替代性与 这份工作谁都能干无关 1 1.2. 不可替代性未必很好,因为其岗位可能很累或者收入很低 1 1.3. 不可替代性与报酬无关 1 2
    PetShop4.0视频讲解 通过简单案例理解petshop4.0的工厂模式
    PetShop4.0视频教程系列 简单实例讲解PetShop4.0的缓存机制
    视频讲解Petshop4.0消息处理概述
    写给自学asp.net的年轻人,特别是大学生
    ASP.NET学习者的必修课——PetShop4.0
    求解【DataBinding:“System.Data.DataRowView”不包含名为“ID”的属性】
    程序员,当你写程序写累了怎么办。
    Limit.exe
    都是�(65533)惹得祸~
  • 原文地址:https://www.cnblogs.com/shijy-1990/p/5952742.html
Copyright © 2011-2022 走看看