多台服务器共享session问题

多台服务器共享session问题

在现在的大型网站中,如何实现多台服务器中的session数据共享呢

    当使用多台服务器架设成集群之后,我们通过负载均衡的方式,同一个用户(或者ip)访问时被分配到不同的服务器上,假设在A服务器登录,如果在B服务器拿不到用户的登录信息session。这时访问到B服务器时就出现未登录情况。

    所以如何对于这种情况做到共享session至关重要。

   以下给出一些解决方案:(来源网络以及自己的一些见解)

  1.通过数据库mysql共享session

     a.采用一台专门的mysql服务器来存储所有的session信息。

      用户访问随机的web服务器时,会去这个专门的数据库服务器check一下session的情况,以达到session同步的目的。 

      缺点就是:依懒性太强,mysql服务器无法工作,影响整个系统;

    b.将存放session的数据表与业务的数据表放在同一个库。如果mysql做了主从,需要每一个库都需要存在这个表,并且需要数据实时同步。

    缺点:用数据库来同步session,会加大数据库的负担,数据库本来就是容易产生瓶颈的地方,如果把session还放到数据库里面,无疑是雪上加霜。上面的二种方法,第一点方法较好,把放session的表独立开来,减轻了真正数据库的负担 。但是session一般的查询频率较高,放在数据库中查询性能也不是很好,不推荐使用这种方式。

2.通过cookie共享session

   把用户访问页面产生的session放到cookie里面,就是以cookie为中转站。

   当访问服务器A时,登录成功之后将产生的session信息存放在cookie中;当访问请求分配到服务器B时,服务器B先判断服务器有没有这个session,如果没有,在去看看客户端的cookie里面有没有这个session,如果cookie里面有,就把cookie里面的sessoin同步到web服务器B,这样就可以实现session的同步了。 

   缺点:cookie的安全性不高,容易伪造、客户端禁止使用cookie等都可能造成无法共享session。

3.通过服务器之间的数据同步session

  使用一台作为用户的登录服务器,当用户登录成功之后,会将session写到当前服务器上,我们通过脚本或者守护进程将session同步到其他服务器上,这时当用户跳转到其他服务器,session一致,也就不用再次登录。

  缺陷:速度慢,同步session有延迟性,可能导致跳转服务器之后,session未同步。而且单向同步时,登录服务器宕机,整个系统都不能正常运行。

4.通过NFS共享Session

  选择一台公共的NFS服务器(Network File Server)做共享服务器,所有的Web服务器登陆的时候把session数据写到这台服务器上,那么所有的session数据其实都是保存在这台NFS服务器上的,不论用户访问那太Web服务器,都要来这台服务器获取session数据,那么就能够实现共享session数据了。

  缺点:依赖性太强,如果NFS服务器down掉了,那么大家都无法工作了,当然,可以考虑多台NFS服务器同步的形式。

5.通过memcache同步session

  memcache可以做分布式,如果没有这功能,他也不能用来做session同步。他可以把web服务器中的内存组合起来,成为一个”内存池”,不管是哪个服务器产生的sessoin都可以放到这个”内存池”中,其他的都可以使用。 

  优点:以这种方式来同步session,不会加大数据库的负担,并且安全性比用cookie大大的提高,把session放到内存里面,比从文件中读取要快很多。 

  缺点:memcache把内存分成很多种规格的存储块,有块就有大小,这种方式也就决定了,memcache不能完全利用内存,会产生内存碎片,如果存储块不足,还会产生内存溢出。 

6.通过redis共享session

  redis与memcache一样,都是将数据放在内存中。区别的是redis会周期性的把更新的数据写入磁盘或者把修改操作写入追加的记录文件,并且在此基础上实现了master-slave(主从)同步。

   根据实际开发应用,一般选择使用memcache或redis方式来共享session.

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请联系我们举报,一经查实,本站将立刻删除。

发布者:全栈程序员-站长,转载请注明出处:https://javaforall.net/112992.html原文链接:https://javaforall.net

(0)
全栈程序员-站长的头像全栈程序员-站长


相关推荐

  • Centos查看ip地址

    Centos查看ip地址使用远程工具Xshell连接Centos的时候,需要IP地址,查看方式:[root@April~]#ifconfigeth0Linkencap:EthernetHWaddr08:00:28:3B:C8:84inetaddr:192.168.0.41Bcast:192.168.0.255Mask:255.255.255.0…

    2025年7月2日
    2
  • django 自定义过滤器_mvc自定义过滤器

    django 自定义过滤器_mvc自定义过滤器前言虽然DTL给我们内置了许多好用的过滤器。但是有些时候还是不能满足我们的需求。因此Django给我们提供了一个接口,可以让我们自定义过滤器,实现自己的需求。自定义过滤器首先在某个app中,创建

    2022年8月7日
    5
  • ostringstream的使用方法

    ostringstream的使用方法ostringstream的使用方法【本文来自】http://www.builder.com.cn/2003/0304/83250.shtmlhttp://www.cppblog.com/alanto

    2022年7月4日
    34
  • 怎样用matlab插值得到函数表达式

    怎样用matlab插值得到函数表达式
    x=[1:1:10];
    y=[2:2:20];
    pp=interp1(x,y,’spline’,’pp’)
    breaks=pp.breaks
    coefs=pp.coefs

    说明:
    interp1得到的函数其实是分段函数。
    函数的全部信息全部都在pp里
    让我们看一下其breaks分量和coefs分量,他们蕴含着函数表达式,具体涵义如下:
    假设co

    2022年5月23日
    35
  • js删除数组中的一个元素_js数组包含某个元素

    js删除数组中的一个元素_js数组包含某个元素目录第一种:删除最后一个元素pop删除slice删除splice删除for删除length删除第二种:删除第一个元素shift删除slice删除splice删除第三种:删除数组中某个指定下标的元素splice删除for删除第四种:删除数组中某个指定元素splice删除filter删除forEach、m…

    2022年10月1日
    3
  • java发送邮件带url、html

    java发送邮件带url、htmljava发送邮件,内容包含URL、HTML,并且对URL中文编码,URL的有效性校验。

    2022年5月14日
    34

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注

关注全栈程序员社区公众号