多台服务器共享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)
全栈程序员-站长的头像全栈程序员-站长


相关推荐

  • Python 反转字符串_python输出字符串

    Python 反转字符串_python输出字符串python字符串反转方法Helloeveryone,inthistutorialwe’llseedifferentwaystoreversestringinPython.大家好,在本教程中,我们将看到在Python中反转字符串的不同方法。Asweknow,wecanreversealistusingreverse()methodbutPy…

    2022年10月24日
    0
  • 使用cef3开发的浏览器不支持flash问题的解决

    使用cef3开发的浏览器不支持flash问题的解决开发浏览器时遇到了flash的问题,网上搜了下,解决的方法基本是加npapi、ppapi,一开始奔着ppapi去的,没有解决,后来用的npapi,在项目的output下新建plugins文件夹,将NPSWF32_22_0_0_209.dll拷入到文件夹下。问题解决。

    2022年6月9日
    33
  • Kali Linux 系统安装详细教程(VMware14)「建议收藏」

    Kali Linux 系统安装详细教程(VMware14)「建议收藏」文章出自个人博客https://knightyun.github.io/2018/04/15/kali-linux-install,转载目录一、KaliLinux介绍 1、Linux2、Kali二、虚拟机安装与配置 1、下载2、安装配置三、Kali系统安装与配置一、KaliLinux介绍1、Linux引用一下百度百科: Linux是一套免费使用和自由传播的类Unix操作系统,是一个基于PO…

    2022年6月5日
    31
  • Python字符串删除、截取,删除某个字符、片段[通俗易懂]

    Python字符串删除、截取,删除某个字符、片段[通俗易懂]各种字符串删除操作删除字符串某一片段删除、替换指定字符删除字符串某一片段使用字符串切片,如:str1=’1abcd.txt’str2=str1[1:-4]print(str2)Out:’abcd’索引[x,y],当某一项为0时,可以省略不写索引[x,y],当某一项为负数时,代表倒数索引删除、替换指定字符使用replace(),如:删除:replace(‘指定字符’,”),是通过将指定字符替换为空实现的str1=’abkcd’str2=str1.replac

    2022年6月3日
    45
  • 智能家居趋势[通俗易懂]

    智能家居趋势[通俗易懂]光纤到户,宽带提速,提升3G网络的覆盖面和服务质量,推动年内发放4G牌照,全面推进三网融合,年内在试点基础上向全国推广……种种政策告诉我们,互联网将会覆盖全球,上传、下载速度将会大幅度提高,信息时代的到来已是大势所趋。作为对于互联网依赖程度比较深的智能家居,在这样一场浪潮中,将会成为最大的受益者之一,尤其,在目前的经济形势以及技术发展形势中,智能家居代表的已经是新一轮信息技术革命中,价值最大的产业…

    2022年6月22日
    33
  • HS数据库_hsqldb

    HS数据库_hsqldb前言在对dao层写测试类的时候,我们需要一个测试数据库,一般我们会是专门建立一个真实的测试数据库,但是有了HSQLDB事情就变得简单了起来。正题一、简介:hsql数据库是一款纯Java编写的免费数据库,许可是BSD-style的协议,如果你是使用Java编程的话,前言在对dao层写测试类的时候,我们需要一个测试数据库,一般我们会是专门建立一个真实的测试数据库,但是有了HSQLDB事情就变…

    2022年9月22日
    0

发表回复

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

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