跨服务器Session共享解决方案(借鉴网络 记录一下)

什么是Session

在web开发中,服务器可以为每个浏览器创建一个会话对象(Session对象)
PS:一个浏览器独占一个Session对象(默认情况下)
因此,在需要保存用户数据时,服务器程序可以把用户数据写到用户浏览器独占的session中,当用户使用浏览器访问其它程序时,其它程序可以从用户的session中取出该用户的数据,为用户服务。

Session和Cookie区别

Cookie是把用户的数据写给用户的浏览器;
Session技术把用户的数据写到用户独占的session中;
Session对象由服务器创建,开发人员可以调用request对象的getSession方法得到session对象。

背景

现如今,随着网站业务规模和访问量的逐步发展,原本由单台服务器、单个域名的迷你网站架构已经无法满足发展需要。此时我们可能会购买更多服务器,并且启用多个二级子域名以频道化的方式,根据业务功能将网站分布部署在独立的服务器上;或通过负载均衡技术 (如:DNS轮询、Radware、F5、LVS等)让多个频道共享一组服务器。OK,头脑中我们已经构思了这样的解决方案,不过进入深入开发后新的技术问题又随之而来:
我们把网站程序分布部署到多台服务器上,而且独立为几个二级域名,由于Session受实现原理的局限,使得我们的网站用户不得不经常在几个频道间来回输入用户名、密码登入,导致用户体验大打折扣;另外,原本程序可以直接从用户 Session变量中读取的资料(如:昵称、积分、登入时间等),因为无法跨服务器同步更新Session变量,迫使开发人员必须实时读写数据库,从而增加了数据库的负担。

结合现实说事

公司的电商系统,现在有2台服务器,且实现了负载均衡,如何让这2台web服务器共享session数据?
session数据默认是以文件的形式保存在web服务器的磁盘上,一般都是用户登录成功的时候,保存session数据。
同一个用户登录后,就会将session保存在某个web服务器上,假设是保存在服务器A上,该用户访问网站的其他页面时,可能请求的就是服务器B,但服务器B上并没有该用户的session文件,这样,就会导致网站误认为该用户未登录,用户的登录状态丢失的问题。归根结底,就是要解决多台web服务器共享session的问题!

网站跨服务器之间的Session共享方案

解决网站跨服务器之间的Session共享方案需求变得迫切起来,最终催生了多种解决方案,下面列举几种较为可行的方案进行对比探讨!

基于数据库的Session共享

sessionid还是利用cookie机制存储到客户端,但session数据却存放在数据库服务器上。(需要建立sessionid和session数据行的对应关系)
但这样做,只适合访问量比较小的网站。如果网站的访问量比较大,对MySQL服务器会造成很大压力。因为每次用户请求页面(即使是刷新页面)都要查询MySQL数据库中的session数据表,进而判断用户的登录状态和读取用户相关信息,势必会对数据库服务器造成很大压力,这样就会降低服务器的响应速度,影响用户体验。

关于数据库首选当然是大名鼎鼎的Mysql数据库,并且建议使用内存表Heap,提高session操作的读写效率。这个方案的实用性比较强,相信大家普 遍在 使用,它的缺点在于session的并发读写能力取决于Mysql数据库的性能,同时需要自己实现session淘汰逻辑,以便定时从数据表中更新、删除 session记录,当并发过高时容易出现表锁,虽然我们可以选择行级锁的表引擎,但不得不否认使用数据库存储Session还是有些杀鸡用牛刀的架势。
PS:针对以上问题 我的理解是 session的实现是基于cookie的 。COOKIE用于识别访问者。所有的session的操作都是对某个访问者单独的操作,像设置session,获取session,删除session,清空session等等

基于Cookie的Session共享

这个方案我们可能比较陌生,但它在大型网站中还是比较普遍被使用。
即用cookie会话机制替代session会话机制,将session数据保存到客户端浏览器的cookie中,这样同一个用户访问同一网站时,无论负载均衡到哪台web服务器,都不用再去服务器请求session数据,而直接获取客户端cookie中的session数据。如此,同一个用户的登录状态就不会丢失了。
但这样做,有三大弊端:
1、把session数据放到客户端的cookie中,一般都是重要数据(如用户id、昵称等),会存在安全问题,但可以将session数据加密、序列化以后,再存放到cookie中,来降低安全风险。
2、浏览器对单个cookie的数据量大小限制为4K左右,因此会存在数据量的限制问题。
3、影响带宽性能,降低了页面的访问速度。在高访问量的情况下,用户每次请求时,都要将客户端cookie中的session数据发送到服务器,同时Cookie化的 Session内容需要进行安全加解密,要占用较多的带宽,进而影响访问速度,服务器带宽成本增高。
PS:个人认为Cookie存在一定的安全性问题,同时用户端浏览器有一定可能性禁用Cookie设置。另外关键性的问题就是二级域名跨域的问题

基于内存数据库的Session共享(redis/memcache)

memcache或redis是基于内存存储数据的,性能很高,尤其是高并发的情况下尤为合适。主要是因为从内存中读取数据要比从磁盘读取数据快很多。
内存数据库还支持数据过期失效的机制,正好与session的过期机制对应,推荐使用redis内存数据库,因为它比memcache支持更多的数据类型,且支持内存数据备份到磁盘。

通过NFS共享Session

选择一台公共的NFS服务器(Network File Server)做共享服务器,所有的Web服务器登陆的时候把session数据写到这台服务器上,那么所有的session数据其实都是保存在这台NFS服务器上的,不论用户访问那太Web服务器,都要来这台服务器获取session数据,那么就能够实现共享session数据了。
缺点:依赖性太强,如果NFS服务器down掉了,那么大家都无法工作了,当然,可以考虑多台NFS服务器同步的形式。

  • 5
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值