解决集群session方案
来源:互联网 发布:c语言typedef的用法 编辑:程序博客网 时间:2024/05/18 11:18
Memcahed分布式缓存服务替换Session解决方案:http://www.cnblogs.com/xuanfeng/archive/2009/06/04/1494735.html
需求:
有个ASP.NET网站系统,有一级域名,二级域名,三级域名,系统的各个功能模块分布在不同的域名,同一域名的也有可能分布在不同省份的服务器或者同一省份的不同的服务器中,同一省份的的服务器可以通过内部局域网访问。在系统中,现在需要所有功能模块共享用户同一次会话中的私有数据。
常用的方式是启用Session的数据库持久会模式可以达到上面的需求(没尝试过),现在需要使用Memcached分布式缓存服务来达到保存用户的会话数据,而达到各个功能模块都能够跨省份、跨服务器共享本次会话中的私有数据的目的。
解决方案:
每个省份使用一台服务器来做为Memcached服务器来存储用话的会话中的数据,当然也可以多台服务器,但必须确保每个省份的做Memcached服务器数量必须一致,这样才能够保证Memcached客户端操作的是同一份数据,保证数据的一致性。
会话数据的添加、删除、修改:
Memcached客户端,添加、删除和、修改会话信息数据时,不仅要添加、删除、修改本省的Memcached服务器数据,而且同时要对其它省份的Memcahed服务器做同样的操作,这样用户访问其它省份的服务器的功能模块进也能读取到相同的会话数据。Memcached客户端服务器的列表使用局域网的内网IP(如:192.168.1.179)操作本省的Memcahed服务器,使用公网的IP((如:202.183.62.210))操作其它省份的Memcahe服务器。
会话数据的读取
系统所有模块读取会话数据的Memcached客户端服务器列表都设为本省Memcached服务器地址的内网IP来向Memcahed服务器中读取会话数据。
如上图所示,A省有四台服务器,B省也有四台服务器,两个三份都有三台Web服务器、一台Memcached服务器,且A省四台服务器同在一个局域网内的可能通过内网IP相互访问,B省也一样。假如:A省的A1,B1,C1这三台Web服务器其中的一台要添加或修改、或删除会话数据,它首先调服Memcached客户端使服D1服务器的内网IP向D1服务器中添加或修改、或删除会话数据,操作完成后,还用调用Memcache客户端使服D2服务器的公网IP向D2服务器做同样的操作,这样才算完整的操作过程,也可以当做一个事务来处理。假如:A省的A1,B1,C1这三台Web服务器其中一台服务器想要读取会话的数据,只需要调用Memcached客户端使服D1服务器的内网IP读取数据即可,如果发现该数据不存在,即做向Memcached服务器添加数据的相关业务处理。B省处理逻辑同A省。
同一会话的确认:
使用Cookie来保持客户与服务端的联系。 每一次会话开始就生成一个GUID作为SessionID,保存在客户端的Cookie中,作用域是顶级域名,这样二级、三级域名就可以共享到这个Cookie,系统中就使用这个SessionID来确认它是否是同一个会话。
会话数据的唯一ID
会话数据存储在Memcached服务器上的唯一键Key也就是会话数据数据的唯一ID定义为:SessionID_Name, SessionID就是保存在客户端Cookie中的SessionID, Name就是会话数据的名称,同一次会话中各个会话数据的Name必须是唯一的,否则新的会话数据将覆盖旧的会话数据。
会话的失效时间:
会话的失效通过控制Cookie的有效时间来实现,会话的时间设为SessionID或Cookie中的有效时间,且每一次访问SessionID时都要重新设置一下Cookie的有效时间,这样就达到的会话的有效时间就是两次间访问Cookie中SessionID值的的最长时间,如果两次访问的间隔时间超过用效时间,那么保存在SessionID的Cookie将会失效,并生成新的SessionID存放在Cookie中, SessionID改变啦,会话就结束啦。
Memcached服务器中会话数据的失效
每一次向Memcache服务器中添加会话数据时,都把有效时间设为一天也就是24小时,让Memcached服务使用它内部的机制去清除,不必在程序中特别做会话数据的删除操作。数据在Memcache服务器中有有效时间只是逻辑上的,就算是过了24 小时,如果分配给Memcached服务的内存还够用的话,数据还是保存在内存当中的,只是Memcache客户端读取不到而已。只有到了分配给Memcached服务的内存不够用时,它才会清理没用或者比较旧的数据,也就是懒性清除。
示例jsp代码:
String guid = null;/* * 读cookie*/ Cookie[] cookies = request.getCookies(); if (cookies != null) { for (int i = 0; i < cookies.length; i++) { Cookie c = cookies[i]; if (c.getName().equalsIgnoreCase("guid")) { System.out.println("find cookie guid :"+c.getValue()); guid = c.getValue(); } } } /* * 如果没有发现guid cookie ,生成新的guid,并写cookie */ if (guid == null) { RandomGUID randomguid = new RandomGUID(); guid = randomguid.toString(); Cookie guidcookie = new Cookie("guid", guid); guidcookie.setMaxAge(60 * 60 * 24 * 365); guidcookie.setDomain(".domain.com"); response.addCookie(guidcookie); System.out.println("not find cookie guid and set guid cookie:"+guid); } String username = request.getParameter("username"); System.out.println("request username : "+username); if (username != null) { System.out.println("memcache set username ["+guid+","+username+"]"); MemcachedUtil.put(guid, username); } username = (String) MemcachedUtil.get(guid); System.out.println("memcache username : "+username);
- 解决集群session方案
- 解决WEB集群session同步的方案,Redis内存缓存
- 解决WEB集群session同步的方案,Redis内存缓存
- 服务器集群session共享方案
- 集群项目session 共享方案
- 集群session共享方案(有shiro共享session的方案)
- Java web集群session共享方案
- 集群间Session共享问题解决方案
- tomcat集群的memcached session manager方案
- 集群间Session共享问题解决方案
- 集群间Session共享问题解决方案
- 集群中session同步解决方式
- 解决应用服务器集群后session问题
- 解决应用服务器集群的Session问题
- 解决应用服务器集群的Session问题
- memcached session manager 解决tomcat集群session共享
- spring session解决集群环境下session共享问题
- web项目集群时共享session方案实践。
- android底部选项卡(一) TableHost
- Origin生成图,copy到word后,发现图的外边框太大,怎么改
- java读入txt并保存到数组中。
- 客户分析细分案例
- 为什么谷歌的JSON响应以while(1);开头?
- 解决集群session方案
- 成为Linux内核高手的四个方法[ZZ]
- oracle 9i,10g,11c下载地址
- 老毛桃装系统时遇到原来的c盘转化为D E F等盘时解决方法
- vs2008至vs2012切换报链接错误
- 黑马程序员_面对对象_继承_抽象类_接口
- HDU 1001(水题)
- 3、机器学习-Logistic Regression and Regularization
- wifi定位方法,系统构成及原理