第一次玩负载均衡集群,使用的是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。
以上这些总结都是经过本人亲测检验过的。希望对小伙伴们有帮助。本人文笔不材,表达不当及有错误之处欢迎拍砖。欢迎评论指正交流。