使用Apache通过JK实现多Tomcat负载均衡集群实现总结及自己的感悟

          第一次玩负载均衡集群,使用的是Apache、Tomcat,通过JK来实现。由于没有这方面经验,自己摸索了好多天,直到今天才基本完全搞定了。也了解了里面的一些相关原理,自己也亲自动手验证了一些原理。现将自己的经历过程和一些感悟总结分享一下,也以便自己日后查阅。

         首先是下载Apache、Tomcat、JK,这没什么说的,主要注意一下需要的Apache的版本,然后是Apache、Tomcat集群相应的JK版本。版本不对的话会有问题。我自己在这里没遇到多大问题。

         第一步,先做负载均衡,网上这方面的配置很多,随便找一个照着做,主要是针对Apache和Tomcat的配置文件的配置,这里我主要遇到的一个问题就是:Apache不能将请求分发给Tomcat处理(即Apache反向代理不成功)的问题关于这个问题详细解决方法及说明可以参照我之前写的一遍博文http://blog.csdn.net/fuxiaohui/article/details/45425985 ,这个不算什么大问题,就是Apache的一个配置没有配置好,但困扰了我很多天。希望可以帮到遇到同样的小伙伴们。这个问题解决了,就OK,负载均衡搞定。代码及相关配置我就不贴了,网上相关信息太多。

         第二步,集群,也是照着网上的配置做了一遍,同样也遇到个问题,就是session不能共享,没有复制。搞了好几个小时,不知道哪里有问题,最后发现在新建tomcat的工程下的WEB-INF文件夹的时候错将WEB-INF文件夹名写成了WEN-INF,哎!粗心害死人啊,就是因为这一个小小的字母写错了,浪费了我好几个小时,最后还是偶然发现的。不多说了,配置方面的东西一定要认真认真再认真。吸取教训。这个问题搞定了,也就OK了。

         至此负载均衡集群的全部工作总算完成了。但我想详细了解一下sticky_session和sticky_session_force这个配置的意义,所以网上找了相关文章看了看,自己照着试验了一下,现将网上了解的和自己总结的一些关于这两个配置的说明写一下:

sticky_session           sticky_session_force           结论

0(false)                                  0(false)                                           session无黏性,session会复制(共享)

0(false)                                  1(true)                                           session无黏性,session会复制(共享)

1(true)                                   0(false)                                            session有粘性(非强制)session会复制(共享)

1(true)                                   1(true)                                            session有粘性(强制)session没必要再复制共享

          以上这张表格是我从网上看到别人总结的,现我把自己的一些理解和感悟写一下:

1、当sticky_session为0(false)时,表示session无黏性,session会复制共享,也就是这个时候用户发出的request请求(不管是不是来自同一个用户和会话),都会根据负载均衡策略分发给不同的server处理,这个时候为了做到负载均衡集群,理所当然session肯定得共享。这个时候sticky_session_force参数的配置无关紧要,相当于失效了。  所以两个配置情况就明了。

2、当sticky_session为1(true)时,session有粘性,该种方式下,当用户发出第一个request后,负载均衡器动态的把该用户分配到某个节点,并记录该节点的jvm路由,以后该用户的所有request都会被绑定这个jvm路由,用户只会与该server发生交互,这种策略被称为粘性session(session sticky)。由此可以理解无粘性session(session sticky)。此时如果 sticky_session_force 为0(false) ,表示session有粘性,但是非强制的,session会复制共享。这个时候apache将某个请求分发给其中一台server,以后这个用户所有请求均会由于这个server来处理,但是如果当该server由于种种原因停掉了,不能再处理这个用户请求了,那么会由集群中另外的一个server来接手处理这个用户的请求(由于session复制共享了,此时理所当然session也应该复制共享,否则不能集群了),个人感觉这才是集群的经典用例。一般情况下我们配置集群通常也就使用该种配置比较好。而如果 sticky_session_force 为1(true),表示session有粘性,而且是强制的,session不会复制共享。这个时候就有点类似于apache将某个请求分发给其中一台server,然后这个请求就一直与这个server玩,当该server由于种种原因停掉了,不能再处理这个用户请求了,集群中另外的server也不会来接手处理这个用户的请求,也就是跟集群中另外server没太大关系了。个人感觉这种没太大意思,有点脱离了集群的本意了,负载均衡还可以算得上有点。本人亲测这个配置的时候,发出一个请求,如果请求被分配到server1上处理,此将server1停掉,再在这个请求下访问时,会报500。 

以上这些总结都是经过本人亲测检验过的。希望对小伙伴们有帮助。本人文笔不材,表达不当及有错误之处欢迎拍砖。欢迎评论指正交流。




你可能感兴趣的:(jvm,tomcat,负载均衡,集群,session)