声明:以下仅为个人的一些总结和随写,如有不对之处,还请看到的网友指出,以免误导。 (详细的配置方案请google,这里只说解决方案。)
1、熟悉几个组件 1.4、HAProxy
—— HAProxy提供高可用性、负载均衡以及基于TCP和HTTP应用的代理,支持虚拟主机,它是免费、快速并且可靠的一种解决方案。HAProxy特别适用于那些负载特大的web站点,
这些站点通常又需要会话保持或七层处理。HAProxy运行在当前的硬件上,完全可以支持数以万计的并发连接。并且它的运行模式使得它可以很简单安全的整合进您当前的架构中, 同时可以保护你的web服务器不被暴露到网络上.
3、常用web集群
问题1:只有一个web服务器,明显的单点故障。如果该apache出现问题,整个网站就会瘫痪。
3.2、session复制
LVS、HAProxy、Nginx做负载均衡的比较 4.2.1、terracotta是jvm级别的session共享 它基本原理是对于集群间共享的数据,当在一个节点发生变化的时候,Terracotta只把变化的部分发送给Terracotta服务器,然后由服务器把它转发给真正需要这个数据的节点,并且共享的数据对象不需要序列化。
4.2.2、通过memcached实现内存级session共享 通过memcached-session-manager(msm)插件,通过tomcat上一定的配置,即可实现把session存储到memcached服务器上。注意:tomcat支持tomcat6+,并且memcached可以支持分布式内存,msm同时支持黏性session(sticky sessions)或者非黏性session(non-sticky sessions)两种模式,在memcached内存中共享的对象需要序列化。结构如图3:
通过一定的配置,可以实现故障转移(只支持对非粘性session)。如:
说明:failoverNodes:故障转移节点,对非粘性session不可用。属性failoverNodes="n1"的作用是告诉msm最好是把session保存在memcached "n2"节点上,只有在n2节点不可用的情况下才把session保存在n1节点。这样即使host2上的tomcat宕机,仍然可以通过host1上的tomcat访问存放在memcached "n1" 节点中的session。
原理在第三,四篇文章中讲到了会话保持的问题,而且还遗留了一个问题,就是会话保持存在单点故障, 当时的方案是cookie插入后缀,即haproxy指负责分发请求,应用服务自行保持用户会话,如果应 用服务器宕机,则session会丢失。 现在来温习下解决方案 方案1:session复制
方案2:session粘滞
方案3:session服务器
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./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./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服务器会成为性能瓶颈。
|
|