原理

在第三,四篇文章中讲到了会话保持的问题,而且还遗留了一个问题,就是会话保持存在单点故障,

当时的方案是cookie插入后缀,即haproxy指负责分发请求,应用服务自行保持用户会话,如果应

用服务器宕机,则session会丢失。

现在来温习下解决方案

方案1:session复制

原理

就是将1台服务器的session复制到其它所有的服务器上,这样无论访问哪台服务器,都会得到用户 的session

优点

不存在单点故障问题

缺点

当服务器的数量比较大时,session同步将会变得相当耗时

方案2:session粘滞

原理

就是用户请求一个服务器之后,同一个会话的其它请求,都会被分配到这台服务器,session粘滞的 功能由负载均衡中间件完成

优点

解决了session复制的性能问题

缺点

由于用户的会话被保存到单一的服务器,就容易出现单点故障

方案3:session服务器

原理

部署一个专门的服务,保存用户session,同时在web服务器本地也保存一份,当本地没有或者失效时, 去访问session服务器,当然session服务器就成了单点,当用户量大的时候也容易宕机,这时可以做一 个session服务器集群,做主备同步备份,这样就达到了较好的效果,具体实现可以用redies,memcached 等缓存中间件。

优点

解决了单点故障和性能问题

缺点

实现复杂

redis保存session方案

上篇文章讲到的就是session粘滞的方案,既然前2种方案都有各自的缺点,那么就采用第三中方案

可以用redis做session缓存,保存用户session,做成主备模式,采用同步备份或者异步备份。

同步备份:在主机宕机时,备机接管之后session数据不丢失。

异步备份:在主机宕机时,备机接管主机,但是如果有一部分session还没来得及同步到备机,session将丢失。

可以根据实际情况来决定采用同步备份还是异步备份。

系统架构图如下:

如果用户量比较大,单服务器访问和存储session将会成为瓶颈,可以考虑用session服务器集群,架构图如下:

redis集群特点

1)将数据分散到集群中的多个节点,每个节点存储的数据量就会变少,这样存储和访问

的效率会得到提升。

2)每个节点都有主备,如果节点的主存储挂了,备份存储会接管主存储,提高可用性。

Redis+Tomcat实现

session流程

1.客户端首次请求服务端

2.服务端产生session并set cookie响应给客户端

3.客户端再次请求服务端,会带上cookie

4.服务端根据cookie找到对应的session

实现思路

如果我们要编写程序实现这个方案,需要解决以下问题:

1.session的安全性,即不容易被仿造。

2.session的唯一性,如果用tomcat产生session的策略,多台tomcat会产生的session会存在重复的可能。

3.session的有效期维护,session会有个有效期,用户在这个时间内不访问系统,session将会失效,如果

用户一直访问,则要自动延长session有效期。

4.在集群session服务器中,要考虑负载均衡,这也是需要编写客户端代码的,在分布式session缓存中,

需要根据sessionId哈希分布,那么就和服务器个数进行了耦合,在添加和移除服务器的时候,将出现数

据不一致的问题 。

5.如何实现才能让应用程序改动最小,或者是不改动。

我们可以选择自己写程序来实现以上功能,不过在这里我使用一个现成的框架,即tomcat-redis-session-manager

有时间并感兴趣的朋友,可以在这个基础上自行实现一个,这样更适合自己的项目。

服务器部署分布:

ha主机 192.168.1.227:80

ha备机 192.168.1.246:80

keepalived 主机 192.168.1.227

keepalived备机 192.168.1.246

web1 http://192.168.1.226:8888/login

web2 http://192.168.1.246:8888/login

redis主 192.168.1.245 6380

redis备

安装redis

主机和备机都安装redis

wget http://download.redis.io/releases/redis-2.8.5.tar.gz

解压:

tar xzf redis-2.8.5.tar.gz

cd redis-2.8.5

make

启动

src/redis-server redis.conf --port 6380 &

客户端登录

src/redis-cli -p 6380

备机配置复制:

redis.conf文件中

添加

slaveof 192.168.1.245 6380

Tomcat配置

tomcat版本:7.0.61

相关jar包:

注意这里的jar包最好是按下面的版本,否则会出现jar包冲突的问题。

tomcat-redis-session-manager-1.1.jar

commons-pool-1.6.jar

jedis-2.1.0.jar

下载tomcat redis session manager

https://github.com/jcoleman/tomcat-redis-session-manager/downloads

下载 apache common pool

http://commons.apache.org/proper/commons-pool/download_pool.cgi

下载版本:tomcat-redis-session-manager-1.1

redis的jar包可以从maven中央仓库下载

将以上3个jar包放入tomcat/lib目录中

在tomcat context.xml中加入如下内容

<!-- host: optional: defaults to "localhost" -->
<!-- port: defaults to "6379" -->
<!-- database: optional: defaults to "0" -->
<!-- maxInactiveInterval: optional: defaults to "60" (in seconds) -->
<Valve className="com.radiadesign.catalina.session.RedisSessionHandlerValve" />
<Manager className="com.radiadesign.catalina.session.RedisSessionManager"host="192.168.1.245" port="6380" database="0" maxInactiveInterval="60" />

启动tomcat,浏览器请求tomcat

http://192.168.1.226:8888/login/

登录redis客户端,查看session

session已经被保存到redis

下面,我们进行一项测试

测试流程:

1.先访问虚拟ip1.99的应用,得到sessionId

web服务器是226

2.然后将对应的tomcat停掉

3.刷新该应用,若sessionId未变,则表示redis保存session成功。

我们发现web服务器变成了246,但是sessionId未发生变化

该方案将session集中保存在了redis服务器,并做了主备容灾,从一定程度上提高了系统的高可用,由于

redis是内存存储,访问效率较高,在性能上也是比较好的,但是本例中session不是分布式存储,因此当用户量

非常大,并发访问量非常高的时候,session服务器会成为性能瓶颈。

引用自:http://www.cnblogs.com/tangyanbo/p/4442242.html

转载于:https://www.cnblogs.com/powerwu/articles/7741575.html

大型网站系统架构实践(六)深入探讨web应用集群Session保持相关推荐

  1. 大型网站系统架构实践(五)深入探讨web应用高可用方案

    从上篇文章到这篇文章,中间用了一段时间准备,主要是想把东西讲透,同时希望大家给与一些批评和建议,这样我才能有所进步,也希望喜欢我文章的朋友,给个赞,这样我才能更有激情,呵呵. 由于本篇要写的内容有点多 ...

  2. 大型网站系统架构实践(四)http层负载均衡之haproxy实践篇(一)

    方案 上篇文章讲到了负载均衡的相关理论知识,这篇文章我打算讲讲实践方法以及实践中遇到的问题 方案:haproxy http层负载均衡 安装一个haproxy服务,两个web服务 haproxy:192 ...

  3. 大型网站系统架构实践(一)从简单到复杂

    前言 写这篇文章的目的是想用来帮助自己思考和理清头绪,以及如何从一个简单的网站架构演进发展成一个大型网站架构,主要侧重在技术方面 简单的网站 由于我没有做过php,那么就以jsp为例,jsp做网站前端 ...

  4. 大型网站系统架构的演化

    大型网站系统架构的演化 来源:http://www.cnblogs.com/leefreeman/ 声明:作者授权转载. 前言 一个成熟的大型网站(如淘宝.京东等)的系统架构并不是开始设计就具备完整的 ...

  5. 大型网站系统架构分析--转

    大型网站系统架构分析 原文地址:http://www.cnblogs.com/Mainz/archive/2009/04/28/1445424.html 千万级的注册用户,千万级的帖子,nTB级的附件 ...

  6. 大型网站系统架构系列:负载均衡详解(一)

    大型网站系统架构系列:负载均衡详解(一) 2016-03-20 架构说 面对大量用户访问.高并发请求,海量数据,可以使用高性能的服务器.大型数据库,存储设备,高性能Web服务器,采用高效率的编程语言比 ...

  7. 解读大型网站系统架构的演化

    解读大型网站系统架构的演化 大型网站的架构是根据业务需求不断完善的,根据不同的业务特征会做特定的设计和考虑,本文只是讲述一个常规大型网站会涉及的一些技术和手段. 作者:李平来源:LEE的博客 前言 一 ...

  8. 大型网站技术架构(六)——网站的伸缩性架构

    大型网站技术架构(六)--网站的伸缩性架构 网站系统的伸缩性架构最重要的技术手段就是使用服务器集群功能,通过不断地向集群中添加服务器来增强整个集群的处理能力."伸"即网站的规模和服 ...

  9. 大型网站技术架构(3):WEB 前端性能优化

    上次说到了性能优化策略,根据网站的分层架构,可以大致的分为 web 前端性能优化,应用服务器性能优化,存储服务器性能优化三大类 这次来说一下 web 前端性能优化,一般来说,web 前端就是应用服务器 ...

  10. 【面试精选】关于大型网站系统架构你不得不懂的10个问题

    该文已加入笔主的开源项目--JavaGuide(一份涵盖大部分Java程序员所需要掌握的核心知识的文档类项目),地址:github.com/Snailclimb/- .觉得不错的话,记得点个Star. ...

最新文章

  1. Android 关于::app:clean :app:preBuild UP-TO-DATE :app:preDebugBuild UP-TO-DATE,引用jar冲突问题...
  2. 通过 运行实现快速打开应用程序
  3. mysql视图学习总结
  4. Java设计模式:抽像工厂模式
  5. Tomcat的manager APP设置
  6. IE6 式样表 Bug
  7. boost::phoenix::lambda相关的测试程序
  8. OpenCV绘图和文本输出功能的实例(附完整代码)
  9. 图片马可以直接连接吗_商标买来可以直接使用吗?
  10. 西北农林科技大学 计算机复试,西北农林科技大学 | 学长学姐考研面试经验谈...
  11. 【WC2018】通道【边分治】【虚树】【树的直径】
  12. c html循环ienumerable,C#方法返回IEnumerable实现用foreach遍历
  13. PHP如何释放内存之unset销毁变量并释放内存详解
  14. iOS开发之超级签名-原理/机制/技术细节-完全解析(暂时还没有验证)
  15. ppt图片文字嵌入_形状,文字填充图片教你做出好看的PPT
  16. 土壤类型空间分布数据介绍
  17. 【点击链接,自动下载安装APP,小米公司的坑】在浏览器中, 我们以为回退就能解决误点击。其实是不管用的。
  18. 大公司病了,这也太形象了吧!!!
  19. 智能优化算法——哈里斯鹰算法(Matlab代码实现)
  20. ibm tivoli_将IBM Tivoli Directory Integrator密码同步器与Tivoli Identity Manager集成

热门文章

  1. hibernate Restrictions 用法
  2. javascript getComputedStyle,getPropertyValue,CurrentStyle说明
  3. 自食其力!ASP.NET 4打造HTML5视频控件
  4. gem install XXX报错
  5. 如何在ECLIPSE中使用MVN CLEAN INSTALL
  6. 14. 使用reserve避免不必要的内存分配
  7. 面试中爱问的大数量的问题总结
  8. 怎么通过安装包安装mysql_教你安装Mysql(解压版/非安装包)图文教程
  9. 天气之子电脑壁纸_今年最受期待的5部日本动画电影,新海诚新作《天气之子》领衔...
  10. 大数据Hadoop学习记录(1)----HDFS目录和文件Shell操作