web集群时session同步的3种方法

张映 发表于 2010-07-17

分类目录: 服务器相关

标签:, , , ,

在做了web集群后,你肯定会首先考虑session同步问题,因为通过负载均衡后,同一个IP访问同一个页面会被分配到不同的服务器上,如果session不同步的话,一个登录用户,一会是登录状态,一会又不是登录状态。所以本文就根据这种情况给出三种不同的方法来解决这个问题:

一,利用数据库同步session

在做多服务器session同步时我没有用这种方法,如果非要用这种方法的话,我想过二种方法:

1,用一个低端电脑建个数据库专门存放web服务器的session,或者,把这个专门的数据库建在文件服务器上,用户访问web服务器时,会去这个专门的数据库check一下session的情况,以达到session同步的目的。

2,这种方法是把存放session的表和其他数据库表放在一起,如果mysql也做了集群了话,每个mysql节点都要有这张表,并且这张session表的数据表要实时同步。

说明:用数据库来同步session,会加大数据库的负担,数据库本来就是容易产生瓶颈的地方,如果把session还放到数据库里面,无疑是雪上加霜。上面的二种方法,第一点方法较好,把放session的表独立开来,减轻了真正数据库的负担

二,利用cookie同步session

session是文件的形势存放在服务器端的,cookie是文件的形势存在客户端的,怎么实现同步呢?方法很简单,就是把用户访问页面产生的session放到cookie里面,就是以cookie为中转站。你访问web服务器A,产生了session把它放到cookie里面了,你访问被分配到web服务器B,这个时候,web服务器B先判断服务器有没有这个session,如果没有,在去看看客户端的cookie里面有没有这个session,如果也没有,说明session真的不存,如果cookie里面有,就把cookie里面的sessoin同步到web服务器B,这样就可以实现session的同步了。

说明:这种方法实现起来简单,方便,也不会加大数据库的负担,但是如果客户端把cookie禁掉了的话,那么session就无从同步了,这样会给网站带来损失;cookie的安全性不高,虽然它已经加了密,但是还是可以伪造的。

三,利用memcache同步session

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

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

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

四,总结

上面三种方法都是可行的

第一种方法,最影响系统速度的那种,不推荐使用;

第二种方法,效果不错,不过安全隐患一样的存在;

第三种方法,个人觉得第三种方法是最好的,推荐大家使用



转载请注明
作者:海底苍鹰
地址:http://blog.51yip.com/server/922.html

5 条评论

  1. test 留言

    来了随便讲几句好了。还有好多种其他办法来同步SESSION的。比如用文件系统共享的方式。就是将SESSION的SAVE PATH指到同一个物理介质上,这个很简单的吧。高速的存储服务器划一块出来,供保存SESSION使用。
    还有一种办法就是upstream hash,IP或者URL HASH都行,让用户访问的始终是集群里面的某台SERVER。这样就不会出现SESSION不同步的问题,也就达到了SESSION同步的作用。

  2. 张映 留言

    谢谢你的建议,我觉得你说得第一种办法挺好,哪天把电脑带到公司试一下。
    像ip hash,url hash这样算法,如果把固定IP固定某台web服务器上的话,会出现负载不是很均衡的情况,1000人可能会访问web服务器A,而只有10个人访问web服务器B。

  3. vicente 留言

    [这个时候,web服务器B先判断服务器有没有这个session,如果没有,在去看看客户端的cookie里面有没有这个session,如果也没有,说明session真的不存,如果cookie里面有,就把cookie里面的sessoin同步到web服务器B,这样就可以实现session的同步了。]
    我是觉得你这句话有歧义吧,当浏览器在访问服务器B的时候,如何首先验证这个session啊。session数据是存储在服务器中的。cookie记录着session_id的信息,所以需要服务器之间同步session的信息,当浏览器访问服务器B的时候,在验证cookie中的session_id的信息。还有[就把cookie里面的sessoin同步到web服务器B],首先这样安全性不高吧,还有cookie存储的容量有限,要通过cookie同步session数据给其他服务器也不可取吧。
    这个方式具体可以看http://www.vicenteforever.com/2011/11/php-web-share-session/

    我看了你很多文章,感觉比较好,比较适用,也转载了一些,希望做个友链啊。

  4. cilendeng 留言

    第二种方法不会有问题吗?说个过程:访问server1,形成server1的session,并生成cookie,这时候访问server2.由于有cookie,server2生成session。这时候,用户在server2上退出。cookie清空,server2 session清除。server1的session还在,用户此时如果访问到server1怎么办

  5. Null 留言

    这应该是基于PHP的吧,tomcat有自带的组播集群,不过都是坑。
    还是学习了PHP的session保持方法