关于Session的分布式存储和容灾问题

引子:一般对session的分布式管理常用的有以下3中方式,当然必须是当访问用户达到一定的量级以后才有分布式Session的概念
1)集群分组
2)一致性哈希
3)放置前端cookie中
 
首先说说集群分组:
  • 一般一组memcache支持3000个并发,如果10组就是30000个并发, 你想瞬间30000个并发是什么感念,每天几亿的Pv不是问题。
  • 组内memcached服务器数量可配(一般2~4台)通过内存共享的方式对client来说就是一块内存,其实是几台memcached服务台的合集。
容灾备份:重要的东西可以在memcached攒够了一个阀值,统一备份一次放到文件中或者数据库中,这样在一台服务器死掉后可以去数据库拿数据放在另外一台服务器上(这个有点耗时)
对于这个备份有比较成熟的解决方案,比如靠sina的开源插件,memcachedb这个 可以把 memcached数据缓存到 伯克利db里面  ) 
 
一致性哈希:
这个比较普遍了,我以前的公司采用的就是这个办法。具体算法如下:
解释:其实是这样的,我们把所有的sessionId从前端用户请求cookie中拿到 做getHashCode(sessionId)=key1,多个sessionId就是keyn。。。。,在用一直的哈希算法后得到的key永远在一个0~2的32次方内的定值,sessionID不同,这个key也就不同,这样在0到2的32次方的数可以组成一个闭环,在把我们的memcached服务器也采用统一的hash算法一般是getHashCode(memcached ID地址)这样是不是服务器的key也落到这个闭环里面了,呵呵,从0开始向右,或者向左都行,一般是向右开始找key找到一个key就放到离他最近的一个服务器的key中,这样在2个node之间的key就可以放在右侧的node服务器中。怎么知道key是sessionID算出来的,还是memcached IP地址算出来的呢,哈哈,大家自己想想,别想的太复杂啊。
 
放置前端cookie中:
这个也比较简单,就是将用户的登陆成功信息放在cookie中,并设置一个失效时间,当用户请求web服务器时,这个请求会经过一个策略,这个策略会看cookie里面的信息,
如果发现已经登陆了,则将cookie里面的信息提出来用户用户基本信息展示,并给出已登录界面。
如果发现未登陆,直接给出登录界面。
这个方法就是有些浏览器对cookie的大小是有限制的,所有要将你放入cookie尽可能的小,bool型的用0,1表示,字符串编码成数字最好。
 
好了,说了这么多,我的手都打累了。
今天就到这里吧。
posted @ 2012-12-07 14:27  剑桥  阅读(3597)  评论(5编辑  收藏  举报