多台服务器共享session问题

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

    当使用多台服务器架设成集群以后,咱们经过负载均衡的方式,同一个用户(或者ip)访问时被分配到不一样的服务器上,假设在A服务器登陆,若是在B服务器拿不到用户的登陆信息session。这时访问到B服务器时就出现未登陆状况。web

    因此如何对于这种状况作到共享session相当重要。redis

   如下给出一些解决方案:(来源网络以及本身的一些看法)sql

  1.经过数据库mysql共享session数据库

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

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

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

    b.将存放session的数据表与业务的数据表放在同一个库。若是mysql作了主从,须要每个库都须要存在这个表,而且须要数据实时同步。网络

    缺点:用数据库来同步session,会加大数据库的负担,数据库原本就是容易产生瓶颈的地方,若是把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.

相关文章
相关标签/搜索